From 3511852f39cd5023ec8e6d0b94cc69f34e9201ed Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 3 Aug 2023 15:32:28 +1000 Subject: Add very limited resampling (it's slow as shit) --- src/audio/i2s_audio_output.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index bb413b38..e53dbe2a 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -115,10 +115,19 @@ auto I2SAudioOutput::AdjustVolumeDown() -> bool { return true; } -auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> bool { +auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) + -> StreamInfo::Pcm { + return StreamInfo::Pcm{ + .channels = std::min(orig.channels, 2), + .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), + .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), + }; +} + +auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> void { if (current_config_ && pcm == *current_config_) { ESP_LOGI(kTag, "ignoring unchanged format"); - return true; + return; } ESP_LOGI(kTag, "incoming audio stream: %u ch %u bpp @ %lu Hz", pcm.channels, @@ -134,7 +143,7 @@ auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> bool { break; default: ESP_LOGE(kTag, "dropping stream with out of bounds channels"); - return false; + return; } drivers::I2SDac::BitsPerSample bps; @@ -150,30 +159,36 @@ auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> bool { break; default: ESP_LOGE(kTag, "dropping stream with unknown bps"); - return false; + return; } drivers::I2SDac::SampleRate sample_rate; switch (pcm.sample_rate) { + case 8000: + sample_rate = drivers::I2SDac::SAMPLE_RATE_8; + break; + case 32000: + sample_rate = drivers::I2SDac::SAMPLE_RATE_32; + break; case 44100: sample_rate = drivers::I2SDac::SAMPLE_RATE_44_1; break; case 48000: sample_rate = drivers::I2SDac::SAMPLE_RATE_48; break; + case 88200: + sample_rate = drivers::I2SDac::SAMPLE_RATE_88_2; + break; + case 96000: + sample_rate = drivers::I2SDac::SAMPLE_RATE_96; + break; default: ESP_LOGE(kTag, "dropping stream with unknown rate"); - return false; + return; } dac_->Reconfigure(ch, bps, sample_rate); current_config_ = pcm; - - return true; -} - -auto I2SAudioOutput::Send(const cpp::span& data) -> void { - dac_->WriteData(data); } } // namespace audio -- cgit v1.2.3 From 60f767713227b5405b855e6e6e2a0475ecd96bcc Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 4 Aug 2023 20:07:44 +1000 Subject: Do our own resampling --- src/audio/i2s_audio_output.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index e53dbe2a..4eab3e02 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -117,11 +117,18 @@ auto I2SAudioOutput::AdjustVolumeDown() -> bool { auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) -> StreamInfo::Pcm { + /* return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), }; + */ + return StreamInfo::Pcm{ + .channels = std::min(orig.channels, 2), + .bits_per_sample = 16, + .sample_rate = 48000, + }; } auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> void { -- cgit v1.2.3 From 4118d880c3f20dbd9304a3f50d6d111f194592c8 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Aug 2023 09:47:44 +1000 Subject: Fix dangle build issues, do some tweaks to investigate performance --- src/audio/i2s_audio_output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 4eab3e02..41640e7a 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -127,7 +127,7 @@ auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = 16, - .sample_rate = 48000, + .sample_rate = 44100, }; } -- cgit v1.2.3 From a66c3428063017f2233b6b15d5ce6c920d5c9095 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Aug 2023 14:26:04 +1000 Subject: Resampling *basically* working? Just cleanup and buffering issues --- src/audio/i2s_audio_output.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 41640e7a..09dc1ce8 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -117,18 +117,19 @@ auto I2SAudioOutput::AdjustVolumeDown() -> bool { auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) -> StreamInfo::Pcm { - /* return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), }; - */ + /* return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = 16, - .sample_rate = 44100, + //.sample_rate = std::clamp(orig.sample_rate, 8000, 96000), + .sample_rate = 32000, }; + */ } auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> void { -- cgit v1.2.3 From c38754401b95642b5e61fd273c2adf7d76a829fe Mon Sep 17 00:00:00 2001 From: jacqueline Date: Mon, 7 Aug 2023 18:22:15 +1000 Subject: Downscaling working! --- src/audio/i2s_audio_output.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 09dc1ce8..e8aa8975 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -117,19 +117,19 @@ auto I2SAudioOutput::AdjustVolumeDown() -> bool { auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) -> StreamInfo::Pcm { - return StreamInfo::Pcm{ - .channels = std::min(orig.channels, 2), - .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), - .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), - }; - /* + /* +return StreamInfo::Pcm{ + .channels = std::min(orig.channels, 2), + .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), + .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), +}; + */ return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = 16, //.sample_rate = std::clamp(orig.sample_rate, 8000, 96000), - .sample_rate = 32000, + .sample_rate = 44100, }; - */ } auto I2SAudioOutput::Configure(const StreamInfo::Pcm& pcm) -> void { -- cgit v1.2.3 From 6c99f9f2fee0928987fe944c8ed29878064df87a Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 8 Aug 2023 11:36:10 +1000 Subject: Fix resampler issue, do a little performance tuning --- src/audio/i2s_audio_output.cpp | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index e8aa8975..e53dbe2a 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -117,18 +117,10 @@ auto I2SAudioOutput::AdjustVolumeDown() -> bool { auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) -> StreamInfo::Pcm { - /* -return StreamInfo::Pcm{ - .channels = std::min(orig.channels, 2), - .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), - .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), -}; - */ return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), - .bits_per_sample = 16, - //.sample_rate = std::clamp(orig.sample_rate, 8000, 96000), - .sample_rate = 44100, + .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), + .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), }; } -- cgit v1.2.3 From 93ccf11fc506b95221ce0c5eddaed9e0e6c8b3b5 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 8 Aug 2023 13:47:08 +1000 Subject: Investigate and improve core pinning for resampler --- src/audio/i2s_audio_output.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index e53dbe2a..d60ddfa4 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -120,7 +120,8 @@ auto I2SAudioOutput::PrepareFormat(const StreamInfo::Pcm& orig) return StreamInfo::Pcm{ .channels = std::min(orig.channels, 2), .bits_per_sample = std::clamp(orig.bits_per_sample, 16, 32), - .sample_rate = std::clamp(orig.sample_rate, 8000, 96000), + .sample_rate = 44100, + //.sample_rate = std::clamp(orig.sample_rate, 8000, 96000), }; } -- cgit v1.2.3