# Audio Mixer Service ## Overview The Audio Mixer service exposes PipeWire mixer controls to applications. Each of the controls has a *volume* and a *mute* value. *volume* is a floating point number between 0.0 and 1.0, while *mute* is an integer that can be either 0 or 1. To receive the list of controls, call the *list_controls* verb. The reply will also include the current values for both *volume* and *mute* for each control. When the list of controls changes, the *controls_changed* event is emited. The receiver is then expected to invalidate its cached state of all the controls and call *list_controls* again. ## Verbs | Name | Description | JSON Parameters | | ------------------ |:----------------------------------------|:----------------------------------------------------| | subscribe | subscribe to mixer events | *Request:* {"event": "volume_changed"} | | unsubscribe | unsubscribe from mixer events | *Request:* {"event": "mute_changed"} | | list_controls | list the available controls | See the *List controls* section | | volume | get/set volume | See the *Get/Set Volume/Mute* section | | mute | get/set mute | See the *Get/Set Volume/Mute* section | ### List controls * Request: empty * Reply: Array of objects of the form **{"control": "Emergency", "volume": "1.0", mute: "0"}** ### Get/Set Volume/Mute Getting a volume or a mute value can be achieved by calling the appropriate verb with a parameter that specifies only the control name: **{"control": "Master"}** Setting a volume or a mute value can be achived by calling the appropriate verb with a parameter that specifies both the control name and the value that you want to be set: * On the *volume* verb: **{"control": "Multimedia", "value": "0.8"}** * On the *mute* verb: **{"control": "Multimedia", "value": "1"}** In both cases, the reply will include the current value: * On the *volume* verb: **{"volume": "0.8"}** * On the *mute* verb: **{"mute": "1"}** ## Events | Name | Description | JSON Payload | | ------------------ |:----------------------------------------|-----------------------------------------------------| | controls_changed | the list of available controls changed | None. Call *list_controls* to get the new controls | | volume_changed | volume has changed for a control | {"control": "Multimedia", "volume": "0.65"} | | mute_changed | mute has changed for a control | {"control": "Multimedia", "mute": "1"} | ## Environment variables | Name | Description | |--------------------|:--------------------------------------------------| | XDG_RUNTIME_DIR | the location of the pipewire socket to connect to | ## Notes regarding the connection to PipeWire This binding is engineered in such a way so that when PipeWire exits, the binding attempts to re-connect to it, possibly restarting PipeWire due to socket activation. This re-connection attempt, however, is only done when a verb is called. Therefore, if PipeWire for some reason exits and there is no call to any verb on this binding afterwards, the binding will not emit any events until this happens.