diff options
| author | 2018-09-09 09:16:48 +0100 | |
|---|---|---|
| committer | 2018-09-09 09:51:46 +0100 | |
| commit | 55af5bda5574a34716680b23aab6482d340a00ed (patch) | |
| tree | a97b3aa2bc3084163b62bfd083d14477215a9dbd | |
| parent | cubeb_sink: Perform audio stretching (diff) | |
| download | yuzu-55af5bda5574a34716680b23aab6482d340a00ed.tar.gz yuzu-55af5bda5574a34716680b23aab6482d340a00ed.tar.xz yuzu-55af5bda5574a34716680b23aab6482d340a00ed.zip | |
cubeb_sink: Downsample arbitrary number of channels
Diffstat (limited to '')
| -rw-r--r-- | src/audio_core/cubeb_sink.cpp | 19 |
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 { | |||
| 17 | public: | 17 | public: |
| 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; |