Аудиофайлы в форматах MP3, WAV и PCM такой проблемы не вызывают.
Чип: AC7916A
Рабочая плата: JL_AC79_DEVKITBOARD V1.0
Программа: AC7901N_DEMO_DEMO_DEVKITBOARD: пример/аудио_демо/запись.c
Как использовать декодирование и кодирование Opus?
Отображение следующего:
[00:00:01.008]CPU1 run addr = 0x1e00000
[00:00:01.009]cpu 0 exception_analyze DEBUG_MSG = 0x80000, EMU_MSG = 0x0 C0_CON=1000000
[00:00:01.010]CPU0 21aa956 --> 2049714 --> 2049728 --> 0
[00:00:01.010]CPU1 2000daa --> 2000e36 --> 20005c2 --> 6eecbc6
[00:00:01.011]R0: 40039a4
[00:00:01.011]R1: 0
[00:00:01.012]R2: 0
[00:00:01.012]R3: 0
[00:00:01.012]R4: a4
[00:00:01.012]R5: 405db28
[00:00:01.013]R6: 405ce80
[00:00:01.013]R7: 0
[00:00:01.013]R8: 405dc08
[00:00:01.014]R9: 2126d8b
[00:00:01.014]R10: 405dae0
[00:00:01.014]R11: 405daa0
[00:00:01.015]R12: 4055b00
[00:00:01.015]R13: 40605dc
[00:00:01.015]R14: 1
[00:00:01.015]R15: 1
[00:00:01.016]icfg: 7010280
[00:00:01.016]psr: 2
[00:00:01.016]rets: 0x2049734
[00:00:01.017]reti: 0x2
[00:00:01.017]usp: 4060570, ssp: 1c14dac sp: 1c14dac
[00:00:01.018]текущий_task: opus_0
[00:00:01.018]CPU1 AXI_WR_INV_ID: 0x3ff, AXI_RD_INV_ID: 0x3ff, PRP_WR_LIMIT_ID: 0x284, PRP_MMU_ERR_RID: 0x3ff, PRP_MMU_ERR_WID: 0x3ff
[00:00:01.018]причина_исключения: c0_if_bus_inv
[00:00:01.020]системный_сброс...
Функция:
// Преобразование цифрового сигнала с микрофона в аналоговый сигнал для воспроизведения через DAC
// Внимание: если требуется воспроизводить два канала микрофона, то DAC должны быть настроены на каналы DACL и DACR соответственно. Обратите внимание, что некоторые микросхемы могут не иметь вывода для канала DACR. Кроме того, необходимо активировать двухканальное воспроизведение DAC. При использовании разностной выходной конфигурации DAC вы услышите только звук первого канала микрофона.```c
int recorder_play_to_dac(int sample_rate, u8 channel)
{
int err;
union audio_req req = {0};
log_d("----------recorder_play_to_dac----------\n");
if (channel > 2)
{
channel = 2;
}
__this->cache_buf = malloc(sample_rate * channel); // Верхний уровень буферизации buf для хранения данных за 0.5 секунды. Буфер слишком большой может вызвать задержку восприятия.
if (__this->cache_buf == NULL)
{
return -1;
}
cbuf_init(&__this->save_cbuf, __this->cache_buf, sample_rate * channel);
os_sem_create(&__this->w_sem, 0);
os_sem_create(&__this->r_sem, 0);
__this->run_flag = 1;
}
req.dec.cmd = AUDIO_DEC_OPEN;
req.dec.volume = __this->volume;
req.dec.output_buf_len = 4 * 1024;канал = канал;
req.dec.sample_rate = частота_выборки;
req.dec.vfs_ops = &recorder_vfs_ops;
req.dec.decoder_type = "opus";
req.dec.sample_source = CONFIG_AUDIO_DEC_PLAY_SOURCE;
req.dec.file = (FILE *)&__this->save_cbuf;
/* req.dec.attribute = AUDIO_ATTR_LR_ADD; */ //левый и правый каналы объединены в один, если требуется тестировать два микрофона
err = сервер_запрос(__this->dec_server, AUDIO_REQ_DEC, &req);
if (err)
{
goto __err;
}
req.dec.cmd = AUDIO_DEC_START;
req.dec.attribute = AUDIO_ATTR_NO_WAIT_READY;
сервер_запрос(__this->dec_server, AUDIO_REQ_DEC, &req);
/********************Открытие кодировщика*************************/
memset(&req, 0, sizeof(union audio_req));
//BIT(x) используется для разделения данных между каналами
if (канал == 2)
{
req.enc.channel_mapping = BIT(CONFIG_AUDIO_ADC_CHANNEL_L) | BIT(CONFIG_AUDIO_ADC_CHANNEL_R);
}
else
{
req.enc.channel_mapping = BIT(CONFIG_AUDIO_ADC_CHANNEL_L);
}
req.enc.frame_size = частота_выборки / 100 * 4 * канал; //собирается достаточно PCM данных для вызова fwrite
req.enc.output_buffer_length = req.enc.frame_size * 3; //низкоуровневый буфер buf должен быть как минимум в три раза больше размера кадра
req.enc.cmd = AUDIO_ENC_OPEN;
req.enc.channel = канал;
req.enc.gain = __this->gain;
req.enc.sample_rate = частота_выборки;
req.enc.format = "opus";источник_образца = __this->источник_образца;
req.кодировка.vfs_ops = &recorder_vfs_ops;
req.кодировка.файл = (FILE *)&__this->save_cbuf;
if (канал == 1 && !strcmp(__this->источник_образца, "microphone") && (частота_выборки == 8000 || частота_выборки == 16000))
{
req.кодировка.использовать_vad = 1; //активация VAD для отключения звука
req.кодировка.использование_dns = 1; //активация функции шумоподавления
req.кодировка.автоматическое_обновление_vad = 1; //автоматическое обновление VAD
}
err = сервер_запрос(__this->enc_server, AUDIO_REQ_ENC, &req);
if (err)
{
goto __err1;
}
return 0;
__err1:
req.декодировка.команда = AUDIO_DEC_STOP;
сервер_запрос(__this->dec_server, AUDIO_REQ_DEC, &req);
__err:
if (__this->buffer)
{
free(__this->buffer);
__this->buffer = NULL;
}
__this->run_flag = 0;
return -1;
}