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 使用介绍 的相关文章

  • CAS新版本(6.0-RC4)使用介绍(一)

    新版本CAS介绍 xff08 6 0 RC4 xff09 简介 Central Authentication Service CAS xff0c 通常称为CAS CAS是一种针对Web的企业多语言单点登录解决方案 xff0c 并尝试成为您的
  • 性能测试工具iPerf和Netperf使用介绍

    实验教程 任务目的 1 掌握iPerf的功能和基本命令 xff0c 利用iPerf测试主机之间的吞吐量 xff0c 熟悉基本命令参数的作用 xff0c 为后期实验做准备 2 掌握Netperf的功能和基本命令 xff0c 能够根据不同的测试
  • Alsa交叉编译

    alsa交叉编译 下载源码 需要编译两个库 首先编译lib库 configure span class token parameter variable host span span class token operator 61 span
  • alsa音频调试

    alsa音频调试 1 找不到配置项 在amixer controls指令找不到Master Playback Volume配置项 xff0c 查阅资料可知 softval类型有些需要配置一次才能出现 xff0c 执行指令 在etc asou
  • amixer和alsamixer使用说明

    amixer和alsamixer说明 本文主要解答 xff1a 1 amixer与alsamixer的区别 2 amixer与alsamixer的使用 alsamixer与amixer的区别 alsamixer是Linux音频框架ALSA工
  • PCM data flow - 7 - Frame & Period

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

    DAPM Dynamic Audio Power Management 对应结构体是snd soc dapm widget和snd soc dapm route 对应的操作函数是snd soc dapm new controls snd s
  • 录制成WAV文件

    自从我发帖以来这个问题 我一直在尝试自己从原始 PCM 数据编写一个有效的 WAV 文件 我已经成功编写了 FLAC 转换器 经过测试并且可以工作 但它不会对我一直在编写的 WAV 文件进行编码 我不确定我做错了什么 我一直在网上搜索其他个
  • Alsa无法设置样本格式[FFMPEG]

    我正在尝试使用 ffmpeg 从 Roland USB 设备捕获 pcm 流并用 wav 包装它 我正在使用的命令行如下 ffmpeg f alsa acodec pcm s32le ac 2 ar 48000 i hw 2 0 out w
  • 使用 PyAudio 防止 ALSA 欠载

    我编写了一个小程序 它记录麦克风的声音并将其通过网络发送并在那里播放 我正在使用 PyAudio 来完成此任务 它工作得几乎很好 但在两台计算机上我都从 ALSA 收到错误 表明发生了欠载 我在谷歌上搜索了很多相关内容 现在我知道什么是欠载
  • 从 C 代码设置 ALSA 主音量

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

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

    我想使用alsa实现全双工通信 我首先编写了捕获和回放程序 并使用 UDP 通信将数据从捕获的进程传输到回放进程 当我运行两个进程时工作正常 其中一个正在捕获 另一个正在播放 将其视为从 A 到 B 的半双工 当我尝试实现另一个半双工 从
  • alsa_aplay 不在 Android 上录制

    我刚刚开始研究 android 我试图了解 android 音频子系统 alsa 是如何工作的 我正在 windows 7 64 位 上运行的虚拟盒中运行 android 映像 我正在摆弄 alsa utils 来录制声音 我试过alsa
  • ALSA:不支持非交错访问?

    ALSA s snd pcm hw params set access http www alsa project org alsa doc alsa lib group p c m h w params html ga4c8f1c6329
  • Android:如何配置“tinymix”以使用“tinycap”录制系统音频

    在 Android 中 目前无法使用 Android SDK 录制系统音频 因此 我尝试了一下 TinyALSA 自 Android 4 起 希望可以重新路由音频输出 以便可以录制它 当我在设备上调用 tinymix 时 我得到以下配置 c
  • 在 Android 中重定向音频/创建备用声音路径

    有人有在 Android 中重定向音频或创建新声音路径的经验 使用 OpenSL ES ALSA 等 吗 最终目标是创建一个虚拟麦克风来取代外部麦克风 人们可以播放音频文件 就像对着麦克风说话一样 访问麦克风的应用程序AudioSource
  • 通话录音 - 使其在 Nexus 5X 上运行(可以生根或定制 ROM)

    我正在尝试使用AudioRecord with AudioSource VOICE DOWNLINK在 Nexus 5X Android 7 1 我自己的 AOSP 版本 上 我已经过了权限阶段 将我的 APK 移至特权应用程序 并进行了调
  • 在 Linux 上使用 PyAudio 列出设备

    在 Linux 上列出音频设备时 我尝试使用 Raspbian RaspberryPi import pyaudio p pyaudio PyAudio for i in range p get device count print p g
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗

随机推荐

  • 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