alsa amixer 使用介绍

2023-05-16

alsa-utils 提供的工具中,arecord 可以用来录音,aplay 可以用来播放,amixer 可以用来控制音量、增益等。

/ # amixer controls
numid=34,iface=MIXER,name='Master Switch'
numid=35,iface=MIXER,name='Master Switch X'
numid=32,iface=MIXER,name='Master Volume'
numid=33,iface=MIXER,name='Master Volume X'
...

可以通过amixer controls 列出alsa下面的控制节点

/ # amixer cget name='Master Volume'
numid=32,iface=MIXER,name='Master Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=100,step=0
  : values=100

要查看Master Volume 这个节点更详细的信息,可以输入 amixer cget name='节点名称'
这个节点名称是相关驱动注册,添加到alsa驱动框架中生成的,并不一定是固定的名称。

/ # amixer cset name='Master Volume' 80
numid=32,iface=MIXER,name='Master Volume'
  ; type=INTEGER,access=rw------,values=1,min=0,max=100,step=0
  : values=80

通过amixer cset 命令可以修改节点的值,amixer cset name='节点名称' (新的值)

 

通过代码实现如下

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <alsa/asoundlib.h>

#define ALSA_MIXER_NAME      "default"
#define ALSA_ELEM_NAME       "Master Volume"

static snd_mixer_t *mixer = NULL;
static snd_mixer_elem_t *elem=NULL;
static int alsa_mixer_init()
{
    //1. 打开mixer
    if (snd_mixer_open(&mixer, 0)<0){
        printf("snd_mixer_open fail.\n");
        return -1;
    }

    // 2. attach HCTL to open mixer
    if (snd_mixer_attach(mixer, ALSA_MIXER_NAME) < 0){
        printf("snd_mixer_attach fail.\n");
        goto mixer_fail;
    }

    // 3.register mixer
    if (snd_mixer_selem_register(mixer, NULL, NULL) < 0){
        printf("snd_mixer_attach fail.\n");
        goto mixer_fail;
    }

    // 4. load mixer
    if (snd_mixer_load(mixer) < 0) {
        printf("snd_mixer_load fail.\n");
        goto mixer_fail;
    }

    // 5. find the elem
    for (elem = snd_mixer_first_elem(mixer); elem;elem = snd_mixer_elem_next(elem))
    {
       if (snd_mixer_elem_get_type(elem)==SND_MIXER_ELEM_SIMPLE&&snd_mixer_selem_is_active(elem))
       {
           //printf("mixer elem name is %s.\n",snd_mixer_selem_get_name(elem));
           if (strcmp(snd_mixer_selem_get_name(elem), ALSA_ELEM_NAME) == 0)
           {
                printf("found mixer elem, name is %s.\n",ALSA_ELEM_NAME);

                long int alsa_left=0,alsa_right=0;
                //snd_mixer_selem_set_playback_volume_range(elem, 0, 1000);
                snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_LEFT,  &alsa_left);
                snd_mixer_selem_get_playback_volume(elem, SND_MIXER_SCHN_FRONT_RIGHT, &alsa_right);
                //snd_mixer_selem_set_playback_volume_range(elem, AUDIO_MIN_VOLUME, AUDIO_MAX_VOLUME);
                //snd_mixer_selem_set_playback_volume_all(elem, mix_vol);
                printf("alsa_left is %ld,alsa_right is %ld.\n",alsa_left,alsa_right);
                return 0;
           }
       }
    }
    
mixer_fail:
    snd_mixer_close(mixer);
    mixer=NULL;
    return -1;
}

static int set_master_volume(int vol)
{
    if(mixer != NULL && elem != NULL)
    {
       return snd_mixer_selem_set_playback_volume_all(elem, vol);
    }
    return -1;
}

static int alsa_mixer_uninit()
{
    if(mixer != NULL)
    {
        snd_mixer_close(mixer);
        mixer=NULL;
        return 0;
    }
    return -1;
}

另一种实现方式

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stddef.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <alsa/asoundlib.h>

#define ALSA_HCTL_NAME       "default"
#define ALSA_HCTL_ELEM_NAME  "name='Master Volume'"

static snd_hctl_t *pt_hctl=NULL;
static snd_hctl_elem_t *pt_helem=NULL;

static int alsa_ctrl_init()
{
   snd_ctl_elem_id_t *pt_id;
   snd_ctl_elem_id_alloca(&pt_id);

   //1. open hctl
   if(snd_hctl_open(&pt_hctl, ALSA_HCTL_NAME, 0)<0)
   {
       printf("snd_hctl_open fail.\n");
       return -1;
   }

   //2. load hctl
   if(snd_hctl_load(pt_hctl)<0)
   {
       printf("snd_hctl_load fail.\n");
       goto hctl_fail;
   }

   //3. parse ctl elem
   if(snd_ctl_ascii_elem_id_parse(pt_id, ALSA_HCTL_ELEM_NAME)<0)
   {
       printf("snd_ctl_ascii_elem_id_parse fail.\n");
       goto hctl_fail;
   }

   //4. find hctl elem
   pt_helem = snd_hctl_find_elem(pt_hctl, pt_id);
   if (!pt_helem)
   {
      printf("snd_hctl_find_elem fail.\n");
      goto hctl_fail;
   }

   return 0;

hctl_fail:
   snd_hctl_close(pt_hctl);
   pt_hctl=NULL;
   return -1;
}

static int set_master_volume(int vol)
{
    int ret = -1;
    snd_ctl_elem_value_t *pt_value;
    snd_ctl_elem_value_alloca(&pt_value);
    //5. read hctl elem
    if(snd_hctl_elem_read(pt_helem, pt_value)<0)
    {
        printf("snd_hctl_elem_read fail.\n");
        goto set_volume_end;
    }

    //get elem value
    long volume=snd_ctl_elem_value_get_integer(pt_value, 0);
    printf("snd_ctl_elem_value_get_integer volume = %ld.\n",volume);

    //set elem value
    snd_ctl_elem_value_set_integer(pt_value, 0, vol);

    //6 write hctl elem
    if(snd_hctl_elem_write(pt_helem, pt_value))
    {
        printf("snd_hctl_elem_write fail.\n");
        goto set_volume_end;
    }
    printf("set_master_volume volume = %d.\n",vol);
    ret = 0;
 set_volume_end:
    snd_ctl_elem_value_free(pt_value);
    ret;
}

static int alsa_ctrl_uninit()
{
    if(pt_hctl)
    {
        snd_hctl_close(pt_hctl);
        pt_hctl = NULL;
        return 0;
    }
    return -1;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

alsa amixer 使用介绍 的相关文章

  • explian使用介绍

    1 xff09 id列数字越大越先执行 xff0c 如果说数字一样大 xff0c 那么就从上往下依次执行 xff0c id列为null的就表是这是一个结果集 xff0c 不需要使用它来进行查询 2 xff09 select type列常见的
  • amixer用法

    1 先看看amixer支持哪些命令 大概有哪些功能 amixer help Usage amixer lt options gt command Available options h help this help c card N sel
  • 菜鸟修炼笔记-alsa-调节音频音量大小

    alsa 调节音频音量大小 前言一 方法一 xff1a 直接放大缓存中的数据1 基本原理2 相关尝试和结果2 1 在播放前放大音频缓存数据2 2 在录制前放大缓存 二 方法二 xff1a 在linux终端直接设置alsa的参数 1 基本原理
  • Linux ALSA 之四:Tinyalsa->Alsa Driver Flow分析

    Tinyalsa gt Alsa Driver Flow 一 概述二 Tinyalsa2 1 tinypcminfo2 2 tinymix2 3 tinyplay2 4 tinycap 三 Tinyalsa gt alsa driver f
  • Linux ALSA 之十:ALSA ASOC Machine Driver

    ALSA ASOC Machine Driver 一 Machine 简介二 ASoC Machine Driver2 1 Machine Driver 的 Platform Driver amp Platform Device 驱动模型2
  • Linux ALSA 之十二:ALSA ASOC Kcontrol

    ALSA ASOC Kcontrol 一 结构体 snd kcontrol new二 ASoC 系统定义的 kcontrol 宏2 1 SOC SINGLE2 2 SOC SINGLE TLV2 3 SOC DOUBLE2 4 Mixer
  • yum解决办法:fatal error: alsa/asoundlib.h: No such file or directory #include <alsa/asoundlib.h>

    错误 libavdevice alsa c 31 28 fatal error alsa asoundlib h No such file or directory include lt alsa asoundlib h gt 安装命令 s
  • OKHttpUtils使用介绍

    一 xff0c 概述 在上一篇blog的末尾讲到了OKHttp使用时的缺点 xff0c 和对OKHttp封装的必要性 在github上有很多对OKHttp封装的优秀框架 xff0c 其首推的就是hongyang大神的OKHttpUtils
  • PCM data flow - 7 - Frame & Period

    后面章节将分析 dma buffer 的管理 其中细节需要对音频数据相关概念有一定的了解 因此本章说明下音频数据中的几个重要概念 Sample 样本长度 音频数据最基本的单位 常见的有 8 位和 16 位 Channel 声道数 分为单声道
  • ALSA:防止扬声器欠载的方法

    我正在非交错模式下播放单通道音频 当我将音频数据写入扬声器时 我遇到了问题 ALSA lib pcm c 7339 snd pcm recover underrun occurred 我是这样写的 printf d snd pcm avai
  • 以 root 身份运行 python 脚本

    我有以下脚本 usr bin env python import sys import pyttsx def main print running
  • 从 C 代码设置 ALSA 主音量

    我一直在寻找一个简单的 C 代码示例来设置 ALSA 混音器的主音量 但找不到任何简单的内容来完成这个所谓的常见操作 我对 ALSA 完全不熟悉 所以制作我自己的最小示例需要时间 如果有人能提供一个 我会很高兴 以下内容对我有用 参数体积应
  • 在 NodeJS 中写入音频文件时读取音频文件

    我正在使用 ffmpeg 通过 alsa 捕获音频并将其写入 wav 文件 但在编写过程中 我需要将捕获的音频发送给第三方 我尝试过几种方法 包括节点生长文件但没能成功 有没有一种方法可以将文件作为流读取 只要它正在写入并根据需要进行处理
  • alsa_aplay 不在 Android 上录制

    我刚刚开始研究 android 我试图了解 android 音频子系统 alsa 是如何工作的 我正在 windows 7 64 位 上运行的虚拟盒中运行 android 映像 我正在摆弄 alsa utils 来录制声音 我试过alsa
  • ALSA中句号的含义

    我在 Linux 上使用 ALSA 和音频应用程序 我发现很棒的文档解释了如何使用它 1 http www linuxjournal com article 6735 page 0 1 and this one http users sus
  • 将 apply 的管道输出传送到 centos 中的记录

    我正在尝试自动化 websocket 客户端的一些测试 该客户端根据命令连接到服务器 该服务器基本上是一个语音到文本引擎 客户端支持来自麦克风的音频流 这样人们就可以实时录制自己的声音并将其传输到引擎 我在 centos 虚拟机中运行客户端
  • 以编程方式在 Linux 上查找可用的声卡

    有没有办法使用 asoundlib 和 C 以编程方式获取系统上可用声卡的列表 我想要它具有相同的信息 proc asound cards 您可以使用迭代卡片snd card next 从值 1开始获得第0张牌 这是示例代码 编译它gcc
  • 在 Android 中重定向音频/创建备用声音路径

    有人有在 Android 中重定向音频或创建新声音路径的经验 使用 OpenSL ES ALSA 等 吗 最终目标是创建一个虚拟麦克风来取代外部麦克风 人们可以播放音频文件 就像对着麦克风说话一样 访问麦克风的应用程序AudioSource
  • 枚举捕获 ALSA 设备并从中捕获

    我正在编写一个 C 程序 我想枚举系统中的所有捕获设备 实际上 我知道我有三个网络摄像头加上 集成 麦克风 识别它们并同时开始捕获它们 我使用 snd device name hint 枚举所有 PCM 设备 然后使用 snd device
  • 是否可以记录虚拟卡的输出?

    我正在尝试使用 dmix 和 dsnoop 通过虚拟卡混合音频文件 aplay s1 wav aplay s2 wav arecord f dat t wav d 3 result wav 但这可能吗 我只有虚拟卡 modprobe snd

随机推荐

  • yolov3的训练(一)下载与训练

    darknet框架简介 https blog csdn net mao hui fei article details 113820303 AlexeyAB大佬的关于darknet的详细文档信息 https github com Alexe
  • yolov3的训练(五)darknet的VOC测试集和训练集以及训练前准备

    VOC测试集和训练集 同学们 xff0c 这个系列的文件不要直接就跟着我操作了 xff0c 因为这个是踩坑的记录 xff0c 不是教程 xff0c 我只是将整个流程记录下来 xff0c 让后面的同学操作的时候能够避开这些坑 xff0c 希望
  • yolov3的训练(七)使用darknet_ros框架进行识别与模型导入

    同学们 xff0c 这个系列的文件不要直接就跟着我操作了 xff0c 因为这个是踩坑的记录 xff0c 不是教程 xff0c 我只是将整个流程记录下来 xff0c 让后面的同学操作的时候能够避开这些坑 xff0c 希望你能将整个系列的操作流
  • ORB-SLAM2的布置(一)Pangolin的安装

    参考文件 ORB SLAM 2在github的官方流程 https github com raulmur ORB SLAM2 然后就是安装Pangolin 在 ORB SLAM 2 中那些很炫酷的实时建图画面是通过 Pangolin 实现的
  • ORB-SLAM2的布置(二)ORB-SLAM2的安装

    当在上一节中 xff0c Pangolin 安装成功后 xff0c 便可进行ORB SLAM2的安装 这里的普通模式是指直接运行编译之后的可执行文件 xff0c ROS 模式是以ROS机器人框架的形式执行 首先从 github 下载源文件
  • ORB-SLAM2的布置(四)ORB-SLAM2构建点云

    提要 高博的工作是对基本 ORB SLAM2 的扩展 xff0c 基本思想是为每个关键帧构造相应的点云 xff0c 然后依据从 ORB SLAM2 中获取的关键帧位置信息将所有的点云拼接起来 xff0c 形成一个全局点云地图 https g
  • ORB-SLAM2的布置(三)ORB-SLAM2的测试使用

    目标 在上一节 xff0c 我们完成了ORB SLAM2的编译与测试 xff0c 这一节使用完整的数据集进行测试 普通模式 这里的普通模式直接运行编译之后的可执行文件 单目摄像头 首先是单目摄像头 这里我们使用TUM数据集进行离线测试 去到
  • ORB-SLAM2的布置(五)使用 intel D435i 构建SLAM点云地图

    Intel RealSense SDK 2 0 是跨平台的开发套装 xff0c 包含了基本的相机使用工具如 realsense viewer xff0c 也为二次开发提供了丰富的接口 xff0c 包括 ROS xff0c python Ma
  • 阿里云ecs服务器(Ubuntu)配置图形界面并远程桌面连接

    1 登录阿里云后跳转到管理页面 xff0c 点击远程连接 xff08 如图1 xff09 2 选择Workbench远程连接登录进入到终端命令窗口 xff0c 首次登录需要设置实例密码 登录后界面如下 3 安装ubuntu桌面系统 执行下面
  • Windows Nodejs多版本使用

    一 遇到的问题 不同的项目使用的node版本不一致 xff0c 导致使用的时候 xff0c 安装依赖的时候冲突了 xff0c 从网上找了很多的方案 xff0c 解决起来也挺费劲的 xff1b 问题 xff1a 当一个项目使用低版本的时候 x
  • linux 自平衡AVL树

    简介 仔细观察BST会发现 xff0c 虽然它有良好的 搜索 特性 xff0c 也就是可以利用其节点之前的大小关系 xff0c 很容易地从根节点开始往下走找到我们所要的节点 xff0c 但它无法保证这种搜索所需要的时间长短 xff0c 因为
  • C++职业发展路线

    一 C 43 43 服务器程序员 xff08 流媒体后台 xff0c 游戏后台 xff0c 高性能服务器后台 xff09 精通C 43 43 xff0c STL xff0c Linux等 xff0c 熟悉设计模式 xff1b 熟练掌握一门脚
  • Apache CXF文件目录结构及需要jar包

    原文地址 xff1a http blog 163 com a13151055695 64 126 blog static 112087074201143014443273 文件目录结构及相关文件的详细说明 xff1a bin xff08 目
  • 浅析SAX,DOM,JAXP,JDOM与DOM4J之间的关系

    众所周知 xff0c SAX与DOM是JAVA中两大核心XML解析API类库 xff0c 而JAXP JDOM与DOM4J都是基于这两大核心API而衍生出来的 今日兴起看了看相关资料 xff0c 在这里总结总结 SAX与DOM 首先需要说明
  • StAX-基于流的拉式XML解析

    最近在学习webservice时 xff0c 发现很多框架 xff0c 技术都在使用StAX作为底层XML解析工具 xff0c 于是今天看了看资料 xff0c 简单学习了下 xff0c 在这里做个总结 简介 StAX xff0c 全称 St
  • 那些支持我学习与工作的良师益友

    2011大学毕业后 xff0c 成为一名JAVA开发人员从事开发工作只有区区3年不到的时间 回想高中时 xff0c 学校计算机课开设Flash课程 xff0c 第一次接触Flash的我 xff0c 便对计算机技术产生了浓厚的兴趣 xff0c
  • Apache HttpClient4.2入门

    介绍 HttpClient 是 Apache Jakarta Common 下的子项目 xff0c 用来提供高效的 最新的 功能丰富的支持 HTTP 协议的客户端编程工具包 xff0c 并且它支持 HTTP 协议最新的版本和建议 HttpC
  • JMX “javax.management.NotCompliantMBeanException” 异常解决

    原文章 xff1a http lovespss blog 51cto com 1907593 616403 昨天同事在JBoss中部署MBean时一直报错 xff1a Caused by javax management NotCompli
  • webservice-WSDL结构与各元素解析

    承接上一遍webservice初识 xff0c 这篇文章将着重于WSDL wsdl协议说明http www w3 org TR wsdl 结构 现在开始说说wsdl的结构以及各个元素的意义 从下面这张图可以看出wsdl中各元素是存在嵌套的关
  • alsa amixer 使用介绍

    alsa utils 提供的工具中 xff0c arecord 可以用来录音 xff0c aplay 可以用来播放 xff0c amixer 可以用来控制音量 增益等 amixer controls numid 61 34 iface 61