Skip to content
Advertisement

Controlling Jabra 710 USB speaker volume from linux host

I am using Linux (2.6.39 kernel) and trying to find a way that would allow me to send volume increment/decrement commands from my host Linux OS to the Jabra device. I saw this functionality is possible both in Windows and Ubuntu, where controlling of the volume from the PC alters the Jabra volume.

I am able to accept Consumer HID volume increment/decrement commands from the Jabra to the host OS, but not the other way around. Also, I can send Mute or Off-Hook commands to the Jabra, using the HIDIOCSUSAGE ioctl, but I couldn’t find the corresponding usage id for the volume controls in the official USB usage table document.

I am not sure if volume commands from the host are indeed sent via the HID or some other API such as the snd-usb-audio kernel module.

I would appreciate your insights.

Advertisement

Answer

Find out the name and the valid range of that mixer control, then just execute:

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

or access the control directly like this:

#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: %sn", 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;
}
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement