Просмотр исходного кода

sink: Change EnqueueSamples to take a pointer to a buffer instead of a std::vector

MerryMage 10 лет назад
Родитель
Сommit
0ef4185644

+ 2 - 1
src/audio_core/hle/dsp.cpp

@@ -90,7 +90,8 @@ static AudioCore::TimeStretcher time_stretcher;
 
 static void OutputCurrentFrame(const StereoFrame16& frame) {
     time_stretcher.AddSamples(&frame[0][0], frame.size());
-    sink->EnqueueSamples(time_stretcher.Process(sink->SamplesInQueue()));
+    std::vector<s16> stretched_samples = time_stretcher.Process(sink->SamplesInQueue());
+    sink->EnqueueSamples(stretched_samples.data(), stretched_samples.size() / 2);
 }
 
 // Public Interface

+ 1 - 1
src/audio_core/null_sink.h

@@ -19,7 +19,7 @@ public:
         return native_sample_rate;
     }
 
-    void EnqueueSamples(const std::vector<s16>&) override {}
+    void EnqueueSamples(const s16*, size_t) override {}
 
     size_t SamplesInQueue() const override {
         return 0;

+ 2 - 4
src/audio_core/sdl2_sink.cpp

@@ -71,14 +71,12 @@ unsigned int SDL2Sink::GetNativeSampleRate() const {
     return impl->sample_rate;
 }
 
-void SDL2Sink::EnqueueSamples(const std::vector<s16>& samples) {
+void SDL2Sink::EnqueueSamples(const s16* samples, size_t sample_count) {
     if (impl->audio_device_id <= 0)
         return;
 
-    ASSERT_MSG(samples.size() % 2 == 0, "Samples must be in interleaved stereo PCM16 format (size must be a multiple of two)");
-
     SDL_LockAudioDevice(impl->audio_device_id);
-    impl->queue.emplace_back(samples);
+    impl->queue.emplace_back(samples, samples + sample_count * 2);
     SDL_UnlockAudioDevice(impl->audio_device_id);
 }
 

+ 1 - 1
src/audio_core/sdl2_sink.h

@@ -18,7 +18,7 @@ public:
 
     unsigned int GetNativeSampleRate() const override;
 
-    void EnqueueSamples(const std::vector<s16>& samples) override;
+    void EnqueueSamples(const s16* samples, size_t sample_count) override;
 
     size_t SamplesInQueue() const override;
 

+ 3 - 2
src/audio_core/sink.h

@@ -23,9 +23,10 @@ public:
 
     /**
      * Feed stereo samples to sink.
-     * @param samples Samples in interleaved stereo PCM16 format. Size of vector must be multiple of two.
+     * @param samples Samples in interleaved stereo PCM16 format.
+     * @param sample_count Number of samples.
      */
-    virtual void EnqueueSamples(const std::vector<s16>& samples) = 0;
+    virtual void EnqueueSamples(const s16* samples, size_t sample_count) = 0;
 
     /// Samples enqueued that have not been played yet.
     virtual std::size_t SamplesInQueue() const = 0;