ソースを参照

cubeb_sink: Downsample arbitrary number of channels

MerryMage 7 年 前
コミット
55af5bda55
1 ファイル変更9 行追加10 行削除
  1. 9 10
      src/audio_core/cubeb_sink.cpp

+ 9 - 10
src/audio_core/cubeb_sink.cpp

@@ -17,8 +17,8 @@ class CubebSinkStream final : public SinkStream {
 public:
 public:
     CubebSinkStream(cubeb* ctx, u32 sample_rate, u32 num_channels_, cubeb_devid output_device,
     CubebSinkStream(cubeb* ctx, u32 sample_rate, u32 num_channels_, cubeb_devid output_device,
                     const std::string& name)
                     const std::string& name)
-        : ctx{ctx}, is_6_channel{num_channels_ == 6}, num_channels{std::min(num_channels_, 2u)},
-          time_stretch{sample_rate, num_channels} {
+        : ctx{ctx}, num_channels{std::min(num_channels_, 2u)}, time_stretch{sample_rate,
+                                                                            num_channels} {
 
 
         cubeb_stream_params params{};
         cubeb_stream_params params{};
         params.rate = sample_rate;
         params.rate = sample_rate;
@@ -57,15 +57,15 @@ public:
         cubeb_stream_destroy(stream_backend);
         cubeb_stream_destroy(stream_backend);
     }
     }
 
 
-    void EnqueueSamples(u32 num_channels, const std::vector<s16>& samples) override {
-        if (is_6_channel) {
+    void EnqueueSamples(u32 source_num_channels, const std::vector<s16>& samples) override {
+        if (source_num_channels > num_channels) {
             // Downsample 6 channels to 2
             // Downsample 6 channels to 2
-            const size_t sample_count_copy_size = samples.size() * 2;
             std::vector<s16> buf;
             std::vector<s16> buf;
-            buf.reserve(sample_count_copy_size);
-            for (size_t i = 0; i < samples.size(); i += num_channels) {
-                buf.push_back(samples[i]);
-                buf.push_back(samples[i + 1]);
+            buf.reserve(samples.size() * num_channels / source_num_channels);
+            for (size_t i = 0; i < samples.size(); i += source_num_channels) {
+                for (size_t ch = 0; ch < num_channels; ch++) {
+                    buf.push_back(samples[i + ch]);
+                }
             }
             }
             queue.Push(buf);
             queue.Push(buf);
             return;
             return;
@@ -91,7 +91,6 @@ private:
     cubeb* ctx{};
     cubeb* ctx{};
     cubeb_stream* stream_backend{};
     cubeb_stream* stream_backend{};
     u32 num_channels{};
     u32 num_channels{};
-    bool is_6_channel{};
 
 
     Common::RingBuffer<s16, 0x10000> queue;
     Common::RingBuffer<s16, 0x10000> queue;
     std::array<s16, 2> last_frame;
     std::array<s16, 2> last_frame;