default: esd is obsolete, hence don't load it anymore by default
[pulseaudio-mirror.git] / src / modules / bluetooth / module-bluetooth-device.c
blob288ad2fdbf208f2c79ee93b3a31b0f6b3172c50a
1 /***
2 This file is part of PulseAudio.
4 Copyright 2008-2009 Joao Paulo Rechi Vita
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.
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.
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 ***/
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
26 #include <string.h>
27 #include <errno.h>
28 #include <linux/sockios.h>
29 #include <arpa/inet.h>
31 #include <pulse/i18n.h>
32 #include <pulse/rtclock.h>
33 #include <pulse/sample.h>
34 #include <pulse/timeval.h>
35 #include <pulse/xmalloc.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>
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"
59 #define BITPOOL_DEC_LIMIT 32
60 #define BITPOOL_DEC_STEP 5
61 #define HSP_MAX_GAIN 15
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>");
84 /* TODO: not close fd when entering suspend mode in a2dp */
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
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 */
111 void* buffer; /* Codec transfer buffer */
112 size_t buffer_size; /* Size of the buffer */
114 uint16_t seq_num; /* Cumulative packet sequence */
115 uint8_t min_bitpool;
116 uint8_t max_bitpool;
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;
129 struct userdata {
130 pa_core *core;
131 pa_module *module;
133 char *address;
134 char *path;
135 char *transport;
136 char *accesstype;
138 pa_bluetooth_discovery *discovery;
139 pa_bool_t auto_connect;
141 pa_dbus_connection *connection;
143 pa_card *card;
144 pa_sink *sink;
145 pa_source *source;
147 pa_thread_mq thread_mq;
148 pa_rtpoll *rtpoll;
149 pa_rtpoll_item *rtpoll_item;
150 pa_thread *thread;
152 uint64_t read_index, write_index;
153 pa_usec_t started_at;
154 pa_smoother *read_smoother;
156 pa_memchunk write_memchunk;
158 pa_sample_spec sample_spec, requested_sample_spec;
160 int service_fd;
161 int stream_fd;
163 size_t link_mtu;
164 size_t block_size;
166 struct a2dp_info a2dp;
167 struct hsp_info hsp;
169 enum profile profile;
171 pa_modargs *modargs;
173 int stream_write_type;
174 int service_write_type, service_read_type;
176 pa_bool_t filter_added;
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)
184 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
186 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
188 static int init_bt(struct userdata *u);
189 static int init_profile(struct userdata *u);
191 static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) {
192 ssize_t r;
194 pa_assert(u);
195 pa_assert(msg);
196 pa_assert(msg->length > 0);
198 if (u->service_fd < 0) {
199 pa_log_warn("Service not connected");
200 return -1;
203 pa_log_debug("Sending %s -> %s",
204 pa_strnull(bt_audio_strtype(msg->type)),
205 pa_strnull(bt_audio_strname(msg->name)));
207 if ((r = pa_loop_write(u->service_fd, msg, msg->length, &u->service_write_type)) == (ssize_t) msg->length)
208 return 0;
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()");
215 return -1;
218 static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t room) {
219 ssize_t r;
221 pa_assert(u);
222 pa_assert(u->service_fd >= 0);
223 pa_assert(msg);
224 pa_assert(room >= sizeof(*msg));
226 pa_log_debug("Trying to receive message from audio service...");
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;
232 if (msg->length < sizeof(*msg)) {
233 pa_log_error("Invalid message size.");
234 return -1;
237 if (msg->length > room) {
238 pa_log_error("Not enough room.");
239 return -1;
242 /* Secondly, read the payload */
243 if (msg->length > sizeof(*msg)) {
245 size_t remains = msg->length - sizeof(*msg);
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;
254 pa_log_debug("Received %s <- %s",
255 pa_strnull(bt_audio_strtype(msg->type)),
256 pa_strnull(bt_audio_strname(msg->name)));
258 return 0;
260 read_fail:
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()");
267 return -1;
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;
273 pa_assert(u);
274 pa_assert(u->service_fd >= 0);
275 pa_assert(rsp);
277 if ((r = service_recv(u, rsp, room)) < 0)
278 return r;
280 if ((rsp->type != BT_INDICATION && rsp->type != BT_RESPONSE) ||
281 rsp->name != expected_name ||
282 (expected_size > 0 && rsp->length != expected_size)) {
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;
293 return 0;
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;
301 pa_assert(u);
302 pa_assert(rsp);
304 bytes_left = rsp->h.length - sizeof(*rsp);
306 if (bytes_left < sizeof(codec_capabilities_t)) {
307 pa_log_error("Packet too small to store codec information.");
308 return -1;
311 codec = (codec_capabilities_t *) rsp->data; /** ALIGNMENT? **/
313 pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left, (unsigned long) sizeof(*codec));
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;
321 if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
323 if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities))
324 return -1;
326 pa_assert(codec->type == BT_HFP_CODEC_PCM);
328 if (codec->configured && seid == 0)
329 return codec->seid;
331 memcpy(&u->hsp.pcm_capabilities, codec, sizeof(u->hsp.pcm_capabilities));
333 } else if (u->profile == PROFILE_A2DP) {
335 while (bytes_left > 0) {
336 if ((codec->type == BT_A2DP_SBC_SINK) && !codec->lock)
337 break;
339 bytes_left -= codec->length;
340 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
343 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
344 return -1;
346 pa_assert(codec->type == BT_A2DP_SBC_SINK);
348 if (codec->configured && seid == 0)
349 return codec->seid;
351 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
353 } else if (u->profile == PROFILE_A2DP_SOURCE) {
355 while (bytes_left > 0) {
356 if ((codec->type == BT_A2DP_SBC_SOURCE) && !codec->lock)
357 break;
359 bytes_left -= codec->length;
360 codec = (const codec_capabilities_t*) ((const uint8_t*) codec + codec->length);
363 if (bytes_left <= 0 || codec->length != sizeof(u->a2dp.sbc_capabilities))
364 return -1;
366 pa_assert(codec->type == BT_A2DP_SBC_SOURCE);
368 if (codec->configured && seid == 0)
369 return codec->seid;
371 memcpy(&u->a2dp.sbc_capabilities, codec, sizeof(u->a2dp.sbc_capabilities));
374 return 0;
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;
387 pa_assert(u);
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;
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;
402 msg.getcaps_req.flags = u->auto_connect ? BT_FLAG_AUTOCONNECT : 0;
404 if (service_send(u, &msg.getcaps_req.h) < 0)
405 return -1;
407 if (service_expect(u, &msg.getcaps_rsp.h, sizeof(msg), BT_GET_CAPABILITIES, 0) < 0)
408 return -1;
410 ret = parse_caps(u, seid, &msg.getcaps_rsp);
411 if (ret <= 0)
412 return ret;
414 return get_caps(u, ret);
417 /* Run from main thread */
418 static uint8_t a2dp_default_bitpool(uint8_t freq, uint8_t mode) {
420 switch (freq) {
421 case BT_SBC_SAMPLING_FREQ_16000:
422 case BT_SBC_SAMPLING_FREQ_32000:
423 return 53;
425 case BT_SBC_SAMPLING_FREQ_44100:
427 switch (mode) {
428 case BT_A2DP_CHANNEL_MODE_MONO:
429 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
430 return 31;
432 case BT_A2DP_CHANNEL_MODE_STEREO:
433 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
434 return 53;
436 default:
437 pa_log_warn("Invalid channel mode %u", mode);
438 return 53;
441 case BT_SBC_SAMPLING_FREQ_48000:
443 switch (mode) {
444 case BT_A2DP_CHANNEL_MODE_MONO:
445 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL:
446 return 29;
448 case BT_A2DP_CHANNEL_MODE_STEREO:
449 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO:
450 return 51;
452 default:
453 pa_log_warn("Invalid channel mode %u", mode);
454 return 51;
457 default:
458 pa_log_warn("Invalid sampling freq %u", freq);
459 return 53;
463 /* Run from main thread */
464 static int setup_a2dp(struct userdata *u) {
465 sbc_capabilities_t *cap;
466 int i;
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 }
478 pa_assert(u);
479 pa_assert(u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE);
481 cap = &u->a2dp.sbc_capabilities;
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;
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;
501 if (i < 0) {
502 pa_log("Not suitable sample rate");
503 return -1;
507 pa_assert((unsigned) i < PA_ELEMENTSOF(freq_table));
509 if (cap->capability.configured)
510 return 0;
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;
520 if (u->sample_spec.channels >= 2) {
521 u->sample_spec.channels = 2;
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;
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;
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;
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;
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);
568 return 0;
571 /* Run from main thread */
572 static void setup_sbc(struct a2dp_info *a2dp, enum profile p) {
573 sbc_capabilities_t *active_capabilities;
575 pa_assert(a2dp);
577 active_capabilities = &a2dp->sbc_capabilities;
579 if (a2dp->sbc_initialized)
580 sbc_reinit(&a2dp->sbc, 0);
581 else
582 sbc_init(&a2dp->sbc, 0);
583 a2dp->sbc_initialized = TRUE;
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();
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();
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();
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();
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();
658 a2dp->min_bitpool = active_capabilities->min_bitpool;
659 a2dp->max_bitpool = active_capabilities->max_bitpool;
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);
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;
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);
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;
687 if (service_send(u, &msg.open_req.h) < 0)
688 return -1;
690 if (service_expect(u, &msg.open_rsp.h, sizeof(msg), BT_OPEN, sizeof(msg.open_rsp)) < 0)
691 return -1;
693 if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) {
694 u->sample_spec.format = PA_SAMPLE_S16LE;
696 if (setup_a2dp(u) < 0)
697 return -1;
698 } else {
699 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
701 u->sample_spec.format = PA_SAMPLE_S16LE;
702 u->sample_spec.channels = 1;
703 u->sample_spec.rate = 8000;
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);
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);
718 msg.setconf_req.h.length += msg.setconf_req.codec.length - sizeof(msg.setconf_req.codec);
720 if (service_send(u, &msg.setconf_req.h) < 0)
721 return -1;
723 if (service_expect(u, &msg.setconf_rsp.h, sizeof(msg), BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0)
724 return -1;
726 u->link_mtu = msg.setconf_rsp.link_mtu;
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);
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);
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;
742 return 0;
745 /* from IO thread */
746 static void a2dp_set_bitpool(struct userdata *u, uint8_t bitpool)
748 struct a2dp_info *a2dp;
750 pa_assert(u);
752 a2dp = &u->a2dp;
754 if (a2dp->sbc.bitpool == bitpool)
755 return;
757 if (bitpool > a2dp->max_bitpool)
758 bitpool = a2dp->max_bitpool;
759 else if (bitpool < a2dp->min_bitpool)
760 bitpool = a2dp->min_bitpool;
762 a2dp->sbc.bitpool = bitpool;
764 a2dp->codesize = sbc_get_codesize(&a2dp->sbc);
765 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
767 pa_log_debug("Bitpool has changed to %u", a2dp->sbc.bitpool);
769 u->block_size =
770 (u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
771 / a2dp->frame_length * a2dp->codesize;
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));
778 /* from IO thread, except in SCO over PCM */
780 static int setup_stream(struct userdata *u) {
781 struct pollfd *pollfd;
782 int one;
784 pa_make_fd_nonblock(u->stream_fd);
785 pa_make_socket_low_delay(u->stream_fd);
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));
791 pa_log_debug("Stream properly set up, we're ready to roll!");
793 if (u->profile == PROFILE_A2DP)
794 a2dp_set_bitpool(u, u->a2dp.max_bitpool);
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;
801 u->read_index = u->write_index = 0;
802 u->started_at = 0;
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,
811 pa_rtclock_now(),
812 TRUE);
814 return 0;
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;
827 pa_assert(u);
828 pa_assert(u->rtpoll);
829 pa_assert(!u->rtpoll_item);
830 pa_assert(u->stream_fd < 0);
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);
837 if (service_send(u, &msg.start_req.h) < 0)
838 return -1;
840 if (service_expect(u, &msg.rsp, sizeof(msg), BT_START_STREAM, sizeof(msg.start_rsp)) < 0)
841 return -1;
843 if (service_expect(u, &msg.rsp, sizeof(msg), BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0)
844 return -1;
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;
851 return setup_stream(u);
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;
865 pa_assert(u);
866 pa_assert(u->rtpoll);
868 if (u->rtpoll_item) {
869 pa_rtpoll_item_free(u->rtpoll_item);
870 u->rtpoll_item = NULL;
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);
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;
883 pa_close(u->stream_fd);
884 u->stream_fd = -1;
887 if (u->read_smoother) {
888 pa_smoother_free(u->read_smoother);
889 u->read_smoother = NULL;
892 return r;
895 static void bt_transport_release(struct userdata *u) {
896 const char *accesstype = "rw";
897 const pa_bluetooth_transport *t;
899 /* Ignore if already released */
900 if (!u->accesstype)
901 return;
903 pa_log_debug("Releasing transport %s", u->transport);
905 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
906 if (t)
907 pa_bluetooth_transport_release(t, accesstype);
909 pa_xfree(u->accesstype);
910 u->accesstype = NULL;
912 if (u->rtpoll_item) {
913 pa_rtpoll_item_free(u->rtpoll_item);
914 u->rtpoll_item = NULL;
917 if (u->stream_fd >= 0) {
918 pa_close(u->stream_fd);
919 u->stream_fd = -1;
922 if (u->read_smoother) {
923 pa_smoother_free(u->read_smoother);
924 u->read_smoother = NULL;
928 static int bt_transport_acquire(struct userdata *u, pa_bool_t start) {
929 const char *accesstype = "rw";
930 const pa_bluetooth_transport *t;
932 if (u->accesstype) {
933 if (start)
934 goto done;
935 return 0;
938 pa_log_debug("Acquiring transport %s", u->transport);
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;
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;
953 u->accesstype = pa_xstrdup(accesstype);
954 pa_log_info("Transport %s acquired: fd %d", u->transport, u->stream_fd);
956 if (!start)
957 return 0;
959 done:
960 pa_log_info("Transport %s resuming", u->transport);
961 return setup_stream(u);
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;
970 pa_assert(u->sink == PA_SINK(o));
972 switch (code) {
974 case PA_SINK_MESSAGE_SET_STATE:
976 switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
978 case PA_SINK_SUSPENDED:
979 pa_assert(PA_SINK_IS_OPENED(u->sink->thread_info.state));
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);
992 break;
994 case PA_SINK_IDLE:
995 case PA_SINK_RUNNING:
996 if (u->sink->thread_info.state != PA_SINK_SUSPENDED)
997 break;
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;
1007 break;
1009 case PA_SINK_UNLINKED:
1010 case PA_SINK_INIT:
1011 case PA_SINK_INVALID_STATE:
1014 break;
1016 case PA_SINK_MESSAGE_GET_LATENCY: {
1018 if (u->read_smoother) {
1019 pa_usec_t wi, ri;
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);
1024 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
1025 } else {
1026 pa_usec_t ri, wi;
1028 ri = pa_rtclock_now() - u->started_at;
1029 wi = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1031 *((pa_usec_t*) data) = wi > ri ? wi - ri : 0;
1034 *((pa_usec_t*) data) += u->sink->thread_info.fixed_latency;
1035 return 0;
1039 r = pa_sink_process_msg(o, code, data, offset, chunk);
1041 return (r < 0 || !failed) ? r : -1;
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;
1050 pa_assert(u->source == PA_SOURCE(o));
1052 switch (code) {
1054 case PA_SOURCE_MESSAGE_SET_STATE:
1056 switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
1058 case PA_SOURCE_SUSPENDED:
1059 pa_assert(PA_SOURCE_IS_OPENED(u->source->thread_info.state));
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);
1069 if (u->read_smoother)
1070 pa_smoother_pause(u->read_smoother, pa_rtclock_now());
1071 break;
1073 case PA_SOURCE_IDLE:
1074 case PA_SOURCE_RUNNING:
1075 if (u->source->thread_info.state != PA_SOURCE_SUSPENDED)
1076 break;
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;
1086 /* We don't resume the smoother here. Instead we
1087 * wait until the first packet arrives */
1088 break;
1090 case PA_SOURCE_UNLINKED:
1091 case PA_SOURCE_INIT:
1092 case PA_SOURCE_INVALID_STATE:
1095 break;
1097 case PA_SOURCE_MESSAGE_GET_LATENCY: {
1098 pa_usec_t wi, ri;
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);
1104 *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
1105 } else
1106 *((pa_usec_t*) data) = 0;
1108 return 0;
1113 r = pa_source_process_msg(o, code, data, offset, chunk);
1115 return (r < 0 || !failed) ? r : -1;
1118 /* Run from IO thread */
1119 static int hsp_process_render(struct userdata *u) {
1120 int ret = 0;
1122 pa_assert(u);
1123 pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
1124 pa_assert(u->sink);
1126 /* First, render some data */
1127 if (!u->write_memchunk.memblock)
1128 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
1130 pa_assert(u->write_memchunk.length == u->block_size);
1132 for (;;) {
1133 ssize_t l;
1134 const void *p;
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. */
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);
1144 pa_assert(l != 0);
1146 if (l < 0) {
1148 if (errno == EINTR)
1149 /* Retry right away if we got interrupted */
1150 continue;
1152 else if (errno == EAGAIN)
1153 /* Hmm, apparently the socket was not writable, give up for now */
1154 break;
1156 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno));
1157 ret = -1;
1158 break;
1161 pa_assert((size_t) l <= u->write_memchunk.length);
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;
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);
1175 ret = 1;
1176 break;
1179 return ret;
1182 /* Run from IO thread */
1183 static int hsp_process_push(struct userdata *u) {
1184 int ret = 0;
1185 pa_memchunk memchunk;
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);
1192 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1193 memchunk.index = memchunk.length = 0;
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;
1205 memset(&m, 0, sizeof(m));
1206 memset(&aux, 0, sizeof(aux));
1207 memset(&iov, 0, sizeof(iov));
1209 m.msg_iov = &iov;
1210 m.msg_iovlen = 1;
1211 m.msg_control = aux;
1212 m.msg_controllen = sizeof(aux);
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);
1220 if (l <= 0) {
1222 if (l < 0 && errno == EINTR)
1223 /* Retry right away if we got interrupted */
1224 continue;
1226 else if (l < 0 && errno == EAGAIN)
1227 /* Hmm, apparently the socket was not readable, give up for now. */
1228 break;
1230 pa_log_error("Failed to read data from SCO socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1231 ret = -1;
1232 break;
1235 pa_assert((size_t) l <= pa_memblock_get_length(memchunk.memblock));
1237 memchunk.length = (size_t) l;
1238 u->read_index += (uint64_t) l;
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;
1249 if (!found_tstamp) {
1250 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1251 tstamp = pa_rtclock_now();
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);
1257 pa_source_post(u->source, &memchunk);
1259 ret = 1;
1260 break;
1263 pa_memblock_unref(memchunk.memblock);
1265 return ret;
1268 /* Run from IO thread */
1269 static void a2dp_prepare_buffer(struct userdata *u) {
1270 pa_assert(u);
1272 if (u->a2dp.buffer_size >= u->link_mtu)
1273 return;
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);
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;
1292 pa_assert(u);
1293 pa_assert(u->profile == PROFILE_A2DP);
1294 pa_assert(u->sink);
1296 /* First, render some data */
1297 if (!u->write_memchunk.memblock)
1298 pa_sink_render_full(u->sink, u->block_size, &u->write_memchunk);
1300 pa_assert(u->write_memchunk.length == u->block_size);
1302 a2dp_prepare_buffer(u);
1304 a2dp = &u->a2dp;
1305 header = a2dp->buffer;
1306 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1308 frame_count = 0;
1310 /* Try to create a packet of the full MTU */
1312 p = (const uint8_t*) pa_memblock_acquire(u->write_memchunk.memblock) + u->write_memchunk.index;
1313 to_encode = u->write_memchunk.length;
1315 d = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1316 to_write = a2dp->buffer_size - sizeof(*header) - sizeof(*payload);
1318 while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
1319 ssize_t written;
1320 ssize_t encoded;
1322 encoded = sbc_encode(&a2dp->sbc,
1323 p, to_encode,
1324 d, to_write,
1325 &written);
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;
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); */
1336 pa_assert_fp((size_t) encoded <= to_encode);
1337 pa_assert_fp((size_t) encoded == a2dp->codesize);
1339 pa_assert_fp((size_t) written <= to_write);
1340 pa_assert_fp((size_t) written == a2dp->frame_length);
1342 p = (const uint8_t*) p + encoded;
1343 to_encode -= encoded;
1345 d = (uint8_t*) d + written;
1346 to_write -= written;
1348 frame_count++;
1351 pa_memblock_release(u->write_memchunk.memblock);
1353 pa_assert(to_encode == 0);
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;
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;
1368 nbytes = (uint8_t*) d - (uint8_t*) a2dp->buffer;
1370 for (;;) {
1371 ssize_t l;
1373 l = pa_write(u->stream_fd, a2dp->buffer, nbytes, &u->stream_write_type);
1375 pa_assert(l != 0);
1377 if (l < 0) {
1379 if (errno == EINTR)
1380 /* Retry right away if we got interrupted */
1381 continue;
1383 else if (errno == EAGAIN)
1384 /* Hmm, apparently the socket was not writable, give up for now */
1385 break;
1387 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno));
1388 ret = -1;
1389 break;
1392 pa_assert((size_t) l <= nbytes);
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;
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);
1406 ret = 1;
1408 break;
1411 return ret;
1414 static int a2dp_process_push(struct userdata *u) {
1415 int ret = 0;
1416 pa_memchunk memchunk;
1418 pa_assert(u);
1419 pa_assert(u->profile == PROFILE_A2DP_SOURCE);
1420 pa_assert(u->source);
1421 pa_assert(u->read_smoother);
1423 memchunk.memblock = pa_memblock_new(u->core->mempool, u->block_size);
1424 memchunk.index = memchunk.length = 0;
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;
1438 a2dp_prepare_buffer(u);
1440 a2dp = &u->a2dp;
1441 header = a2dp->buffer;
1442 payload = (struct rtp_payload*) ((uint8_t*) a2dp->buffer + sizeof(*header));
1444 l = pa_read(u->stream_fd, a2dp->buffer, a2dp->buffer_size, &u->stream_write_type);
1446 if (l <= 0) {
1448 if (l < 0 && errno == EINTR)
1449 /* Retry right away if we got interrupted */
1450 continue;
1452 else if (l < 0 && errno == EAGAIN)
1453 /* Hmm, apparently the socket was not readable, give up for now. */
1454 break;
1456 pa_log_error("Failed to read data from socket: %s", l < 0 ? pa_cstrerror(errno) : "EOF");
1457 ret = -1;
1458 break;
1461 pa_assert((size_t) l <= a2dp->buffer_size);
1463 u->read_index += (uint64_t) l;
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();
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);
1474 p = (uint8_t*) a2dp->buffer + sizeof(*header) + sizeof(*payload);
1475 to_decode = l - sizeof(*header) - sizeof(*payload);
1477 d = pa_memblock_acquire(memchunk.memblock);
1478 to_write = memchunk.length = pa_memblock_get_length(memchunk.memblock);
1480 while (PA_LIKELY(to_decode > 0)) {
1481 size_t written;
1482 ssize_t decoded;
1484 decoded = sbc_decode(&a2dp->sbc,
1485 p, to_decode,
1486 d, to_write,
1487 &written);
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;
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); */
1499 /* Reset frame length, it can be changed due to bitpool change */
1500 a2dp->frame_length = sbc_get_frame_length(&a2dp->sbc);
1502 pa_assert_fp((size_t) decoded <= to_decode);
1503 pa_assert_fp((size_t) decoded == a2dp->frame_length);
1505 pa_assert_fp((size_t) written == a2dp->codesize);
1507 p = (const uint8_t*) p + decoded;
1508 to_decode -= decoded;
1510 d = (uint8_t*) d + written;
1511 to_write -= written;
1513 frame_count++;
1516 memchunk.length -= to_write;
1518 pa_memblock_release(memchunk.memblock);
1520 pa_source_post(u->source, &memchunk);
1522 ret = 1;
1523 break;
1526 pa_memblock_unref(memchunk.memblock);
1528 return ret;
1531 static void a2dp_reduce_bitpool(struct userdata *u)
1533 struct a2dp_info *a2dp;
1534 uint8_t bitpool;
1536 pa_assert(u);
1538 a2dp = &u->a2dp;
1540 /* Check if bitpool is already at its limit */
1541 if (a2dp->sbc.bitpool <= BITPOOL_DEC_LIMIT)
1542 return;
1544 bitpool = a2dp->sbc.bitpool - BITPOOL_DEC_STEP;
1546 if (bitpool < BITPOOL_DEC_LIMIT)
1547 bitpool = BITPOOL_DEC_LIMIT;
1549 a2dp_set_bitpool(u, bitpool);
1552 static void thread_func(void *userdata) {
1553 struct userdata *u = userdata;
1554 unsigned do_write = 0;
1555 pa_bool_t writable = FALSE;
1557 pa_assert(u);
1559 pa_log_debug("IO Thread starting up");
1561 if (u->core->realtime_scheduling)
1562 pa_make_realtime(u->core->realtime_priority);
1564 pa_thread_mq_install(&u->thread_mq);
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;
1572 for (;;) {
1573 struct pollfd *pollfd;
1574 int ret;
1575 pa_bool_t disable_timer = TRUE;
1577 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
1579 if (u->source && PA_SOURCE_IS_LINKED(u->source->thread_info.state)) {
1581 /* We should send two blocks to the device before we expect
1582 * a response. */
1584 if (u->write_index == 0 && u->read_index <= 0)
1585 do_write = 2;
1587 if (pollfd && (pollfd->revents & POLLIN)) {
1588 int n_read;
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);
1595 if (n_read < 0)
1596 goto fail;
1598 /* We just read something, so we are supposed to write something, too */
1599 do_write += n_read;
1603 if (u->sink && PA_SINK_IS_LINKED(u->sink->thread_info.state)) {
1605 if (u->sink->thread_info.rewind_requested)
1606 pa_sink_process_rewind(u->sink, 0);
1608 if (pollfd) {
1609 if (pollfd->revents & POLLOUT)
1610 writable = TRUE;
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;
1616 /* Hmm, there is no input stream we could synchronize
1617 * to. So let's do things by time */
1619 time_passed = pa_rtclock_now() - u->started_at;
1620 audio_sent = pa_bytes_to_usec(u->write_index, &u->sample_spec);
1622 if (audio_sent <= time_passed) {
1623 pa_usec_t audio_to_send = time_passed - audio_sent;
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;
1630 skip_usec = audio_to_send - MAX_PLAYBACK_CATCH_UP_USEC;
1631 skip_bytes = pa_usec_to_bytes(skip_usec, &u->sample_spec);
1633 if (skip_bytes > 0) {
1634 pa_memchunk tmp;
1636 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1637 (unsigned long long) skip_usec,
1638 (unsigned long long) skip_bytes);
1640 pa_sink_render_full(u->sink, skip_bytes, &tmp);
1641 pa_memblock_unref(tmp.memblock);
1642 u->write_index += skip_bytes;
1644 if (u->profile == PROFILE_A2DP)
1645 a2dp_reduce_bitpool(u);
1649 do_write = 1;
1653 if (writable && do_write > 0) {
1654 int n_written;
1656 if (u->write_index <= 0)
1657 u->started_at = pa_rtclock_now();
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;
1667 if (n_written == 0)
1668 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1670 do_write -= n_written;
1671 writable = FALSE;
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;
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;
1689 pa_rtpoll_set_timer_relative(u->rtpoll, sleep_for);
1690 disable_timer = FALSE;
1695 if (disable_timer)
1696 pa_rtpoll_set_timer_disabled(u->rtpoll);
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));
1703 if ((ret = pa_rtpoll_run(u->rtpoll, TRUE)) < 0)
1704 goto fail;
1706 if (ret == 0)
1707 goto finish;
1709 pollfd = u->rtpoll_item ? pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL) : NULL;
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;
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);
1727 finish:
1728 pa_log_debug("IO thread shutting down");
1731 /* Run from main thread */
1732 static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *userdata) {
1733 DBusError err;
1734 struct userdata *u;
1736 pa_assert(bus);
1737 pa_assert(m);
1738 pa_assert_se(u = userdata);
1740 dbus_error_init(&err);
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));
1747 if (!dbus_message_has_path(m, u->path) && !dbus_message_has_path(m, u->transport))
1748 goto fail;
1750 if (dbus_message_is_signal(m, "org.bluez.Headset", "SpeakerGainChanged") ||
1751 dbus_message_is_signal(m, "org.bluez.Headset", "MicrophoneGainChanged")) {
1753 dbus_uint16_t gain;
1754 pa_cvolume v;
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;
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);
1765 /* increment volume by one to correct rounding errors */
1766 if (volume < PA_VOLUME_NORM)
1767 volume++;
1769 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1770 pa_sink_volume_changed(u->sink, &v);
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);
1775 /* increment volume by one to correct rounding errors */
1776 if (volume < PA_VOLUME_NORM)
1777 volume++;
1779 pa_cvolume_set(&v, u->sample_spec.channels, volume);
1780 pa_source_volume_changed(u->source, &v);
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;
1788 t = (pa_bluetooth_transport *) pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
1789 pa_assert(t);
1791 if (!dbus_message_iter_init(m, &arg_i)) {
1792 pa_log("Failed to parse PropertyChanged: %s", err.message);
1793 goto fail;
1796 nrec = t->nrec;
1798 if (pa_bluetooth_transport_parse_property(t, &arg_i) < 0)
1799 goto fail;
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");
1807 fail:
1808 dbus_error_free(&err);
1810 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
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;
1821 pa_assert(s);
1822 pa_assert(s->core);
1824 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1825 u = pa_shared_get(s->core, k);
1826 pa_xfree(k);
1828 pa_assert(u);
1829 pa_assert(u->sink == s);
1830 pa_assert(u->profile == PROFILE_HSP);
1832 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1834 if (gain > HSP_MAX_GAIN)
1835 gain = HSP_MAX_GAIN;
1837 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1839 /* increment volume by one to correct rounding errors */
1840 if (volume < PA_VOLUME_NORM)
1841 volume++;
1843 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
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);
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;
1859 pa_assert(s);
1860 pa_assert(s->core);
1862 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) s);
1863 u = pa_shared_get(s->core, k);
1864 pa_xfree(k);
1866 pa_assert(u);
1867 pa_assert(u->source == s);
1868 pa_assert(u->profile == PROFILE_HSP);
1870 gain = (pa_cvolume_max(&s->real_volume) * HSP_MAX_GAIN) / PA_VOLUME_NORM;
1872 if (gain > HSP_MAX_GAIN)
1873 gain = HSP_MAX_GAIN;
1875 volume = (pa_volume_t) (gain * PA_VOLUME_NORM / HSP_MAX_GAIN);
1877 /* increment volume by one to correct rounding errors */
1878 if (volume < PA_VOLUME_NORM)
1879 volume++;
1881 pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
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);
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;
1894 pa_assert(type);
1895 pa_assert(ma);
1896 pa_assert(device_id);
1897 pa_assert(namereg_fail);
1899 t = pa_sprintf_malloc("%s_name", type);
1900 n = pa_modargs_get_value(ma, t, NULL);
1901 pa_xfree(t);
1903 if (n) {
1904 *namereg_fail = TRUE;
1905 return pa_xstrdup(n);
1908 if ((n = pa_modargs_get_value(ma, "name", NULL)))
1909 *namereg_fail = TRUE;
1910 else {
1911 n = device_id;
1912 *namereg_fail = FALSE;
1915 return pa_sprintf_malloc("bluez_%s.%s", type, n);
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));
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))) {
1925 if (u->service_fd >= 0 && u->stream_fd >= 0)
1926 return 0;
1928 init_bt(u);
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;
1936 if (u->transport)
1937 return bt_transport_acquire(u, TRUE);
1939 return start_stream_fd(u);
1942 if (changed) {
1943 if (u->service_fd < 0 && u->stream_fd < 0)
1944 return 0;
1946 pa_log_debug("Closing SCO over PCM");
1948 if (u->transport)
1949 bt_transport_release(u);
1950 else if (u->stream_fd >= 0)
1951 stop_stream_fd(u);
1953 if (u->service_fd >= 0) {
1954 pa_close(u->service_fd);
1955 u->service_fd = -1;
1959 return 0;
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);
1967 if (s != u->hsp.sco_sink)
1968 return PA_HOOK_OK;
1970 sco_over_pcm_state_update(u, TRUE);
1972 return PA_HOOK_OK;
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);
1980 if (s != u->hsp.sco_source)
1981 return PA_HOOK_OK;
1983 sco_over_pcm_state_update(u, TRUE);
1985 return PA_HOOK_OK;
1988 /* Run from main thread */
1989 static int add_sink(struct userdata *u) {
1990 char *k;
1992 if (USE_SCO_OVER_PCM(u)) {
1993 pa_proplist *p;
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);
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);
2004 } else {
2005 pa_sink_new_data data;
2006 pa_bool_t b;
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;
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;
2025 u->sink = pa_sink_new(u->core, &data, PA_SINK_HARDWARE|PA_SINK_LATENCY | (u->profile == PROFILE_HSP ? PA_SINK_HW_VOLUME_CTRL : 0));
2026 pa_sink_new_data_done(&data);
2028 if (!u->sink) {
2029 pa_log_error("Failed to create sink");
2030 return -1;
2033 u->sink->userdata = u;
2034 u->sink->parent.process_msg = sink_process_msg;
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));
2042 if (u->profile == PROFILE_HSP) {
2043 u->sink->set_volume = sink_set_volume_cb;
2044 u->sink->n_volume_steps = 16;
2046 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->sink);
2047 pa_shared_set(u->core, k, u);
2048 pa_xfree(k);
2051 return 0;
2054 /* Run from main thread */
2055 static int add_source(struct userdata *u) {
2056 char *k;
2058 if (USE_SCO_OVER_PCM(u)) {
2059 u->source = u->hsp.sco_source;
2060 pa_proplist_sets(u->source->proplist, "bluetooth.protocol", "hsp");
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);
2065 } else {
2066 pa_source_new_data data;
2067 pa_bool_t b;
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");
2077 data.card = u->card;
2078 data.name = get_name("source", u->modargs, u->address, &b);
2079 data.namereg_fail = b;
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;
2087 u->source = pa_source_new(u->core, &data, PA_SOURCE_HARDWARE|PA_SOURCE_LATENCY | (u->profile == PROFILE_HSP ? PA_SOURCE_HW_VOLUME_CTRL : 0));
2088 pa_source_new_data_done(&data);
2090 if (!u->source) {
2091 pa_log_error("Failed to create source");
2092 return -1;
2095 u->source->userdata = u;
2096 u->source->parent.process_msg = source_process_msg;
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));
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");
2113 if (u->profile == PROFILE_HSP) {
2114 u->source->set_volume = source_set_volume_cb;
2115 u->source->n_volume_steps = 16;
2117 k = pa_sprintf_malloc("bluetooth-device@%p", (void*) u->source);
2118 pa_shared_set(u->core, k, u);
2119 pa_xfree(k);
2122 return 0;
2125 /* Run from main thread */
2126 static void shutdown_bt(struct userdata *u) {
2127 pa_assert(u);
2129 if (u->stream_fd >= 0) {
2130 pa_close(u->stream_fd);
2131 u->stream_fd = -1;
2133 u->stream_write_type = 0;
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;
2143 if (u->write_memchunk.memblock) {
2144 pa_memblock_unref(u->write_memchunk.memblock);
2145 pa_memchunk_reset(&u->write_memchunk);
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;
2154 t = pa_bluetooth_discovery_get_transport(u->discovery, u->transport);
2155 pa_assert(t);
2157 config = (a2dp_sbc_t *) t->config;
2159 u->sample_spec.format = PA_SAMPLE_S16LE;
2161 if (a2dp->sbc_initialized)
2162 sbc_reinit(&a2dp->sbc, 0);
2163 else
2164 sbc_init(&a2dp->sbc, 0);
2165 a2dp->sbc_initialized = TRUE;
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();
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();
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();
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();
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();
2248 a2dp->min_bitpool = config->min_bitpool;
2249 a2dp->max_bitpool = config->max_bitpool;
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);
2256 u->block_size =
2257 ((u->link_mtu - sizeof(struct rtp_header) - sizeof(struct rtp_payload))
2258 / a2dp->frame_length
2259 * a2dp->codesize);
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);
2264 return 0;
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;
2276 return bt_transport_config_a2dp(u);
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;
2284 return bt_transport_config(u);
2287 /* Run from main thread */
2288 static int init_bt(struct userdata *u) {
2289 pa_assert(u);
2291 shutdown_bt(u);
2293 u->stream_write_type = 0;
2294 u->service_write_type = 0;
2295 u->service_read_type = 0;
2297 if ((u->service_fd = bt_audio_service_open()) < 0) {
2298 pa_log_warn("Bluetooth audio service not available");
2299 return -1;
2302 pa_log_debug("Connected to the bluetooth audio service");
2304 return 0;
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;
2312 pa_assert(u);
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;
2319 /* release transport if exist */
2320 if (u->transport) {
2321 bt_transport_release(u);
2322 pa_xfree(u->transport);
2323 u->transport = NULL;
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);
2333 if (get_caps(u, 0) < 0)
2334 return -1;
2336 pa_log_debug("Got device capabilities");
2338 if (set_conf(u) < 0)
2339 return -1;
2341 pa_log_debug("Connection to the device configured");
2343 if (USE_SCO_OVER_PCM(u)) {
2344 pa_log_debug("Configured to use SCO over PCM");
2345 return 0;
2348 pa_log_debug("Got the stream socket");
2350 return 0;
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);
2359 if (setup_bt(u) < 0)
2360 return -1;
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;
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;
2374 return r;
2377 /* Run from main thread */
2378 static void stop_thread(struct userdata *u) {
2379 char *k;
2381 pa_assert(u);
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;
2389 if (u->rtpoll_item) {
2390 pa_rtpoll_item_free(u->rtpoll_item);
2391 u->rtpoll_item = NULL;
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;
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;
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);
2411 pa_sink_unref(u->sink);
2412 u->sink = NULL;
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);
2422 pa_source_unref(u->source);
2423 u->source = NULL;
2426 if (u->rtpoll) {
2427 pa_thread_mq_done(&u->thread_mq);
2429 pa_rtpoll_free(u->rtpoll);
2430 u->rtpoll = NULL;
2433 if (u->read_smoother) {
2434 pa_smoother_free(u->read_smoother);
2435 u->read_smoother = NULL;
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);
2446 u->rtpoll = pa_rtpoll_new();
2447 pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
2449 if (USE_SCO_OVER_PCM(u)) {
2450 if (sco_over_pcm_state_update(u, FALSE) < 0) {
2451 char *k;
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;
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;
2465 return -1;
2468 pa_sink_ref(u->sink);
2469 pa_source_ref(u->source);
2470 /* FIXME: monitor stream_fd error */
2471 return 0;
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;
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);
2485 if (u->sink->set_volume)
2486 u->sink->set_volume(u->sink);
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);
2494 if (u->source->set_volume)
2495 u->source->set_volume(u->source);
2498 return 0;
2501 static void save_sco_volume_callbacks(struct userdata *u) {
2502 pa_assert(u);
2503 pa_assert(USE_SCO_OVER_PCM(u));
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;
2509 static void restore_sco_volume_callbacks(struct userdata *u) {
2510 pa_assert(u);
2511 pa_assert(USE_SCO_OVER_PCM(u));
2513 u->hsp.sco_sink->set_volume = u->hsp.sco_sink_set_volume;
2514 u->hsp.sco_source->set_volume = u->hsp.sco_source_set_volume;
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;
2524 pa_assert(c);
2525 pa_assert(new_profile);
2526 pa_assert_se(u = c->userdata);
2528 d = PA_CARD_PROFILE_DATA(new_profile);
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;
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;
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;
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;
2553 if (u->sink) {
2554 inputs = pa_sink_move_all_start(u->sink, NULL);
2556 if (!USE_SCO_OVER_PCM(u))
2557 pa_sink_unlink(u->sink);
2560 if (u->source) {
2561 outputs = pa_source_move_all_start(u->source, NULL);
2563 if (!USE_SCO_OVER_PCM(u))
2564 pa_source_unlink(u->source);
2567 stop_thread(u);
2568 shutdown_bt(u);
2570 if (USE_SCO_OVER_PCM(u))
2571 restore_sco_volume_callbacks(u);
2573 u->profile = *d;
2574 u->sample_spec = u->requested_sample_spec;
2576 if (USE_SCO_OVER_PCM(u))
2577 save_sco_volume_callbacks(u);
2579 init_bt(u);
2581 if (u->profile != PROFILE_OFF)
2582 init_profile(u);
2584 if (u->sink || u->source)
2585 start_thread(u);
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);
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);
2601 return 0;
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;
2614 pa_assert(u);
2615 pa_assert(device);
2617 pa_card_new_data_init(&data);
2618 data.driver = __FILE__;
2619 data.module = u->module;
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;
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;
2642 data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
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;
2656 d = PA_CARD_PROFILE_DATA(p);
2657 *d = PROFILE_A2DP;
2659 pa_hashmap_put(data.profiles, p->name, p);
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;
2670 d = PA_CARD_PROFILE_DATA(p);
2671 *d = PROFILE_A2DP_SOURCE;
2673 pa_hashmap_put(data.profiles, p->name, p);
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;
2685 d = PA_CARD_PROFILE_DATA(p);
2686 *d = PROFILE_HSP;
2688 pa_hashmap_put(data.profiles, p->name, p);
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;
2699 d = PA_CARD_PROFILE_DATA(p);
2700 *d = PROFILE_HFGW;
2702 pa_hashmap_put(data.profiles, p->name, p);
2705 pa_assert(!pa_hashmap_isempty(data.profiles));
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);
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);
2719 u->card = pa_card_new(u->core, &data);
2720 pa_card_new_data_done(&data);
2722 if (!u->card) {
2723 pa_log("Failed to allocate card.");
2724 return -1;
2727 u->card->userdata = u;
2728 u->card->set_profile = card_set_profile;
2730 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
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;
2740 d = PA_CARD_PROFILE_DATA(u->card->active_profile);
2741 u->profile = *d;
2743 if (USE_SCO_OVER_PCM(u))
2744 save_sco_volume_callbacks(u);
2746 return 0;
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;
2753 pa_assert(u);
2755 if (!address && !path) {
2756 pa_log_error("Failed to get device address/path from module arguments.");
2757 return NULL;
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;
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;
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;
2778 if (d) {
2779 u->address = pa_xstrdup(d->address);
2780 u->path = pa_xstrdup(d->path);
2783 return d;
2786 /* Run from main thread */
2787 static int setup_dbus(struct userdata *u) {
2788 DBusError err;
2790 dbus_error_init(&err);
2792 u->connection = pa_dbus_bus_get(u->core, DBUS_BUS_SYSTEM, &err);
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;
2800 return 0;
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;
2812 pa_assert(m);
2814 dbus_error_init(&err);
2816 if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
2817 pa_log_error("Failed to parse module arguments");
2818 goto fail;
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;
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;
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;
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;
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;
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;
2859 u->sample_spec.channels = (uint8_t) channels;
2860 u->requested_sample_spec = u->sample_spec;
2862 address = pa_modargs_get_value(ma, "address", NULL);
2863 path = pa_modargs_get_value(ma, "path", NULL);
2865 if (setup_dbus(u) < 0)
2866 goto fail;
2868 if (!(u->discovery = pa_bluetooth_discovery_get(m->core)))
2869 goto fail;
2871 if (!(device = find_device(u, address, path)))
2872 goto fail;
2874 /* Add the card structure. This will also initialize the default profile */
2875 if (add_card(u, device) < 0)
2876 goto fail;
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;
2882 u->filter_added = TRUE;
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'");
2888 if (pa_dbus_add_matches(
2889 pa_dbus_connection_get(u->connection), &err,
2890 speaker,
2891 mike,
2892 transport,
2893 NULL) < 0) {
2895 pa_xfree(speaker);
2896 pa_xfree(mike);
2897 pa_xfree(transport);
2899 pa_log("Failed to add D-Bus matches: %s", err.message);
2900 goto fail;
2903 pa_xfree(speaker);
2904 pa_xfree(mike);
2905 pa_xfree(transport);
2907 /* Connect to the BT service */
2908 init_bt(u);
2910 if (u->profile != PROFILE_OFF)
2911 if (init_profile(u) < 0)
2912 goto fail;
2914 if (u->sink || u->source)
2915 if (start_thread(u) < 0)
2916 goto fail;
2918 return 0;
2920 fail:
2922 pa__done(m);
2924 dbus_error_free(&err);
2926 return -1;
2929 int pa__get_n_used(pa_module *m) {
2930 struct userdata *u;
2932 pa_assert(m);
2933 pa_assert_se(u = m->userdata);
2935 return
2936 (u->sink ? pa_sink_linked_by(u->sink) : 0) +
2937 (u->source ? pa_source_linked_by(u->source) : 0);
2940 void pa__done(pa_module *m) {
2941 struct userdata *u;
2943 pa_assert(m);
2945 if (!(u = m->userdata))
2946 return;
2948 if (u->sink && !USE_SCO_OVER_PCM(u))
2949 pa_sink_unlink(u->sink);
2951 if (u->source && !USE_SCO_OVER_PCM(u))
2952 pa_source_unlink(u->source);
2954 stop_thread(u);
2956 if (USE_SCO_OVER_PCM(u))
2957 restore_sco_volume_callbacks(u);
2959 if (u->connection) {
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);
2966 pa_dbus_remove_matches(pa_dbus_connection_get(u->connection), speaker, mike, NULL);
2968 pa_xfree(speaker);
2969 pa_xfree(mike);
2972 if (u->filter_added)
2973 dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
2975 pa_dbus_connection_unref(u->connection);
2978 if (u->card)
2979 pa_card_free(u->card);
2981 if (u->read_smoother)
2982 pa_smoother_free(u->read_smoother);
2984 shutdown_bt(u);
2986 if (u->a2dp.buffer)
2987 pa_xfree(u->a2dp.buffer);
2989 sbc_finish(&u->a2dp.sbc);
2991 if (u->modargs)
2992 pa_modargs_free(u->modargs);
2994 pa_xfree(u->address);
2995 pa_xfree(u->path);
2997 if (u->transport) {
2998 bt_transport_release(u);
2999 pa_xfree(u->transport);
3002 if (u->discovery)
3003 pa_bluetooth_discovery_unref(u->discovery);
3005 pa_xfree(u);