- 积分
- 15
贡献65
飞刀18 FD
注册时间2016-6-12
在线时间8 小时
扫一扫,手机访问本帖
|
版主和各位高手:
帮帮忙。
我手上的开发板为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
......
[WM9713]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格式的音频
[root@FORLINX6410]# cat ***.wav > /dev/dsp
测试结果:在耳机上,可以听到“嘶嘶”声,因为没有设置音频设备的工作各个参数,所有,
声音肯定听起来不对啦,但可初步验证声卡可以工作哦!
4:开发板的设备节点号,也能正常找到
[root@FORLINX6410]# cd /dev/
[root@FORLINX6410]# ls
audio dsp mixer snd ... ...
[root@FORLINX6410]# ls snd/
controlC0 pcmC0D0c pcmC0D0p timer
[root@FORLINX6410]# cd /proc/asound
[root@FORLINX6410]# ls
SMDK6400 cards 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[BUF_SIZE]; //applicbuf[2048];
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[2048]=>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库等等,
但发现,编译和测试,总是出现一些问题。没法往下做了。。。。 |
|