Procházet zdrojové kódy

Merge pull request #6504 from Kelebek1/samples-played

[audout] Implement GetAudioOutPlayedSampleCount
bunnei před 5 roky
rodič
revize
809e5fd523

+ 5 - 2
src/audio_core/stream.cpp

@@ -107,9 +107,12 @@ void Stream::PlayNextBuffer(std::chrono::nanoseconds ns_late) {
     active_buffer = queued_buffers.front();
     queued_buffers.pop();
 
-    VolumeAdjustSamples(active_buffer->GetSamples(), game_volume);
+    auto& samples = active_buffer->GetSamples();
 
-    sink_stream.EnqueueSamples(GetNumChannels(), active_buffer->GetSamples());
+    VolumeAdjustSamples(samples, game_volume);
+
+    sink_stream.EnqueueSamples(GetNumChannels(), samples);
+    played_samples += samples.size();
 
     const auto buffer_release_ns = GetBufferReleaseNS(*active_buffer);
 

+ 6 - 0
src/audio_core/stream.h

@@ -89,6 +89,11 @@ public:
         return sample_rate;
     }
 
+    /// Gets the number of samples played so far
+    [[nodiscard]] u64 GetPlayedSampleCount() const {
+        return played_samples;
+    }
+
     /// Gets the number of channels
     [[nodiscard]] u32 GetNumChannels() const;
 
@@ -106,6 +111,7 @@ private:
     [[nodiscard]] std::chrono::nanoseconds GetBufferReleaseNS(const Buffer& buffer) const;
 
     u32 sample_rate;                  ///< Sample rate of the stream
+    u64 played_samples{};             ///< The current played sample count
     Format format;                    ///< Format of the stream
     float game_volume = 1.0f;         ///< The volume the game currently has set
     ReleaseCallback release_callback; ///< Buffer release callback for the stream

+ 9 - 1
src/core/hle/service/audio/audout_u.cpp

@@ -58,7 +58,7 @@ public:
             {7, &IAudioOut::AppendAudioOutBufferImpl, "AppendAudioOutBufferAuto"},
             {8, &IAudioOut::GetReleasedAudioOutBufferImpl, "GetReleasedAudioOutBufferAuto"},
             {9, &IAudioOut::GetAudioOutBufferCount, "GetAudioOutBufferCount"},
-            {10, nullptr, "GetAudioOutPlayedSampleCount"},
+            {10, &IAudioOut::GetAudioOutPlayedSampleCount, "GetAudioOutPlayedSampleCount"},
             {11, &IAudioOut::FlushAudioOutBuffers, "FlushAudioOutBuffers"},
             {12, &IAudioOut::SetAudioOutVolume, "SetAudioOutVolume"},
             {13, &IAudioOut::GetAudioOutVolume, "GetAudioOutVolume"},
@@ -186,6 +186,14 @@ private:
         rb.Push(static_cast<u32>(stream->GetQueueSize()));
     }
 
+    void GetAudioOutPlayedSampleCount(Kernel::HLERequestContext& ctx) {
+        LOG_DEBUG(Service_Audio, "called");
+
+        IPC::ResponseBuilder rb{ctx, 4};
+        rb.Push(ResultSuccess);
+        rb.Push(stream->GetPlayedSampleCount());
+    }
+
     void FlushAudioOutBuffers(Kernel::HLERequestContext& ctx) {
         LOG_DEBUG(Service_Audio, "called");