]> code.delx.au - pulseaudio/blob - src/modules/bluetooth/module-bluetooth-device.c
ac76a196c7517666edcefa4cd6a8fa2c057e1932
[pulseaudio] / src / modules / bluetooth / module-bluetooth-device.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2008-2009 Joao Paulo Rechi Vita
5
6 PulseAudio is free software; you can redistribute it and/or modify
7 it under the terms of the GNU Lesser General Public License as
8 published by the Free Software Foundation; either version 2.1 of the
9 License, or (at your option) any later version.
10
11 PulseAudio is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public
17 License along with PulseAudio; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 USA.
20 ***/
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <string.h>
27 #include <errno.h>
28 #include <linux/sockios.h>
29 #include <arpa/inet.h>
30
31 #include <pulse/rtclock.h>
32 #include <pulse/sample.h>
33 #include <pulse/timeval.h>
34 #include <pulse/xmalloc.h>
35
36 #include <pulsecore/i18n.h>
37 #include <pulsecore/module.h>
38 #include <pulsecore/modargs.h>
39 #include <pulsecore/core-rtclock.h>
40 #include <pulsecore/core-util.h>
41 #include <pulsecore/core-error.h>
42 #include <pulsecore/shared.h>
43 #include <pulsecore/socket-util.h>
44 #include <pulsecore/thread.h>
45 #include <pulsecore/thread-mq.h>
46 #include <pulsecore/poll.h>
47 #include <pulsecore/rtpoll.h>
48 #include <pulsecore/time-smoother.h>
49 #include <pulsecore/namereg.h>
50 #include <pulsecore/dbus-shared.h>
51
52 #include "module-bluetooth-device-symdef.h"
53 #include "ipc.h"
54 #include "sbc.h"
55 #include "a2dp-codecs.h"
56 #include "rtp.h"
57 #include "bluetooth-util.h"
58
59 #define BITPOOL_DEC_LIMIT 32
60 #define BITPOOL_DEC_STEP 5
61 #define HSP_MAX_GAIN 15
62
63 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
64 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
65 PA_MODULE_VERSION(PACKAGE_VERSION);
66 PA_MODULE_LOAD_ONCE(FALSE);
67 PA_MODULE_USAGE(
68 "name=<name for the card/sink/source, to be prefixed> "
69 "card_name=<name for the card> "
70 "card_properties=<properties for the card> "
71 "sink_name=<name for the sink> "
72 "sink_properties=<properties for the sink> "
73 "source_name=<name for the source> "
74 "source_properties=<properties for the source> "
75 "address=<address of the device> "
76 "profile=<a2dp|hsp|hfgw> "
77 "rate=<sample rate> "
78 "channels=<number of channels> "
79 "path=<device object path> "
80 "auto_connect=<automatically connect?> "
81 "sco_sink=<SCO over PCM sink name> "
82 "sco_source=<SCO over PCM source name>");
83
84 /* TODO: not close fd when entering suspend mode in a2dp */
85
86 static const char* const valid_modargs[] = {
87 "name",
88 "card_name",
89 "card_properties",
90 "sink_name",
91 "sink_properties",
92 "source_name",
93 "source_properties",
94 "address",
95 "profile",
96 "rate",
97 "channels",
98 "path",
99 "auto_connect",
100 "sco_sink",
101 "sco_source",
102 NULL
103 };
104
105 struct a2dp_info {
106 sbc_capabilities_t sbc_capabilities;
107 sbc_t sbc; /* Codec data */
108 pa_bool_t sbc_initialized; /* Keep track if the encoder is initialized */
109 size_t codesize, frame_length; /* SBC Codesize, frame_length. We simply cache those values here */
110
111 void* buffer; /* Codec transfer buffer */
112 size_t buffer_size; /* Size of the buffer */
113
114 uint16_t seq_num; /* Cumulative packet sequence */
115 uint8_t min_bitpool;
116 uint8_t max_bitpool;
117 };
118
119 struct hsp_info {
120 pcm_capabilities_t pcm_capabilities;
121 pa_sink *sco_sink;
122 void (*sco_sink_set_volume)(pa_sink *s);
123 pa_source *sco_source;
124 void (*sco_source_set_volume)(pa_source *s);
125 pa_hook_slot *sink_state_changed_slot;
126 pa_hook_slot *source_state_changed_slot;
127 };
128
129 struct userdata {
130 pa_core *core;
131 pa_module *module;
132
133 char *address;
134 char *path;
135 char *transport;
136 char *accesstype;
137
138 pa_bluetooth_discovery *discovery;
139 pa_bool_t auto_connect;
140
141 pa_dbus_connection *connection;
142
143 pa_card *card;
144 pa_sink *sink;
145 pa_source *source;
146
147 pa_thread_mq thread_mq;
148 pa_rtpoll *rtpoll;
149 pa_rtpoll_item *rtpoll_item;
150 pa_thread *thread;
151
152 uint64_t read_index, write_index;
153 pa_usec_t started_at;
154 pa_smoother *read_smoother;
155
156 pa_memchunk write_memchunk;
157
158 pa_sample_spec sample_spec, requested_sample_spec;
159
160 int service_fd;
161 int stream_fd;
162
163 size_t link_mtu;
164 size_t block_size;
165
166 struct a2dp_info a2dp;
167 struct hsp_info hsp;
168
169 enum profile profile;
170
171 pa_modargs *modargs;
172
173 int stream_write_type;
174 int service_write_type, service_read_type;
175
176 pa_bool_t filter_added;
177 };
178
179 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
180 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
181 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
182 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
183
184 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
185
186 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
187
188 static int init_bt(struct userdata *u);
189 static int init_profile(struct userdata *u);
190
191 static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) {
192 ssize_t r;
193
194 pa_assert(u);
195 pa_assert(msg);
196 pa_assert(msg->length > 0);
197
198 if (u->service_fd < 0) {
199 pa_log_warn("Service not connected");
200 return -1;
201 }
202
203 pa_log_debug("Sending %s -> %s",
204 pa_strnull(bt_audio_strtype(msg->type)),
205 pa_strnull(bt_audio_strname(msg->name)));
206
207 if ((r = pa_loop_write(u->service_fd, msg, msg->length, &u->service_write_type)) == (ssize_t) msg->length)
208 return 0;
209
210 if (r < 0)
211 pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno));
212 else
213 pa_log_error("Short write()");
214
215 return -1;
216 }
217
218 static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t room) {
219 ssize_t r;
220
221 pa_assert(u);
222 pa_assert(u->service_fd >= 0);
223 pa_assert(msg);
224 pa_assert(room >= sizeof(*msg));
225
226 pa_log_debug("Trying to receive message from audio service...");
227
228 /* First, read the header */
229 if ((r = pa_loop_read(u->service_fd, msg, sizeof(*msg), &u->service_read_type)) != sizeof(*msg))
230 goto read_fail;
231
232 if (msg->length < sizeof(*msg)) {
233 pa_log_error("Invalid message size.");
234 return -1;
235 }
236
237 if (msg->length > room) {
238 pa_log_error("Not enough room.");
239 return -1;
240 }
241
242 /* Secondly, read the payload */
243 if (msg->length > sizeof(*msg)) {
244
245 size_t remains = msg->length - sizeof(*msg);
246
247 if ((r = pa_loop_read(u->service_fd,
248 (uint8_t*) msg + sizeof(*msg),
249 remains,
250 &u->service_read_type)) != (ssize_t) remains)
251 goto read_fail;
252 }
253
254 pa_log_debug("Received %s <- %s",
255 pa_strnull(bt_audio_strtype(msg->type)),
256 pa_strnull(bt_audio_strname(msg->name)));
257
258 return 0;
259
260 read_fail:
261
262 if (r < 0)
263 pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno));
264 else
265 pa_log_error("Short read()");
266
267 return -1;
268 }
269
270 static ssize_t service_expect(struct userdata*u, bt_audio_msg_header_t *rsp, size_t room, uint8_t expected_name, size_t expected_size) {
271 int r;
272
273 pa_assert(u);
274 pa_assert(u->service_fd >= 0);
275 pa_assert(rsp);
276
277 if ((r = service_recv(u, rsp, room)) < 0)
278 return r;
279
280 if ((rsp->type != BT_INDICATION && rsp->type != BT_RESPONSE) ||
281 rsp->name != expected_name ||
282 (expected_size > 0 && rsp->length != expected_size)) {
283
284 if (rsp->type == BT_ERROR && rsp->length == sizeof(bt_audio_error_t))
285 pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t*) rsp)->posix_errno));
286 else
287 pa_log_error("Bogus message %s received while %s was expected",
288 pa_strnull(bt_audio_strname(rsp->name)),
289 pa_strnull(bt_audio_strname(expected_name)));
290 return -1;
291 }
292
293 return 0;
294 }
295
296 /* Run from main thread */
297 static int parse_caps(struct userdata *u, uint8_t seid, const struct bt_get_capabilities_rsp *rsp) {
298 uint16_t bytes_left;
299 const codec_capabilities_t *codec;
300
301 pa_assert(u);
302 pa_assert(rsp);
303
304 bytes_left = rsp->h.length - sizeof(*rsp);
305
306 if (bytes_left < sizeof(codec_capabilities_t)) {
307 pa_log_error("Packet too small to store codec information.");
308 return -1;
309 }
310
311 codec = (codec_capabilities_t *) rsp->data; /** ALIGNMENT? **/
312
313 pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left, (unsigned long) sizeof(*codec));
314
315 if (((u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) && codec->transport != BT_CAPABILITIES_TRANSPORT_A2DP) ||
316 ((u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) && codec->transport != BT_CAPABILITIES_TRANSPORT_SCO)) {
317 pa_log_error("Got capabilities for wrong codec.");
318 return -1;
319 }
320
321 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
322
323 if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities))
324 return -1;
325
326 pa_assert(codec->type == BT_HFP_CODEC_PCM);
327
328 if (codec->configured && seid == 0)
329 return codec->seid;
330
331 memcpy(&u->hsp.pcm_capabilities, codec, sizeof(u->hsp.pcm_capabilities));
332
333 } else if (u->profile == PROFILE_A2DP) {
334
335 while (bytes_left > 0) {
336 if ((codec->type == BT_A2DP_SBC_SINK) && !codec->lock)
337 break;
338
339 bytes_left -= codec->length;
340 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
341 }
342
343 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
344 return -1;
345
346 pa_assert(codec->type == BT_A2DP_SBC_SINK);
347
348 if (codec->configured && seid == 0)
349 return codec->seid;
350
351 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
352
353 } else if (u->profile == PROFILE_A2DP_SOURCE) {
354
355 while (bytes_left > 0) {
356 if ((codec->type == BT_A2DP_SBC_SOURCE) && !codec->lock)
357 break;
358
359 bytes_left -= codec->length;
360 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
361 }
362
363 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
364 return -1;
365
366 pa_assert(codec->type == BT_A2DP_SBC_SOURCE);
367
368 if (codec->configured && seid == 0)
369 return codec->seid;
370
371 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
372 }
373
374 return 0;
375 }
376
377 /* Run from main thread */
378 static int get_caps(struct userdata *u, uint8_t seid) {
379 union {
380 struct bt_get_capabilities_req getcaps_req;
381 struct bt_get_capabilities_rsp getcaps_rsp;
382 bt_audio_error_t error;
383 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
384 } msg;
385 int ret;
386
387 pa_assert(u);
388
389 memset(&msg, 0, sizeof(msg));
390 msg.getcaps_req.h.type = BT_REQUEST;
391 msg.getcaps_req.h.name = BT_GET_CAPABILITIES;
392 msg.getcaps_req.h.length = sizeof(msg.getcaps_req);
393 msg.getcaps_req.seid = seid;
394
395 pa_strlcpy(msg.getcaps_req.object, u->path, sizeof(msg.getcaps_req.object));
396 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE)
397 msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_A2DP;
398 else {
399 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
400 msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_SCO;
401 }
402 msg.getcaps_req.flags = u->auto_connect ? BT_FLAG_AUTOCONNECT : 0;
403
404 if (service_send(u, &msg.getcaps_req.h) < 0)
405 return -1;
406
407 if (service_expect(u, &msg.getcaps_rsp.h, sizeof(msg), BT_GET_CAPABILITIES, 0) < 0)
408 return -1;
409
410 ret = parse_caps(u, seid, &msg.getcaps_rsp);
411 if (ret <= 0)
412 return ret;
413
414 return get_caps(u, ret);
415 }
416
417 /* Run from main thread */
418 static uint8_t a2dp_default_bitpool(uint8_t freq, uint8_t mode) {
419
420 switch (freq) {
421 case BT_SBC_SAMPLING_FREQ_16000:
422 case BT_SBC_SAMPLING_FREQ_32000:
423 return 53;
424
425 case BT_SBC_SAMPLING_FREQ_44100:
426
427 switch (mode) {
428 case BT_A2DP_CHANNEL_MODE_MONO:
429 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
430 return 31;
431
432 case BT_A2DP_CHANNEL_MODE_STEREO:
433 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
434 return 53;
435
436 default:
437 pa_log_warn("Invalid channel mode %u", mode);
438 return 53;
439 }
440
441 case BT_SBC_SAMPLING_FREQ_48000:
442
443 switch (mode) {
444 case BT_A2DP_CHANNEL_MODE_MONO:
445 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
446 return 29;
447
448 case BT_A2DP_CHANNEL_MODE_STEREO:
449 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
450 return 51;
451
452 default:
453 pa_log_warn("Invalid channel mode %u", mode);
454 return 51;
455 }
456
457 default:
458 pa_log_warn("Invalid sampling freq %u", freq);
459 return 53;
460 }
461 }
462
463 /* Run from main thread */
464 static int setup_a2dp(struct userdata *u) {
465 sbc_capabilities_t *cap;
466 int i;
467
468 static const struct {
469 uint32_t rate;
470 uint8_t cap;
471 } freq_table[] = {
472 { 16000U, BT_SBC_SAMPLING_FREQ_16000 },
473 { 32000U, BT_SBC_SAMPLING_FREQ_32000 },
474 { 44100U, BT_SBC_SAMPLING_FREQ_44100 },
475 { 48000U, BT_SBC_SAMPLING_FREQ_48000 }
476 };
477
478 pa_assert(u);
479 pa_assert(u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE);
480
481 cap = &u->a2dp.sbc_capabilities;
482
483 /* Find the lowest freq that is at least as high as the requested
484 * sampling rate */
485 for (i = 0; (unsigned) i < PA_ELEMENTSOF(freq_table); i++)
486 if (freq_table[i].rate >= u->sample_spec.rate && (cap->frequency & freq_table[i].cap)) {
487 u->sample_spec.rate = freq_table[i].rate;
488 cap->frequency = freq_table[i].cap;
489 break;
490 }
491
492 if ((unsigned) i == PA_ELEMENTSOF(freq_table)) {
493 for (--i; i >= 0; i--) {
494 if (cap->frequency & freq_table[i].cap) {
495 u->sample_spec.rate = freq_table[i].rate;
496 cap->frequency = freq_table[i].cap;
497 break;
498 }
499 }
500
501 if (i < 0) {
502 pa_log("Not suitable sample rate");
503 return -1;
504 }
505 }
506
507 pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table));
508
509 if (cap->capability.configured)
510 return 0;
511
512 if (u->sample_spec.channels <= 1) {
513 if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) {
514 cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO;
515 u->sample_spec.channels = 1;
516 } else
517 u->sample_spec.channels = 2;
518 }
519
520 if (u->sample_spec.channels >= 2) {
521 u->sample_spec.channels = 2;
522
523 if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_JOINT_STEREO)
524 cap->channel_mode = BT_A2DP_CHANNEL_MODE_JOINT_STEREO;
525 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO)
526 cap->channel_mode = BT_A2DP_CHANNEL_MODE_STEREO;
527 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL)
528 cap->channel_mode = BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL;
529 else if (cap->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) {
530 cap->channel_mode = BT_A2DP_CHANNEL_MODE_MONO;
531 u->sample_spec.channels = 1;
532 } else {
533 pa_log("No supported channel modes");
534 return -1;
535 }
536 }
537
538 if (cap->block_length & BT_A2DP_BLOCK_LENGTH_16)
539 cap->block_length = BT_A2DP_BLOCK_LENGTH_16;
540 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_12)
541 cap->block_length = BT_A2DP_BLOCK_LENGTH_12;
542 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_8)
543 cap->block_length = BT_A2DP_BLOCK_LENGTH_8;
544 else if (cap->block_length & BT_A2DP_BLOCK_LENGTH_4)
545 cap->block_length = BT_A2DP_BLOCK_LENGTH_4;
546 else {
547 pa_log_error("No supported block lengths");
548 return -1;
549 }
550
551 if (cap->subbands & BT_A2DP_SUBBANDS_8)
552 cap->subbands = BT_A2DP_SUBBANDS_8;
553 else if (cap->subbands & BT_A2DP_SUBBANDS_4)
554 cap->subbands = BT_A2DP_SUBBANDS_4;
555 else {
556 pa_log_error("No supported subbands");
557 return -1;
558 }
559
560 if (cap->allocation_method & BT_A2DP_ALLOCATION_LOUDNESS)
561 cap->allocation_method = BT_A2DP_ALLOCATION_LOUDNESS;
562 else if (cap->allocation_method & BT_A2DP_ALLOCATION_SNR)
563 cap->allocation_method = BT_A2DP_ALLOCATION_SNR;
564
565 cap->min_bitpool = (uint8_t) PA_MAX(MIN_BITPOOL, cap->min_bitpool);
566 cap->max_bitpool = (uint8_t) PA_MIN(a2dp_default_bitpool(cap->frequency, cap->channel_mode), cap->max_bitpool);
567
568 return 0;
569 }
570
571 /* Run from main thread */
572 static void setup_sbc(struct a2dp_info *a2dp, enum profile p) {
573 sbc_capabilities_t *active_capabilities;
574
575 pa_assert(a2dp);
576
577 active_capabilities = &a2dp->sbc_capabilities;
578
579 if (a2dp->sbc_initialized)
580 sbc_reinit(&a2dp->sbc, 0);
581 else
582 sbc_init(&a2dp->sbc, 0);
583 a2dp->sbc_initialized = TRUE;
584
585 switch (active_capabilities->frequency) {
586 case BT_SBC_SAMPLING_FREQ_16000:
587 a2dp->sbc.frequency = SBC_FREQ_16000;
588 break;
589 case BT_SBC_SAMPLING_FREQ_32000:
590 a2dp->sbc.frequency = SBC_FREQ_32000;
591 break;
592 case BT_SBC_SAMPLING_FREQ_44100:
593 a2dp->sbc.frequency = SBC_FREQ_44100;
594 break;
595 case BT_SBC_SAMPLING_FREQ_48000:
596 a2dp->sbc.frequency = SBC_FREQ_48000;
597 break;
598 default:
599 pa_assert_not_reached();
600 }
601
602 switch (active_capabilities->channel_mode) {
603 case BT_A2DP_CHANNEL_MODE_MONO:
604 a2dp->sbc.mode = SBC_MODE_MONO;
605 break;
606 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
607 a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL;
608 break;
609 case BT_A2DP_CHANNEL_MODE_STEREO:
610 a2dp->sbc.mode = SBC_MODE_STEREO;
611 break;
612 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
613 a2dp->sbc.mode = SBC_MODE_JOINT_STEREO;
614 break;
615 default:
616 pa_assert_not_reached();
617 }
618
619 switch (active_capabilities->allocation_method) {
620 case BT_A2DP_ALLOCATION_SNR:
621 a2dp->sbc.allocation = SBC_AM_SNR;
622 break;
623 case BT_A2DP_ALLOCATION_LOUDNESS:
624 a2dp->sbc.allocation = SBC_AM_LOUDNESS;
625 break;
626 default:
627 pa_assert_not_reached();
628 }
629
630 switch (active_capabilities->subbands) {
631 case BT_A2DP_SUBBANDS_4:
632 a2dp->sbc.subbands = SBC_SB_4;
633 break;
634 case BT_A2DP_SUBBANDS_8:
635 a2dp->sbc.subbands = SBC_SB_8;
636 break;
637 default:
638 pa_assert_not_reached();
639 }
640
641 switch (active_capabilities->block_length) {
642 case BT_A2DP_BLOCK_LENGTH_4:
643 a2dp->sbc.blocks = SBC_BLK_4;
644 break;
645 case BT_A2DP_BLOCK_LENGTH_8:
646 a2dp->sbc.blocks = SBC_BLK_8;
647 break;
648 case BT_A2DP_BLOCK_LENGTH_12:
649 a2dp->sbc.blocks = SBC_BLK_12;
650 break;
651 case BT_A2DP_BLOCK_LENGTH_16:
652 a2dp->sbc.blocks = SBC_BLK_16;
653 break;
654 default:
655 pa_assert_not_reached();
656 }
657
658 a2dp->min_bitpool = active_capabilities->min_bitpool;
659 a2dp->max_bitpool = active_capabilities->max_bitpool;
660
661 /* Set minimum bitpool for source to get the maximum possible block_size */
662 a2dp->sbc.bitpool = p == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool;
663 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
664 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
665 }
666
667 /* Run from main thread */
668 static int set_conf(struct userdata *u) {
669 union {
670 struct bt_open_req open_req;
671 struct bt_open_rsp open_rsp;
672 struct bt_set_configuration_req setconf_req;
673 struct bt_set_configuration_rsp setconf_rsp;
674 bt_audio_error_t error;
675 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
676 } msg;
677
678 memset(&msg, 0, sizeof(msg));
679 msg.open_req.h.type = BT_REQUEST;
680 msg.open_req.h.name = BT_OPEN;
681 msg.open_req.h.length = sizeof(msg.open_req);
682
683 pa_strlcpy(msg.open_req.object, u->path, sizeof(msg.open_req.object));
684 msg.open_req.seid = (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) ? u->a2dp.sbc_capabilities.capability.seid : BT_A2DP_SEID_RANGE + 1;
685 msg.open_req.lock = (u->profile == PROFILE_A2DP) ? BT_WRITE_LOCK : BT_READ_LOCK | BT_WRITE_LOCK;
686
687 if (service_send(u, &msg.open_req.h) < 0)
688 return -1;
689
690 if (service_expect(u, &msg.open_rsp.h, sizeof(msg), BT_OPEN, sizeof(msg.open_rsp)) < 0)
691 return -1;
692
693 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
694 u->sample_spec.format = PA_SAMPLE_S16LE;
695
696 if (setup_a2dp(u) < 0)
697 return -1;
698 } else {
699 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
700
701 u->sample_spec.format = PA_SAMPLE_S16LE;
702 u->sample_spec.channels = 1;
703 u->sample_spec.rate = 8000;
704 }
705
706 memset(&msg, 0, sizeof(msg));
707 msg.setconf_req.h.type = BT_REQUEST;
708 msg.setconf_req.h.name = BT_SET_CONFIGURATION;
709 msg.setconf_req.h.length = sizeof(msg.setconf_req);
710
711 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
712 memcpy(&msg.setconf_req.codec, &u->a2dp.sbc_capabilities, sizeof(u->a2dp.sbc_capabilities));
713 } else {
714 msg.setconf_req.codec.transport = BT_CAPABILITIES_TRANSPORT_SCO;
715 msg.setconf_req.codec.seid = BT_A2DP_SEID_RANGE + 1;
716 msg.setconf_req.codec.length = sizeof(pcm_capabilities_t);
717 }
718 msg.setconf_req.h.length += msg.setconf_req.codec.length - sizeof(msg.setconf_req.codec);
719
720 if (service_send(u, &msg.setconf_req.h) < 0)
721 return -1;
722
723 if (service_expect(u, &msg.setconf_rsp.h, sizeof(msg), BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0)
724 return -1;
725
726 u->link_mtu = msg.setconf_rsp.link_mtu;
727
728 /* setup SBC encoder now we agree on parameters */
729 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
730 setup_sbc(&u->a2dp, u->profile);
731
732 u->block_size =
733 ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
734 / u->a2dp.frame_length
735 * u->a2dp.codesize);
736
737 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
738 u->a2dp.sbc.allocation, u->a2dp.sbc.subbands, u->a2dp.sbc.blocks, u->a2dp.sbc.bitpool);
739 } else
740 u->block_size = u->link_mtu;
741
742 return 0;
743 }
744
745 /* from IO thread */
746 static void a2dp_set_bitpool(struct userdata *u, uint8_t bitpool)
747 {
748 struct a2dp_info *a2dp;
749
750 pa_assert(u);
751
752 a2dp = &u->a2dp;
753
754 if (a2dp->sbc.bitpool == bitpool)
755 return;
756
757 if (bitpool > a2dp->max_bitpool)
758 bitpool = a2dp->max_bitpool;
759 else if (bitpool < a2dp->min_bitpool)
760 bitpool = a2dp->min_bitpool;
761
762 a2dp->sbc.bitpool = bitpool;
763
764 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
765 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
766
767 pa_log_debug("Bitpool has changed to %u", a2dp->sbc.bitpool);
768
769 u->block_size =
770 (u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
771 / a2dp->frame_length * a2dp->codesize;
772
773 pa_sink_set_max_request_within_thread(u->sink, u->block_size);
774 pa_sink_set_fixed_latency_within_thread(u->sink,
775 FIXED_LATENCY_PLAYBACK_A2DP + pa_bytes_to_usec(u->block_size, &u->sample_spec));
776 }
777
778 /* from IO thread, except in SCO over PCM */
779
780 static int setup_stream(struct userdata *u) {
781 struct pollfd *pollfd;
782 int one;
783
784 pa_make_fd_nonblock(u->stream_fd);
785 pa_make_socket_low_delay(u->stream_fd);
786
787 one = 1;
788 if (setsockopt(u->stream_fd, SOL_SOCKET, SO_TIMESTAMP, &one, sizeof(one)) < 0)
789 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno));
790
791 pa_log_debug("Stream properly set up, we're ready to roll!");
792
793 if (u->profile == PROFILE_A2DP)
794 a2dp_set_bitpool(u, u->a2dp.max_bitpool);
795
796 u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
797 pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
798 pollfd->fd = u->stream_fd;
799 pollfd->events = pollfd->revents = 0;
800
801 u->read_index = u->write_index = 0;
802 u->started_at = 0;
803
804 if (u->source)
805 u->read_smoother = pa_smoother_new(
806 PA_USEC_PER_SEC,
807 PA_USEC_PER_SEC*2,
808 TRUE,
809 TRUE,
810 10,
811 pa_rtclock_now(),
812 TRUE);
813
814 return 0;
815 }
816
817 static int start_stream_fd(struct userdata *u) {
818 union {
819 bt_audio_msg_header_t rsp;
820 struct bt_start_stream_req start_req;
821 struct bt_start_stream_rsp start_rsp;
822 struct bt_new_stream_ind streamfd_ind;
823 bt_audio_error_t error;
824 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
825 } msg;
826
827 pa_assert(u);
828 pa_assert(u->rtpoll);
829 pa_assert(!u->rtpoll_item);
830 pa_assert(u->stream_fd < 0);
831
832 memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
833 msg.start_req.h.type = BT_REQUEST;
834 msg.start_req.h.name = BT_START_STREAM;
835 msg.start_req.h.length = sizeof(msg.start_req);
836
837 if (service_send(u, &msg.start_req.h) < 0)
838 return -1;
839
840 if (service_expect(u, &msg.rsp, sizeof(msg), BT_START_STREAM, sizeof(msg.start_rsp)) < 0)
841 return -1;
842
843 if (service_expect(u, &msg.rsp, sizeof(msg), BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0)
844 return -1;
845
846 if ((u->stream_fd = bt_audio_service_get_data_fd(u->service_fd)) < 0) {
847 pa_log("Failed to get stream fd from audio service.");
848 return -1;
849 }
850
851 return setup_stream(u);
852 }
853
854 /* from IO thread */
855 static int stop_stream_fd(struct userdata *u) {
856 union {
857 bt_audio_msg_header_t rsp;
858 struct bt_stop_stream_req start_req;
859 struct bt_stop_stream_rsp start_rsp;
860 bt_audio_error_t error;
861 uint8_t buf[BT_SUGGESTED_BUFFER_SIZE];
862 } msg;
863 int r = 0;
864
865 pa_assert(u);
866 pa_assert(u->rtpoll);
867
868 if (u->rtpoll_item) {
869 pa_rtpoll_item_free(u->rtpoll_item);
870 u->rtpoll_item = NULL;
871 }
872
873 if (u->stream_fd >= 0) {
874 memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
875 msg.start_req.h.type = BT_REQUEST;
876 msg.start_req.h.name = BT_STOP_STREAM;
877 msg.start_req.h.length = sizeof(msg.start_req);
878
879 if (service_send(u, &msg.start_req.h) < 0 ||
880 service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
881 r = -1;
882
883 pa_close(u->stream_fd);
884 u->stream_fd = -1;
885 }
886
887 if (u->read_smoother) {
888 pa_smoother_free(u->read_smoother);
889 u->read_smoother = NULL;
890 }
891
892 return r;
893 }
894
895 static void bt_transport_release(struct userdata *u) {
896 const char *accesstype = "rw";
897 const pa_bluetooth_transport *t;
898
899 /* Ignore if already released */
900 if (!u->accesstype)
901 return;
902
903 pa_log_debug("Releasing transport %s", u->transport);
904
905 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
906 if (t)
907 pa_bluetooth_transport_release(t, accesstype);
908
909 pa_xfree(u->accesstype);
910 u->accesstype = NULL;
911
912 if (u->rtpoll_item) {
913 pa_rtpoll_item_free(u->rtpoll_item);
914 u->rtpoll_item = NULL;
915 }
916
917 if (u->stream_fd >= 0) {
918 pa_close(u->stream_fd);
919 u->stream_fd = -1;
920 }
921
922 if (u->read_smoother) {
923 pa_smoother_free(u->read_smoother);
924 u->read_smoother = NULL;
925 }
926 }
927
928 static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
929 const char *accesstype = "rw";
930 const pa_bluetooth_transport *t;
931
932 if (u->accesstype) {
933 if (start)
934 goto done;
935 return 0;
936 }
937
938 pa_log_debug("Acquiring transport %s", u->transport);
939
940 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
941 if (!t) {
942 pa_log("Transport %s no longer available", u->transport);
943 pa_xfree(u->transport);
944 u->transport = NULL;
945 return -1;
946 }
947
948 /* FIXME: Handle in/out MTU properly when unix socket is not longer supported */
949 u->stream_fd = pa_bluetooth_transport_acquire(t, accesstype, NULL, &u->link_mtu);
950 if (u->stream_fd < 0)
951 return -1;
952
953 u->accesstype = pa_xstrdup(accesstype);
954 pa_log_info("Transport %s acquired: fd %d", u->transport, u->stream_fd);
955
956 if (!start)
957 return 0;
958
959 done:
960 pa_log_info("Transport %s resuming", u->transport);
961 return setup_stream(u);
962 }
963
964 /* Run from IO thread */
965 static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
966 struct userdata *u = PA_SINK(o)->userdata;
967 pa_bool_t failed = FALSE;
968 int r;
969
970 pa_assert(u->sink == PA_SINK(o));
971
972 switch (code) {
973
974 case PA_SINK_MESSAGE_SET_STATE:
975
976 switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
977
978 case PA_SINK_SUSPENDED:
979 pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));
980
981 /* Stop the device if the source is suspended as well */
982 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) {
983 /* We deliberately ignore whether stopping
984 * actually worked. Since the stream_fd is
985 * closed it doesn't really matter */
986 if (u->transport)
987 bt_transport_release(u);
988 else
989 stop_stream_fd(u);
990 }
991
992 break;
993
994 case PA_SINK_IDLE:
995 case PA_SINK_RUNNING:
996 if (u->sink->thread_info.state != PA_SINK_SUSPENDED)
997 break;
998
999 /* Resume the device if the source was suspended as well */
1000 if (!u->source || u->source->state == PA_SOURCE_SUSPENDED) {
1001 if (u->transport) {
1002 if (bt_transport_acquire(u, TRUE) < 0)
1003 failed = TRUE;
1004 } else if (start_stream_fd(u) < 0)
1005 failed = TRUE;
1006 }
1007 break;
1008
1009 case PA_SINK_UNLINKED:
1010 case PA_SINK_INIT:
1011 case PA_SINK_INVALID_STATE:
1012 ;
1013 }
1014 break;
1015
1016 case PA_SINK_MESSAGE_GET_LATENCY: {
1017
1018 if (u->read_smoother) {
1019 pa_usec_t wi, ri;
1020
1021 ri = pa_smoother_get(u->read_smoother, pa_rtclock_now());
1022 wi = pa_bytes_to_usec(u->write_index + u->block_size, &u->sample_spec);
1023
1024 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
1025 } else {
1026 pa_usec_t ri, wi;
1027
1028 ri = pa_rtclock_now() - u->started_at;
1029 wi = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1030
1031 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
1032 }
1033
1034 *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency;
1035 return 0;
1036 }
1037 }
1038
1039 r = pa_sink_process_msg(o, code, data, offset, chunk);
1040
1041 return (r < 0 || !failed) ? r : -1;
1042 }
1043
1044 /* Run from IO thread */
1045 static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
1046 struct userdata *u = PA_SOURCE(o)->userdata;
1047 pa_bool_t failed = FALSE;
1048 int r;
1049
1050 pa_assert(u->source == PA_SOURCE(o));
1051
1052 switch (code) {
1053
1054 case PA_SOURCE_MESSAGE_SET_STATE:
1055
1056 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
1057
1058 case PA_SOURCE_SUSPENDED:
1059 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
1060
1061 /* Stop the device if the sink is suspended as well */
1062 if (!u->sink || u->sink->state == PA_SINK_SUSPENDED) {
1063 if (u->transport)
1064 bt_transport_release(u);
1065 else
1066 stop_stream_fd(u);
1067 }
1068
1069 if (u->read_smoother)
1070 pa_smoother_pause(u->read_smoother, pa_rtclock_now());
1071 break;
1072
1073 case PA_SOURCE_IDLE:
1074 case PA_SOURCE_RUNNING:
1075 if (u->source->thread_info.state != PA_SOURCE_SUSPENDED)
1076 break;
1077
1078 /* Resume the device if the sink was suspended as well */
1079 if (!u->sink || u->sink->thread_info.state == PA_SINK_SUSPENDED) {
1080 if (u->transport) {
1081 if (bt_transport_acquire(u, TRUE) < 0)
1082 failed = TRUE;
1083 } else if (start_stream_fd(u) < 0)
1084 failed = TRUE;
1085 }
1086 /* We don't resume the smoother here. Instead we
1087 * wait until the first packet arrives */
1088 break;
1089
1090 case PA_SOURCE_UNLINKED:
1091 case PA_SOURCE_INIT:
1092 case PA_SOURCE_INVALID_STATE:
1093 ;
1094 }
1095 break;
1096
1097 case PA_SOURCE_MESSAGE_GET_LATENCY: {
1098 pa_usec_t wi, ri;
1099
1100 if (u->read_smoother) {
1101 wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
1102 ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
1103
1104 *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
1105 } else
1106 *((pa_usec_t*) data) = 0;
1107
1108 return 0;
1109 }
1110
1111 }
1112
1113 r = pa_source_process_msg(o, code, data, offset, chunk);
1114
1115 return (r < 0 || !failed) ? r : -1;
1116 }
1117
1118 /* Run from IO thread */
1119 static int hsp_process_render(struct userdata *u) {
1120 int ret = 0;
1121
1122 pa_assert(u);
1123 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
1124 pa_assert(u->sink);
1125
1126 /* First, render some data */
1127 if (!u->write_memchunk.memblock)
1128 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
1129
1130 pa_assert(u->write_memchunk.length == u->block_size);
1131
1132 for (;;) {
1133 ssize_t l;
1134 const void *p;
1135
1136 /* Now write that data to the socket. The socket is of type
1137 * SEQPACKET, and we generated the data of the MTU size, so this
1138 * should just work. */
1139
1140 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
1141 l = pa_write(u->stream_fd, p, u->write_memchunk.length, &u->stream_write_type);
1142 pa_memblock_release(u->write_memchunk.memblock);
1143
1144 pa_assert(l != 0);
1145
1146 if (l < 0) {
1147
1148 if (errno == EINTR)
1149 /* Retry right away if we got interrupted */
1150 continue;
1151
1152 else if (errno == EAGAIN)
1153 /* Hmm, apparently the socket was not writable, give up for now */
1154 break;
1155
1156 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
1157 ret = -1;
1158 break;
1159 }
1160
1161 pa_assert((size_t) l <= u->write_memchunk.length);
1162
1163 if ((size_t) l != u->write_memchunk.length) {
1164 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1165 (unsigned long long) l,
1166 (unsigned long long) u->write_memchunk.length);
1167 ret = -1;
1168 break;
1169 }
1170
1171 u->write_index += (uint64_t) u->write_memchunk.length;
1172 pa_memblock_unref(u->write_memchunk.memblock);
1173 pa_memchunk_reset(&u->write_memchunk);
1174
1175 ret = 1;
1176 break;
1177 }
1178
1179 return ret;
1180 }
1181
1182 /* Run from IO thread */
1183 static int hsp_process_push(struct userdata *u) {
1184 int ret = 0;
1185 pa_memchunk memchunk;
1186
1187 pa_assert(u);
1188 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
1189 pa_assert(u->source);
1190 pa_assert(u->read_smoother);
1191
1192 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1193 memchunk.index = memchunk.length = 0;
1194
1195 for (;;) {
1196 ssize_t l;
1197 void *p;
1198 struct msghdr m;
1199 struct cmsghdr *cm;
1200 uint8_t aux[1024];
1201 struct iovec iov;
1202 pa_bool_t found_tstamp = FALSE;
1203 pa_usec_t tstamp;
1204
1205 memset(&m, 0, sizeof(m));
1206 memset(&aux, 0, sizeof(aux));
1207 memset(&iov, 0, sizeof(iov));
1208
1209 m.msg_iov = &iov;
1210 m.msg_iovlen = 1;
1211 m.msg_control = aux;
1212 m.msg_controllen = sizeof(aux);
1213
1214 p = pa_memblock_acquire(memchunk.memblock);
1215 iov.iov_base = p;
1216 iov.iov_len = pa_memblock_get_length(memchunk.memblock);
1217 l = recvmsg(u->stream_fd, &m, 0);
1218 pa_memblock_release(memchunk.memblock);
1219
1220 if (l <= 0) {
1221
1222 if (l < 0 && errno == EINTR)
1223 /* Retry right away if we got interrupted */
1224 continue;
1225
1226 else if (l < 0 && errno == EAGAIN)
1227 /* Hmm, apparently the socket was not readable, give up for now. */
1228 break;
1229
1230 pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1231 ret = -1;
1232 break;
1233 }
1234
1235 pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock));
1236
1237 memchunk.length = (size_t) l;
1238 u->read_index += (uint64_t) l;
1239
1240 for (cm = CMSG_FIRSTHDR(&m); cm; cm = CMSG_NXTHDR(&m, cm))
1241 if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP) {
1242 struct timeval *tv = (struct timeval*) CMSG_DATA(cm);
1243 pa_rtclock_from_wallclock(tv);
1244 tstamp = pa_timeval_load(tv);
1245 found_tstamp = TRUE;
1246 break;
1247 }
1248
1249 if (!found_tstamp) {
1250 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1251 tstamp = pa_rtclock_now();
1252 }
1253
1254 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
1255 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
1256
1257 pa_source_post(u->source, &memchunk);
1258
1259 ret = 1;
1260 break;
1261 }
1262
1263 pa_memblock_unref(memchunk.memblock);
1264
1265 return ret;
1266 }
1267
1268 /* Run from IO thread */
1269 static void a2dp_prepare_buffer(struct userdata *u) {
1270 pa_assert(u);
1271
1272 if (u->a2dp.buffer_size >= u->link_mtu)
1273 return;
1274
1275 u->a2dp.buffer_size = 2 * u->link_mtu;
1276 pa_xfree(u->a2dp.buffer);
1277 u->a2dp.buffer = pa_xmalloc(u->a2dp.buffer_size);
1278 }
1279
1280 /* Run from IO thread */
1281 static int a2dp_process_render(struct userdata *u) {
1282 struct a2dp_info *a2dp;
1283 struct rtp_header *header;
1284 struct rtp_payload *payload;
1285 size_t nbytes;
1286 void *d;
1287 const void *p;
1288 size_t to_write, to_encode;
1289 unsigned frame_count;
1290 int ret = 0;
1291
1292 pa_assert(u);
1293 pa_assert(u->profile == PROFILE_A2DP);
1294 pa_assert(u->sink);
1295
1296 /* First, render some data */
1297 if (!u->write_memchunk.memblock)
1298 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
1299
1300 pa_assert(u->write_memchunk.length == u->block_size);
1301
1302 a2dp_prepare_buffer(u);
1303
1304 a2dp = &u->a2dp;
1305 header = a2dp->buffer;
1306 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1307
1308 frame_count = 0;
1309
1310 /* Try to create a packet of the full MTU */
1311
1312 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
1313 to_encode = u->write_memchunk.length;
1314
1315 d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1316 to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload);
1317
1318 while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
1319 ssize_t written;
1320 ssize_t encoded;
1321
1322 encoded = sbc_encode(&a2dp->sbc,
1323 p, to_encode,
1324 d, to_write,
1325 &written);
1326
1327 if (PA_UNLIKELY(encoded <= 0)) {
1328 pa_log_error("SBC encoding error (%li)", (long) encoded);
1329 pa_memblock_release(u->write_memchunk.memblock);
1330 return -1;
1331 }
1332
1333 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
1334 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
1335
1336 pa_assert_fp((size_t) encoded <= to_encode);
1337 pa_assert_fp((size_t) encoded == a2dp->codesize);
1338
1339 pa_assert_fp((size_t) written <= to_write);
1340 pa_assert_fp((size_t) written == a2dp->frame_length);
1341
1342 p = (const uint8_t*) p + encoded;
1343 to_encode -= encoded;
1344
1345 d = (uint8_t*) d + written;
1346 to_write -= written;
1347
1348 frame_count++;
1349 }
1350
1351 pa_memblock_release(u->write_memchunk.memblock);
1352
1353 pa_assert(to_encode == 0);
1354
1355 PA_ONCE_BEGIN {
1356 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc)));
1357 } PA_ONCE_END;
1358
1359 /* write it to the fifo */
1360 memset(a2dp->buffer, 0, sizeof(*header) + sizeof(*payload));
1361 header->v = 2;
1362 header->pt = 1;
1363 header->sequence_number = htons(a2dp->seq_num++);
1364 header->timestamp = htonl(u->write_index / pa_frame_size(&u->sample_spec));
1365 header->ssrc = htonl(1);
1366 payload->frame_count = frame_count;
1367
1368 nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer;
1369
1370 for (;;) {
1371 ssize_t l;
1372
1373 l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type);
1374
1375 pa_assert(l != 0);
1376
1377 if (l < 0) {
1378
1379 if (errno == EINTR)
1380 /* Retry right away if we got interrupted */
1381 continue;
1382
1383 else if (errno == EAGAIN)
1384 /* Hmm, apparently the socket was not writable, give up for now */
1385 break;
1386
1387 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno));
1388 ret = -1;
1389 break;
1390 }
1391
1392 pa_assert((size_t) l <= nbytes);
1393
1394 if ((size_t) l != nbytes) {
1395 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1396 (unsigned long long) l,
1397 (unsigned long long) nbytes);
1398 ret = -1;
1399 break;
1400 }
1401
1402 u->write_index += (uint64_t) u->write_memchunk.length;
1403 pa_memblock_unref(u->write_memchunk.memblock);
1404 pa_memchunk_reset(&u->write_memchunk);
1405
1406 ret = 1;
1407
1408 break;
1409 }
1410
1411 return ret;
1412 }
1413
1414 static int a2dp_process_push(struct userdata *u) {
1415 int ret = 0;
1416 pa_memchunk memchunk;
1417
1418 pa_assert(u);
1419 pa_assert(u->profile == PROFILE_A2DP_SOURCE);
1420 pa_assert(u->source);
1421 pa_assert(u->read_smoother);
1422
1423 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1424 memchunk.index = memchunk.length = 0;
1425
1426 for (;;) {
1427 pa_bool_t found_tstamp = FALSE;
1428 pa_usec_t tstamp;
1429 struct a2dp_info *a2dp;
1430 struct rtp_header *header;
1431 struct rtp_payload *payload;
1432 const void *p;
1433 void *d;
1434 ssize_t l;
1435 size_t to_write, to_decode;
1436 unsigned frame_count;
1437
1438 a2dp_prepare_buffer(u);
1439
1440 a2dp = &u->a2dp;
1441 header = a2dp->buffer;
1442 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1443
1444 l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type);
1445
1446 if (l <= 0) {
1447
1448 if (l < 0 && errno == EINTR)
1449 /* Retry right away if we got interrupted */
1450 continue;
1451
1452 else if (l < 0 && errno == EAGAIN)
1453 /* Hmm, apparently the socket was not readable, give up for now. */
1454 break;
1455
1456 pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1457 ret = -1;
1458 break;
1459 }
1460
1461 pa_assert((size_t) l <= a2dp->buffer_size);
1462
1463 u->read_index += (uint64_t) l;
1464
1465 /* TODO: get timestamp from rtp */
1466 if (!found_tstamp) {
1467 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
1468 tstamp = pa_rtclock_now();
1469 }
1470
1471 pa_smoother_put(u->read_smoother, tstamp, pa_bytes_to_usec(u->read_index, &u->sample_spec));
1472 pa_smoother_resume(u->read_smoother, tstamp, TRUE);
1473
1474 p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1475 to_decode = l - sizeof(*header) - sizeof(*payload);
1476
1477 d = pa_memblock_acquire(memchunk.memblock);
1478 to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock);
1479
1480 while (PA_LIKELY(to_decode > 0)) {
1481 size_t written;
1482 ssize_t decoded;
1483
1484 decoded = sbc_decode(&a2dp->sbc,
1485 p, to_decode,
1486 d, to_write,
1487 &written);
1488
1489 if (PA_UNLIKELY(decoded <= 0)) {
1490 pa_log_error("SBC decoding error (%li)", (long) decoded);
1491 pa_memblock_release(memchunk.memblock);
1492 pa_memblock_unref(memchunk.memblock);
1493 return -1;
1494 }
1495
1496 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
1497 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
1498
1499 /* Reset frame length, it can be changed due to bitpool change */
1500 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
1501
1502 pa_assert_fp((size_t) decoded <= to_decode);
1503 pa_assert_fp((size_t) decoded == a2dp->frame_length);
1504
1505 pa_assert_fp((size_t) written == a2dp->codesize);
1506
1507 p = (const uint8_t*) p + decoded;
1508 to_decode -= decoded;
1509
1510 d = (uint8_t*) d + written;
1511 to_write -= written;
1512
1513 frame_count++;
1514 }
1515
1516 memchunk.length -= to_write;
1517
1518 pa_memblock_release(memchunk.memblock);
1519
1520 pa_source_post(u->source, &memchunk);
1521
1522 ret = 1;
1523 break;
1524 }
1525
1526 pa_memblock_unref(memchunk.memblock);
1527
1528 return ret;
1529 }
1530
1531 static void a2dp_reduce_bitpool(struct userdata *u)
1532 {
1533 struct a2dp_info *a2dp;
1534 uint8_t bitpool;
1535
1536 pa_assert(u);
1537
1538 a2dp = &u->a2dp;
1539
1540 /* Check if bitpool is already at its limit */
1541 if (a2dp->sbc.bitpool <= BITPOOL_DEC_LIMIT)
1542 return;
1543
1544 bitpool = a2dp->sbc.bitpool - BITPOOL_DEC_STEP;
1545
1546 if (bitpool < BITPOOL_DEC_LIMIT)
1547 bitpool = BITPOOL_DEC_LIMIT;
1548
1549 a2dp_set_bitpool(u, bitpool);
1550 }
1551
1552 static void thread_func(void *userdata) {
1553 struct userdata *u = userdata;
1554 unsigned do_write = 0;
1555 pa_bool_t writable = FALSE;
1556
1557 pa_assert(u);
1558
1559 pa_log_debug("IO Thread starting up");
1560
1561 if (u->core->realtime_scheduling)
1562 pa_make_realtime(u->core->realtime_priority);
1563
1564 pa_thread_mq_install(&u->thread_mq);
1565
1566 if (u->transport) {
1567 if (bt_transport_acquire(u, TRUE) < 0)
1568 goto fail;
1569 } else if (start_stream_fd(u) < 0)
1570 goto fail;
1571
1572 for (;;) {
1573 struct pollfd *pollfd;
1574 int ret;
1575 pa_bool_t disable_timer = TRUE;
1576
1577 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1578
1579 if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) {
1580
1581 /* We should send two blocks to the device before we expect
1582 * a response. */
1583
1584 if (u->write_index == 0 && u->read_index <= 0)
1585 do_write = 2;
1586
1587 if (pollfd && (pollfd->revents & POLLIN)) {
1588 int n_read;
1589
1590 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW)
1591 n_read = hsp_process_push(u);
1592 else
1593 n_read = a2dp_process_push(u);
1594
1595 if (n_read < 0)
1596 goto fail;
1597
1598 /* We just read something, so we are supposed to write something, too */
1599 do_write += n_read;
1600 }
1601 }
1602
1603 if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) {
1604
1605 if (u->sink->thread_info.rewind_requested)
1606 pa_sink_process_rewind(u->sink, 0);
1607
1608 if (pollfd) {
1609 if (pollfd->revents & POLLOUT)
1610 writable = TRUE;
1611
1612 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0 && writable) {
1613 pa_usec_t time_passed;
1614 pa_usec_t audio_sent;
1615
1616 /* Hmm, there is no input stream we could synchronize
1617 * to. So let's do things by time */
1618
1619 time_passed = pa_rtclock_now() - u->started_at;
1620 audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1621
1622 if (audio_sent <= time_passed) {
1623 pa_usec_t audio_to_send = time_passed - audio_sent;
1624
1625 /* Never try to catch up for more than 100ms */
1626 if (u->write_index > 0 && audio_to_send > MAX_PLAYBACK_CATCH_UP_USEC) {
1627 pa_usec_t skip_usec;
1628 uint64_t skip_bytes;
1629
1630 skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
1631 skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
1632
1633 if (skip_bytes > 0) {
1634 pa_memchunk tmp;
1635
1636 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1637 (unsigned long long) skip_usec,
1638 (unsigned long long) skip_bytes);
1639
1640 pa_sink_render_full(u->sink, skip_bytes, &tmp);
1641 pa_memblock_unref(tmp.memblock);
1642 u->write_index += skip_bytes;
1643
1644 if (u->profile == PROFILE_A2DP)
1645 a2dp_reduce_bitpool(u);
1646 }
1647 }
1648
1649 do_write = 1;
1650 }
1651 }
1652
1653 if (writable && do_write > 0) {
1654 int n_written;
1655
1656 if (u->write_index <= 0)
1657 u->started_at = pa_rtclock_now();
1658
1659 if (u->profile == PROFILE_A2DP) {
1660 if ((n_written = a2dp_process_render(u)) < 0)
1661 goto fail;
1662 } else {
1663 if ((n_written = hsp_process_render(u)) < 0)
1664 goto fail;
1665 }
1666
1667 if (n_written == 0)
1668 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1669
1670 do_write -= n_written;
1671 writable = FALSE;
1672 }
1673
1674 if ((!u->source || !PA_SOURCE_IS_LINKED(u->source->thread_info.state)) && do_write <= 0) {
1675 pa_usec_t sleep_for;
1676 pa_usec_t time_passed, next_write_at;
1677
1678 if (writable) {
1679 /* Hmm, there is no input stream we could synchronize
1680 * to. So let's estimate when we need to wake up the latest */
1681 time_passed = pa_rtclock_now() - u->started_at;
1682 next_write_at = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1683 sleep_for = time_passed < next_write_at ? next_write_at - time_passed : 0;
1684 /* pa_log("Sleeping for %lu; time passed %lu, next write at %lu", (unsigned long) sleep_for, (unsigned long) time_passed, (unsigned long)next_write_at); */
1685 } else
1686 /* drop stream every 500 ms */
1687 sleep_for = PA_USEC_PER_MSEC * 500;
1688
1689 pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for);
1690 disable_timer = FALSE;
1691 }
1692 }
1693 }
1694
1695 if (disable_timer)
1696 pa_rtpoll_set_timer_disabled(u->rtpoll);
1697
1698 /* Hmm, nothing to do. Let's sleep */
1699 if (pollfd)
1700 pollfd->events = (short) (((u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state) && !writable) ? POLLOUT : 0) |
1701 (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state) ? POLLIN : 0));
1702
1703 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1704 goto fail;
1705
1706 if (ret == 0)
1707 goto finish;
1708
1709 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1710
1711 if (pollfd && (pollfd->revents & ~(POLLOUT|POLLIN))) {
1712 pa_log_info("FD error: %s%s%s%s",
1713 pollfd->revents & POLLERR ? "POLLERR " :"",
1714 pollfd->revents & POLLHUP ? "POLLHUP " :"",
1715 pollfd->revents & POLLPRI ? "POLLPRI " :"",
1716 pollfd->revents & POLLNVAL ? "POLLNVAL " :"");
1717 goto fail;
1718 }
1719 }
1720
1721 fail:
1722 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1723 pa_log_debug("IO thread failed");
1724 pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
1725 pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
1726
1727 finish:
1728 pa_log_debug("IO thread shutting down");
1729 }
1730
1731 /* Run from main thread */
1732 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
1733 DBusError err;
1734 struct userdata *u;
1735
1736 pa_assert(bus);
1737 pa_assert(m);
1738 pa_assert_se(u = userdata);
1739
1740 dbus_error_init(&err);
1741
1742 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1743 dbus_message_get_interface(m),
1744 dbus_message_get_path(m),
1745 dbus_message_get_member(m));
1746
1747 if (!dbus_message_has_path(m, u->path) && !dbus_message_has_path(m, u->transport))
1748 goto fail;
1749
1750 if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") ||
1751 dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1752
1753 dbus_uint16_t gain;
1754 pa_cvolume v;
1755
1756 if (!dbus_message_get_args(m, &err, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID) || gain > HSP_MAX_GAIN) {
1757 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err.message);
1758 goto fail;
1759 }
1760
1761 if (u->profile == PROFILE_HSP) {
1762 if (u->sink && dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged")) {
1763 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1764
1765 /* increment volume by one to correct rounding errors */
1766 if (volume < PA_VOLUME_NORM)
1767 volume++;
1768
1769 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1770 pa_sink_volume_changed(u->sink, &v);
1771
1772 } else if (u->source && dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1773 pa_volume_t volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1774
1775 /* increment volume by one to correct rounding errors */
1776 if (volume < PA_VOLUME_NORM)
1777 volume++;
1778
1779 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1780 pa_source_volume_changed(u->source, &v);
1781 }
1782 }
1783 } else if (dbus_message_is_signal(m, "org.bluez.MediaTransport", "PropertyChanged")) {
1784 DBusMessageIter arg_i;
1785 pa_bluetooth_transport *t;
1786 pa_bool_t nrec;
1787
1788 t = (pa_bluetooth_transport *) pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1789 pa_assert(t);
1790
1791 if (!dbus_message_iter_init(m, &arg_i)) {
1792 pa_log("Failed to parse PropertyChanged: %s", err.message);
1793 goto fail;
1794 }
1795
1796 nrec = t->nrec;
1797
1798 if (pa_bluetooth_transport_parse_property(t, &arg_i) < 0)
1799 goto fail;
1800
1801 if (nrec != t->nrec) {
1802 pa_log_debug("dbus: property 'NREC' changed to value '%s'", t->nrec ? "True" : "False");
1803 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0");
1804 }
1805 }
1806
1807 fail:
1808 dbus_error_free(&err);
1809
1810 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1811 }
1812
1813 /* Run from main thread */
1814 static void sink_set_volume_cb(pa_sink *s) {
1815 DBusMessage *m;
1816 dbus_uint16_t gain;
1817 pa_volume_t volume;
1818 struct userdata *u;
1819 char *k;
1820
1821 pa_assert(s);
1822 pa_assert(s->core);
1823
1824 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1825 u = pa_shared_get(s->core, k);
1826 pa_xfree(k);
1827
1828 pa_assert(u);
1829 pa_assert(u->sink == s);
1830 pa_assert(u->profile == PROFILE_HSP);
1831
1832 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1833
1834 if (gain > HSP_MAX_GAIN)
1835 gain = HSP_MAX_GAIN;
1836
1837 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1838
1839 /* increment volume by one to correct rounding errors */
1840 if (volume < PA_VOLUME_NORM)
1841 volume++;
1842
1843 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1844
1845 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetSpeakerGain"));
1846 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1847 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1848 dbus_message_unref(m);
1849 }
1850
1851 /* Run from main thread */
1852 static void source_set_volume_cb(pa_source *s) {
1853 DBusMessage *m;
1854 dbus_uint16_t gain;
1855 pa_volume_t volume;
1856 struct userdata *u;
1857 char *k;
1858
1859 pa_assert(s);
1860 pa_assert(s->core);
1861
1862 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1863 u = pa_shared_get(s->core, k);
1864 pa_xfree(k);
1865
1866 pa_assert(u);
1867 pa_assert(u->source == s);
1868 pa_assert(u->profile == PROFILE_HSP);
1869
1870 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1871
1872 if (gain > HSP_MAX_GAIN)
1873 gain = HSP_MAX_GAIN;
1874
1875 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1876
1877 /* increment volume by one to correct rounding errors */
1878 if (volume < PA_VOLUME_NORM)
1879 volume++;
1880
1881 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
1882
1883 pa_assert_se(m = dbus_message_new_method_call("org.bluez", u->path, "org.bluez.Headset", "SetMicrophoneGain"));
1884 pa_assert_se(dbus_message_append_args(m, DBUS_TYPE_UINT16, &gain, DBUS_TYPE_INVALID));
1885 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u->connection), m, NULL));
1886 dbus_message_unref(m);
1887 }
1888
1889 /* Run from main thread */
1890 static char *get_name(const char *type, pa_modargs *ma, const char *device_id, pa_bool_t *namereg_fail) {
1891 char *t;
1892 const char *n;
1893
1894 pa_assert(type);
1895 pa_assert(ma);
1896 pa_assert(device_id);
1897 pa_assert(namereg_fail);
1898
1899 t = pa_sprintf_malloc("%s_name", type);
1900 n = pa_modargs_get_value(ma, t, NULL);
1901 pa_xfree(t);
1902
1903 if (n) {
1904 *namereg_fail = TRUE;
1905 return pa_xstrdup(n);
1906 }
1907
1908 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1909 *namereg_fail = TRUE;
1910 else {
1911 n = device_id;
1912 *namereg_fail = FALSE;
1913 }
1914
1915 return pa_sprintf_malloc("bluez_%s.%s", type, n);
1916 }
1917
1918 static int sco_over_pcm_state_update(struct userdata *u, pa_bool_t changed) {
1919 pa_assert(u);
1920 pa_assert(USE_SCO_OVER_PCM(u));
1921
1922 if (PA_SINK_IS_OPENED(pa_sink_get_state(u->hsp.sco_sink)) ||
1923 PA_SOURCE_IS_OPENED(pa_source_get_state(u->hsp.sco_source))) {
1924
1925 if (u->service_fd >= 0 && u->stream_fd >= 0)
1926 return 0;
1927
1928 init_bt(u);
1929
1930 pa_log_debug("Resuming SCO over PCM");
1931 if (init_profile(u) < 0) {
1932 pa_log("Can't resume SCO over PCM");
1933 return -1;
1934 }
1935
1936 if (u->transport)
1937 return bt_transport_acquire(u, TRUE);
1938
1939 return start_stream_fd(u);
1940 }
1941
1942 if (changed) {
1943 if (u->service_fd < 0 && u->stream_fd < 0)
1944 return 0;
1945
1946 pa_log_debug("Closing SCO over PCM");
1947
1948 if (u->transport)
1949 bt_transport_release(u);
1950 else if (u->stream_fd >= 0)
1951 stop_stream_fd(u);
1952
1953 if (u->service_fd >= 0) {
1954 pa_close(u->service_fd);
1955 u->service_fd = -1;
1956 }
1957 }
1958
1959 return 0;
1960 }
1961
1962 static pa_hook_result_t sink_state_changed_cb(pa_core *c, pa_sink *s, struct userdata *u) {
1963 pa_assert(c);
1964 pa_sink_assert_ref(s);
1965 pa_assert(u);
1966
1967 if (s != u->hsp.sco_sink)
1968 return PA_HOOK_OK;
1969
1970 sco_over_pcm_state_update(u, TRUE);
1971
1972 return PA_HOOK_OK;
1973 }
1974
1975 static pa_hook_result_t source_state_changed_cb(pa_core *c, pa_source *s, struct userdata *u) {
1976 pa_assert(c);
1977 pa_source_assert_ref(s);
1978 pa_assert(u);
1979
1980 if (s != u->hsp.sco_source)
1981 return PA_HOOK_OK;
1982
1983 sco_over_pcm_state_update(u, TRUE);
1984
1985 return PA_HOOK_OK;
1986 }
1987
1988 /* Run from main thread */
1989 static int add_sink(struct userdata *u) {
1990 char *k;
1991
1992 if (USE_SCO_OVER_PCM(u)) {
1993 pa_proplist *p;
1994
1995 u->sink = u->hsp.sco_sink;
1996 p = pa_proplist_new();
1997 pa_proplist_sets(p, "bluetooth.protocol", "sco");
1998 pa_proplist_update(u->sink->proplist, PA_UPDATE_MERGE, p);
1999 pa_proplist_free(p);
2000
2001 if (!u->hsp.sink_state_changed_slot)
2002 u->hsp.sink_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SINK_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) sink_state_changed_cb, u);
2003
2004 } else {
2005 pa_sink_new_data data;
2006 pa_bool_t b;
2007
2008 pa_sink_new_data_init(&data);
2009 data.driver = __FILE__;
2010 data.module = u->module;
2011 pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
2012 pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP ? "a2dp" : "sco");
2013 if (u->profile == PROFILE_HSP)
2014 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
2015 data.card = u->card;
2016 data.name = get_name("sink", u->modargs, u->address, &b);
2017 data.namereg_fail = b;
2018
2019 if (pa_modargs_get_proplist(u->modargs, "sink_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
2020 pa_log("Invalid properties");
2021 pa_sink_new_data_done(&data);
2022 return -1;
2023 }
2024
2025 u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY);
2026 pa_sink_new_data_done(&data);
2027
2028 if (!u->sink) {
2029 pa_log_error("Failed to create sink");
2030 return -1;
2031 }
2032
2033 u->sink->userdata = u;
2034 u->sink->parent.process_msg = sink_process_msg;
2035
2036 pa_sink_set_max_request(u->sink, u->block_size);
2037 pa_sink_set_fixed_latency(u->sink,
2038 (u->profile == PROFILE_A2DP ? FIXED_LATENCY_PLAYBACK_A2DP : FIXED_LATENCY_PLAYBACK_HSP) +
2039 pa_bytes_to_usec(u->block_size, &u->sample_spec));
2040 }
2041
2042 if (u->profile == PROFILE_HSP) {
2043 pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
2044 u->sink->n_volume_steps = 16;
2045
2046 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
2047 pa_shared_set(u->core, k, u);
2048 pa_xfree(k);
2049 }
2050
2051 return 0;
2052 }
2053
2054 /* Run from main thread */
2055 static int add_source(struct userdata *u) {
2056 char *k;
2057
2058 if (USE_SCO_OVER_PCM(u)) {
2059 u->source = u->hsp.sco_source;
2060 pa_proplist_sets(u->source->proplist, "bluetooth.protocol", "hsp");
2061
2062 if (!u->hsp.source_state_changed_slot)
2063 u->hsp.source_state_changed_slot = pa_hook_connect(&u->core->hooks[PA_CORE_HOOK_SOURCE_STATE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) source_state_changed_cb, u);
2064
2065 } else {
2066 pa_source_new_data data;
2067 pa_bool_t b;
2068
2069 pa_source_new_data_init(&data);
2070 data.driver = __FILE__;
2071 data.module = u->module;
2072 pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
2073 pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP_SOURCE ? "a2dp_source" : "hsp");
2074 if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW))
2075 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
2076
2077 data.card = u->card;
2078 data.name = get_name("source", u->modargs, u->address, &b);
2079 data.namereg_fail = b;
2080
2081 if (pa_modargs_get_proplist(u->modargs, "source_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
2082 pa_log("Invalid properties");
2083 pa_source_new_data_done(&data);
2084 return -1;
2085 }
2086
2087 u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY);
2088 pa_source_new_data_done(&data);
2089
2090 if (!u->source) {
2091 pa_log_error("Failed to create source");
2092 return -1;
2093 }
2094
2095 u->source->userdata = u;
2096 u->source->parent.process_msg = source_process_msg;
2097
2098 pa_source_set_fixed_latency(u->source,
2099 (u->profile == PROFILE_A2DP_SOURCE ? FIXED_LATENCY_RECORD_A2DP : FIXED_LATENCY_RECORD_HSP) +
2100 pa_bytes_to_usec(u->block_size, &u->sample_spec));
2101 }
2102
2103 if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW)) {
2104 if (u->transport) {
2105 const pa_bluetooth_transport *t;
2106 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
2107 pa_assert(t);
2108 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", t->nrec ? "1" : "0");
2109 } else
2110 pa_proplist_sets(u->source->proplist, "bluetooth.nrec", (u->hsp.pcm_capabilities.flags & BT_PCM_FLAG_NREC) ? "1" : "0");
2111 }
2112
2113 if (u->profile == PROFILE_HSP) {
2114 pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
2115 u->source->n_volume_steps = 16;
2116
2117 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
2118 pa_shared_set(u->core, k, u);
2119 pa_xfree(k);
2120 }
2121
2122 return 0;
2123 }
2124
2125 /* Run from main thread */
2126 static void shutdown_bt(struct userdata *u) {
2127 pa_assert(u);
2128
2129 if (u->stream_fd >= 0) {
2130 pa_close(u->stream_fd);
2131 u->stream_fd = -1;
2132
2133 u->stream_write_type = 0;
2134 }
2135
2136 if (u->service_fd >= 0) {
2137 pa_close(u->service_fd);
2138 u->service_fd = -1;
2139 u->service_write_type = 0;
2140 u->service_read_type = 0;
2141 }
2142
2143 if (u->write_memchunk.memblock) {
2144 pa_memblock_unref(u->write_memchunk.memblock);
2145 pa_memchunk_reset(&u->write_memchunk);
2146 }
2147 }
2148
2149 static int bt_transport_config_a2dp(struct userdata *u) {
2150 const pa_bluetooth_transport *t;
2151 struct a2dp_info *a2dp = &u->a2dp;
2152 a2dp_sbc_t *config;
2153
2154 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
2155 pa_assert(t);
2156
2157 config = (a2dp_sbc_t *) t->config;
2158
2159 u->sample_spec.format = PA_SAMPLE_S16LE;
2160
2161 if (a2dp->sbc_initialized)
2162 sbc_reinit(&a2dp->sbc, 0);
2163 else
2164 sbc_init(&a2dp->sbc, 0);
2165 a2dp->sbc_initialized = TRUE;
2166
2167 switch (config->frequency) {
2168 case BT_SBC_SAMPLING_FREQ_16000:
2169 a2dp->sbc.frequency = SBC_FREQ_16000;
2170 u->sample_spec.rate = 16000U;
2171 break;
2172 case BT_SBC_SAMPLING_FREQ_32000:
2173 a2dp->sbc.frequency = SBC_FREQ_32000;
2174 u->sample_spec.rate = 32000U;
2175 break;
2176 case BT_SBC_SAMPLING_FREQ_44100:
2177 a2dp->sbc.frequency = SBC_FREQ_44100;
2178 u->sample_spec.rate = 44100U;
2179 break;
2180 case BT_SBC_SAMPLING_FREQ_48000:
2181 a2dp->sbc.frequency = SBC_FREQ_48000;
2182 u->sample_spec.rate = 48000U;
2183 break;
2184 default:
2185 pa_assert_not_reached();
2186 }
2187
2188 switch (config->channel_mode) {
2189 case BT_A2DP_CHANNEL_MODE_MONO:
2190 a2dp->sbc.mode = SBC_MODE_MONO;
2191 u->sample_spec.channels = 1;
2192 break;
2193 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
2194 a2dp->sbc.mode = SBC_MODE_DUAL_CHANNEL;
2195 u->sample_spec.channels = 2;
2196 break;
2197 case BT_A2DP_CHANNEL_MODE_STEREO:
2198 a2dp->sbc.mode = SBC_MODE_STEREO;
2199 u->sample_spec.channels = 2;
2200 break;
2201 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
2202 a2dp->sbc.mode = SBC_MODE_JOINT_STEREO;
2203 u->sample_spec.channels = 2;
2204 break;
2205 default:
2206 pa_assert_not_reached();
2207 }
2208
2209 switch (config->allocation_method) {
2210 case BT_A2DP_ALLOCATION_SNR:
2211 a2dp->sbc.allocation = SBC_AM_SNR;
2212 break;
2213 case BT_A2DP_ALLOCATION_LOUDNESS:
2214 a2dp->sbc.allocation = SBC_AM_LOUDNESS;
2215 break;
2216 default:
2217 pa_assert_not_reached();
2218 }
2219
2220 switch (config->subbands) {
2221 case BT_A2DP_SUBBANDS_4:
2222 a2dp->sbc.subbands = SBC_SB_4;
2223 break;
2224 case BT_A2DP_SUBBANDS_8:
2225 a2dp->sbc.subbands = SBC_SB_8;
2226 break;
2227 default:
2228 pa_assert_not_reached();
2229 }
2230
2231 switch (config->block_length) {
2232 case BT_A2DP_BLOCK_LENGTH_4:
2233 a2dp->sbc.blocks = SBC_BLK_4;
2234 break;
2235 case BT_A2DP_BLOCK_LENGTH_8:
2236 a2dp->sbc.blocks = SBC_BLK_8;
2237 break;
2238 case BT_A2DP_BLOCK_LENGTH_12:
2239 a2dp->sbc.blocks = SBC_BLK_12;
2240 break;
2241 case BT_A2DP_BLOCK_LENGTH_16:
2242 a2dp->sbc.blocks = SBC_BLK_16;
2243 break;
2244 default:
2245 pa_assert_not_reached();
2246 }
2247
2248 a2dp->min_bitpool = config->min_bitpool;
2249 a2dp->max_bitpool = config->max_bitpool;
2250
2251 /* Set minimum bitpool for source to get the maximum possible block_size */
2252 a2dp->sbc.bitpool = u->profile == PROFILE_A2DP ? a2dp->max_bitpool : a2dp->min_bitpool;
2253 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
2254 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
2255
2256 u->block_size =
2257 ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
2258 / a2dp->frame_length
2259 * a2dp->codesize);
2260
2261 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
2262 a2dp->sbc.allocation, a2dp->sbc.subbands, a2dp->sbc.blocks, a2dp->sbc.bitpool);
2263
2264 return 0;
2265 }
2266
2267 static int bt_transport_config(struct userdata *u) {
2268 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
2269 u->block_size = u->link_mtu;
2270 u->sample_spec.format = PA_SAMPLE_S16LE;
2271 u->sample_spec.channels = 1;
2272 u->sample_spec.rate = 8000;
2273 return 0;
2274 }
2275
2276 return bt_transport_config_a2dp(u);
2277 }
2278
2279 /* Run from main thread */
2280 static int bt_transport_open(struct userdata *u) {
2281 if (bt_transport_acquire(u, FALSE) < 0)
2282 return -1;
2283
2284 return bt_transport_config(u);
2285 }
2286
2287 /* Run from main thread */
2288 static int init_bt(struct userdata *u) {
2289 pa_assert(u);
2290
2291 shutdown_bt(u);
2292
2293 u->stream_write_type = 0;
2294 u->service_write_type = 0;
2295 u->service_read_type = 0;
2296
2297 if ((u->service_fd = bt_audio_service_open()) < 0) {
2298 pa_log_warn("Bluetooth audio service not available");
2299 return -1;
2300 }
2301
2302 pa_log_debug("Connected to the bluetooth audio service");
2303
2304 return 0;
2305 }
2306
2307 /* Run from main thread */
2308 static int setup_bt(struct userdata *u) {
2309 const pa_bluetooth_device *d;
2310 const pa_bluetooth_transport *t;
2311
2312 pa_assert(u);
2313
2314 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
2315 pa_log_error("Failed to get device object.");
2316 return -1;
2317 }
2318
2319 /* release transport if exist */
2320 if (u->transport) {
2321 bt_transport_release(u);
2322 pa_xfree(u->transport);
2323 u->transport = NULL;
2324 }
2325
2326 /* check if profile has a transport */
2327 t = pa_bluetooth_device_get_transport(d, u->profile);
2328 if (t) {
2329 u->transport = pa_xstrdup(t->path);
2330 return bt_transport_open(u);
2331 }
2332
2333 if (get_caps(u, 0) < 0)
2334 return -1;
2335
2336 pa_log_debug("Got device capabilities");
2337
2338 if (set_conf(u) < 0)
2339 return -1;
2340
2341 pa_log_debug("Connection to the device configured");
2342
2343 if (USE_SCO_OVER_PCM(u)) {
2344 pa_log_debug("Configured to use SCO over PCM");
2345 return 0;
2346 }
2347
2348 pa_log_debug("Got the stream socket");
2349
2350 return 0;
2351 }
2352
2353 /* Run from main thread */
2354 static int init_profile(struct userdata *u) {
2355 int r = 0;
2356 pa_assert(u);
2357 pa_assert(u->profile != PROFILE_OFF);
2358
2359 if (setup_bt(u) < 0)
2360 return -1;
2361
2362 if (u->profile == PROFILE_A2DP ||
2363 u->profile == PROFILE_HSP ||
2364 u->profile == PROFILE_HFGW)
2365 if (add_sink(u) < 0)
2366 r = -1;
2367
2368 if (u->profile == PROFILE_HSP ||
2369 u->profile == PROFILE_A2DP_SOURCE ||
2370 u->profile == PROFILE_HFGW)
2371 if (add_source(u) < 0)
2372 r = -1;
2373
2374 return r;
2375 }
2376
2377 /* Run from main thread */
2378 static void stop_thread(struct userdata *u) {
2379 char *k;
2380
2381 pa_assert(u);
2382
2383 if (u->thread) {
2384 pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
2385 pa_thread_free(u->thread);
2386 u->thread = NULL;
2387 }
2388
2389 if (u->rtpoll_item) {
2390 pa_rtpoll_item_free(u->rtpoll_item);
2391 u->rtpoll_item = NULL;
2392 }
2393
2394 if (u->hsp.sink_state_changed_slot) {
2395 pa_hook_slot_free(u->hsp.sink_state_changed_slot);
2396 u->hsp.sink_state_changed_slot = NULL;
2397 }
2398
2399 if (u->hsp.source_state_changed_slot) {
2400 pa_hook_slot_free(u->hsp.source_state_changed_slot);
2401 u->hsp.source_state_changed_slot = NULL;
2402 }
2403
2404 if (u->sink) {
2405 if (u->profile == PROFILE_HSP) {
2406 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
2407 pa_shared_remove(u->core, k);
2408 pa_xfree(k);
2409 }
2410
2411 pa_sink_unref(u->sink);
2412 u->sink = NULL;
2413 }
2414
2415 if (u->source) {
2416 if (u->profile == PROFILE_HSP) {
2417 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
2418 pa_shared_remove(u->core, k);
2419 pa_xfree(k);
2420 }
2421
2422 pa_source_unref(u->source);
2423 u->source = NULL;
2424 }
2425
2426 if (u->rtpoll) {
2427 pa_thread_mq_done(&u->thread_mq);
2428
2429 pa_rtpoll_free(u->rtpoll);
2430 u->rtpoll = NULL;
2431 }
2432
2433 if (u->read_smoother) {
2434 pa_smoother_free(u->read_smoother);
2435 u->read_smoother = NULL;
2436 }
2437 }
2438
2439 /* Run from main thread */
2440 static int start_thread(struct userdata *u) {
2441 pa_assert(u);
2442 pa_assert(!u->thread);
2443 pa_assert(!u->rtpoll);
2444 pa_assert(!u->rtpoll_item);
2445
2446 u->rtpoll = pa_rtpoll_new();
2447 pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
2448
2449 if (USE_SCO_OVER_PCM(u)) {
2450 if (sco_over_pcm_state_update(u, FALSE) < 0) {
2451 char *k;
2452
2453 if (u->sink) {
2454 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
2455 pa_shared_remove(u->core, k);
2456 pa_xfree(k);
2457 u->sink = NULL;
2458 }
2459 if (u->source) {
2460 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
2461 pa_shared_remove(u->core, k);
2462 pa_xfree(k);
2463 u->source = NULL;
2464 }
2465 return -1;
2466 }
2467
2468 pa_sink_ref(u->sink);
2469 pa_source_ref(u->source);
2470 /* FIXME: monitor stream_fd error */
2471 return 0;
2472 }
2473
2474 if (!(u->thread = pa_thread_new("bluetooth", thread_func, u))) {
2475 pa_log_error("Failed to create IO thread");
2476 stop_thread(u);
2477 return -1;
2478 }
2479
2480 if (u->sink) {
2481 pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
2482 pa_sink_set_rtpoll(u->sink, u->rtpoll);
2483 pa_sink_put(u->sink);
2484
2485 if (u->sink->set_volume)
2486 u->sink->set_volume(u->sink);
2487 }
2488
2489 if (u->source) {
2490 pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
2491 pa_source_set_rtpoll(u->source, u->rtpoll);
2492 pa_source_put(u->source);
2493
2494 if (u->source->set_volume)
2495 u->source->set_volume(u->source);
2496 }
2497
2498 return 0;
2499 }
2500
2501 static void save_sco_volume_callbacks(struct userdata *u) {
2502 pa_assert(u);
2503 pa_assert(USE_SCO_OVER_PCM(u));
2504
2505 u->hsp.sco_sink_set_volume = u->hsp.sco_sink->set_volume;
2506 u->hsp.sco_source_set_volume = u->hsp.sco_source->set_volume;
2507 }
2508
2509 static void restore_sco_volume_callbacks(struct userdata *u) {
2510 pa_assert(u);
2511 pa_assert(USE_SCO_OVER_PCM(u));
2512
2513 pa_sink_set_set_volume_callback(u->hsp.sco_sink, u->hsp.sco_sink_set_volume);
2514 pa_source_set_set_volume_callback(u->hsp.sco_source, u->hsp.sco_source_set_volume);
2515 }
2516
2517 /* Run from main thread */
2518 static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
2519 struct userdata *u;
2520 enum profile *d;
2521 pa_queue *inputs = NULL, *outputs = NULL;
2522 const pa_bluetooth_device *device;
2523
2524 pa_assert(c);
2525 pa_assert(new_profile);
2526 pa_assert_se(u = c->userdata);
2527
2528 d = PA_CARD_PROFILE_DATA(new_profile);
2529
2530 if (!(device = pa_bluetooth_discovery_get_by_path(u->discovery, u->path))) {
2531 pa_log_error("Failed to get device object.");
2532 return -PA_ERR_IO;
2533 }
2534
2535 /* The state signal is sent by bluez, so it is racy to check
2536 strictly for CONNECTED, we should also accept STREAMING state
2537 as being good enough. However, if the profile is used
2538 concurrently (which is unlikely), ipc will fail later on, and
2539 module will be unloaded. */
2540 if (device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) {
2541 pa_log_warn("HSP is not connected, refused to switch profile");
2542 return -PA_ERR_IO;
2543 }
2544 else if (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) {
2545 pa_log_warn("A2DP is not connected, refused to switch profile");
2546 return -PA_ERR_IO;
2547 }
2548 else if (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) {
2549 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
2550 return -PA_ERR_IO;
2551 }
2552
2553 if (u->sink) {
2554 inputs = pa_sink_move_all_start(u->sink, NULL);
2555
2556 if (!USE_SCO_OVER_PCM(u))
2557 pa_sink_unlink(u->sink);
2558 }
2559
2560 if (u->source) {
2561 outputs = pa_source_move_all_start(u->source, NULL);
2562
2563 if (!USE_SCO_OVER_PCM(u))
2564 pa_source_unlink(u->source);
2565 }
2566
2567 stop_thread(u);
2568 shutdown_bt(u);
2569
2570 if (USE_SCO_OVER_PCM(u))
2571 restore_sco_volume_callbacks(u);
2572
2573 u->profile = *d;
2574 u->sample_spec = u->requested_sample_spec;
2575
2576 if (USE_SCO_OVER_PCM(u))
2577 save_sco_volume_callbacks(u);
2578
2579 init_bt(u);
2580
2581 if (u->profile != PROFILE_OFF)
2582 init_profile(u);
2583
2584 if (u->sink || u->source)
2585 start_thread(u);
2586
2587 if (inputs) {
2588 if (u->sink)
2589 pa_sink_move_all_finish(u->sink, inputs, FALSE);
2590 else
2591 pa_sink_move_all_fail(inputs);
2592 }
2593
2594 if (outputs) {
2595 if (u->source)
2596 pa_source_move_all_finish(u->source, outputs, FALSE);
2597 else
2598 pa_source_move_all_fail(outputs);
2599 }
2600
2601 return 0;
2602 }
2603
2604 /* Run from main thread */
2605 static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
2606 pa_card_new_data data;
2607 pa_bool_t b;
2608 pa_card_profile *p;
2609 enum profile *d;
2610 const char *ff;
2611 char *n;
2612 const char *default_profile;
2613
2614 pa_assert(u);
2615 pa_assert(device);
2616
2617 pa_card_new_data_init(&data);
2618 data.driver = __FILE__;
2619 data.module = u->module;
2620
2621 n = pa_bluetooth_cleanup_name(device->name);
2622 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_DESCRIPTION, n);
2623 pa_xfree(n);
2624 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, device->address);
2625 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_API, "bluez");
2626 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_CLASS, "sound");
2627 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_BUS, "bluetooth");
2628 if ((ff = pa_bluetooth_get_form_factor(device->class)))
2629 pa_proplist_sets(data.proplist, PA_PROP_DEVICE_FORM_FACTOR, ff);
2630 pa_proplist_sets(data.proplist, "bluez.path", device->path);
2631 pa_proplist_setf(data.proplist, "bluez.class", "0x%06x", (unsigned) device->class);
2632 pa_proplist_sets(data.proplist, "bluez.name", device->name);
2633 data.name = get_name("card", u->modargs, device->address, &b);
2634 data.namereg_fail = b;
2635
2636 if (pa_modargs_get_proplist(u->modargs, "card_properties", data.proplist, PA_UPDATE_REPLACE) < 0) {
2637 pa_log("Invalid properties");
2638 pa_card_new_data_done(&data);
2639 return -1;
2640 }
2641
2642 data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
2643
2644 /* we base hsp/a2dp availability on UUIDs.
2645 Ideally, it would be based on "Connected" state, but
2646 we can't afford to wait for this information when
2647 we are loaded with profile="hsp", for instance */
2648 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SINK_UUID)) {
2649 p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile));
2650 p->priority = 10;
2651 p->n_sinks = 1;
2652 p->n_sources = 0;
2653 p->max_sink_channels = 2;
2654 p->max_source_channels = 0;
2655
2656 d = PA_CARD_PROFILE_DATA(p);
2657 *d = PROFILE_A2DP;
2658
2659 pa_hashmap_put(data.profiles, p->name, p);
2660 }
2661
2662 if (pa_bluetooth_uuid_has(device->uuids, A2DP_SOURCE_UUID)) {
2663 p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile));
2664 p->priority = 10;
2665 p->n_sinks = 0;
2666 p->n_sources = 1;
2667 p->max_sink_channels = 0;
2668 p->max_source_channels = 2;
2669
2670 d = PA_CARD_PROFILE_DATA(p);
2671 *d = PROFILE_A2DP_SOURCE;
2672
2673 pa_hashmap_put(data.profiles, p->name, p);
2674 }
2675
2676 if (pa_bluetooth_uuid_has(device->uuids, HSP_HS_UUID) ||
2677 pa_bluetooth_uuid_has(device->uuids, HFP_HS_UUID)) {
2678 p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile));
2679 p->priority = 20;
2680 p->n_sinks = 1;
2681 p->n_sources = 1;
2682 p->max_sink_channels = 1;
2683 p->max_source_channels = 1;
2684
2685 d = PA_CARD_PROFILE_DATA(p);
2686 *d = PROFILE_HSP;
2687
2688 pa_hashmap_put(data.profiles, p->name, p);
2689 }
2690
2691 if (pa_bluetooth_uuid_has(device->uuids, HFP_AG_UUID)) {
2692 p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile));
2693 p->priority = 20;
2694 p->n_sinks = 1;
2695 p->n_sources = 1;
2696 p->max_sink_channels = 1;
2697 p->max_source_channels = 1;
2698
2699 d = PA_CARD_PROFILE_DATA(p);
2700 *d = PROFILE_HFGW;
2701
2702 pa_hashmap_put(data.profiles, p->name, p);
2703 }
2704
2705 pa_assert(!pa_hashmap_isempty(data.profiles));
2706
2707 p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
2708 d = PA_CARD_PROFILE_DATA(p);
2709 *d = PROFILE_OFF;
2710 pa_hashmap_put(data.profiles, p->name, p);
2711
2712 if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
2713 if (pa_hashmap_get(data.profiles, default_profile))
2714 pa_card_new_data_set_profile(&data, default_profile);
2715 else
2716 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile);
2717 }
2718
2719 u->card = pa_card_new(u->core, &data);
2720 pa_card_new_data_done(&data);
2721
2722 if (!u->card) {
2723 pa_log("Failed to allocate card.");
2724 return -1;
2725 }
2726
2727 u->card->userdata = u;
2728 u->card->set_profile = card_set_profile;
2729
2730 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2731
2732 if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) ||
2733 (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) ||
2734 (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW)) {
2735 pa_log_warn("Default profile not connected, selecting off profile");
2736 u->card->active_profile = pa_hashmap_get(u->card->profiles, "off");
2737 u->card->save_profile = FALSE;
2738 }
2739
2740 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2741 u->profile = *d;
2742
2743 if (USE_SCO_OVER_PCM(u))
2744 save_sco_volume_callbacks(u);
2745
2746 return 0;
2747 }
2748
2749 /* Run from main thread */
2750 static const pa_bluetooth_device* find_device(struct userdata *u, const char *address, const char *path) {
2751 const pa_bluetooth_device *d = NULL;
2752
2753 pa_assert(u);
2754
2755 if (!address && !path) {
2756 pa_log_error("Failed to get device address/path from module arguments.");
2757 return NULL;
2758 }
2759
2760 if (path) {
2761 if (!(d = pa_bluetooth_discovery_get_by_path(u->discovery, path))) {
2762 pa_log_error("%s is not a valid BlueZ audio device.", path);
2763 return NULL;
2764 }
2765
2766 if (address && !(pa_streq(d->address, address))) {
2767 pa_log_error("Passed path %s address %s != %s don't match.", path, d->address, address);
2768 return NULL;
2769 }
2770
2771 } else {
2772 if (!(d = pa_bluetooth_discovery_get_by_address(u->discovery, address))) {
2773 pa_log_error("%s is not known.", address);
2774 return NULL;
2775 }
2776 }
2777
2778 if (d) {
2779 u->address = pa_xstrdup(d->address);
2780 u->path = pa_xstrdup(d->path);
2781 }
2782
2783 return d;
2784 }
2785
2786 /* Run from main thread */
2787 static int setup_dbus(struct userdata *u) {
2788 DBusError err;
2789
2790 dbus_error_init(&err);
2791
2792 u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err);
2793
2794 if (dbus_error_is_set(&err) || !u->connection) {
2795 pa_log("Failed to get D-Bus connection: %s", err.message);
2796 dbus_error_free(&err);
2797 return -1;
2798 }
2799
2800 return 0;
2801 }
2802
2803 int pa__init(pa_module* m) {
2804 pa_modargs *ma;
2805 uint32_t channels;
2806 struct userdata *u;
2807 const char *address, *path;
2808 DBusError err;
2809 char *mike, *speaker, *transport;
2810 const pa_bluetooth_device *device;
2811
2812 pa_assert(m);
2813
2814 dbus_error_init(&err);
2815
2816 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
2817 pa_log_error("Failed to parse module arguments");
2818 goto fail;
2819 }
2820
2821 m->userdata = u = pa_xnew0(struct userdata, 1);
2822 u->module = m;
2823 u->core = m->core;
2824 u->service_fd = -1;
2825 u->stream_fd = -1;
2826 u->sample_spec = m->core->default_sample_spec;
2827 u->modargs = ma;
2828
2829 if (pa_modargs_get_value(ma, "sco_sink", NULL) &&
2830 !(u->hsp.sco_sink = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_sink", NULL), PA_NAMEREG_SINK))) {
2831 pa_log("SCO sink not found");
2832 goto fail;
2833 }
2834
2835 if (pa_modargs_get_value(ma, "sco_source", NULL) &&
2836 !(u->hsp.sco_source = pa_namereg_get(m->core, pa_modargs_get_value(ma, "sco_source", NULL), PA_NAMEREG_SOURCE))) {
2837 pa_log("SCO source not found");
2838 goto fail;
2839 }
2840
2841 if (pa_modargs_get_value_u32(ma, "rate", &u->sample_spec.rate) < 0 ||
2842 u->sample_spec.rate <= 0 || u->sample_spec.rate > PA_RATE_MAX) {
2843 pa_log_error("Failed to get rate from module arguments");
2844 goto fail;
2845 }
2846
2847 u->auto_connect = TRUE;
2848 if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) {
2849 pa_log("Failed to parse auto_connect= argument");
2850 goto fail;
2851 }
2852
2853 channels = u->sample_spec.channels;
2854 if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
2855 channels <= 0 || channels > PA_CHANNELS_MAX) {
2856 pa_log_error("Failed to get channels from module arguments");
2857 goto fail;
2858 }
2859 u->sample_spec.channels = (uint8_t) channels;
2860 u->requested_sample_spec = u->sample_spec;
2861
2862 address = pa_modargs_get_value(ma, "address", NULL);
2863 path = pa_modargs_get_value(ma, "path", NULL);
2864
2865 if (setup_dbus(u) < 0)
2866 goto fail;
2867
2868 if (!(u->discovery = pa_bluetooth_discovery_get(m->core)))
2869 goto fail;
2870
2871 if (!(device = find_device(u, address, path)))
2872 goto fail;
2873
2874 /* Add the card structure. This will also initialize the default profile */
2875 if (add_card(u, device) < 0)
2876 goto fail;
2877
2878 if (!dbus_connection_add_filter(pa_dbus_connection_get(u->connection), filter_cb, u, NULL)) {
2879 pa_log_error("Failed to add filter function");
2880 goto fail;
2881 }
2882 u->filter_added = TRUE;
2883
2884 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2885 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2886 transport = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'");
2887
2888 if (pa_dbus_add_matches(
2889 pa_dbus_connection_get(u->connection), &err,
2890 speaker,
2891 mike,
2892 transport,
2893 NULL) < 0) {
2894
2895 pa_xfree(speaker);
2896 pa_xfree(mike);
2897 pa_xfree(transport);
2898
2899 pa_log("Failed to add D-Bus matches: %s", err.message);
2900 goto fail;
2901 }
2902
2903 pa_xfree(speaker);
2904 pa_xfree(mike);
2905 pa_xfree(transport);
2906
2907 /* Connect to the BT service */
2908 init_bt(u);
2909
2910 if (u->profile != PROFILE_OFF)
2911 if (init_profile(u) < 0)
2912 goto fail;
2913
2914 if (u->sink || u->source)
2915 if (start_thread(u) < 0)
2916 goto fail;
2917
2918 return 0;
2919
2920 fail:
2921
2922 pa__done(m);
2923
2924 dbus_error_free(&err);
2925
2926 return -1;
2927 }
2928
2929 int pa__get_n_used(pa_module *m) {
2930 struct userdata *u;
2931
2932 pa_assert(m);
2933 pa_assert_se(u = m->userdata);
2934
2935 return
2936 (u->sink ? pa_sink_linked_by(u->sink) : 0) +
2937 (u->source ? pa_source_linked_by(u->source) : 0);
2938 }
2939
2940 void pa__done(pa_module *m) {
2941 struct userdata *u;
2942
2943 pa_assert(m);
2944
2945 if (!(u = m->userdata))
2946 return;
2947
2948 if (u->sink && !USE_SCO_OVER_PCM(u))
2949 pa_sink_unlink(u->sink);
2950
2951 if (u->source && !USE_SCO_OVER_PCM(u))
2952 pa_source_unlink(u->source);
2953
2954 stop_thread(u);
2955
2956 if (USE_SCO_OVER_PCM(u))
2957 restore_sco_volume_callbacks(u);
2958
2959 if (u->connection) {
2960
2961 if (u->path) {
2962 char *speaker, *mike;
2963 speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
2964 mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
2965
2966 pa_dbus_remove_matches(pa_dbus_connection_get(u->connection), speaker, mike, NULL);
2967
2968 pa_xfree(speaker);
2969 pa_xfree(mike);
2970 }
2971
2972 if (u->filter_added)
2973 dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
2974
2975 pa_dbus_connection_unref(u->connection);
2976 }
2977
2978 if (u->card)
2979 pa_card_free(u->card);
2980
2981 if (u->read_smoother)
2982 pa_smoother_free(u->read_smoother);
2983
2984 shutdown_bt(u);
2985
2986 if (u->a2dp.buffer)
2987 pa_xfree(u->a2dp.buffer);
2988
2989 sbc_finish(&u->a2dp.sbc);
2990
2991 if (u->modargs)
2992 pa_modargs_free(u->modargs);
2993
2994 pa_xfree(u->address);
2995 pa_xfree(u->path);
2996
2997 if (u->transport) {
2998 bt_transport_release(u);
2999 pa_xfree(u->transport);
3000 }
3001
3002 if (u->discovery)
3003 pa_bluetooth_discovery_unref(u->discovery);
3004
3005 pa_xfree(u);
3006 }