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
|
depends on IDF_TARGET_ESP32S3 && USE_AFE
|
||||||
help
|
help
|
||||||
需要 ESP32 S3 与 AFE 支持
|
需要 ESP32 S3 与 AFE 支持
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include <esp_log.h>
|
#include <esp_log.h>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
#define TAG "NoAudioCodec"
|
#define TAG "NoAudioCodec"
|
||||||
|
|
||||||
@@ -372,3 +373,22 @@ int NoAudioCodec::Read(int16_t* dest, int samples) {
|
|||||||
}
|
}
|
||||||
return 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 {
|
class NoAudioCodecSimplexPdm : public NoAudioCodec {
|
||||||
public:
|
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);
|
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
|
#endif // _NO_AUDIO_CODEC_H
|
||||||
|
|||||||
Reference in New Issue
Block a user