forked from xiaozhi/xiaozhi-esp32
修复麦克风PDM数据位宽读取bug,唤醒也能正常使用 (#284)
* 修复麦克风PDM数据位宽读取bug,唤醒也能正常使用 * 重载NoAudioCodecSimplexPdm::Read()
This commit is contained in:
@@ -197,5 +197,4 @@ config USE_WAKE_WORD_DETECT
|
||||
depends on IDF_TARGET_ESP32S3 && USE_AFE
|
||||
help
|
||||
需要 ESP32 S3 与 AFE 支持
|
||||
|
||||
endmenu
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <esp_log.h>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
#define TAG "NoAudioCodec"
|
||||
|
||||
@@ -372,3 +373,22 @@ int NoAudioCodec::Read(int16_t* dest, int samples) {
|
||||
}
|
||||
return samples;
|
||||
}
|
||||
|
||||
int NoAudioCodecSimplexPdm::Read(int16_t* dest, int samples) {
|
||||
size_t bytes_read;
|
||||
|
||||
// PDM 解调后的数据位宽为 16 位
|
||||
std::vector<int16_t> bit16_buffer(samples);
|
||||
if (i2s_channel_read(rx_handle_, bit16_buffer.data(), samples * sizeof(int16_t), &bytes_read, portMAX_DELAY) != ESP_OK) {
|
||||
ESP_LOGE(TAG, "Read Failed!");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// 计算实际读取的样本数
|
||||
samples = bytes_read / sizeof(int16_t);
|
||||
|
||||
// 将 16 位数据直接复制到目标缓冲区
|
||||
memcpy(dest, bit16_buffer.data(), samples * sizeof(int16_t));
|
||||
|
||||
return samples;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ public:
|
||||
class NoAudioCodecSimplexPdm : public NoAudioCodec {
|
||||
public:
|
||||
NoAudioCodecSimplexPdm(int input_sample_rate, int output_sample_rate, gpio_num_t spk_bclk, gpio_num_t spk_ws, gpio_num_t spk_dout, gpio_num_t mic_sck, gpio_num_t mic_din);
|
||||
int Read(int16_t* dest, int samples);
|
||||
};
|
||||
|
||||
#endif // _NO_AUDIO_CODEC_H
|
||||
|
||||
Reference in New Issue
Block a user