blob: 2e170f5043b4fd89d61a6315a5261b4e3aaee670 (
plain)
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
|
/*
*
* BlueZ - Bluetooth protocol stack for Linux
*
* Copyright (C) 2004-2009 Marcel Holtmann <marcel@holtmann.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
*/
/*
Message sequence chart of streaming sequence for A2DP transport
Audio daemon User
on snd_pcm_open
<--BT_GET_CAPABILITIES_REQ
BT_GET_CAPABILITIES_RSP-->
on snd_pcm_hw_params
<--BT_SETCONFIGURATION_REQ
BT_SET_CONFIGURATION_RSP-->
on snd_pcm_prepare
<--BT_START_STREAM_REQ
<Moves to streaming state>
BT_START_STREAM_RSP-->
BT_NEW_STREAM_IND -->
< streams data >
..........
on snd_pcm_drop/snd_pcm_drain
<--BT_STOP_STREAM_REQ
<Moves to open state>
BT_STOP_STREAM_RSP-->
on IPC close or appl crash
<Moves to idle>
*/
#ifndef BT_AUDIOCLIENT_H
#define BT_AUDIOCLIENT_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#define BT_SUGGESTED_BUFFER_SIZE 512
#define BT_IPC_SOCKET_NAME "\0/org/bluez/audio"
/* Generic message header definition, except for RESPONSE messages */
typedef struct {
uint8_t type;
uint8_t name;
uint16_t length;
} __attribute__ ((packed)) bt_audio_msg_header_t;
typedef struct {
bt_audio_msg_header_t h;
uint8_t posix_errno;
} __attribute__ ((packed)) bt_audio_error_t;
/* Message types */
#define BT_REQUEST 0
#define BT_RESPONSE 1
#define BT_INDICATION 2
#define BT_ERROR 3
/* Messages names */
#define BT_GET_CAPABILITIES 0
#define BT_OPEN 1
#define BT_SET_CONFIGURATION 2
#define BT_NEW_STREAM 3
#define BT_START_STREAM 4
#define BT_STOP_STREAM 5
#define BT_CLOSE 6
#define BT_CONTROL 7
#define BT_CAPABILITIES_TRANSPORT_A2DP 0
#define BT_CAPABILITIES_TRANSPORT_SCO 1
#define BT_CAPABILITIES_TRANSPORT_ANY 2
#define BT_CAPABILITIES_ACCESS_MODE_READ 1
#define BT_CAPABILITIES_ACCESS_MODE_WRITE 2
#define BT_CAPABILITIES_ACCESS_MODE_READWRITE 3
#define BT_FLAG_AUTOCONNECT 1
struct bt_get_capabilities_req {
bt_audio_msg_header_t h;
char source[18]; /* Address of the local Device */
char destination[18];/* Address of the remote Device */
char object[128]; /* DBus object path */
uint8_t transport; /* Requested transport */
uint8_t flags; /* Requested flags */
uint8_t seid; /* Requested capability configuration */
} __attribute__ ((packed));
/**
* SBC Codec parameters as per A2DP profile 1.0 § 4.3
*/
/* A2DP seid are 6 bytes long so HSP/HFP are assigned to 7-8 bits */
#define BT_A2DP_SEID_RANGE (1 << 6) - 1
#define BT_A2DP_SBC_SOURCE 0x00
#define BT_A2DP_SBC_SINK 0x01
#define BT_A2DP_MPEG12_SOURCE 0x02
#define BT_A2DP_MPEG12_SINK 0x03
#define BT_A2DP_MPEG24_SOURCE 0x04
#define BT_A2DP_MPEG24_SINK 0x05
#define BT_A2DP_ATRAC_SOURCE 0x06
#define BT_A2DP_ATRAC_SINK 0x07
#define BT_A2DP_UNKNOWN_SOURCE 0x08
#define BT_A2DP_UNKNOWN_SINK 0x09
#define BT_SBC_SAMPLING_FREQ_16000 (1 << 3)
#define BT_SBC_SAMPLING_FREQ_32000 (1 << 2)
#define BT_SBC_SAMPLING_FREQ_44100 (1 << 1)
#define BT_SBC_SAMPLING_FREQ_48000 1
#define BT_A2DP_CHANNEL_MODE_MONO (1 << 3)
#define BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL (1 << 2)
#define BT_A2DP_CHANNEL_MODE_STEREO (1 << 1)
#define BT_A2DP_CHANNEL_MODE_JOINT_STEREO 1
#define BT_A2DP_BLOCK_LENGTH_4 (1 << 3)
#define BT_A2DP_BLOCK_LENGTH_8 (1 << 2)
#define BT_A2DP_BLOCK_LENGTH_12 (1 << 1)
#define BT_A2DP_BLOCK_LENGTH_16 1
#define BT_A2DP_SUBBANDS_4 (1 << 1)
#define BT_A2DP_SUBBANDS_8 1
#define BT_A2DP_ALLOCATION_SNR (1 << 1)
#define BT_A2DP_ALLOCATION_LOUDNESS 1
#define BT_MPEG_SAMPLING_FREQ_16000 (1 << 5)
#define BT_MPEG_SAMPLING_FREQ_22050 (1 << 4)
#define BT_MPEG_SAMPLING_FREQ_24000 (1 << 3)
#define BT_MPEG_SAMPLING_FREQ_32000 (1 << 2)
#define BT_MPEG_SAMPLING_FREQ_44100 (1 << 1)
#define BT_MPEG_SAMPLING_FREQ_48000 1
#define BT_MPEG_LAYER_1 (1 << 2)
#define BT_MPEG_LAYER_2 (1 << 1)
#define BT_MPEG_LAYER_3 1
#define BT_HFP_CODEC_PCM 0x00
#define BT_PCM_FLAG_NREC 0x01
#define BT_PCM_FLAG_PCM_ROUTING 0x02
#define BT_WRITE_LOCK (1 << 1)
#define BT_READ_LOCK 1
typedef struct {
uint8_t seid;
uint8_t transport;
uint8_t type;
uint8_t length;
uint8_t configured;
uint8_t lock;
uint8_t data[0];
} __attribute__ ((packed)) codec_capabilities_t;
typedef struct {
codec_capabilities_t capability;
uint8_t channel_mode;
uint8_t frequency;
uint8_t allocation_method;
uint8_t subbands;
uint8_t block_length;
uint8_t min_bitpool;
uint8_t max_bitpool;
} __attribute__ ((packed)) sbc_capabilities_t;
typedef struct {
codec_capabilities_t capability;
uint8_t channel_mode;
uint8_t crc;
uint8_t layer;
uint8_t frequency;
uint8_t mpf;
uint16_t bitrate;
} __attribute__ ((packed)) mpeg_capabilities_t;
typedef struct {
codec_capabilities_t capability;
uint8_t flags;
uint16_t sampling_rate;
} __attribute__ ((packed)) pcm_capabilities_t;
struct bt_get_capabilities_rsp {
bt_audio_msg_header_t h;
char source[18]; /* Address of the local Device */
char destination[18];/* Address of the remote Device */
char object[128]; /* DBus object path */
uint8_t data[0]; /* First codec_capabilities_t */
} __attribute__ ((packed));
struct bt_open_req {
bt_audio_msg_header_t h;
char source[18]; /* Address of the local Device */
char destination[18];/* Address of the remote Device */
char object[128]; /* DBus object path */
uint8_t seid; /* Requested capability configuration to lock */
uint8_t lock; /* Requested lock */
} __attribute__ ((packed));
struct bt_open_rsp {
bt_audio_msg_header_t h;
char source[18]; /* Address of the local Device */
char destination[18];/* Address of the remote Device */
char object[128]; /* DBus object path */
} __attribute__ ((packed));
struct bt_set_configuration_req {
bt_audio_msg_header_t h;
codec_capabilities_t codec; /* Requested codec */
} __attribute__ ((packed));
struct bt_set_configuration_rsp {
bt_audio_msg_header_t h;
uint16_t link_mtu; /* Max length that transport supports */
} __attribute__ ((packed));
#define BT_STREAM_ACCESS_READ 0
#define BT_STREAM_ACCESS_WRITE 1
#define BT_STREAM_ACCESS_READWRITE 2
struct bt_start_stream_req {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_start_stream_rsp {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
/* This message is followed by one byte of data containing the stream data fd
as ancilliary data */
struct bt_new_stream_ind {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_stop_stream_req {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_stop_stream_rsp {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_close_req {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_close_rsp {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_suspend_stream_ind {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
struct bt_resume_stream_ind {
bt_audio_msg_header_t h;
} __attribute__ ((packed));
#define BT_CONTROL_KEY_POWER 0x40
#define BT_CONTROL_KEY_VOL_UP 0x41
#define BT_CONTROL_KEY_VOL_DOWN 0x42
#define BT_CONTROL_KEY_MUTE 0x43
#define BT_CONTROL_KEY_PLAY 0x44
#define BT_CONTROL_KEY_STOP 0x45
#define BT_CONTROL_KEY_PAUSE 0x46
#define BT_CONTROL_KEY_RECORD 0x47
#define BT_CONTROL_KEY_REWIND 0x48
#define BT_CONTROL_KEY_FAST_FORWARD 0x49
#define BT_CONTROL_KEY_EJECT 0x4A
#define BT_CONTROL_KEY_FORWARD 0x4B
#define BT_CONTROL_KEY_BACKWARD 0x4C
struct bt_control_req {
bt_audio_msg_header_t h;
uint8_t mode; /* Control Mode */
uint8_t key; /* Control Key */
} __attribute__ ((packed));
struct bt_control_rsp {
bt_audio_msg_header_t h;
uint8_t mode; /* Control Mode */
uint8_t key; /* Control Key */
} __attribute__ ((packed));
struct bt_control_ind {
bt_audio_msg_header_t h;
uint8_t mode; /* Control Mode */
uint8_t key; /* Control Key */
} __attribute__ ((packed));
/* Function declaration */
/* Opens a connection to the audio service: return a socket descriptor */
int bt_audio_service_open(void);
/* Closes a connection to the audio service */
int bt_audio_service_close(int sk);
/* Receives stream data file descriptor : must be called after a
BT_STREAMFD_IND message is returned */
int bt_audio_service_get_data_fd(int sk);
/* Human readable message type string */
const char *bt_audio_strtype(uint8_t type);
/* Human readable message name string */
const char *bt_audio_strname(uint8_t name);
#ifdef __cplusplus
}
#endif
#endif /* BT_AUDIOCLIENT_H */
|