You've already forked MicroPythonOS
mirror of
https://github.com/m5stack/MicroPythonOS.git
synced 2026-05-20 11:51:27 -07:00
Work on adc_mic
This commit is contained in:
@@ -6,13 +6,13 @@ add_library(usermod_c_mpos INTERFACE)
|
||||
|
||||
set(MPOS_C_INCLUDES)
|
||||
|
||||
#set(MPOS_C_INCLUDES
|
||||
# ${CMAKE_CURRENT_LIST_DIR}/../lvgl_micropython/lib/micropython/ports/esp32/managed_components/espressif__esp_codec_dev/include/
|
||||
# ${CMAKE_CURRENT_LIST_DIR}/../lvgl_micropython/lib/micropython/ports/esp32/managed_components/espressif__esp_codec_dev/interface/
|
||||
#)
|
||||
set(MPOS_C_INCLUDES
|
||||
${CMAKE_CURRENT_LIST_DIR}/../lvgl_micropython/lib/micropython/ports/esp32/managed_components/espressif__esp_codec_dev/include/
|
||||
${CMAKE_CURRENT_LIST_DIR}/../lvgl_micropython/lib/micropython/ports/esp32/managed_components/espressif__esp_codec_dev/interface/
|
||||
)
|
||||
|
||||
set(MPOS_C_SOURCES
|
||||
# ${CMAKE_CURRENT_LIST_DIR}/src/adc_mic.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/adc_mic.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/src/quirc_decode.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/quirc/lib/identify.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/quirc/lib/version_db.c
|
||||
|
||||
+44
-22
@@ -12,28 +12,54 @@
|
||||
|
||||
#define ADC_MIC_DEBUG_PRINT(...) mp_printf(&mp_plat_print, __VA_ARGS__)
|
||||
|
||||
static mp_obj_t adc_mic_read(mp_obj_t chunk_samples_obj) {
|
||||
// Extract chunk_samples from argument
|
||||
size_t chunk_samples = mp_obj_get_int(chunk_samples_obj);
|
||||
static mp_obj_t adc_mic_read(size_t n_args, const mp_obj_t *args) {
|
||||
// Extract arguments
|
||||
// args[0]: chunk_samples
|
||||
// args[1]: unit_id
|
||||
// args[2]: adc_channel_list
|
||||
// args[3]: adc_channel_num
|
||||
// args[4]: sample_rate_hz
|
||||
// args[5]: atten
|
||||
|
||||
size_t chunk_samples = mp_obj_get_int(args[0]);
|
||||
int unit_id = mp_obj_get_int(args[1]);
|
||||
|
||||
mp_obj_t channel_list_obj = args[2];
|
||||
size_t channel_list_len;
|
||||
mp_obj_t *channel_list_items;
|
||||
mp_obj_get_array(channel_list_obj, &channel_list_len, &channel_list_items);
|
||||
|
||||
int adc_channel_num = mp_obj_get_int(args[3]);
|
||||
int sample_rate_hz = mp_obj_get_int(args[4]);
|
||||
int atten = mp_obj_get_int(args[5]);
|
||||
|
||||
ADC_MIC_DEBUG_PRINT("Starting adc_mic_read...\n");
|
||||
ADC_MIC_DEBUG_PRINT("CONFIG_ADC_MIC_TASK_CORE: %d\n", CONFIG_ADC_MIC_TASK_CORE);
|
||||
|
||||
// Configuration (your current manual setup with 2.5 dB atten)
|
||||
if (adc_channel_num > 10) {
|
||||
mp_raise_ValueError("Too many channels (max 10)");
|
||||
}
|
||||
if (channel_list_len < adc_channel_num) {
|
||||
mp_raise_ValueError("adc_channel_list shorter than adc_channel_num");
|
||||
}
|
||||
|
||||
uint8_t channels[10];
|
||||
for (size_t i = 0; i < adc_channel_num; i++) {
|
||||
channels[i] = (uint8_t)mp_obj_get_int(channel_list_items[i]);
|
||||
}
|
||||
|
||||
// Configuration
|
||||
audio_codec_adc_cfg_t cfg = {
|
||||
.handle = NULL,
|
||||
.max_store_buf_size = 1024 * 2,
|
||||
.conv_frame_size = 1024,
|
||||
.unit_id = ADC_UNIT_1,
|
||||
.adc_channel_list = ((uint8_t[]){ADC_CHANNEL_0}),
|
||||
.adc_channel_num = 1,
|
||||
.sample_rate_hz = 16000,
|
||||
//.atten = ADC_ATTEN_DB_0, // values always 16380
|
||||
//.atten = ADC_ATTEN_DB_2_5, // values always 16380
|
||||
.atten = ADC_ATTEN_DB_6, // values around 12500 +/- 320 (silence) or 4000 (loud talk)
|
||||
//.atten = ADC_ATTEN_DB_11, // values around -1130 +/- 160 (silence)
|
||||
.unit_id = (adc_unit_t)unit_id,
|
||||
.adc_channel_list = channels,
|
||||
.adc_channel_num = adc_channel_num, // can probably just count adc_channel_list
|
||||
.sample_rate_hz = sample_rate_hz,
|
||||
.atten = (adc_atten_t)atten,
|
||||
};
|
||||
ADC_MIC_DEBUG_PRINT("Config created for channel %d, sample rate %d, atten %d\n", ADC_CHANNEL_0, 16000, cfg.atten);
|
||||
ADC_MIC_DEBUG_PRINT("Config created for unit %d, channels %d, sample rate %d, atten %d\n", unit_id, adc_channel_num, sample_rate_hz, atten);
|
||||
|
||||
// ────────────────────────────────────────────────
|
||||
// Initialization (same as before)
|
||||
@@ -55,8 +81,8 @@ static mp_obj_t adc_mic_read(mp_obj_t chunk_samples_obj) {
|
||||
}
|
||||
|
||||
esp_codec_dev_sample_info_t fs = {
|
||||
.sample_rate = 16000,
|
||||
.channel = 1,
|
||||
.sample_rate = sample_rate_hz,
|
||||
.channel = adc_channel_num,
|
||||
.bits_per_sample = 16,
|
||||
};
|
||||
esp_err_t open_ret = esp_codec_dev_open(dev, &fs);
|
||||
@@ -69,9 +95,9 @@ static mp_obj_t adc_mic_read(mp_obj_t chunk_samples_obj) {
|
||||
// ────────────────────────────────────────────────
|
||||
// Small reusable buffer + tracking variables
|
||||
// ────────────────────────────────────────────────
|
||||
const size_t buf_size = chunk_samples * sizeof(int16_t);
|
||||
const size_t buf_size = chunk_samples * sizeof(int16_t) * adc_channel_num;
|
||||
int16_t *audio_buffer = heap_caps_malloc(buf_size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT);
|
||||
//int16_t *audio_buffer = heap_caps_thread.start_new_thread(testit, ())_malloc_prefer(buf_size, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT);
|
||||
//int16_t *audio_buffer = heap_caps_malloc_prefer(buf_size, MALLOC_CAP_DEFAULT | MALLOC_CAP_SPIRAM, MALLOC_CAP_DEFAULT);
|
||||
if (audio_buffer == NULL) {
|
||||
esp_codec_dev_close(dev);
|
||||
esp_codec_dev_delete(dev);
|
||||
@@ -99,10 +125,6 @@ static mp_obj_t adc_mic_read(mp_obj_t chunk_samples_obj) {
|
||||
break;
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(1)); // 1 ms yield
|
||||
//if (ret != (int)buf_size) {
|
||||
// ADC_MIC_DEBUG_PRINT("Partial read at chunk %d: got %d bytes (expected %zu)\n",
|
||||
// chunk, ret, buf_size);
|
||||
//}
|
||||
|
||||
// Update global min/max
|
||||
for (size_t i = 0; i < chunk_samples; i++) {
|
||||
@@ -146,7 +168,7 @@ static mp_obj_t adc_mic_read(mp_obj_t chunk_samples_obj) {
|
||||
|
||||
return last_buf_obj ? last_buf_obj : mp_obj_new_bytes(NULL, 0);
|
||||
}
|
||||
MP_DEFINE_CONST_FUN_OBJ_1(adc_mic_read_obj, adc_mic_read);
|
||||
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(adc_mic_read_obj, 6, 6, adc_mic_read);
|
||||
|
||||
static const mp_rom_map_elem_t adc_mic_module_globals_table[] = {
|
||||
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_adc_mic) },
|
||||
|
||||
+11
-2
@@ -29,7 +29,7 @@ popd
|
||||
idfile="$codebasedir"/lvgl_micropython/lib/micropython/ports/esp32/main/idf_component.yml
|
||||
echo "Patching $idfile"...
|
||||
|
||||
echo "Check need to add esp32-camera..."
|
||||
echo "Check need to add esp32-camera to $idfile"
|
||||
if ! grep esp32-camera "$idfile"; then
|
||||
echo "Adding esp32-camera to $idfile"
|
||||
echo " mpos/esp32-camera:
|
||||
@@ -37,7 +37,16 @@ if ! grep esp32-camera "$idfile"; then
|
||||
else
|
||||
echo "No need to add esp32-camera to $idfile"
|
||||
fi
|
||||
echo "Resulting file:"
|
||||
|
||||
echo "Check need to add adc_mic to $idfile"
|
||||
if ! grep esp32-camera "$idfile"; then
|
||||
echo "Adding esp32-camera to $idfile"
|
||||
echo ' espressif/adc_mic: "*"' >> "$idfile"
|
||||
else
|
||||
echo "No need to add adc_mic to $idfile"
|
||||
fi
|
||||
|
||||
echo "Resulting $idfile file:"
|
||||
cat "$idfile"
|
||||
|
||||
echo "Check need to add lvgl_micropython manifest to micropython-camera-API's manifest..."
|
||||
|
||||
Reference in New Issue
Block a user