From 34b3f8349814c8c3a7ca5f1f6bd36a98dd32a207 Mon Sep 17 00:00:00 2001 From: bunnei Date: Thu, 2 Aug 2018 18:54:25 -0400 Subject: audio_core: Sinks need unique names as well. --- src/audio_core/cubeb_sink.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'src/audio_core/cubeb_sink.cpp') diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp index 34ae5b062..cf4839989 100644 --- a/src/audio_core/cubeb_sink.cpp +++ b/src/audio_core/cubeb_sink.cpp @@ -13,7 +13,7 @@ namespace AudioCore { class SinkStreamImpl final : public SinkStream { public: - SinkStreamImpl(cubeb* ctx, cubeb_devid output_device) : ctx{ctx} { + SinkStreamImpl(cubeb* ctx, cubeb_devid output_device, const std::string& name) : ctx{ctx} { cubeb_stream_params params; params.rate = 48000; params.channels = GetNumChannels(); @@ -25,8 +25,8 @@ public: LOG_CRITICAL(Audio_Sink, "Error getting minimum latency"); } - if (cubeb_stream_init(ctx, &stream_backend, "yuzu Audio Output", nullptr, nullptr, - output_device, ¶ms, std::max(512u, minimum_latency), + if (cubeb_stream_init(ctx, &stream_backend, name.c_str(), nullptr, nullptr, output_device, + ¶ms, std::max(512u, minimum_latency), &SinkStreamImpl::DataCallback, &SinkStreamImpl::StateCallback, this) != CUBEB_OK) { LOG_CRITICAL(Audio_Sink, "Error initializing cubeb stream"); @@ -129,8 +129,9 @@ CubebSink::~CubebSink() { cubeb_destroy(ctx); } -SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels) { - sink_streams.push_back(std::make_unique(ctx, output_device)); +SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels, + const std::string& name) { + sink_streams.push_back(std::make_unique(ctx, output_device, name)); return *sink_streams.back(); } -- cgit v1.2.3 From 02fccc09408de59629ea408d825a8978882a6e06 Mon Sep 17 00:00:00 2001 From: bunnei Date: Fri, 3 Aug 2018 14:50:53 -0400 Subject: cubeb_sink: Support variable sample_rate and num_channels. --- src/audio_core/cubeb_sink.cpp | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) (limited to 'src/audio_core/cubeb_sink.cpp') diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp index cf4839989..0b0e9a053 100644 --- a/src/audio_core/cubeb_sink.cpp +++ b/src/audio_core/cubeb_sink.cpp @@ -13,14 +13,24 @@ namespace AudioCore { class SinkStreamImpl final : public SinkStream { public: - SinkStreamImpl(cubeb* ctx, cubeb_devid output_device, const std::string& name) : ctx{ctx} { - cubeb_stream_params params; - params.rate = 48000; - params.channels = GetNumChannels(); + SinkStreamImpl(cubeb* ctx, u32 sample_rate, u32 num_channels_, cubeb_devid output_device, + const std::string& name) + : ctx{ctx}, num_channels{num_channels_} { + + if (num_channels == 6) { + // 6-channel audio does not seem to work with cubeb + SDL, so we downsample this to 2 + // channel for now + is_6_channel = true; + num_channels = 2; + } + + cubeb_stream_params params{}; + params.rate = sample_rate; + params.channels = num_channels; params.format = CUBEB_SAMPLE_S16NE; - params.layout = CUBEB_LAYOUT_STEREO; + params.layout = num_channels == 1 ? CUBEB_LAYOUT_MONO : CUBEB_LAYOUT_STEREO; - u32 minimum_latency = 0; + u32 minimum_latency{}; if (cubeb_get_min_latency(ctx, ¶ms, &minimum_latency) != CUBEB_OK) { LOG_CRITICAL(Audio_Sink, "Error getting minimum latency"); } @@ -58,11 +68,7 @@ public: queue.reserve(queue.size() + sample_count * GetNumChannels()); - if (num_channels == 2) { - // Copy as-is - std::copy(samples, samples + sample_count * GetNumChannels(), - std::back_inserter(queue)); - } else if (num_channels == 6) { + if (is_6_channel) { // Downsample 6 channels to 2 const size_t sample_count_copy_size = sample_count * num_channels * 2; queue.reserve(sample_count_copy_size); @@ -71,13 +77,14 @@ public: queue.push_back(samples[i + 1]); } } else { - ASSERT_MSG(false, "Unimplemented"); + // Copy as-is + std::copy(samples, samples + sample_count * GetNumChannels(), + std::back_inserter(queue)); } } u32 GetNumChannels() const { - // Only support 2-channel stereo output for now - return 2; + return num_channels; } private: @@ -85,6 +92,8 @@ private: cubeb* ctx{}; cubeb_stream* stream_backend{}; + u32 num_channels{}; + bool is_6_channel{}; std::vector queue; @@ -131,7 +140,8 @@ CubebSink::~CubebSink() { SinkStream& CubebSink::AcquireSinkStream(u32 sample_rate, u32 num_channels, const std::string& name) { - sink_streams.push_back(std::make_unique(ctx, output_device, name)); + sink_streams.push_back( + std::make_unique(ctx, sample_rate, num_channels, output_device, name)); return *sink_streams.back(); } -- cgit v1.2.3 From 1dee8ceda1e5ecd5ebaee464b1450f323e82305f Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 4 Aug 2018 00:03:12 -0400 Subject: audio_core: Use s16 where possible for audio samples. --- src/audio_core/cubeb_sink.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'src/audio_core/cubeb_sink.cpp') diff --git a/src/audio_core/cubeb_sink.cpp b/src/audio_core/cubeb_sink.cpp index 0b0e9a053..1501ef1f4 100644 --- a/src/audio_core/cubeb_sink.cpp +++ b/src/audio_core/cubeb_sink.cpp @@ -61,25 +61,24 @@ public: cubeb_stream_destroy(stream_backend); } - void EnqueueSamples(u32 num_channels, const s16* samples, size_t sample_count) override { + void EnqueueSamples(u32 num_channels, const std::vector& samples) override { if (!ctx) { return; } - queue.reserve(queue.size() + sample_count * GetNumChannels()); + queue.reserve(queue.size() + samples.size() * GetNumChannels()); if (is_6_channel) { // Downsample 6 channels to 2 - const size_t sample_count_copy_size = sample_count * num_channels * 2; + const size_t sample_count_copy_size = samples.size() * 2; queue.reserve(sample_count_copy_size); - for (size_t i = 0; i < sample_count * num_channels; i += num_channels) { + for (size_t i = 0; i < samples.size(); i += num_channels) { queue.push_back(samples[i]); queue.push_back(samples[i + 1]); } } else { // Copy as-is - std::copy(samples, samples + sample_count * GetNumChannels(), - std::back_inserter(queue)); + std::copy(samples.begin(), samples.end(), std::back_inserter(queue)); } } -- cgit v1.2.3