Persistent audio mute support (#1161)

* Persistent speaker mute support #1100
* Moving persistent mute support from WM8731/AK4951 codec files to audio.cpp module for simplification
This commit is contained in:
Mark Thompson
2023-06-17 16:15:21 -05:00
committed by GitHub
parent 5743d3a3b9
commit ba2407d691
12 changed files with 159 additions and 80 deletions

View File

@@ -102,7 +102,6 @@ POCSAGAppView::POCSAGAppView(NavigationView& nav) {
logger->append(LOG_ROOT_DIR "/POCSAG.TXT");
audio::output::start();
audio::output::unmute();
baseband::set_pocsag();
}

View File

@@ -235,7 +235,6 @@ SetFrequencyCorrectionModel SetRadioView::form_collect() {
SetUIView::SetUIView(NavigationView& nav) {
add_children({&checkbox_disable_touchscreen,
&checkbox_speaker,
&checkbox_bloff,
&options_bloff,
&checkbox_showsplash,
@@ -246,7 +245,6 @@ SetUIView::SetUIView(NavigationView& nav) {
&button_cancel});
checkbox_disable_touchscreen.set_value(persistent_memory::disable_touchscreen());
checkbox_speaker.set_value(persistent_memory::config_speaker());
checkbox_showsplash.set_value(persistent_memory::config_splash());
checkbox_showclock.set_value(!persistent_memory::hide_clock());
checkbox_guireturnflag.set_value(persistent_memory::show_gui_return_icon());
@@ -272,11 +270,6 @@ SetUIView::SetUIView(NavigationView& nav) {
persistent_memory::set_clock_with_date(false);
}
if (checkbox_speaker.value()) audio::output::speaker_mute(); // Just mute audio if speaker is disabled
persistent_memory::set_config_speaker(checkbox_speaker.value()); // Store Speaker status
StatusRefreshMessage message{}; // Refresh status bar with/out speaker
EventDispatcher::send_message(message);
persistent_memory::set_config_splash(checkbox_showsplash.value());
persistent_memory::set_clock_hidden(!checkbox_showclock.value());
persistent_memory::set_gui_return_icon(checkbox_guireturnflag.value());
@@ -524,13 +517,16 @@ void SetPersistentMemoryView::focus() {
SetAudioView::SetAudioView(NavigationView& nav) {
add_children({&labels,
&field_tone_mix,
&checkbox_speaker_disable,
&button_save,
&button_cancel});
field_tone_mix.set_value(persistent_memory::tone_mix());
checkbox_speaker_disable.set_value(persistent_memory::config_speaker_disable());
button_save.on_select = [&nav, this](Button&) {
persistent_memory::set_tone_mix(field_tone_mix.value());
persistent_memory::set_config_speaker_disable(checkbox_speaker_disable.value());
nav.pop();
};

View File

@@ -212,17 +212,12 @@ class SetUIView : public View {
20,
"Disable touchscreen"};
Checkbox checkbox_speaker{
{3 * 8, 4 * 16},
20,
"Hide H1 Speaker option"};
Checkbox checkbox_bloff{
{3 * 8, 6 * 16},
{3 * 8, 4 * 16},
20,
"Backlight off after:"};
OptionsField options_bloff{
{52, 7 * 16 + 8},
{60, 5 * 16 + 8},
20,
{
{"5 seconds", backlight_timeout_t::Timeout5Sec},
@@ -236,25 +231,25 @@ class SetUIView : public View {
}};
Checkbox checkbox_showsplash{
{3 * 8, 9 * 16},
{3 * 8, 7 * 16},
20,
"Show splash"};
Checkbox checkbox_showclock{
{3 * 8, 11 * 16},
{3 * 8, 9 * 16},
20,
"Show clock with:"};
OptionsField options_clockformat{
{52, 12 * 16 + 8},
{60, 10 * 16 + 8},
20,
{{"time only", 0},
{"time and date", 1}}};
Checkbox checkbox_guireturnflag{
{3 * 8, 14 * 16},
{3 * 8, 12 * 16},
25,
"add return icon in GUI"};
"Show return icon in GUI"};
Button button_save{
{2 * 8, 16 * 16, 12 * 8, 32},
@@ -393,6 +388,11 @@ class SetAudioView : public View {
1,
'0'};
Checkbox checkbox_speaker_disable{
{2 * 8, 6 * 16},
25,
"Disable AK speaker amp"};
Button button_save{
{2 * 8, 16 * 16, 12 * 8, 32},
"Save"};

View File

@@ -117,7 +117,6 @@ SondeView::SondeView(NavigationView& nav) {
logger->append(LOG_ROOT_DIR "/SONDE.TXT");
audio::output::start();
audio::output::speaker_unmute();
// inject a PitchRSSIConfigureMessage in order to arm
// the pitch rssi events that will be used by the

View File

@@ -134,6 +134,10 @@ static audio::Codec* audio_codec = nullptr;
namespace output {
static bool cfg_speaker_disable = false;
static bool nav_requested_mute = false;
static bool app_requested_mute = false;
void start() {
i2s::i2s0::tx_start();
unmute();
@@ -145,23 +149,46 @@ void stop() {
}
void mute() {
app_requested_mute = true;
i2s::i2s0::tx_mute();
audio_codec->headphone_disable();
}
void unmute() {
i2s::i2s0::tx_unmute();
audio_codec->headphone_enable();
}
void speaker_mute() {
i2s::i2s0::tx_mute();
audio_codec->speaker_disable();
}
void unmute() {
app_requested_mute = false;
if (!nav_requested_mute) {
i2s::i2s0::tx_unmute();
audio_codec->headphone_enable();
if (!cfg_speaker_disable) {
audio_codec->speaker_enable();
}
}
}
void speaker_disable() {
cfg_speaker_disable = true;
audio_codec->speaker_disable();
}
void speaker_enable() {
cfg_speaker_disable = false;
}
// The following functions are used by the navigation-bar Speaker Mute only,
// and override all other audio mute/unmute requests from apps
void speaker_mute() {
nav_requested_mute = true;
i2s::i2s0::tx_mute();
audio_codec->speaker_disable();
audio_codec->headphone_disable();
}
void speaker_unmute() {
i2s::i2s0::tx_unmute();
audio_codec->speaker_enable();
nav_requested_mute = false;
if (!app_requested_mute) {
unmute();
}
}
} /* namespace output */

View File

@@ -65,6 +65,8 @@ void stop();
void mute();
void unmute();
void speaker_disable();
void speaker_enable();
void speaker_mute();
void speaker_unmute();

View File

@@ -96,13 +96,18 @@ bool get_antenna_bias() {
return antenna_bias;
}
bool speaker_mode{false};
void set_speaker_mode(const bool v) {
speaker_mode = v;
if (speaker_mode)
audio::output::speaker_unmute();
else
void set_audio_mute(const bool v) {
if (v)
audio::output::speaker_mute();
else
audio::output::speaker_unmute();
}
void set_speaker_disable(const bool v) {
if (v)
audio::output::speaker_disable();
else
audio::output::speaker_enable();
}
static constexpr uint32_t systick_count(const uint32_t clock_source_f) {

View File

@@ -53,8 +53,8 @@ extern ClockManager clock_manager;
extern ReceiverModel receiver_model;
extern TransmitterModel transmitter_model;
extern bool speaker_mode;
void set_speaker_mode(const bool v);
void set_audio_mute(const bool v);
void set_speaker_disable(const bool v);
extern uint32_t bl_tick_counter;
extern bool antenna_bias;

View File

@@ -126,11 +126,6 @@ SystemStatusView::SystemStatusView(
portapack::persistent_memory::load_persistent_settings_from_file();
}
if (portapack::persistent_memory::config_speaker())
button_speaker.hidden(false);
else
button_speaker.hidden(true);
if (portapack::persistent_memory::config_hide_converter()) {
button_converter.hidden(true);
} else {
@@ -217,16 +212,16 @@ void SystemStatusView::refresh() {
button_converter.set_foreground(Color::light_grey());
}
}
// Poke tunings to take converter change in account.
receiver_model.set_target_frequency(receiver_model.target_frequency());
transmitter_model.set_target_frequency(transmitter_model.target_frequency());
if (!portapack::persistent_memory::config_speaker()) {
portapack::set_speaker_disable(portapack::persistent_memory::config_speaker_disable());
portapack::set_audio_mute(portapack::persistent_memory::config_audio_mute());
if (portapack::persistent_memory::config_audio_mute()) {
button_speaker.set_foreground(Color::light_grey());
button_speaker.set_bitmap(&bitmap_icon_speaker_mute);
button_speaker.hidden(false);
} else {
button_speaker.hidden(true);
button_speaker.set_foreground(Color::green());
button_speaker.set_bitmap(&bitmap_icon_speaker);
}
if (portapack::get_antenna_bias()) {
@@ -285,20 +280,21 @@ void SystemStatusView::on_converter() {
button_converter.set_foreground(Color::light_grey());
}
// Poke to update tuning.
// Poke to update tuning
// NOTE: Code assumes here that a TX app isn't active, since RX & TX have diff tuning offsets
// (and there's only one tuner in the radio so can't update tuner for both).
receiver_model.set_target_frequency(receiver_model.target_frequency());
}
void SystemStatusView::on_speaker() {
if (!portapack::speaker_mode) {
portapack::set_speaker_mode(true);
button_speaker.set_foreground(Color::green());
button_speaker.set_bitmap(&bitmap_icon_speaker);
if (portapack::persistent_memory::config_audio_mute()) {
portapack::set_audio_mute(false);
portapack::persistent_memory::set_config_audio_mute(false);
} else {
portapack::set_speaker_mode(false);
button_speaker.set_foreground(Color::light_grey());
button_speaker.set_bitmap(&bitmap_icon_speaker_mute);
portapack::set_audio_mute(true);
portapack::persistent_memory::set_config_audio_mute(true);
}
refresh();
}
void SystemStatusView::on_stealth() {