WM8960的音量控制测试程序

转载 2018年04月17日 15:51:17

转载地址:http://blog.chinaunix.net/uid-22950545-id-2600584.html

WM8960的音量控制测试程序

一,前言:刚完成的WM8960声卡驱动,其中的控制多是以snd_kcontrol_new的结构形式表现,然后通过snd_ctl_add函数添加到core里面去。为了验证一下控制的正确性,经过对alsa库函数研究了一天,终于是简单的完成了这个音量的控制测试程序。

 

二程序如下:

/*vol_control.c*/

/*used for volume control test.author:sparkle*/

#include

#include

#include

 

unsigned char left_volume,right_volume;

 

 

int process_cmdline(int argc, char **argv)

{

        int i;

        if(argc==1){

               printf("volume control usage:\n" \

                        " -all :left and right vol is the same, range:0~255\n" \

                        " -l :left  vol , range:0~255\n"      \

                        " -r :right vol , range:0~255\n\n");

               return -1;

        }

        for (i = 1; i < argc; i++) {

                if (strcmp(argv[i], "-all") == 0 && argc==3) {

                        left_volume = right_volume=atoi(argv[++i]);

                }

 

                else if (strcmp(argv[i], "-l") == 0 && argc==5) {

                        left_volume = atoi(argv[++i]);

                }

                else if (strcmp(argv[i], "-r") == 0 && argc==5) {

                        right_volume = atoi(argv[++i]);

                }               

                else{

                        printf("volume control usage:\n" \

                               " -all :left and right vol is the same, range:0~255\n" \

                               " -l :left  vol , range:0~255\n" \

                               " -r :right vol , range:0~255\n\n");

                        return -1;

                }

               

        }

        printf("left_volume = %d\n", left_volume);

        printf("right_volume = %d\n", right_volume);

       

        return 0;

}

 

 

int main(int argc, char **argv)

{

       int idx, err,i;

       snd_ctl_t *handle;

       char str[128];

       snd_ctl_elem_value_t * elem_value;

       long * pdata;

 

         if (process_cmdline(argc, argv) < 0) {

                return -1;

        }

        

       snd_ctl_elem_value_alloca(&elem_value);

       /*ccording to my wm8960 driver,the the numid of

       snd_kcontrol_new "Playback Volume" is 4*/

       snd_ctl_elem_value_set_numid(elem_value,4);

      

       idx = -1;

       if ((err = snd_card_next(&idx)) < 0) {

              printf("Card next error: %s\n", snd_strerror(err));

              return -1;

       }

      

       sprintf(str, "hw:CARD=%i", idx);

       if ((err = snd_ctl_open(&handle, str, 0)) < 0) {

              printf("Open control error: %s\n", snd_strerror(err));

              return -1;

       }

             

       if ((err = snd_ctl_elem_read(handle,elem_value)) < 0) {

              printf("snd_ctl_elem_read error: %s\n", snd_strerror(err));

              return -1;

       }

       pdata=(long *)snd_ctl_elem_value_get_bytes(elem_value);

       printf("before changing ,left volume is:%d,right volume is %d\n",*pdata,*(pdata+1));

      

       //to set the new value    

       snd_ctl_elem_value_set_integer(elem_value,0,left_volume);

       snd_ctl_elem_value_set_integer(elem_value,1,right_volume);

       if ((err = snd_ctl_elem_write(handle,elem_value)) < 0) {

              printf("snd_ctl_elem_write error: %s\n", snd_strerror(err));

              return -1;

       }

 

       //read it out again to check if we did set the registers.

       if ((err = snd_ctl_elem_read(handle,elem_value)) < 0) {

              printf("snd_ctl_elem_read error: %s\n", snd_strerror(err));

              return -1;

       }

       pdata=(long *)snd_ctl_elem_value_get_bytes(elem_value);

       printf("after changing, left volume is:%d,right volume is %d\n",*pdata,*(pdata+1));

      

       snd_ctl_close(handle);

       return 0;

}

 

 三,测试结果:

/nand2 # ./vol_control -l 127 -r 200

left_volume = 127

right_volume = 200

before changing ,left volume is:255,right volume is 255

after changing, left volume is:127,right volume is 200

 

 

/nand2 # cd mplayer/

/nand2/mplayer # ./mplayer-y justonelastdance.mp3

结果左右声道的音量是不一样的,测试成功。

S3C2416裸机开发系列十八_音频驱动实现(1)

在消费电子产品中,往往都会用到音频系统来播放音乐、进行通话等多媒体应用,此外,对于一些需语音提示的产品,音频部分都是不可或缺的功能。笔者此处就s3c2416的音频驱动实现作一个简单的介绍。...
  • huang20083200056
  • huang20083200056
  • 2014-06-10 09:48:04
  • 3077

I.mx6s上移植wm8960驱动(基于linux3.0.101版本)

I.mx6s上移植wm8960驱动   此篇博文只记录移植的步骤,其他不做分析。首先上一张wm8960的硬件连接图: ...
  • u010177751
  • u010177751
  • 2015-07-18 18:58:39
  • 4724

imx6solo wm8960始终没有声音输出

我尝试各种办法,wm8960始终不能得到声音输出。调试过程如下: 首先,打开电源使能脚:        ret=gpio_request(SABRESD_CODEC_PWR_EN,"audio_pw...
  • freeman1975
  • freeman1975
  • 2015-04-21 18:10:00
  • 3656

Widora MT7688 开发板录音放音使用方法

Widora MT7688 是目前市场上最具竞争力的MT7688开发板, 声卡使用I2S接口的WM8960, 我们使用官方的SDK(Openwrt) 录音命令: arecord -...
  • u014778332
  • u014778332
  • 2016-03-21 21:59:54
  • 4052

android 2.3 调试wm8960注意事项

以下是本人调试wm8960的一些总结,是为以后调试类似的东西做参考: 1、首先请检查硬件问题,确保连接良好,有供电。 2、确定I2C能正常通信,设置正常的通信速率。 3、配置slave模式或ma...
  • zhong0985
  • zhong0985
  • 2013-01-28 17:10:53
  • 1524

wm8960驱动:裸机代码研读

网上已经有基本的wm8960驱动的demo。可以播放特定频率的wav文件。这个程序很具有参考性。 我们知道,初始化wm8960,需要大概的步骤如下: 1.初始化I2C总线,通过I2C接口给wm89...
  • changliang7731
  • changliang7731
  • 2017-01-08 21:26:21
  • 1280

linux驱动开发: wm8960 codec代码分析

关于alsa架构已经啃了好久好久,但是也卡了好久好久。难说皮毛到底有看懂多少,不管,我们先来啃wm8960 codec的驱动代码:必要相关函数说明: ////////////////////////...
  • changliang7731
  • changliang7731
  • 2016-12-09 23:54:05
  • 1812

openwrt+Linkit7688+wm8960:粗略实现wm8960耳麦和喇叭音频输出

引言: 本文只是介绍怎么使用linkit7688开发板上的wm8960的输出喇叭声音和耳机声音,主要是怎么输出喇叭声音,默认的音频驱动是只有耳麦的音频输出而没有喇叭音频输出的。别人指导我,有点成果也...
  • Go_RoCo
  • Go_RoCo
  • 2017-04-11 15:25:02
  • 2516

S5PV210 WM8960 ASOC 移植

S5PV210 移植 WM8960到ASOC中·············································································...
  • NoMmmMoN
  • NoMmmMoN
  • 2016-11-02 22:12:33
  • 685

S5PV210 WM8960音频驱动 学习

最新由于项目需要,调试S5PV210开发板 Linux系统上面的音频功能,我们选择的音频编解码芯片是WM8960,连接到CPU的IIS接口,调试过   程中遇到了一系列的问题,现总结如下: ...
  • xingyuan1hao
  • xingyuan1hao
  • 2013-10-11 23:54:07
  • 4989
收藏助手
不良信息举报
您举报文章:WM8960的音量控制测试程序
举报原因:
原因补充:

(最多只允许输入30个字)