嵌入式爱好者

查看: 9064|回复: 9

请教如何编写一个最简单的TE6410-WM9713音频应用测试程序?

[复制链接]

0

主题

0

帖子

15

积分

i.MX6UL通行证i.MX6Q通行证

扫一扫,手机访问本帖
发表于 2011-6-13 17:16:59 | 显示全部楼层 |阅读模式
版主和各位高手:
  帮帮忙。

  我手上的开发板为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库等等,
但发现,编译和测试,总是出现一些问题。没法往下做了。。。。
回复

使用道具 举报

29

主题

9048

帖子

5593

积分

发表于 2011-6-14 08:54:52 | 显示全部楼层
目前没有提供音频测试
该会员没有填写今日想说内容.

0

主题

0

帖子

10

积分

i.MX6Q通行证

发表于 2011-11-22 09:23:11 | 显示全部楼层
啥时候会有?既然开发板上已经提供了这样的硬件及接口,那就应该给我们提供相应的测试代码及源码?不然买开发板有啥用?

0

主题

1836

帖子

1028

积分

发表于 2011-11-22 09:31:39 | 显示全部楼层
音频测试,使用Qtopia里面的播放器,播放音频文件即可,具体的代码您可以看Qtopia中播放器的源代码吗。
三棱镜 该用户已被删除
发表于 2011-12-26 10:32:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

29

主题

9048

帖子

5593

积分

发表于 2011-12-26 13:26:08 | 显示全部楼层
测试邮件已经发给楼上 呵呵
该会员没有填写今日想说内容.
forrest 该用户已被删除
发表于 2012-2-23 15:52:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
flyme511 该用户已被删除
发表于 2012-4-1 15:15:10 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
kaly_liu 该用户已被删除
发表于 2013-3-23 11:21:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复 支持 反对

使用道具 举报

153

主题

3910

帖子

4207

积分

AM5718通行证AM335x通行证i.MX6UL通行证i.MX RT通行证i.MX6Q通行证XX18通行证TCU通行证FCU1401通行证FCU1301通行证FCU11xx通行证

发表于 2013-3-25 10:04:14 | 显示全部楼层
可以附件啊,或者发到华为网盘,供大家下载使用
技术支持电话:0312-3119192
技术支持邮箱:Linux@forlinx.com
点评回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-23 14:54

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表