-
Notifications
You must be signed in to change notification settings - Fork 16
/
hsphfpd.txt
892 lines (681 loc) · 28.9 KB
/
hsphfpd.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
Design
======
Start up
--------
hsphfpd BlueZ
| |
| register HSP HS profile agent |
| ----------------------------> |
| |
| register HSP AG profile agent |
| ----------------------------> |
| |
| register HFP HF profile agent |
| ----------------------------> |
| |
| register HFP AG profile agent |
| ----------------------------> |
| |
Audio daemon hsphfpd
| |
| register audio application |
| ----------------------------> |
| |
| request list of audio agents |
| <---------------------------- |
| return list of audio agents |
| ----------------------------> |
| |
Telephony daemon hsphfpd
| |
| register telephony application|
| ----------------------------> |
| |
| request list of tel. agents |
| <---------------------------- |
| return list of tel. agents |
| ----------------------------> |
| |
HSP connection
--------------
hsphfpd Bluez HSP
| | |
| | connection setup |
| | <--------------> |
| NewConnection | |
| <---------------------------- | |
| | |
Connection is now established and fully working.
hsphfpd will handle all AT commands defined by
HSP profile. Button press event is exported by
Linux input API and RING event via DBus signal.
HFP connection
--------------
Telephony daemon hsphfpd Bluez HFP
| | | |
| | | connection setup |
| | | <--------------> |
| | NewConnection with fd | |
| | <---------------------------- | |
| | | |
| +-----------------------------+ | |
| | Processing of all bluetooth | | |
| | At commands as required for | | |
| | all HFP connection. | | |
| +-----------------------------+ | |
| | | |
....
Connection is now established and fully working. hsphfpd will reject all Telephony
function requests from HSP device until some Telephony agent is registered and
accepted Telephony transport. hsphfpd will handle button press events, battery
level reporting and other non-telephony events send via AT commands and exports
them via DBus signals.
....
| | | |
| NewConnection with fd | | |
| <---------------------------- | | |
| | | |
| +----------------------------+ | |
| | Telephony AT commands are | | |
| | now forwarded to Telephony | | |
| | daemon, non-telephony are | | |
| | still processed by hsphfpd | | |
| +----------------------------+ | |
| | | |
....
Connection is now established with Telephony agent. Telephony agent is now responsible
for all Telephony related AT commands. Non-telephony events (battery level reporting,
speaker/microphone gain) are still processed by hsphfpd.
....
Audio SCO connection
--------------------
Audio daemon hsphfpd
| |
| NewConnection with fd |
| <---------------------------- |
| |
| change mic. and speaker gain |
| ----------------------------> |
| |
| change mic. and speaker gain |
| <---------------------------- |
| |
Audio connection can be established independently of Telephony agent. All audio related
AT commands (codec negotiation, mic/speaker gain) are always handled by hsphfpd.
Audio connection is automatically dropped when shutdown() syscall is called on SCO socket
file descriptor.
Processing of AT commands
-------------------------
Processing AT+BCC command which is not telephony related is always done in hsphfpd.
Telephony daemon hsphfpd Bluez HFP
| | | |
| | | AT+BCC |
| | | <--------------- |
| | AT+BCC | |
| | <---------------------------- | |
| | | |
| | +BCS: id | |
| | ----------------------------> | |
| | | +BCS: id |
| | | ---------------> |
| | | |
....
Processing AT+BLDN command (dial last number) is forward to telephony daemon.
Telephony daemon hsphfpd Bluez HFP
| | | |
| | | AT+BLDN |
| | | <--------------- |
| | AT+BLDN | |
| | <---------------------------- | |
| AT+BLDN | | |
| <---------------------------- | | |
| | | |
| OK | | |
| ----------------------------> | | |
| | OK | |
| | ----------------------------> | |
| | | OK |
| | | ---------------> |
| | | |
| | | |
....
Processing AT+BLDN command (dial last number) is done in hsphfpd when telephony daemon is not connected.
hsphfpd Bluez HFP
| | |
| | AT+BLDN |
| | <--------------- |
| AT+BLDN | |
| <---------------------------- | |
| | |
| ERROR | |
| ----------------------------> | |
| | ERROR |
| | ---------------> |
| | |
| | |
Device hierarchy
================
Service org.hsphfpd
Interface org.freedesktop.DBus.ObjectManager
Object /
This is standard DBus org.freedesktop.DBus.ObjectManager interface. Method
GetManagedObjects() returns only Endpoint objects. Signals InterfacesAdded()
and InterfacesRemoved() are emitted only for Endpoint objects.
Methods
dict GetManagedObjects()
Signals
InterfacesAdded(object device, dict interfaces)
InterfacesRemoved(object device, array interfaces)
Service org.hsphfpd
Interface org.hsphfpd.ApplicationManager
Object /
Methods
RegisterApplication(object application)
Register application. Caller should implement at
supplied object path application with standard
org.freedesktop.DBus.ObjectManager interface.
See section Application hierarchy.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.AlreadyExists
UnregisterApplication(object application)
Unregister previously registered application.
Application is automatically unregistered when caller
disconnect from DBus.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.DoesNotExist
Service org.hsphfpd
Interface org.hsphfpd.Endpoint
Object <dynamic>
This is base interface of all kind of endpoints. Endpoint is a specific profile
with role of bluetooth device. E.g. Hands-Free profile in AudioGateway role of
bluetooth device with address 00:11:22:33:44:55. If bluetooth device supports
more profiles and roles then bluetooth devices is exported more times.
Methods
object, string, object ConnectAudio(string air_codec, string agent_codec)
Connect audio transport with supplied air and agent
codecs. Endpoint must support air codec, adapter must
support air and agent codecs and some audio application
must provide some agent which supports supplied agent
codec. Audio transport socket is then passed to some
registered audio application agent which is responsible
for processing audio. When this method is called by
registered audio application then their agents are
preferred when choosing agent which would get audio
transport socket.
Air codec represents a format used for transmitting data
over the air. Agent codec represents a format used by
audio application agent. If air codec does not match
agent codec then bluetooth adapter is doing conversion
between these two formats.
Standard air codec is CVSD and standard agent codec is
PCM_s16le_8kHz.
When this method is called with empty codec name (either
air or agent or both of them) then particular codec is
chosen automatically to some supported combination.
Does not have to work for HSP profile in gateway role.
Also does not have to work for HFP profile in gateway
role when "codec-negotiation" feature is not supported.
On success this method returns newly registered audio
transport path, then DBus service id and object path of
application's agent which took audio transport socket.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.NotConnected
org.hsphfpd.Error.AlreadyConnected
org.hsphfpd.Error.InProgress
org.hsphfpd.Error.InUse
org.hsphfpd.Error.NotSupported
org.hsphfpd.Error.NotAvailable
org.hsphfpd.Error.Failed
Error org.hsphfpd.Error.NotSupported is returned when
either adapter or endpoint does not support supplied
codec. Error org.hsphfpd.Error.NotAvailable is returned
when there is no audio application agent which can
process agent codec.
Properties
string Name [readonly, const]
Name of bluetooth device represented by Endpoint.
string RemoteAddress [readonly, const]
Address of bluetooth device represented by Endpoint.
string LocalAddress [readonly, const]
Address of bluetooth adapter.
bool Connected [readonly]
True whether Endpoint is connected.
bool AudioConnected [readonly]
True whether Endpoint has connected Audio agent.
bool TelephonyConnected [readonly]
True whether Endpoint has connected Telephony agent.
string Profile [readonly, const]
Type of bluetooth profile.
Possible values:
"headset"
"handsfree"
string Version [readonly]
Version of bluetooth profile.
Cached value. May be empty string before first connection.
string Role [readonly, const]
Role of bluetooth profile.
Possible values:
"gateway"
"client"
string PowerSource [readonly]
Power source of bluetooth device.
Possible values:
"unknown" - power source of bluetooth device is not known
"battery" - bluetooth device is powered by battery
"external" - bluetooth device has external power supply
int16 BatteryLevel [readonly]
Battery level of bluetooth device.
Possible values:
0-100 - battery charge level in percentage
-1 - battery charge level is not know or
bluetooth device does not have battery
array{string} Features [readonly]
List of features supported by Endpoint.
HS features:
"volume-control"
HF features:
"echo-canceling-and-noise-reduction"
"three-way-calling"
"cli-presentation"
"voice-recognition"
"volume-control"
"enhanced-call-status"
"enhanced-call-control"
"codec-negotiation"
"hf-indicators"
"esco-s4-settings"
"wide-band-speech"
AG features:
"three-way-calling"
"echo-canceling-and-noise-reduction"
"voice-recognition"
"in-band-ring-tone"
"attach-voice-tag"
"reject-call"
"enhanced-call-status"
"enhanced-call-control"
"extended-error-codecs"
"codec-negotiation"
"hf-indicators"
"esco-s4-settings"
"wide-band-speech"
AG call hold features:
"release-all-held"
"release-specified-active-call"
"places-all-held"
"private-chat"
"create-multiparty"
"transfer"
HF indicator features:
"enhanced-safety"
"battery-level"
AG indicator features:
"service-availability"
"call-status"
"call-setup"
"call-held"
"signal-strength"
"roam-status"
"battery-level"
CSR features:
"csr-caller-name"
"csr-display-text"
"csr-sms-indication"
"csr-battery-level"
"csr-power-source"
Apple features:
"apple-battery-level"
"apple-dock-state"
"apple-siri-status"
"apple-noise-reduction-status"
Cached value. May be empty array before feature
negotiation is complete.
array{string} AudioCodecs [readonly]
List of air codecs supported by bluetooth device
represented by Endpoint.
Cached value. May be empty array before codec list
negotiation is complete.
Service org.hsphfpd
Interface org.hsphfpd.ClientEndpoint
Object <dynamic>
This interface is specific for Client role endpoints.
Methods
void SendDisplayTextEvent(string text)
Send event to remote bluetooth device to display
supplied on own screen. This is supported only
when Endpoint support "csr-display-text" feature.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.NotConnected
org.hsphfpd.Error.NotSupported
Service org.hsphfpd
Interface org.hsphfpd.HSPClientEndpoint
Object <dynamic>
This interface is specific for Client role endpoints of Headset Profile.
Methods
SendIncomingCallEvent()
Send ring event to remote bluetooth device about
incoming call.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.NotConnected
Service org.hsphfpd
Interface org.hsphfpd.GatewayEndpoint
Object <dynamic>
This interface is specific for Gateway role endpoints.
Signals
DisplayText(string text)
This signal is emitted when remote device want to show
supplied text on our screen. Signal can be emitted only
when Endpoint support "csr-display-text" feature.
Service org.hsphfpd
Interface org.hsphfpd.HSPGatewayEndpoint
Object <dynamic>
This interface is specific for Gateway role endpoints of Headset Profile.
Methods
SendButtonPressEvent()
Send button press event to remote bluetooth device.
Headset profile supports only one button.
Possible errors: org.hsphfpd.Error.InvalidArguments
org.hsphfpd.Error.NotConnected
Signals
IncomingCall()
This signal is emitted when remote device is sending
to us ring event which signals incoming call. You may
react on this signal with sending button press event
via method SendButtonPressEvent().
Service org.hsphfpd
Interface org.hsphfpd.AudioTransport
Object <dynamic>
This interface represents audio transport between audio application agent and
hsphfpd daemon.
Methods
void Release()
Release and disconnect this audio transport. Underlying
socket is closed and audio transport is destroyed.
Properties
string RxVolumeControl [readonly]
This property describes who tunes gain of stream which
is receiving by audio agent.
Possible values:
"remote" - Remote device tunes gain of transmitted audio
stream according to RxVolumeGain property
(audio stream which agent receives). Audio
agent should not change gain of received
audio stream. But it may change RxVolumeGain
property to tell remote device to tune gain
before transmitting audio stream.
"local" - Remote device is not capable of changing gain
of transmitting audio stream but can inform
audio agent to post-process received audio
stream for specified gain value. Remote
device can also receive information from
audio agent what is the current gain value
used in post-processing. Audio agent for this
post-processing should install softvol plugin
and tune gain of received audio stream
according to RxVolumeGain property. When
volume in solftvol plugin is changed then
audio agent should update RxVolumeGain
property to inform remote side about this
change.
"none" - Remote device has no support for any kind
of volume control. Audio agent needs to use
softvol plugin if it want to change volume.
RxVoluemGain property is ignored, does not
contain any meaningful value and does not
have to be present.
Cached value. May change also when connection is already
established.
string TxVolumeControl [readonly]
This property describes who tunes gain of stream which
is transmitted by audio agent.
Possible values:
"remote" - Remote device tunes gain of received audio
stream according to TxVolumeGain property
(audio stream which agent transmits). Audio
agent should not change gain of transmitting
audio stream. But it may change TxVolumeGain
property to tell remote device to use some
kind of softvol plugin to post-process
received audio stream and tune gain.
"local" - Remote device is not capable of changing gain
of receiving audio stream but can inform
audio agent to preprocess audio stream before
transmission to specified gain value. Remote
device can also receive information from
audio agent what is the current gain value
used in preprocessing. Audio agent for this
preprocessing should install softvol plugin
and tune gain of transmitting audio stream
according to TxVolumeGain property. When
volume in solftvol plugin is changed then
audio agent should update TxVolumeGain
property to inform remote side about this
change.
"none" - Remote device has no support for any kind
of volume control. Audio agent needs to use
softvol plugin if it want to change volume.
TxVoluemGain property is ignored, does not
contain any meaningful value and does not
have to be present.
Cached value. May change also when connection is already
established.
uint16 RxVolumeGain [readwrite, optional]
Gain value of the receiving audio stream. Property does
not have to be present when RxVolumeControl is "none".
See RxVolumeControl.
Property can be changed either by remote device or by
local applications.
Possible values:
0-15
uint16 TxVolumeGain [readwrite, optional]
Gain value of the transmitting audio stream. Property
does not have to be present when TxVolumeControl is
"none". See TxVolumeControl.
Property can be changed either by remote device or by
local applications.
Possible values:
0-15
bool NREC [readonly, const, optional]
True whether audio agent is doing echo canceling and
noise reduction functions.
Property is present only in HFP profile and has meaning
only for HFP profile. When set to True then audio agent
must do echo canceling and noise reduction functions to
fulfill HFP specification and audio quality. When to set
to False then audio agent must not enable echo canceling
and noise reduction functions.
In HSP profile audio agent should do or disable echo
canceling and noise reduction functions based on system
audio settings or other audio characteristic.
uint16 MTU [readonly, const]
MTU of SCO socket.
string AgentCodec [readonly, const]
Codec used by audio application agent.
string AirCodec [readonly, const]
Codec used for transmitting data over the air.
object Endpoint [readonly, const]
Endpoint to which this audio transport belongs.
Power supply hierarchy
======================
Service org.hsphfpd
Interface org.hsphfpd.PowerSupply
Object /org/hsphfpd/power_supply
This interface is for external power supply daemon (e.g. upower).
It should periodically update exported properties to up-to-date state
of our main device battery. hsphfpd then notify all connected bluetooth
devices about power supply status.
Properties
string PowerSource [readwrite]
Power source of our main device battery.
Possible values:
"unknown" - power source of our device is not known
"battery" - our device is powered by battery
"external" - our device has external power supply
int16 BatteryLevel [readwrite]
Battery level of our device.
Possible values:
0-100 - battery charge level in percentage
-1 - battery charge level is not know or
our device does not have any battery
Application hierarchy
=====================
Every application (either audio or telephony) should implement this standard
DBus interface org.freedesktop.DBus.ObjectManager. Method GetManagedObjects()
should return all audio and telephony agents in application's preferred order.
Object path of this application is registered to hsphfpd via method
RegisterApplication() on interface org.hsphfpd.ApplicationManager.
Service <freely defined>
Interface org.freedesktop.DBus.ObjectManager
Object <freely defined>
Methods
dict GetManagedObjects()
Signals
InterfacesAdded(object agent, dict interfaces)
InterfacesRemoved(object agent, array interfaces)
Audio Agent hierarchy
=====================
Service <freely defined>
Interface org.hsphfpd.AudioAgent
Object <freely defined>
This interface represents audio agent. Audio agent is responsible for processing
audio transport. Discovery of audio agents by hsphfpd is done by calling
GetManagedObjects() method on object path registered by RegisterApplication()
method.
Methods
void NewConnection(object audio_transport, fd sco, dict properties)
properties:
string RxVolumeControl
string TxVolumeControl
uint16 RxVolumeGain
uint16 TxVolumeGain
bool NREC
uint16 MTU
object Endpoint
string Name
string LocalAddress
string RemoteAddress
string Profile
string Version
string Role
string AirCodec
Properties are same as exported on audio transport
object and endpoint object.
Called when new audio transport is created. Audio
transport object is automatically destroyed when
either shutdown() syscall on passed file descriptor
is called or when Release method on audio transport
object is called. Audio application agent should
monitor POLLHUP event on passed file descriptor.
AirCodec does not have to match AgentCodec (e.g. when
hardware is doing encoding and decoding of data).
Possible errors: org.hsphfpd.Error.Rejected
org.hsphfpd.Error.Canceled
When org.hsphfpd.Error.Rejected is returned then other
audio agent is used. In this case application should
not read/write data from/to SCO socket and also should
not modify SCO socket properties.
When org.hsphfpd.Error.Canceled is returned then no
other audio agent is used and audio transfer is
immediately destroyed. This error may be returned also
when application already read/write data from/to socket.
Properties
string AgentCodec [readonly, const]
Format in which agent read/write data from/to SCO
socket. If application supports more codecs, it needs
to export more agents, one per codec. AgentCodec does
not have to match AirCodec (e.g. when hardware is doing
encoding and decoding of data).
Must not be empty and must not be changed.
Telephony Agent hierarchy
=========================
This interface represents telephony agent. Telephony agent is responsible for
processing Telephony AT commands for HFP devices. Discovery of telephony agents
by hsphfpd is done by calling GetManagedObjects() method on object path
registered by RegisterApplication() method.
When Telephony agent is not connected to HFP device then hsphfpd takes care of
it and provides dummy responses to HFP devices.
Service <freely defined>
Interface org.hsphfpd.TelephonyAgent
Object <freely defined>
Methods
void NewConnection(object endpoint, fd socket, dict properties)
properties:
string Name
string LocalAddress
string RemoteAddress
string Profile
string Version
array{string} Features
array{string} Indicators
Properties are same as exported on endpoint object.
Additional property Indicators contains list of AG
indicators in same order as they were already sent
in +CIND: response to HF device. This property is
available only for endpoints in gateway role.
This metod is called for each endpoint when does not
have connected any Telephony agent yet. Telephony
connection is automatically destroyed when either
shutdown() syscall on passed file descriptor is called
or when endpoint is moved to disconnected state. In
later case hsphfd calls shutdown() syscall. So
Telephony application agent should monitor POLLHUP
event on passed file descriptor. Calling shutdown()
syscall for still connected endpoint does not
disconnect endpoint, it only disconnects Telephony
connection.
Possible errors: org.hsphfpd.Error.Rejected
org.hsphfpd.Error.Canceled
When org.hsphfpd.Error.Rejected is returned then other
telephony agent is used. In this case application
should not read/write data from/to socket and also
should not modify socket properties.
When org.hsphfpd.Error.Canceled is returned then no
other telephony agent is used and telephony connection
is immediately destroyed. This error may be returned
also when application already read/write data from/to
socket.
Properties
string Role [readonly, const]
Role of modem. In client role agent acts as a client
for AT modem, it receives AT+cmd commands on which it
response with OK, ERROR or +status: codes. In gateway
role agent acts as a AT modem, it sends AT+cmd and
expects for OK, ERROR or +status code responses.
If application supports more then one role, it needs
to export more agents. It could exports also more agents
of same role and via org.hsphfpd.Error.Rejected error
code from NewConnection can control which agent finally
takes telephony connection.
Must not be changed.
Possible values:
"gateway"
"client"
Possible agent codecs:
PCM_u8_8kHz
PCM_s8_8kHz
alaw
ulaw
CVSD
AuriStream_2bit_8kHz
AuriStream_4bit_8kHz
PCM_u16le_8kHz
PCM_s16le_8kHz
PCM_u8_16kHz
PCM_s8_16kHz
AuriStream_2bit_16kHz
AuriStream_4bit_16kHz
mSBC
PCM_u16le_16kHz
PCM_s16le_16kHz
Possible air codecs:
alaw
ulaw
CVSD
AuriStream_2bit_8kHz
AuriStream_4bit_8kHz
AuriStream_2bit_16kHz
AuriStream_4bit_16kHz
mSBC
Currently supported codecs combinations:
air=CVSD agent=PCM_s16le_8kHz
air=mSBC agent=mSBC