请教如何编写一个最简单的TE6410-WM9713音频应用测试程序?
版主和各位高手:帮帮忙。
我手上的开发板为TE6410,因为我的项目中,需要音频的录音和放音功能。
但在你们网上和CD上,始终都没有找到合适的应用程序作为参考和测试。
能否提供一份最简单的ALSA体系的录/放音测试程序呀? 急呀!!!先谢谢了。
-------------------
我已作过如下工作了:但不知道思路是否正确?请各位高手指点一下。谢谢!
1:开发板加电后,显示正常的音频信息
......
Advanced Linux Sound Architecture Driver Version 1.0.18rc3.
ASoC version 0.13.2
WM9713/WM9714 SoC Audio Codec 0.15
playback: 1, capture : 1
asoc: AC97 HiFi <-> s3c64xx-ac97 mapping ok
......
Open speaker volume.
ALSA device list:
#0: SMDK6400 (WM9713)
......
这说明,我的开发板的驱动加电正常,为linux的ALSA体系驱动。
2:我仔细阅读和分析了源码驱动
Linux-2.6.28.6/sound/soc/codecs/wm9713.c
Linux-2.6.28.6/sound/soc/s3c64xx/smdk64xx_wm9713.c
Linux-2.6.28.6/sound/soc/s3c64xx/s3c64xx-ac97.c
其中,关于如何注册/注销音频设备driver和device,都比较清楚了。
3:开发板上,测试音频设备是否能发音。
加电,进入开发板终端,用OSS体系的/dev/dsp节点,测试一个wav格式的音频
# cat ***.wav > /dev/dsp
测试结果:在耳机上,可以听到“嘶嘶”声,因为没有设置音频设备的工作各个参数,所有,
声音肯定听起来不对啦,但可初步验证声卡可以工作哦!
4:开发板的设备节点号,也能正常找到
# cd /dev/
# ls
audiodsp mixersnd ... ...
# ls snd/
controlC0pcmC0D0c pcmC0D0p timer
# cd /proc/asound
# ls
SMDK6400cards oss timers
card0 devices pcm version
也就是开发板支持OSS和ALSA体系。
5:自己编写了一个简单的OSS程序,但测试不能正常录/放音。
测试结果:在耳机上,可以听到“嘶嘶”声,但听不到自己录的声音。
1:直接播放LyRec_P1_22050HZ_8Seconds.wav文件,也是只有“嘶嘶”声
2:开启录音功能,先录音频到文件名为audio_ReadFile的文件,再播放,也是只有“嘶嘶”声
3:录音时,很快,一下就过了,放音正常速度,不知道为什么?好像没有延时,还是?
以下是我自己编写的测试音频源代码如下(基于OSS体系的)
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
#include <stdlib.h>
#include <unistd.h>
//-------------------------------------------
#define LY_FORMAT AFMT_S16_NE
#define LY_CHANNELS 1 // 1 .2
#define LY_SPEED 22050 // 44100 . 22050 . 11025 . 8000 .
#define BUF_SIZE 4096 //buf = 2048 . 4096
#define LY_SET_REC_SECONDS 4 // record audio = 4 seconds
//-------------------------------------------
#define LY_SET_REC 1 //record audio
#define LY_SET_PALYBACK 2 //play audio
#define LY_TEST_IC_STATUS 3 //read IC status
//------------------------------------------
#ifdef LY_SET_REC
#define filename"/testly/audio_ReadFile"
#else
#define filename"/testly/LyRec_P1_22050HZ_8Seconds.wav"
#endif
int main()
{
int i;
//----------1: OSS open device -----------------------
int audio_fd;
audio_fd = open( "/dev/audio", O_WRONLY,0 );
if( audio_fd == -1)
{
printf("=1=> open /dev/dsp error.\n");
exit(1);
}
printf("=1=> open /dev/dsp ok.\n");
//----------2: OSS set audio format-----------------------
int format;
format=AFMT_S16_NE;
if( ioctl(audio_fd,SNDCTL_DSP_SETFMT,&format)==-1)
{
printf("=2=> ioctl(format) error.\n");
exit(1);
}
printf("=2=> ioctl(format) ok. format=%d\n",format);
//-----------3: OSS set Channels----------------------
int channels;
channels = LY_CHANNELS;
if( ioctl(audio_fd,SNDCTL_DSP_CHANNELS,&channels) == -1)
{
printf("=3=> ioctl(channels) error.\n");
exit(1);
}
printf("=3=> ioctl(channels) ok. channels=%d\n",channels);
//-----------4:OSS set speed----------------------
int speed;
speed=LY_SPEED;
if( ioctl(audio_fd,SNDCTL_DSP_SPEED,&speed) == -1)
{
printf("=4=> ioctl(speed) error.\n");
exit(1);
}
printf("=4=> ioctl(speed) ok. speed=%d\n",speed);
//-----------------------
#ifdef LY_TEST_IC_STATUS
int status;
status = 0;
if( ioctl(audio_fd,SNDCTL_DSP_GETBLKSIZE,&status) == -1)
{
printf("=Test1=> ioctl(status) error.\n");
exit(1);
}
printf("=Test1=> ioctl(status) ok. SNDCTL_DSP_GETBLKSIZE=%d\n",status);
if( ioctl(audio_fd,SNDCTL_DSP_GETFMTS,&status) == -1)
{
printf("=Test2=> ioctl(status) error.\n");
exit(1);
}
printf("=Test2=> ioctl(status) ok. SNDCTL_DSP_GETFMTS=%d\n",status);
if( ioctl(audio_fd,SNDCTL_DSP_GETCHANNELMASK,&status) == -1)
{
printf("=Test3=> ioctl(status) error.\n");
//exit(1);
}
else
{
printf("=Test3=> ioctl(status) ok. SNDCTL_DSP_GETCHANNELMASK=%d\n",status);
}
#endif
//-----------5:OSS open(filename)----------------------
int music_fd;
unsigned short applicbuf; //applicbuf;
int count;
#ifdef LY_SET_REC
music_fd = open(filename,O_WRONLY | O_CREAT,0); //filename ==> NFS/*
if( music_fd == -1)
{
printf("=5=> open/create filename error.\n");
exit(1);
}
printf("=5=> open/create filename ok. ushort applicbuf=>1Buf\n");
//-----------6:OSS open(mixer)----------------------
int mixer_fd;
mixer_fd = open("/dev/mixer",O_WRONLY); //not ==> O_RDONLY
if( mixer_fd == -1)
{
printf("=6=> open /dev/mixer error.\n");
exit(1);
}
printf("=6=> open /dev/mixer ok.\n");
//-----------7:OSS set mixer recsrc----------------------
int testchan;
int recsrc;
testchan=SOUND_MIXER_CD;
recsrc = (1<<testchan);
if( ioctl(mixer_fd,SOUND_MIXER_WRITE_RECSRC,&recsrc) == -1) //parameter:Page318
{
printf("=7=> ioctl(recsrc) error.\n");
exit(1);
}
printf("=7=> ioctl(recsrc) ok. recsrc = (1<<SOUND_MIXER_CD)\n");
//-----------7:OSS set mixer recsrc----------------------
int totalbyte;
int totalword;
int total;
totalbyte = speed*channels*2*LY_SET_REC_SECONDS; // 2 seconds ????
totalword = totalbyte/2;
total=0;
i=0;
printf("=8=>start.totalword=%d,LY_SET_REC_SECONDS=%d\n",totalword,LY_SET_REC_SECONDS);
while(total != totalword)
{
i++;
if((totalword-total)>= BUF_SIZE)
{
count=BUF_SIZE;
}
else
{
count=totalword - total;
}
read(audio_fd,applicbuf,count); //step1: record audio
write(music_fd,applicbuf,count); //step2: write audio to file
total += count;
}
close(mixer_fd);
printf("=9=>end.--> /testly/audio_ReadFile.\n");
//-----------------------
close(music_fd);
printf("=10=> end app.close(mixer_fd)/(audio_fd)/(music_fd)\n");
#endif
////////////////// Play Test //////////////////////////////////
#ifdef LY_SET_PALYBACK
music_fd = open(filename,O_RDONLY,0);
if( music_fd == -1)
{
printf("\n=Play1=> open file error.\n");
exit(1);
}
printf("\n=Play1=> open file ok = %s.\n",filename);
printf("=Play2=> recode audio start.\n");
i=0;
while( (count = read(music_fd,applicbuf,BUF_SIZE))>0 )
{
i++;
write(audio_fd,applicbuf,count);
//printf("i=%d, count=%d\n",i , count);
}
printf("=Play3=> recode audio end.\n");
#endif
//------------------
close(audio_fd);
close(music_fd);
printf("=Play4=> end app.\n");
return 0;
}
6:我以为是自己编写的OSS程序有问题,无法支持开发板的驱动,后来,又编写了一个ALSA体系的测试程序。
同时,在ALSA官方网站,下载alsa-lib软件包,正确安装了alsa/asoundlib.h库等等,
但发现,编译和测试,总是出现一些问题。没法往下做了。。。。 目前没有提供音频测试 啥时候会有?既然开发板上已经提供了这样的硬件及接口,那就应该给我们提供相应的测试代码及源码?不然买开发板有啥用? 音频测试,使用Qtopia里面的播放器,播放音频文件即可,具体的代码您可以看Qtopia中播放器的源代码吗。 测试邮件已经发给楼上 呵呵 可以附件啊,或者发到华为网盘,供大家下载使用
页:
[1]