linux测试音量,在Linux中获取C中的主音量

2023-05-16

我正试图在Linux中检索(可能稍后设置)主音量.我正在使用PulseAudio,但理想情况下它也适用于ALSA.

我找到了关于如何设置音量的this非常有用的帖子,从中我能够推断出snd_mixer_selem_get_playback_volume()的存在以检索当前设置.然而,在我的系统上,这似乎给了我错误的读数 – 混音器程序显示100%,最高约66%.

如果我打开pavucontrol,我可以看到这个输出设备的音量与我从这里得到的读数相匹配,所以我假设它给了我硬件音量设置,而不是我想要的全局主音量.

解决方法:

使用gcc audio_volume.c -o audio_volume -lasound或使用gcc audio_volume.c -o audio_volume_oss -DOSSCONTROL编译以下代码. OSS版本写得很粗糙,并没有给出精确的结果.在我的系统中将音量设置为100可设置97%的音量. ALSA版本适用于我和openSUSE中的PulseAudio.需要一些清理和爱,但我希望它是你需要的,我允许在WTFPL license上使用它.

#include

#include

#ifdef OSSCONTROL

#define MIXER_DEV "/dev/dsp"

#include

#include

#include

#else

#include

#endif

typedef enum {

AUDIO_VOLUME_SET,

AUDIO_VOLUME_GET,

} audio_volume_action;

/*

Drawbacks. Sets volume on both channels but gets volume on one. Can be easily adapted.

*/

int audio_volume(audio_volume_action action, long* outvol)

{

#ifdef OSSCONTROL

int ret = 0;

int fd, devs;

if ((fd = open(MIXER_DEV, O_WRONLY)) > 0)

{

if(action == AUDIO_VOLUME_SET) {

if(*outvol < 0 || *outvol > 100)

return -2;

*outvol = (*outvol << 8) | *outvol;

ioctl(fd, SOUND_MIXER_WRITE_VOLUME, outvol);

}

else if(action == AUDIO_VOLUME_GET) {

ioctl(fd, SOUND_MIXER_READ_VOLUME, outvol);

*outvol = *outvol & 0xff;

}

close(fd);

return 0;

}

return -1;;

#else

snd_mixer_t* handle;

snd_mixer_elem_t* elem;

snd_mixer_selem_id_t* sid;

static const char* mix_name = "Master";

static const char* card = "default";

static int mix_index = 0;

long pmin, pmax;

long get_vol, set_vol;

float f_multi;

snd_mixer_selem_id_alloca(&sid);

//sets simple-mixer index and name

snd_mixer_selem_id_set_index(sid, mix_index);

snd_mixer_selem_id_set_name(sid, mix_name);

if ((snd_mixer_open(&handle, 0)) < 0)

return -1;

if ((snd_mixer_attach(handle, card)) < 0) {

snd_mixer_close(handle);

return -2;

}

if ((snd_mixer_selem_register(handle, NULL, NULL)) < 0) {

snd_mixer_close(handle);

return -3;

}

ret = snd_mixer_load(handle);

if (ret < 0) {

snd_mixer_close(handle);

return -4;

}

elem = snd_mixer_find_selem(handle, sid);

if (!elem) {

snd_mixer_close(handle);

return -5;

}

long minv, maxv;

snd_mixer_selem_get_playback_volume_range (elem, &minv, &maxv);

fprintf(stderr, "Volume range \n", minv, maxv);

if(action == AUDIO_VOLUME_GET) {

if(snd_mixer_selem_get_playback_volume(elem, 0, outvol) < 0) {

snd_mixer_close(handle);

return -6;

}

fprintf(stderr, "Get volume %i with status %i\n", *outvol, ret);

/* make the value bound to 100 */

*outvol -= minv;

maxv -= minv;

minv = 0;

*outvol = 100 * (*outvol) / maxv; // make the value bound from 0 to 100

}

else if(action == AUDIO_VOLUME_SET) {

if(*outvol < 0 || *outvol > VOLUME_BOUND) // out of bounds

return -7;

*outvol = (*outvol * (maxv - minv) / (100-1)) + minv;

if(snd_mixer_selem_set_playback_volume(elem, 0, *outvol) < 0) {

snd_mixer_close(handle);

return -8;

}

if(snd_mixer_selem_set_playback_volume(elem, 1, *outvol) < 0) {

snd_mixer_close(handle);

return -9;

}

fprintf(stderr, "Set volume %i with status %i\n", *outvol, ret);

}

snd_mixer_close(handle);

return 0;

#endif

}

int main(void)

{

long vol = -1;

printf("Ret %i\n", audio_volume(AUDIO_VOLUME_GET, &vol));

printf("Master volume is %i\n", vol);

vol = 100;

printf("Ret %i\n", audio_volume(AUDIO_VOLUME_SET, &vol));

return 0;

}

标签:c-3,linux,audio,alsa,api

来源: https://codeday.me/bug/20190521/1147473.html

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

linux测试音量,在Linux中获取C中的主音量 的相关文章

  • 找不到包“gdk-pixbuf-2.0”

    我正在尝试在 Amazon Linux 发行版实例上构建 librsvg 我已经通过 yum 安装了大部分依赖项 其中一些在实例上启用的默认 yum 存储库中不可用 因此必须从头开始构建它们 我已经走了很远 但还停留在最后一点 跑步时sud
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • tcpdump 是否受 iptables 过滤影响?

    如果我的开发机器有iptables规则到FORWARD一些数据包 这些数据包是否被 tcpdump 捕获 我有这个问题 因为我知道存在其他链称为INPUT如果数据包路由到 它会过滤发往应用程序的数据包FORWARD链 它会到达吗tcpdum
  • 如何阻止ubuntu在使用apt安装或更新软件包时弹出“Daemons using outdatedlibraries”? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我最近新安装了 Ubuntu 22 04 LTS 我发现每次使用 apt 安装或更新软件包时 它都会询问我有关Which servic
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 如何使用waf构建共享库?

    我想使用构建一个共享库waf http code google com p waf 因为它看起来比 GNU 自动工具更容易 更简洁 到目前为止 我实际上有几个与我开始编写的 wscript 有关的问题 VERSION 0 0 1 APPNA
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 使用 gdb 调试 Linux 内核模块

    我想知道 API 在内核模块 中返回什么 从几种形式可以知道 这并不是那么简单 我们需要加载符号表来调试内核模块 所以我所做的就是 1 尝试找到内核模块的 text bss和 data段地址 2 在 gdb 中使用 add symbol f
  • 这种文件锁定方法可以接受吗?

    我们有 10 个 Linux 机器 每周必须运行 100 个不同的任务 这些计算机主要在我们晚上在家时执行这些任务 我的一位同事正在开发一个项目 通过使用 Python 自动启动任务来优化运行时间 他的程序将读取任务列表 抓取一个打开的任务
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content

随机推荐

  • (转)Windows 内存管理

    1 xff0e Windows的内存结构 Windows 系统中的每个进程都被赋予它自己的虚拟地址空间 对于 32 位进程来说 xff0c 这个地址空间是 4GB xff0c 因为 32 位指针可以拥有从 0x00000000 至 0xFF
  • Kali系统换源

    安装好kali系统后要选择更换软件源 xff0c 尽量选择国内源 xff0c 更新速度快 在终端中输入 gedit etc apt sources list 打开源列表文件 xff0c 将以下源选择加入其中 xff0c 原来的内容要删除 k
  • SerialPort IOException Workaround in C#

    ref http zachsaw blogspot com 2010 07 serialport ioexception workaround in c html As promised I 39 ve whipped up a quick
  • LVM-逻辑卷常用命令和示意图

    功能 命令物理卷管理卷组管理逻辑卷管理扫描pvscanvgscanlvscan建立pvcreatevgcreatelvcreate显示pvdisplayvgdisplaylvdisplay删除pvremovevgremovelvremove
  • 卷基于快照进行恢复

    基于P版本 xff0c 对卷基于快照进行恢复的源码分析 1 特性描述 在pike版本中 xff0c openstack官网增加了一个新特性 xff0c Cinder volume revert to snapshot xff0c 该特性支持
  • 计蒜客 2019 蓝桥杯省赛 B 组模拟赛(一)

    D题 xff1a 马的管辖 二进制枚举方案 判断该方案是否全部能被覆盖 xff0c 将最优方案存下来并进行剪枝 include lt iostream gt include lt cstring gt include lt cstdio g
  • [bash] 查找替换文件

    bash 查找替换文件 写这个脚本也加深了对 bash 数组的理解 bin bash 2015 11 23 echo e 34 说明 n将文件放在 app tmp class目录下 xff0c 保证该目录下没有其他文件 n备份目录在 app
  • Mac M1芯片 安装Homebrew

    MacBook M1芯片安装代码如下 xff0c 打开终端输入 bin bash c 34 curl fsSL https cdn jsdelivr net gh ineo6 homebrew install install sh 34 看
  • 1.学习大纲

    1 朱有鹏嵌入式Linux核心课程 xff1a https item taobao com item htm spm 61 a230r 1 14 1 1fca1869rWwNpJ amp id 61 45153106151 amp ns 6
  • [工具整理] Debain(KDE)下常用工具

    前言 xff1a Debian安装了KDE桌面环境后 xff0c 发现好多有用的功能没有集成 xff0c 需要自己安装 这里主要介绍 xff1a 截图工具 云盘工具以及KDE上的网络管理工具 0x01 截图工具 xff1a 推荐使用 fla
  • 【转】汽车CAN总线

    概述 CAN xff08 Controller Area Network xff09 总线协议是由 BOSCH 发明的一种基于消息广播模式的串行通信总线 xff0c 它起初用于实现汽车内ECU之间可靠的通信 xff0c 后因其简单实用可靠等
  • 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式 xff1a 1 基于源码的基础上构建出来的 2 使用WAR overlay的方式来安装 官方推荐使用第二种 xff0c 配置管理方便 xff0c 以后升级也容易 本文就是使用第二种方式 安装步骤
  • vnc连接报错“connection refused (10061)”

    排除 防火墙等等 xff0c 网络设置的错误外 xff0c 登录putty exe 使用以下命令来启动 vnc server 共两行 xff1a service vncserver start vncserver 之后弹出两个warning
  • ST-LINK V2 DIY笔记(一)

    最近一段时间调试STM32板子的时候 xff0c 都是用JLINK 43 杜邦线 xff0c 或者拿官方板子当STLINK用 xff0c 可以用 xff0c 但是体积比较大 xff0c 有时候觉得比较麻烦 正好前一阵手头项目少 xff0c
  • 驱动级键盘模拟(C#)(高手请飘过)

    游戏外挂一般分为三个级别 xff1a 初级是鼠标 键盘模拟 xff0c 中级是Call游戏内部函数 xff0c 读写内存 xff0c 高级是抓包 xff0c 封包的 脱机挂 xff08 完全模拟客户端网络数据 xff0c 不用运行游戏 xf
  • CentOS7安装配置VNCServer

    一 安装图形界面 1 安装X Window图形界面 shell gt yum y groupinstall 34 X Window System 34 shell gt yum y install gnome classic session
  • 【计算机本科补全计划】NFV/SDN初识(为了避免保研复试被电话面试)

    正文之前 所有的通信应用无非就是两部分组成 xff1a 计算和网络 这两者关系密不可分 xff0c 但两者关系严重缺乏对称性 xff0c 网络一直拖累着计算 就好像是发快递 xff0c 你打个包 xff08 计算 xff09 只需要几分钟
  • [!] CDN: trunk - Cannot perform full-text search because Algolia returned an error: 0: Cannot reach

    pod search XXXX 时报错 xff1a CDN trunk Cannot perform full text search because Algolia returned an error 0 Cannot reach any
  • 北大青鸟消防设备说明书_北大青鸟火灾报警控制器JB-TG/T-JBF-11S厂家使用说明书...

    北大青鸟火灾报警控制器JB TG T JBF 11S厂家 使用说明书 一 JB TG T JBF 11S火灾报警控制器主要技术指标 xff1a 型号JB TG T JBF 11S 供电主电AC220V 10 50Hz 巡检周期3秒 备电DC
  • linux测试音量,在Linux中获取C中的主音量

    我正试图在Linux中检索 可能稍后设置 主音量 我正在使用PulseAudio 但理想情况下它也适用于ALSA 我找到了关于如何设置音量的this非常有用的帖子 从中我能够推断出snd mixer selem get playback v