bluez5: initial telephony service API documentation

This commit is contained in:
George Kiagiadakis 2024-07-03 20:03:02 +03:00 committed by Wim Taymans
parent 23c797136a
commit 16c4cd05a9

View file

@ -0,0 +1,235 @@
# PipeWire Bluetooth Telephony service
The Telephony service is a D-Bus user session service that allows applications
to communicate with the HFP native backend in order to control phone calls.
Phone call features are a core part of the HFP specification and are available
when a mobile phone is paired (therefore, PipeWire acts as the Hands-Free and
the phone is the Audio Gateway).
The service is exposed on the session bus and registered under the well-known
name "org.freedesktop.PipeWire.Telephony".
## Manager Object
```
Service org.freedesktop.PipeWire.Telephony
Object path /org/freedesktop/PipeWire/Telephony
Implements org.freedesktop.DBus.Introspectable
org.freedesktop.DBus.ObjectManager
```
The manager object is always available and allows applications to get access to
the connected audio gateways.
AudioGateway objects are announced via the standard DBus ObjectManager interface.
## AudioGateway Interface
```
Service org.freedesktop.PipeWire.Telephony
Interface org.freedesktop.PipeWire.Telephony.AudioGateway1
Requires org.freedesktop.DBus.Introspectable
org.freedesktop.DBus.ObjectManager
Object path /org/freedesktop/PipeWire/Telephony/{ag0,ag1,...}
```
Audio gateway objects represent the currently connected AG devices (typically
mobile phones) and should implement the `org.freedesktop.PipeWire.Telephony.AudioGateway1`
interface as well the standard `org.freedesktop.DBus.Introspectable`,
`org.freedesktop.DBus.Properties` and `org.freedesktop.DBus.ObjectManager`
interfaces.
Call objects are announced via the standard DBus ObjectManager interface.
### Methods
`object Dial(string number)`
Initiates a new outgoing call. Returns the object path to the newly created
call.
The number must be a string containing the following characters:
`[0-9+*#,ABCD]{1,80}` In other words, it must be a non-empty string consisting
of 1 to 80 characters. The character set can contain numbers, `+`, `*`, `#`, `,`
and the letters `A` to `D`. Besides this sanity checking no further number
validation is performed. It is assumed that the gateway and/or the network will
perform further validation.
NOTE: If an active call (single or multiparty) exists, then it is automatically
put on hold if the dial procedure is successful.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.InvalidArgs
* org.freedesktop.DBus.Error.Failed
`void SwapCalls()`
Swaps Active and Held calls. The effect of this is that all calls (0 or more
including calls in a multi-party conversation) that were Active are now Held,
and all calls (0 or more) that were Held are now Active.
GSM specification does not allow calls to be swapped in the case where Held,
Active and Waiting calls exist. Some modems implement this anyway, thus it is
manufacturer specific whether this method will succeed in the case of Held,
Active and Waiting calls.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void ReleaseAndAnswer()`
Releases currently active call (0 or more) and answers the currently waiting
call. Please note that if the current call is a multiparty call, then all
parties in the multi-party call will be released.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void ReleaseAndSwap()`
Releases currently active call (0 or more) and activates any currently held
calls. Please note that if the current call is a multiparty call, then all
parties in the multi-party call will be released.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void HoldAndAnswer()`
Puts the current call (including multi-party calls) on hold and answers the
currently waiting call. Calling this function when a user already has a both
Active and Held calls is invalid, since in GSM a user can have only a single
Held call at a time.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void HangupAll()`
Releases all calls except waiting calls. This includes multiparty calls.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`array{object} CreateMultiparty()`
Joins active and held calls together into a multi-party call. If one of the
calls is already a multi-party call, then the other call is added to the
multiparty conversation. Returns the new list of calls participating in the
multiparty call.
There can only be one subscriber controlled multi-party call according to the
GSM specification.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void SendTones(string tones)`
Sends the DTMF tones to the network. The tones have a fixed duration. Tones
can be one of: '0' - '9', '*', '#', 'A', 'B', 'C', 'D'. The last four are
typically not used in normal circumstances.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.InvalidArgs
* org.freedesktop.DBus.Error.Failed
## Call Interface
```
Service org.freedesktop.PipeWire.Telephony
Interface org.freedesktop.PipeWire.Telephony.Call1
Requires org.freedesktop.DBus.Introspectable
org.freedesktop.DBus.Properties
Object path /org/freedesktop/PipeWire/Telephony/{ag0,ag1,...}/{call0,call1,...}
```
Call objects represent active calls and allows managing them.
### Methods
`void Answer()`
Answers an incoming call. Only valid if the state of the call is "incoming".
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
`void Hangup()`
Hangs up the call.
For an incoming call, the call is hung up using ATH or equivalent. For a
waiting call, the remote party is notified by using the User Determined User
Busy (UDUB) condition. This is generally implemented using CHLD=0.
Please note that the GSM specification does not allow the release of a held call
when a waiting call exists. This is because 27.007 allows CHLD=1X to operate
only on active calls. Hence a held call cannot be hung up without affecting the
state of the incoming call (e.g. using other CHLD alternatives). Most
manufacturers provide vendor extensions that do allow the state of the held call
to be modified using CHLD=1X or equivalent. It should be noted that Bluetooth
HFP specifies the classic 27.007 behavior and does not allow CHLD=1X to modify
the state of held calls.
Based on the discussion above, it should also be noted that releasing a
particular party of a held multiparty call might not be possible on some
implementations. It is recommended for the applications to structure their UI
accordingly.
NOTE: Releasing active calls does not produce side-effects. That is the state
of held or waiting calls is not affected. As an exception, in the case where a
single active call and a waiting call are present, releasing the active call
will result in the waiting call transitioning to the 'incoming' state.
Possible Errors:
* org.freedesktop.PipeWire.Telephony.Error.InvalidState
* org.freedesktop.DBus.Error.Failed
### Properties
`string LineIdentification [readonly]`
Contains the Line Identification information returned by the network, if
present. For incoming calls this is effectively the CLIP. For outgoing calls
this attribute will hold the dialed number, or the COLP if received by the
audio gateway.
`string IncomingLine [readonly, optional]`
Contains the Called Line Identification information returned by the network.
This is only available for incoming calls and indicates the local subscriber
number which was dialed by the remote party. This is useful for subscribers
which have a multiple line service with their network provider and would like to
know what line the call is coming in on.
`string Name [readonly]`
Contains the Name Identification information returned by the network, if
present.
`boolean Multiparty [readonly]`
Contains the indication if the call is part of a multiparty call or not.
`string State [readonly]`
Contains the state of the current call. The state can be one of:
- "active" - The call is active
- "held" - The call is on hold
- "dialing" - The call is being dialed
- "alerting" - The remote party is being alerted
- "incoming" - Incoming call in progress
- "waiting" - Call is waiting
- "disconnected" - No further use of this object is allowed, it will be
destroyed shortly