mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-03-26 07:58:03 -04:00
spa: alsa: Support volume control commands for external volume control
This commit is contained in:
parent
681169b415
commit
e863e71f6b
3 changed files with 99 additions and 0 deletions
|
|
@ -893,12 +893,74 @@ static int impl_set_param(void *object,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int impl_send_command(void *object, const struct spa_command *command)
|
||||
{
|
||||
struct impl *this = object;
|
||||
struct acp_card *card = this->card;
|
||||
|
||||
spa_return_val_if_fail(this != NULL, -EINVAL);
|
||||
spa_return_val_if_fail(command != NULL, -EINVAL);
|
||||
|
||||
switch (SPA_DEVICE_COMMAND_ID(command)) {
|
||||
case SPA_DEVICE_COMMAND_VolumeControl:
|
||||
{
|
||||
const struct spa_pod_prop *prop;
|
||||
|
||||
/* We support some volume control commands for external volumes */
|
||||
if (card->ext_volume.client == NULL)
|
||||
return -ENOTSUP;
|
||||
|
||||
SPA_POD_OBJECT_FOREACH(&command->body, prop) {
|
||||
struct acp_port *port;
|
||||
struct acp_device *dev = NULL;
|
||||
uint32_t id, i;
|
||||
|
||||
if (spa_pod_get_id(&prop->value, &id) < 0 || id > card->n_ports)
|
||||
return -EINVAL;
|
||||
|
||||
port = card->ports[id];
|
||||
|
||||
for (i = 0; i < port->n_devices; i++) {
|
||||
if (port->devices[i]->flags & ACP_DEVICE_ACTIVE) {
|
||||
dev = port->devices[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (dev == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
switch (prop->key) {
|
||||
case SPA_COMMAND_DEVICE_volumeUp:
|
||||
acp_device_set_volume_updown(dev, true);
|
||||
break;
|
||||
case SPA_COMMAND_DEVICE_volumeDown:
|
||||
acp_device_set_volume_updown(dev, false);
|
||||
break;
|
||||
case SPA_COMMAND_DEVICE_muteToggle:
|
||||
acp_device_toggle_mute(dev);
|
||||
break;
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct spa_device_methods impl_device = {
|
||||
SPA_VERSION_DEVICE_METHODS,
|
||||
.add_listener = impl_add_listener,
|
||||
.sync = impl_sync,
|
||||
.enum_params = impl_enum_params,
|
||||
.set_param = impl_set_param,
|
||||
.send_command = impl_send_command,
|
||||
};
|
||||
|
||||
static void card_props_changed(void *data)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue