summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-04 16:17:55 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-04 16:17:55 +1000
commitd5d6e3993cd67238ff245446e69e2f200c3fd0e5 (patch)
tree6245939ab341694363eac8bc24ab1b91b5140c6e /src/audio
parent6d831fa7a8c50e15424814fd2be1dd3951e06a4f (diff)
downloadtangara-fw-d5d6e3993cd67238ff245446e69e2f200c3fd0e5.tar.gz
Support changing max volume, persisted to nvs
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio_fsm.cpp20
-rw-r--r--src/audio/i2s_audio_output.cpp18
-rw-r--r--src/audio/include/audio_events.hpp4
-rw-r--r--src/audio/include/audio_fsm.hpp2
-rw-r--r--src/audio/include/i2s_audio_output.hpp4
5 files changed, 43 insertions, 5 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp
index 9121cb5a..f5ce2957 100644
--- a/src/audio/audio_fsm.cpp
+++ b/src/audio/audio_fsm.cpp
@@ -5,6 +5,7 @@
*/
#include "audio_fsm.hpp"
+#include <stdint.h>
#include <future>
#include <memory>
@@ -29,6 +30,7 @@
#include "system_events.hpp"
#include "track.hpp"
#include "track_queue.hpp"
+#include "wm8523.hpp"
namespace audio {
@@ -39,6 +41,7 @@ std::shared_ptr<system_fsm::ServiceLocator> AudioState::sServices;
std::shared_ptr<FatfsAudioInput> AudioState::sFileSource;
std::unique_ptr<Decoder> AudioState::sDecoder;
std::shared_ptr<SampleConverter> AudioState::sSampleConverter;
+std::shared_ptr<I2SAudioOutput> AudioState::sI2SOutput;
std::shared_ptr<IAudioOutput> AudioState::sOutput;
std::optional<database::TrackId> AudioState::sCurrentTrack;
@@ -65,6 +68,13 @@ void AudioState::react(const system_fsm::HasPhonesChanged& ev) {
}
}
+void AudioState::react(const ChangeMaxVolume& ev) {
+ ESP_LOGI(kTag, "new max volume %u db",
+ (ev.new_max - drivers::wm8523::kLineLevelReferenceVolume) / 4);
+ sI2SOutput->SetMaxVolume(ev.new_max);
+ sServices->nvs().AmpMaxVolume(ev.new_max);
+}
+
namespace states {
void Uninitialised::react(const system_fsm::BootComplete& ev) {
@@ -78,8 +88,14 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) {
}
sFileSource.reset(new FatfsAudioInput(sServices->tag_parser()));
- sOutput.reset(new I2SAudioOutput(sServices->gpios(),
- std::unique_ptr<drivers::I2SDac>{*dac}));
+ sI2SOutput.reset(new I2SAudioOutput(sServices->gpios(),
+ std::unique_ptr<drivers::I2SDac>{*dac}));
+
+ auto& nvs = sServices->nvs();
+ sI2SOutput->SetMaxVolume(nvs.AmpMaxVolume().get());
+ sI2SOutput->SetVolumeDb(nvs.AmpCurrentVolume().get());
+
+ sOutput = sI2SOutput;
// sOutput.reset(new BluetoothAudioOutput(bluetooth));
sSampleConverter.reset(new SampleConverter());
diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp
index 927f6541..68b03145 100644
--- a/src/audio/i2s_audio_output.cpp
+++ b/src/audio/i2s_audio_output.cpp
@@ -5,6 +5,7 @@
*/
#include "i2s_audio_output.hpp"
+#include <stdint.h>
#include <algorithm>
#include <cstddef>
@@ -48,9 +49,8 @@ I2SAudioOutput::I2SAudioOutput(drivers::IGpios& expander,
dac_(std::move(dac)),
current_config_(),
left_difference_(0),
- current_volume_(kDefaultVolume),
- max_volume_(kLineLevelVolume) {
- SetVolume(GetVolume());
+ current_volume_(0),
+ max_volume_(0) {
dac_->SetSource(stream());
}
@@ -72,6 +72,18 @@ auto I2SAudioOutput::SetVolumeImbalance(int_fast8_t balance) -> void {
SetVolume(GetVolume());
}
+auto I2SAudioOutput::SetMaxVolume(uint16_t max) -> void {
+ max_volume_ = std::clamp(max, drivers::wm8523::kAbsoluteMinVolume,
+ drivers::wm8523::kAbsoluteMaxVolume);
+ SetVolume(GetVolume());
+}
+
+auto I2SAudioOutput::SetVolumeDb(uint16_t vol) -> void {
+ current_volume_ =
+ std::clamp(vol, drivers::wm8523::kAbsoluteMinVolume, max_volume_);
+ SetVolume(GetVolume());
+}
+
auto I2SAudioOutput::SetVolume(uint_fast8_t percent) -> void {
percent = std::min<uint_fast8_t>(percent, 100);
float new_value = static_cast<float>(max_volume_) / 100 * percent;
diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp
index 8ee8b057..7433d159 100644
--- a/src/audio/include/audio_events.hpp
+++ b/src/audio/include/audio_events.hpp
@@ -6,6 +6,7 @@
#pragma once
+#include <stdint.h>
#include <cstdint>
#include <string>
@@ -36,6 +37,9 @@ struct PlayFile : tinyfsm::Event {
};
struct VolumeChanged : tinyfsm::Event {};
+struct ChangeMaxVolume : tinyfsm::Event {
+ uint16_t new_max;
+};
struct TogglePlayPause : tinyfsm::Event {};
diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp
index 1376feae..46d3d338 100644
--- a/src/audio/include/audio_fsm.hpp
+++ b/src/audio/include/audio_fsm.hpp
@@ -44,6 +44,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
void react(const system_fsm::KeyUpChanged&);
void react(const system_fsm::KeyDownChanged&);
void react(const system_fsm::HasPhonesChanged&);
+ void react(const ChangeMaxVolume&);
virtual void react(const system_fsm::BootComplete&) {}
@@ -63,6 +64,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> {
static std::shared_ptr<FatfsAudioInput> sFileSource;
static std::unique_ptr<Decoder> sDecoder;
static std::shared_ptr<SampleConverter> sSampleConverter;
+ static std::shared_ptr<I2SAudioOutput> sI2SOutput;
static std::shared_ptr<IAudioOutput> sOutput;
static std::optional<database::TrackId> sCurrentTrack;
diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp
index fa09deef..17f6b71a 100644
--- a/src/audio/include/i2s_audio_output.hpp
+++ b/src/audio/include/i2s_audio_output.hpp
@@ -6,6 +6,7 @@
#pragma once
+#include <stdint.h>
#include <cstdint>
#include <memory>
#include <vector>
@@ -25,6 +26,9 @@ class I2SAudioOutput : public IAudioOutput {
auto SetInUse(bool) -> void override;
+ auto SetMaxVolume(uint16_t) -> void;
+ auto SetVolumeDb(uint16_t) -> void;
+
auto SetVolumeImbalance(int_fast8_t balance) -> void override;
auto SetVolume(uint_fast8_t percent) -> void override;
auto GetVolume() -> uint_fast8_t override;