#include "encoder_acquistion.h" #include "config.h" #include "stdlib.h" #include "zassert.h" #include "zboard.h" #include "zthread.h" #define REPORT_BUF_SIZE 1000 #define TAG "aencoder_acquistion_driver" static zthread_t s_workingthread; uint8_t *s_reportbuf; uint32_t s_reportbufsize; encoder_acquisition_cb_t s_cb; /** * @brief 在这里上报语音 * * @param arg * * PS: * 函数效率在240MHZ的情况下,1s的语音数据(32bit,16k)大概需要2ms的处理时间 */ static void prv_workingthread(void *arg) { while (!zthread_is_expect_stop(&s_workingthread)) { size_t bytes_read; // ESP_LOGI(TAG, "read %d ", bytes_read); if (s_cb) { #if 0 //测试放大方法效率 uint32_t sticket = xTaskGetTickCount(); for(unsigned i = 0; i < 16*4; ++i) { amf_voice(s_reportbuf, bytes_read); } uint32_t endticket = xTaskGetTickCount(); ESP_LOGI(TAG, " %d use %d", bytes_read,endticket - sticket); #else // amf_voice(s_reportbuf, bytes_read); #endif // 因为MIC最大响度能够达到的幅值为0.316v,和3.3v差了3.3/0.316倍, // 又因为PCM1808位宽为24bit,32位中低八位为零,已经默认放大 // 则可以保证数据放大3.3/0.316后数据是无损的. for (size_t i = 0; i < bytes_read; i += 4) { int32_t *rxdata = (int32_t *)&s_reportbuf[i]; (*rxdata) = (*rxdata) * 3.3 / 0.316; } // 对音频按照配置进行放大 for (size_t i = 0; i < bytes_read; i += 4) { int32_t *rxdata = (int32_t *)&s_reportbuf[i]; } s_cb(s_reportbuf, bytes_read); } } } void encoder_acquisition_init(encoder_acquisition_cb_t cb) { // s_workingthread // s_workingthread s_reportbuf = malloc(REPORT_BUF_SIZE); s_reportbufsize = REPORT_BUF_SIZE; s_cb = cb; Z_ASSERT(s_reportbuf); Z_ASSERT(s_reportbufsize); Z_ASSERT(s_cb); zthread_init(&s_workingthread, "encoder_acquistion_driver", prv_workingthread); } void encoder_acquisition_start_cauture() { zthread_start(&s_workingthread); } void encoder_acquisition_stop_cauture() { zthread_stop(&s_workingthread); }