交叉编译alsa-lib 编程获取声音大小

本文介绍了一种在Linux环境下利用ALSA库控制音量的方法。文中提供了详细的编译安装步骤,并分享了一个C语言示例程序,该程序能够读取和设置音频设备的音量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

板子上需要控制声音,试过salsa的库(精简版的alsa),功能有些受限,在PC上测试无法正常获取声音大小,打算采用alsa
http://www.alsa-project.org/main/index.php/Download
下载源码,假设是alsa-lib-1.0.9.tar.bz2
tar -xvf  alsa-lib-1.0.9.tar.bz2
cd alsa-lib-1.0.9
./configure --target=arm-linux  --host=x86-64-linux  CC=arm-none-linux-gnueabi-gcc  --prefix=/opt/sun5i
编译
make
安装到/opt/sun5i
sudo make install
PC机是64位系统,所以选择--host=x86-64-linux 

附上网上找的通过alsa获取声音大小的程序,(可以获取,设置好像不行),建议alsa-utils编译产生的工具amixer来获取设置声音

 

 

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <fcntl.h>
  3.  
  4. #ifdef OSSCONTROL
  5. #define MIXER_DEV "/dev/dsp"
  6.  
  7. #include <sys/soundcard.h>
  8. #include <sys/ioctl.h>
  9. #include <stdio.h>
  10. #else
  11. #include <alsa/asoundlib.h>
  12. #endif
  13.  
  14. #define VOLUME_BOUND 10000
  15.  
  16. typedef enum {
  17.     AUDIO_VOLUME_SET,
  18.     AUDIO_VOLUME_GET,
  19. } audio_volume_action;
  20.  
  21. /*
  22.   Drawbacks. Sets volume on both channels but gets volume on one. Can be easily adapted.
  23.  */
  24. int audio_volume(audio_volume_action action, long* outvol)
  25. {
  26.     int ret = 0;
  27. #ifdef OSSCONTROL
  28.     int fd, devs;
  29.  
  30.     if ((fd = open(MIXER_DEV, O_WRONLY)) > 0)
  31.     {
  32.         if(action == AUDIO_VOLUME_SET) {
  33.             if(*outvol < 0 || *outvol > 100)
  34.                 return -2;
  35.             *outvol = (*outvol << 8) | *outvol;
  36.             ioctl(fd, SOUND_MIXER_WRITE_VOLUME, outvol);
  37.         }
  38.         else if(action == AUDIO_VOLUME_GET) {
  39.             ioctl(fd, SOUND_MIXER_READ_VOLUME, outvol);
  40.             *outvol = *outvol & 0xff;
  41.         }
  42.         close(fd);
  43.         return 0;
  44.     }
  45.     return -1;;
  46. #else
  47.     snd_mixer_t* handle;
  48.     snd_mixer_elem_t* elem;
  49.     snd_mixer_selem_id_t* sid;
  50.  
  51.     static const char* mix_name = "Master";
  52.     static const char* card = "default";
  53.     static int mix_index = 0;
  54.  
  55.     long pmin, pmax;
  56.     long get_vol, set_vol;
  57.     float f_multi;
  58.  
  59.     snd_mixer_selem_id_alloca(&sid);
  60.  
  61.     //sets simple-mixer index and name
  62.     snd_mixer_selem_id_set_index(sid, mix_index);
  63.     snd_mixer_selem_id_set_name(sid, mix_name);
  64.  
  65.         if ((snd_mixer_open(&handle, 0)) < 0)
  66.         return -1;
  67.     if ((snd_mixer_attach(handle, card)) < 0) {
  68.         snd_mixer_close(handle);
  69.         return -2;
  70.     }
  71.     if ((snd_mixer_selem_register(handle, NULL, NULL)) < 0) {
  72.         snd_mixer_close(handle);
  73.         return -3;
  74.     }
  75.     ret = snd_mixer_load(handle);
  76.     if (ret < 0) {
  77.         snd_mixer_close(handle);
  78.         return -4;
  79.     }
  80.     elem = snd_mixer_find_selem(handle, sid);
  81.     if (!elem) {
  82.         snd_mixer_close(handle);
  83.         return -5;
  84.     }
  85.  
  86.     long minv, maxv;
  87.  
  88.     snd_mixer_selem_get_playback_volume_range (elem, &minv, &maxv);
  89.     fprintf(stderr, "Volume range <%i,%i>\n", minv, maxv);
  90.  
  91.     if(action == AUDIO_VOLUME_GET) {
  92.         if(snd_mixer_selem_get_playback_volume(elem, 0, outvol) < 0) {
  93.             snd_mixer_close(handle);
  94.             return -6;
  95.         }
  96.  
  97.         fprintf(stderr, "Get volume %i with status %i\n", *outvol, ret);
  98.         /* make the value bound to 100 */
  99.         *outvol -= minv;
  100.         maxv -= minv;
  101.         minv = 0;
  102.         *outvol = 100 * (*outvol) / maxv; // make the value bound from 0 to 100
  103.     }
  104.     else if(action == AUDIO_VOLUME_SET) {
  105.         if(*outvol < 0 || *outvol > VOLUME_BOUND) // out of bounds
  106.             return -7;
  107.         *outvol = (*outvol * (maxv - minv) / (100)) + minv;
  108.  
  109.         if(snd_mixer_selem_set_playback_volume(elem, 0, *outvol) < 0) {
  110.             snd_mixer_close(handle);
  111.             return -8;
  112.         }
  113.         if(snd_mixer_selem_set_playback_volume(elem, 1, *outvol) < 0) {
  114.             snd_mixer_close(handle);
  115.             return -9;
  116.         }
  117.         fprintf(stderr, "Set volume %i with status %i\n", *outvol, ret);
  118.     }
  119.  
  120.     snd_mixer_close(handle);
  121.     return 0;
  122. #endif
  123.     }
  124.  
  125. int main(void)
  126. {
  127.     long vol = -1;
  128.     printf("Ret %i\n", audio_volume(AUDIO_VOLUME_GET, &vol));
  129.     printf("Master volume is %i\n", vol);
  130.  
  131.     vol = 100;
  132.     printf("Ret %i\n", audio_volume(AUDIO_VOLUME_SET, &vol));
  133.  
  134.     return 0;
  135. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帅得不敢出门

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值