/* External Volume Control */ /* SPDX-FileCopyrightText: Copyright © 2026 Arun Raghavan */ /* SPDX-FileCopyrightText: Copyright © 2026 Julian Bouzas */ /* SPDX-License-Identifier: MIT */ #ifndef ACP_EXT_VOLUME_H #define ACP_EXT_VOLUME_H #include #include #include #define MAX_PORTS 256 typedef struct pa_cvolume pa_cvolume; typedef void (*ext_volume_notifier_t) (void *data, struct spa_event *event); struct caps_reply { int res; enum spa_audio_volume_control_flags caps; }; struct mute_reply { int res; bool mute; }; struct vols_reply { int res; uint32_t channels; double values[SPA_AUDIO_MAX_CHANNELS]; }; struct spa_acp_ext_volume { bool initialized; enum spa_audio_volume_control_flags flags; ext_volume_notifier_t notifier_cb; void *notifier_data; struct caps_reply caps_reply; struct mute_reply mute_replies[MAX_PORTS]; struct vols_reply vols_replies[MAX_PORTS]; }; int spa_acp_ext_volume_init(struct spa_acp_ext_volume *ext_volume, const char *device, ext_volume_notifier_t notifier_cb, void *notifier_data); int spa_acp_ext_volume_read_volume(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index, pa_cvolume *cvol); int spa_acp_ext_volume_write_volume_absolute(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index, pa_cvolume *cvol); int spa_acp_ext_volume_write_volume_relative(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index, float step); int spa_acp_ext_volume_read_mute(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index, bool *mute); int spa_acp_ext_volume_write_mute_value(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index, bool mute); int spa_acp_ext_volume_write_mute_toggle(struct spa_acp_ext_volume *ext_volume, const char *device, const char *port_name, uint32_t port_index); #endif /* ACP_EXT_VOLUME_H */