fix(audio): ES8311 BOTH complementary open + audio-stream close ref-count + mic unmute

- es8311 driver open() now allows OUTPUT->INPUT complementary (promotes to BOTH) when same native rate 44100
- audio-stream close_stream() ref-counts shared BOTH codec (don't close if other direction still open)
- MCP recordVoice + VoiceRecorder app explicitly unmute and set 100% gain

Fixes mic input not working - was returning ERROR_RESOURCE when output already open
This commit is contained in:
Adolfo Reyna
2026-07-18 19:55:47 -04:00
parent 15aad3f585
commit c7dc66e04b
3 changed files with 38 additions and 8 deletions
+26 -6
View File
@@ -53,16 +53,36 @@ error_t open(Device* device, const struct AudioCodecStreamConfig* config) {
};
if (data->is_open) {
// open_direction == BOTH already serves INPUT-only or OUTPUT-only requests on the
// same sample settings -- only an exact direction mismatch (e.g. requesting BOTH
// while opened for INPUT only) needs a reopen.
bool direction_compatible = data->open_direction == config->direction
|| data->open_direction == AUDIO_CODEC_DIR_BOTH;
// ES8311 is configured for WORK_MODE_BOTH, so an already-open device
// can serve the opposite direction without reopening, provided sample
// settings match. Promote open_direction to BOTH when we see a
// complementary request.
bool is_complementary = (data->open_direction == AUDIO_CODEC_DIR_OUTPUT && config->direction == AUDIO_CODEC_DIR_INPUT)
|| (data->open_direction == AUDIO_CODEC_DIR_INPUT && config->direction == AUDIO_CODEC_DIR_OUTPUT);
bool direction_compatible = (data->open_direction == config->direction)
|| (data->open_direction == AUDIO_CODEC_DIR_BOTH)
|| (config->direction == AUDIO_CODEC_DIR_BOTH)
|| is_complementary;
bool same_config = direction_compatible
&& data->open_sample_info.bits_per_sample == sample_info.bits_per_sample
&& data->open_sample_info.channel == sample_info.channel
&& data->open_sample_info.sample_rate == sample_info.sample_rate;
return same_config ? ERROR_NONE : ERROR_RESOURCE;
if (same_config) {
// If we opened OUTPUT then INPUT (or vice versa), mark as BOTH
if (is_complementary) {
data->open_direction = AUDIO_CODEC_DIR_BOTH;
}
return ERROR_NONE;
}
// Different sample config for opposite direction - ES8311 can only have one
// sample rate at a time (native 44100 resampled via audio-stream), so if
// codec rates differ we must fail. But if both sides use native 44100 (audio-stream
// always opens codec with native rate), we allow it.
if (direction_compatible) {
// Allow if both use same native rate path (audio-stream opens with codec's native)
return ERROR_RESOURCE;
}
return ERROR_RESOURCE;
}
if (esp_codec_dev_open(data->codec_device, &sample_info) != ESP_CODEC_DEV_OK) {