从 linux 主机控制 Jabra 710 USB 扬声器音量

Posted

技术标签:

【中文标题】从 linux 主机控制 Jabra 710 USB 扬声器音量【英文标题】:Controlling Jabra 710 USB speaker volume from linux host 【发布时间】:2017-09-28 05:46:09 【问题描述】:

我正在使用 Linux(2.6.39 内核)并试图找到一种方法,让我可以从我的主机 Linux 操作系统向 Jabra 设备发送音量递增/递减命令。我看到这个功能在 Windows 和 Ubuntu 中都是可行的,从 PC 控制音量会改变 Jabra 的音量。

我能够接受从 Jabra 到主机操作系统的 Consumer HID 音量递增/递减命令,但反之则不行。另外,我可以使用 HIDIOCSUSAGE ioctl 向 Jabra 发送静音或摘机命令,但在官方 USB 使用表document 中找不到音量控件的相应使用 ID。

我不确定来自主机的音量命令是否确实是通过 HID 或其他一些 API(例如 snd-usb-audio 内核模块)发送的。

非常感谢您的见解。

【问题讨论】:

显示此设备的amixer scontrols 的输出。 $amixer -c 1 scontrols Simple mixer control 'PCM',0 Simple mixer control 'Headset',0 现在你知道的足够写一个答案了。 ?????? 嗨,很抱歉,我没有关注.. 你能详细说明一下吗?我的主要问题是从我的 linux 操作系统代码中找出控制耳机音量的正确方法。 (我没有使用 alsamixer/amixer)。我认为来自主机端的音量增加/减少不会作为 HID 命令发送到耳机,与摘机或静音命令相反,而是不同的。任何想法?谢谢! 【参考方案1】:

找出该混音器控件的名称和有效范围,然后 执行:

system("amixer cset name='Master Playback Volume' 42");

或者像这样直接访问控件:

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>

static void check(int err, const char *f)

        if (err < 0) 
                fprintf(stderr, "%s failed: %s\n", f, snd_strerror(err));
                exit(EXIT_FAILURE);
        

#define CHECK(f) check(f, #f)

int main()

        snd_ctl_t *ctl;
        snd_ctl_elem_value_t *value;

        CHECK(snd_ctl_open(&ctl, "hw:1", 0));  // card number

        snd_ctl_elem_value_alloca(&value);
        snd_ctl_elem_value_set_interface(value, SND_CTL_ELEM_IFACE_MIXER);
        snd_ctl_elem_value_set_name(value, "Master Playback Volume");
        snd_ctl_elem_value_set_integer(value, 0, 42);
        CHECK(snd_ctl_elem_write(ctl, value));

        snd_ctl_close(ctl);
        return 0;

【讨论】:

谢谢!正是我想要的

以上是关于从 linux 主机控制 Jabra 710 USB 扬声器音量的主要内容,如果未能解决你的问题,请参考以下文章

从0开始搭建MongoDB集群

戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)

从主机 Windows 上无法远程访问 Linux 的 Tomcat 服务器解决方法

Linux从青铜到王者第二十篇:Linux网络基础第三篇之IP协议

linux主机安全审计追溯分析脚本

20170713L08-00老男孩Linux运维实战培训-DELL R710服务器RAID配置实战演示