228 lines
7.3 KiB
C
228 lines
7.3 KiB
C
|
/*
|
|||
|
****************************************************************
|
|||
|
* AUDIO_ADC_DEMO
|
|||
|
* File : audio_adc_demo.c
|
|||
|
* By :
|
|||
|
* Notes :Audio_ADC使用demo,请不要修改本demo,如有需求,请拷贝副
|
|||
|
* 本,自行修改
|
|||
|
****************************************************************
|
|||
|
*/
|
|||
|
#include "asm/includes.h"
|
|||
|
#include "media/includes.h"
|
|||
|
#include "system/includes.h"
|
|||
|
#include "audio_config.h"
|
|||
|
|
|||
|
/*AUDIO_ADC采样参数输出到DAC配置(调试使用)*/
|
|||
|
#define LADC_2_DAC_ENABLE 1
|
|||
|
|
|||
|
/*AUDIO_ADC采样参数配置*/
|
|||
|
#define LADC_BUF_NUM 2 /*adc采样buf数*/
|
|||
|
#define LADC_CH_NUM 1 /*adc采样通道数*/
|
|||
|
#define LADC_IRQ_POINTS 256 /*adc采样buf长度,即多少点起一次中断*/
|
|||
|
#define LADC_BUFS_SIZE (LADC_CH_NUM * LADC_BUF_NUM * LADC_IRQ_POINTS)
|
|||
|
|
|||
|
struct ladc_demo {
|
|||
|
struct audio_adc_output_hdl adc_output;
|
|||
|
struct adc_mic_ch mic_ch;
|
|||
|
s16 adc_buf[LADC_BUFS_SIZE]; //align 2Bytes
|
|||
|
s16 temp_buf[LADC_IRQ_POINTS * 2];
|
|||
|
};
|
|||
|
static struct ladc_demo *ladc = NULL;
|
|||
|
|
|||
|
extern struct audio_adc_hdl adc_hdl;
|
|||
|
|
|||
|
/*audio_adc采样数据输出回调*/
|
|||
|
static void audio_adc_demo_output(void *priv, s16 *data, int len)
|
|||
|
{
|
|||
|
struct audio_adc_hdl *hdl = priv;
|
|||
|
putchar('o');
|
|||
|
if (hdl == NULL) {
|
|||
|
printf("audio_adc_hdl err:NULL!!!!");
|
|||
|
return;
|
|||
|
}
|
|||
|
//printf("hdl:%x,data:%x,len:%d,ch:%d\n",hdl,data,len,hdl->channel);
|
|||
|
|
|||
|
#if LADC_2_DAC_ENABLE
|
|||
|
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR)//双声道数据结构
|
|||
|
for (int i = 0; i < (len / 2); i++) {
|
|||
|
ladc->temp_buf[i * 2] = data[i];
|
|||
|
ladc->temp_buf[i * 2 + 1] = data[i];
|
|||
|
}
|
|||
|
int wlen = app_audio_output_write(ladc->temp_buf, len * 2);
|
|||
|
if (wlen != (len * 2)) {
|
|||
|
//printf("wlen:%d-%d",wlen,len * 2);
|
|||
|
}
|
|||
|
#else //单声道数据结构
|
|||
|
int wlen = app_audio_output_write(data, len * hdl->channel);
|
|||
|
if (wlen != len) {
|
|||
|
//printf("wlen:%d-%d",wlen,len);
|
|||
|
}
|
|||
|
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
|||
|
#endif/*LADC_2_DAC_ENABLE*/
|
|||
|
}
|
|||
|
|
|||
|
static u8 mic_demo_idle_query()
|
|||
|
{
|
|||
|
return (ladc ? 0 : 1);
|
|||
|
}
|
|||
|
REGISTER_LP_TARGET(mic_demo_lp_target) = {
|
|||
|
.name = "mic_demo",
|
|||
|
.is_idle = mic_demo_idle_query,
|
|||
|
};
|
|||
|
|
|||
|
/*
|
|||
|
*Audio_ADC使用demo以及测试手段
|
|||
|
*通过注册回调函数,可以获取ADC采样数据
|
|||
|
*/
|
|||
|
void audio_adc_open_demo(void)
|
|||
|
{
|
|||
|
u16 sr = 16000;
|
|||
|
u8 gain = 10;
|
|||
|
printf("audio_adc_open:%d\n", sr);
|
|||
|
ladc = zalloc(sizeof(struct ladc_demo));
|
|||
|
if (ladc) {
|
|||
|
audio_adc_mic_open(&ladc->mic_ch, AUDIO_ADC_MIC_CH, &adc_hdl);
|
|||
|
audio_adc_mic_set_sample_rate(&ladc->mic_ch, sr);
|
|||
|
audio_adc_mic_set_gain(&ladc->mic_ch, gain);
|
|||
|
audio_adc_mic_set_buffs(&ladc->mic_ch, ladc->adc_buf, LADC_IRQ_POINTS * 2, LADC_BUF_NUM);
|
|||
|
/*注册ADC采样回调函数*/
|
|||
|
ladc->adc_output.handler = audio_adc_demo_output;
|
|||
|
/*传给回调函数的私有参数*/
|
|||
|
ladc->adc_output.priv = &adc_hdl;
|
|||
|
audio_adc_add_output_handler(&adc_hdl, &ladc->adc_output);
|
|||
|
audio_adc_mic_start(&ladc->mic_ch);
|
|||
|
|
|||
|
/*可以通过把ADC采样数据推到DAC进行播放,直观判定数据是否初步正常*/
|
|||
|
#if LADC_2_DAC_ENABLE
|
|||
|
app_audio_output_samplerate_set(sr);
|
|||
|
app_audio_output_start();
|
|||
|
#endif/*LADC_2_DAC_ENABLE*/
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void audio_adc_demo_close(void)
|
|||
|
{
|
|||
|
if (ladc) {
|
|||
|
audio_adc_del_output_handler(&adc_hdl, &ladc->adc_output);
|
|||
|
audio_adc_mic_close(&ladc->mic_ch);
|
|||
|
free(ladc);
|
|||
|
ladc = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/********************************************************/
|
|||
|
/* linein demo */
|
|||
|
/********************************************************/
|
|||
|
|
|||
|
|
|||
|
/*AUDIO_ADC采样参数配置*/
|
|||
|
#define LADC_LINEIN_BUF_NUM 2 /*adc采样buf数*/
|
|||
|
#define LADC_LINEIN_CH_NUM 2 /*adc采样通道数*/
|
|||
|
#define LADC_LINEIN_IRQ_POINTS 256 /*adc采样buf长度,即多少点起一次中断*/
|
|||
|
#define LADC_LINEIN_BUFS_SIZE (LADC_LINEIN_CH_NUM * LADC_LINEIN_BUF_NUM * LADC_LINEIN_IRQ_POINTS)
|
|||
|
|
|||
|
struct ladc_linein_demo {
|
|||
|
struct audio_adc_output_hdl adc_output;
|
|||
|
struct audio_adc_ch linein_ch;
|
|||
|
s16 adc_buf[LADC_LINEIN_BUFS_SIZE]; //align 2Bytes
|
|||
|
s16 temp_buf[LADC_LINEIN_IRQ_POINTS * 2];
|
|||
|
};
|
|||
|
static struct ladc_linein_demo *ladc_linein_hdl = NULL;
|
|||
|
|
|||
|
/*audio_adc采样数据输出回调*/
|
|||
|
static void audio_linein_output(void *priv, s16 *data, int len)
|
|||
|
{
|
|||
|
struct audio_adc_hdl *hdl = priv;
|
|||
|
putchar('o');
|
|||
|
if (hdl == NULL) {
|
|||
|
printf("audio_adc_hdl err:NULL!!!!");
|
|||
|
return;
|
|||
|
}
|
|||
|
/* printf("hdl:%x,data:%x,len:%d,ch:%d\n",hdl,data,len,hdl->channel); */
|
|||
|
|
|||
|
#if LADC_2_DAC_ENABLE
|
|||
|
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_LR)//双声道数据结构
|
|||
|
if (hdl->channel == 1) {
|
|||
|
for (int i = 0; i < (len / 2); i++) {
|
|||
|
ladc_linein_hdl->temp_buf[i * 2] = data[i];
|
|||
|
ladc_linein_hdl->temp_buf[i * 2 + 1] = data[i];
|
|||
|
}
|
|||
|
int wlen = app_audio_output_write(ladc_linein_hdl->temp_buf, len * 2);
|
|||
|
if (wlen != (len * 2)) {
|
|||
|
//printf("wlen:%d-%d",wlen,len * 2);
|
|||
|
}
|
|||
|
} else {
|
|||
|
int wlen = app_audio_output_write(ladc_linein_hdl->temp_buf, len * 2);
|
|||
|
if (wlen != (len * 2)) {
|
|||
|
//printf("wlen:%d-%d",wlen,len * 2);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
#else //单声道数据结构
|
|||
|
if (hdl->channel == 1) {
|
|||
|
int wlen = app_audio_output_write(data, len * hdl->channel);
|
|||
|
if (wlen != len) {
|
|||
|
//printf("wlen:%d-%d",wlen,len);
|
|||
|
}
|
|||
|
} else {
|
|||
|
for (int i = 0; i < (len / 2); i++) {
|
|||
|
ladc_linein_hdl->temp_buf[i] = data[i * 2] + data[i * 2 + 1];
|
|||
|
}
|
|||
|
int wlen = app_audio_output_write(data, len);
|
|||
|
if (wlen != len) {
|
|||
|
//printf("wlen:%d-%d",wlen,len);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
|||
|
#endif/*LADC_2_DAC_ENABLE*/
|
|||
|
}
|
|||
|
|
|||
|
static u8 linein_demo_idle_query()
|
|||
|
{
|
|||
|
return (ladc_linein_hdl ? 0 : 1);
|
|||
|
}
|
|||
|
REGISTER_LP_TARGET(linein_demo_lp_target) = {
|
|||
|
.name = "linein_demo",
|
|||
|
.is_idle = linein_demo_idle_query,
|
|||
|
};
|
|||
|
|
|||
|
void audio_linein_open_demo(void)
|
|||
|
{
|
|||
|
/* u16 sr = 16000; */
|
|||
|
u16 sr = 44100;
|
|||
|
u8 gain = 10;
|
|||
|
printf("audio_adc_linein_open:%d\n", sr);
|
|||
|
|
|||
|
ladc_linein_hdl = zalloc(sizeof(struct ladc_linein_demo));
|
|||
|
if (ladc_linein_hdl) {
|
|||
|
audio_adc_linein_open(&ladc_linein_hdl->linein_ch, AUDIO_ADC_LINE0_LR, &adc_hdl);
|
|||
|
audio_adc_linein_set_sample_rate(&ladc_linein_hdl->linein_ch, sr);
|
|||
|
audio_adc_linein_set_gain(&ladc_linein_hdl->linein_ch, gain);
|
|||
|
audio_adc_set_buffs(&ladc_linein_hdl->linein_ch, ladc_linein_hdl->adc_buf, LADC_LINEIN_IRQ_POINTS * 2, LADC_LINEIN_BUF_NUM);
|
|||
|
/*注册ADC采样回调函数*/
|
|||
|
ladc_linein_hdl->adc_output.handler = audio_linein_output;
|
|||
|
/*传给回调函数的私有参数*/
|
|||
|
ladc_linein_hdl->adc_output.priv = &adc_hdl;
|
|||
|
audio_adc_add_output_handler(&adc_hdl, &ladc_linein_hdl->adc_output);
|
|||
|
audio_adc_linein_start(&ladc_linein_hdl->linein_ch);
|
|||
|
|
|||
|
/*可以通过把ADC采样数据推到DAC进行播放,直观判定数据是否初步正常*/
|
|||
|
#if LADC_2_DAC_ENABLE
|
|||
|
app_audio_output_samplerate_set(sr);
|
|||
|
app_audio_output_start();
|
|||
|
#endif/*LADC_2_DAC_ENABLE*/
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void audio_linein_demo_close(void)
|
|||
|
{
|
|||
|
if (ladc_linein_hdl) {
|
|||
|
audio_adc_del_output_handler(&adc_hdl, &ladc_linein_hdl->adc_output);
|
|||
|
audio_adc_linein_close(&ladc_linein_hdl->linein_ch);
|
|||
|
free(ladc_linein_hdl);
|
|||
|
ladc_linein_hdl = NULL;
|
|||
|
}
|
|||
|
}
|
|||
|
|