Support call waiting/hold/conference calls
Please support supplementary services like call waiting, held calls and conference calls to support GSM-compliant phone usage. In the Librem 5 we need to support these operations. At present, there is no infrastructure in place; the API provided by ModemManager's Call objects only supports simple call operations: Accept(), Hangup() and SendDtmf().
For the Librem 5 at least, priorities would be something like:
- Call Waiting
- Call Hold (required for Call Waiting?)
- Conference Calls
- Call Transfers
- Call Deflection
Specifications
Regardless of the higher API offered by ModemManager, some of the underlying 27.007 AT commands to support complex call operations are:
7.12 Call waiting +CCWA
7.13 Call related supplementary services +CHLD
7.14 Call deflection +CTFR
and related information is in 22.030:
6.5.5 Handling of supplementary services within a call
6.5.5.1 Call Deflection, Call Waiting, Call Hold, MultiParty Services, Explicit Call Transfer and Completion of Calls to Busy Subscriber general principles
Alternative implementations
The oFono API provides methods like the following:
void Transfer()
Joins the currently Active (or Outgoing, depending
on network support) and Held calls together and
disconnects both calls.
void SwapCalls()
Swaps Active and Held calls.
void ReleaseAndAnswer()
Releases currently active call (0 or more) and
answers the currently waiting call.
void ReleaseAndSwap()
Releases currently active call (0 or more) and
activates any currently held calls.
void HoldAndAnswer()
Puts the current call (including multi-party calls) on
hold and answers the currently waiting call.
void HangupAll()
Releases all calls except waiting calls. This includes
multiparty calls.
array{object} PrivateChat(object call)
Places the multi-party call on hold and makes desired
call active.
array{object} CreateMultiparty()
Joins active and held calls together into a multi-party
call.
void HangupMultiparty()
Hangs up the multi-party call. All participating
calls are released.