summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/audio_core/cubeb_sink.cpp19
1 files changed, 9 insertions, 10 deletions
diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp
index 7982306b3..067dc98d2 100644
--- a/src/audio_core/cubeb_sink.cpp
+++ b/src/audio_core/cubeb_sink.cpp
@@ -17,8 +17,8 @@ class CubebSinkStream final : public SinkStream {
17public: 17public:
18 CubebSinkStream(cubeb* ctx, u32 sample_rate, u32 num_channels_, cubeb_devid output_device, 18 CubebSinkStream(cubeb* ctx, u32 sample_rate, u32 num_channels_, cubeb_devid output_device,
19 const std::string& name) 19 const std::string& name)
20 : ctx{ctx}, is_6_channel{num_channels_ == 6}, num_channels{std::min(num_channels_, 2u)}, 20 : ctx{ctx}, num_channels{std::min(num_channels_, 2u)}, time_stretch{sample_rate,
21 time_stretch{sample_rate, num_channels} { 21 num_channels} {
22 22
23 cubeb_stream_params params{}; 23 cubeb_stream_params params{};
24 params.rate = sample_rate; 24 params.rate = sample_rate;
@@ -57,15 +57,15 @@ public:
57 cubeb_stream_destroy(stream_backend); 57 cubeb_stream_destroy(stream_backend);
58 } 58 }
59 59
60 void EnqueueSamples(u32 num_channels, const std::vector<s16>& samples) override { 60 void EnqueueSamples(u32 source_num_channels, const std::vector<s16>& samples) override {
61 if (is_6_channel) { 61 if (source_num_channels > num_channels) {
62 // Downsample 6 channels to 2 62 // Downsample 6 channels to 2
63 const size_t sample_count_copy_size = samples.size() * 2;
64 std::vector<s16> buf; 63 std::vector<s16> buf;
65 buf.reserve(sample_count_copy_size); 64 buf.reserve(samples.size() * num_channels / source_num_channels);
66 for (size_t i = 0; i < samples.size(); i += num_channels) { 65 for (size_t i = 0; i < samples.size(); i += source_num_channels) {
67 buf.push_back(samples[i]); 66 for (size_t ch = 0; ch < num_channels; ch++) {
68 buf.push_back(samples[i + 1]); 67 buf.push_back(samples[i + ch]);
68 }
69 } 69 }
70 queue.Push(buf); 70 queue.Push(buf);
71 return; 71 return;
@@ -91,7 +91,6 @@ private:
91 cubeb* ctx{}; 91 cubeb* ctx{};
92 cubeb_stream* stream_backend{}; 92 cubeb_stream* stream_backend{};
93 u32 num_channels{}; 93 u32 num_channels{};
94 bool is_6_channel{};
95 94
96 Common::RingBuffer<s16, 0x10000> queue; 95 Common::RingBuffer<s16, 0x10000> queue;
97 std::array<s16, 2> last_frame; 96 std::array<s16, 2> last_frame;