diff --git a/firmware/application/apps/ui_mictx.cpp b/firmware/application/apps/ui_mictx.cpp index 4aa216d4..898bf32c 100644 --- a/firmware/application/apps/ui_mictx.cpp +++ b/firmware/application/apps/ui_mictx.cpp @@ -183,11 +183,7 @@ void MicTXView::rxaudio(bool is_on) { baseband::run_image(portapack::spi_flash::image_tag_mic_tx); audio::output::stop(); - audio::input::start(ak4951_alc_and_wm8731_boost_GUI); // When detected AK4951 => set up ALC mode; when detected WM8731 => set up mic_boost ON/OFF. - if (mic_to_HP_enabled) - audio::input::loopback_mic_to_hp_enable(); - else - audio::input::loopback_mic_to_hp_disable(); + audio::input::start(ak4951_alc_and_wm8731_boost_GUI, mic_to_HP_enabled); // set up ALC mode (AK4951) or set up mic_boost ON/OFF (WM8731). and the check box "Hear Mic" portapack::pin_i2s0_rx_sda.mode(3); configure_baseband(); } @@ -291,25 +287,17 @@ MicTXView::MicTXView( shift_bits_s16 = 6; // -08 dB’s respect ref level, (when +20dB's boost OFF) break; // now mic-boost off (+00dBs) shift bits (6) (+0+12dB's)=12 dBs => -08dB's respect ref. } - ak4951_alc_and_wm8731_boost_GUI = v; // 0..4, WM8731_boost dB's options, (combination boost on/off, and effective gain in captured data >>x) - audio::input::start(ak4951_alc_and_wm8731_boost_GUI); // Detected (WM8731), set up the proper wm_boost on/off, 0..4 (0,1) boost_on, (2,3,4) boost_off - if (mic_to_HP_enabled) - audio::input::loopback_mic_to_hp_enable(); - else - audio::input::loopback_mic_to_hp_disable(); - configure_baseband(); // to update in real time, sending msg, var-parameters >>shift_bits FM msg, to audio_tx from M0 to M4 Proc - + ak4951_alc_and_wm8731_boost_GUI = v; // 0..4, WM8731_boost dB's options, (combination boost on/off, and effective gain in captured data >>x) + audio::input::start(ak4951_alc_and_wm8731_boost_GUI, mic_to_HP_enabled); // Detected (WM8731), set up the proper wm_boost on/off, 0..4 (0,1) boost_on, (2,3,4) boost_off,and the check box "Hear Mic" + configure_baseband(); // to update in real time, sending msg, var-parameters >>shift_bits FM msg, to audio_tx from M0 to M4 Proc - }; options_wm8731_boost_mode.set_selected_index(3); // preset GUI index 3 as default WM -> -02 dB's. } else { shift_bits_s16 = 8; // Initialized default fixed >>8_FM for FM tx mod, shift audio data for AK4951, using top 8 bits s16 data (>>8) options_ak4951_alc_mode.on_change = [this](size_t, int8_t v) { - ak4951_alc_and_wm8731_boost_GUI = v; // 0..11, AK4951 Mic -Automatic volume Level Control options, - audio::input::start(ak4951_alc_and_wm8731_boost_GUI); // Detected (AK4951) ==> Set up proper ALC mode from 0..11 options - if (mic_to_HP_enabled) - audio::input::loopback_mic_to_hp_enable(); - else - audio::input::loopback_mic_to_hp_disable(); - configure_baseband(); // sending fixed >>8_FM, var-parameters msg, to audiotx from this M0 to M4 process. + ak4951_alc_and_wm8731_boost_GUI = v; // 0..11, AK4951 Mic -Automatic volume Level Control options, + audio::input::start(ak4951_alc_and_wm8731_boost_GUI, mic_to_HP_enabled); // Detected (AK4951) ==> Set up proper ALC mode from 0..11 options, and the check box "Hear Mic" + configure_baseband(); // sending fixed >>8_FM, var-parameters msg, to audiotx from this M0 to M4 process. }; } @@ -632,11 +620,7 @@ MicTXView::MicTXView( set_tx(false); audio::set_rate(audio::Rate::Hz_24000); - audio::input::start(ak4951_alc_and_wm8731_boost_GUI); // When detected AK4951 => set up ALC mode; when detected WM8731 => set up mic_boost ON/OFF. - if (mic_to_HP_enabled) - audio::input::loopback_mic_to_hp_enable(); - else - audio::input::loopback_mic_to_hp_disable(); + audio::input::start(ak4951_alc_and_wm8731_boost_GUI, mic_to_HP_enabled); // set up ALC mode (AK4951) or set up mic_boost ON/OFF (WM8731). and the check box "Hear Mic" } MicTXView::MicTXView( diff --git a/firmware/application/audio.cpp b/firmware/application/audio.cpp index 59f885be..2afc4215 100644 --- a/firmware/application/audio.cpp +++ b/firmware/application/audio.cpp @@ -198,8 +198,8 @@ void update_audio_mute() { namespace input { -void start(int8_t alc_mode) { - audio_codec->microphone_enable(alc_mode); // added user-GUI selection for AK4951, ALC mode parameter. +void start(int8_t alc_mode, bool mic_to_HP_enabled) { + audio_codec->microphone_enable(alc_mode, mic_to_HP_enabled); // added user-GUI selection for AK4951, ALC mode parameter. and the check box "Hear Mic" i2s::i2s0::rx_start(); } diff --git a/firmware/application/audio.hpp b/firmware/application/audio.hpp index f5cba0e9..7c144f5a 100644 --- a/firmware/application/audio.hpp +++ b/firmware/application/audio.hpp @@ -50,7 +50,7 @@ class Codec { virtual volume_range_t headphone_gain_range() const = 0; virtual void set_headphone_volume(const volume_t volume) = 0; - virtual void microphone_enable(int8_t alc_mode) = 0; // added user-GUI AK4951 ,selected ALC mode. + virtual void microphone_enable(int8_t alc_mode, bool mic_to_HP_enabled) = 0; // added user-GUI AK4951 ,selected ALC mode. virtual void microphone_disable() = 0; virtual void microphone_to_HP_enable() = 0; @@ -79,7 +79,7 @@ void update_audio_mute(); namespace input { -void start(int8_t alc_mode); // added parameter user-GUI select AK4951-ALC mode for config mic path,(recording mode in datasheet), +void start(int8_t alc_mode, bool mic_to_HP_enabled); // added parameters -GUI select AK4951-ALC mode for config mic path,(recording mode),and the check box "Hear Mic" void stop(); void loopback_mic_to_hp_enable(); diff --git a/firmware/common/ak4951.cpp b/firmware/common/ak4951.cpp index 2c029cf0..8106e27b 100644 --- a/firmware/common/ak4951.cpp +++ b/firmware/common/ak4951.cpp @@ -224,7 +224,7 @@ void AK4951::speaker_disable() { set_speaker_power(false); } -void AK4951::microphone_enable(int8_t alc_mode) { +void AK4951::microphone_enable(int8_t alc_mode, bool mic_to_HP_enabled) { // alc_mode =0 = (OFF =same as original code = NOT using AK4951 Programmable digital filter block), // alc_mode >1 (with DIGITAL FILTER BLOCK , example : 1:(+12dB) , 2:(+9dB)", 3:(+6dB), ...) @@ -505,6 +505,11 @@ void AK4951::microphone_enable(int8_t alc_mode) { map.r.power_management_1.PMPFIL = 1; // Pre-loaded in top part. Orig value=0, Programmable Digital filter unused (not power up), routed around. update(Register::PowerManagement1); // Activating the Power management of the used blocks . (Mic ADC always + Dig Block filter , when used ) + if (mic_to_HP_enabled) + microphone_to_HP_enable(); + else + microphone_to_HP_disable(); + // 1059/fs, 22ms @ 48kHz chThdSleepMilliseconds(22); } diff --git a/firmware/common/ak4951.hpp b/firmware/common/ak4951.hpp index 2638efd8..99cca870 100644 --- a/firmware/common/ak4951.hpp +++ b/firmware/common/ak4951.hpp @@ -844,7 +844,7 @@ class AK4951 : public audio::Codec { void set_headphone_volume(const volume_t volume) override; void headphone_mute(); - void microphone_enable(int8_t alc_mode); // added user GUI parameter , to set up AK4951 ALC mode. + void microphone_enable(int8_t alc_mode, bool mic_to_HP_enabled); // added user GUI parameter , to set up AK4951 ALC mode, and mic_to_HP_enabled to control "Hear to Mic" void microphone_disable(); void microphone_to_HP_enable(); diff --git a/firmware/common/wm8731.hpp b/firmware/common/wm8731.hpp index fcc64d4f..85c90382 100644 --- a/firmware/common/wm8731.hpp +++ b/firmware/common/wm8731.hpp @@ -349,13 +349,18 @@ class WM8731 : public audio::Codec { return false; } - void microphone_enable(int8_t wm8731_boost_GUI) override { + void microphone_enable(int8_t wm8731_boost_GUI, bool mic_to_HP_enabled) override { microphone_mute(true); // c/m to reduce "plop noise" when changing wm8731_boost_GUI. // chThdSleepMilliseconds(20); // does not help to reduce the "plop noise" microphone_boost((wm8731_boost_GUI < 2) ? 1 : 0); // 1 = Enable Boost (+20 dBs) . 0 = Disable Boost (0dBs). chThdSleepMilliseconds(120); // >50 msegs, very effective , >100 msegs minor improvement ,120 msegs trade off speed . microphone_mute(false); // (void)alc_mode; In prev. fw version , when we did not use at all param., to avoid "unused warning" when compiling.) + + if (mic_to_HP_enabled) + microphone_to_HP_enable(); + else + microphone_to_HP_disable(); } void microphone_disable() override {