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
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/socket-util.h>
43 #include <pulsecore/thread.h>
44 #include <pulsecore/thread-mq.h>
45 #include <pulsecore/poll.h>
46 #include <pulsecore/rtpoll.h>
47 #include <pulsecore/time-smoother.h>
48 #include <pulsecore/namereg.h>
49 #include <pulsecore/dbus-shared.h>
50 #include <pulsecore/llist.h>
52 #include "module-bluetooth-device-symdef.h"
56 #include "bluetooth-util.h"
58 #define MAX_BITPOOL 64
59 #define MIN_BITPOOL 2U
61 PA_MODULE_AUTHOR("Joao Paulo Rechi Vita");
62 PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
63 PA_MODULE_VERSION(PACKAGE_VERSION
);
64 PA_MODULE_LOAD_ONCE(FALSE
);
66 "name=<name for the card/sink/source, to be prefixed> "
67 "card_name=<name for the card> "
68 "card_properties=<properties for the card> "
69 "sink_name=<name for the sink> "
70 "sink_properties=<properties for the sink> "
71 "source_name=<name for the source> "
72 "source_properties=<properties for the source> "
73 "address=<address of the device> "
74 "profile=<a2dp|hsp|hfgw> "
76 "channels=<number of channels> "
77 "path=<device object path> "
78 "auto_connect=<automatically connect?>");
82 "sco_sink=<SCO over PCM sink name> "
83 "sco_source=<SCO over PCM source name>"
87 /* TODO: not close fd when entering suspend mode in a2dp */
89 static const char* const valid_modargs
[] = {
111 sbc_capabilities_t sbc_capabilities
;
112 sbc_t sbc
; /* Codec data */
113 pa_bool_t sbc_initialized
; /* Keep track if the encoder is initialized */
114 size_t codesize
, frame_length
; /* SBC Codesize, frame_length. We simply cache those values here */
116 void* buffer
; /* Codec transfer buffer */
117 size_t buffer_size
; /* Size of the buffer */
119 uint16_t seq_num
; /* Cumulative packet sequence */
123 pcm_capabilities_t pcm_capabilities
;
126 pa_source
*sco_source
;
128 pa_hook_slot
*sink_state_changed_slot
;
129 pa_hook_slot
*source_state_changed_slot
;
141 pa_bluetooth_discovery
*discovery
;
142 pa_bool_t auto_connect
;
144 pa_dbus_connection
*connection
;
150 pa_thread_mq thread_mq
;
152 pa_rtpoll_item
*rtpoll_item
;
155 uint64_t read_index
, write_index
;
156 pa_usec_t started_at
;
157 pa_smoother
*read_smoother
;
159 pa_memchunk write_memchunk
;
161 pa_sample_spec sample_spec
, requested_sample_spec
;
169 struct a2dp_info a2dp
;
172 enum profile profile
;
176 int stream_write_type
;
177 int service_write_type
, service_read_type
;
179 pa_bool_t filter_added
;
182 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
183 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
184 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
185 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
187 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
190 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
193 static int init_bt(struct userdata
*u
);
194 static int init_profile(struct userdata
*u
);
196 static int service_send(struct userdata
*u
, const bt_audio_msg_header_t
*msg
) {
201 pa_assert(msg
->length
> 0);
203 if (u
->service_fd
< 0) {
204 pa_log_warn("Service not connected");
208 pa_log_debug("Sending %s -> %s",
209 pa_strnull(bt_audio_strtype(msg
->type
)),
210 pa_strnull(bt_audio_strname(msg
->name
)));
212 if ((r
= pa_loop_write(u
->service_fd
, msg
, msg
->length
, &u
->service_write_type
)) == (ssize_t
) msg
->length
)
216 pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno
));
218 pa_log_error("Short write()");
223 static int service_recv(struct userdata
*u
, bt_audio_msg_header_t
*msg
, size_t room
) {
227 pa_assert(u
->service_fd
>= 0);
229 pa_assert(room
>= sizeof(*msg
));
231 pa_log_debug("Trying to receive message from audio service...");
233 /* First, read the header */
234 if ((r
= pa_loop_read(u
->service_fd
, msg
, sizeof(*msg
), &u
->service_read_type
)) != sizeof(*msg
))
237 if (msg
->length
< sizeof(*msg
)) {
238 pa_log_error("Invalid message size.");
242 if (msg
->length
> room
) {
243 pa_log_error("Not enough room.");
247 /* Secondly, read the payload */
248 if (msg
->length
> sizeof(*msg
)) {
250 size_t remains
= msg
->length
- sizeof(*msg
);
252 if ((r
= pa_loop_read(u
->service_fd
,
253 (uint8_t*) msg
+ sizeof(*msg
),
255 &u
->service_read_type
)) != (ssize_t
) remains
)
259 pa_log_debug("Received %s <- %s",
260 pa_strnull(bt_audio_strtype(msg
->type
)),
261 pa_strnull(bt_audio_strname(msg
->name
)));
268 pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno
));
270 pa_log_error("Short read()");
275 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
) {
279 pa_assert(u
->service_fd
>= 0);
282 if ((r
= service_recv(u
, rsp
, room
)) < 0)
285 if ((rsp
->type
!= BT_INDICATION
&& rsp
->type
!= BT_RESPONSE
) ||
286 rsp
->name
!= expected_name
||
287 (expected_size
> 0 && rsp
->length
!= expected_size
)) {
289 if (rsp
->type
== BT_ERROR
&& rsp
->length
== sizeof(bt_audio_error_t
))
290 pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t
*) rsp
)->posix_errno
));
292 pa_log_error("Bogus message %s received while %s was expected",
293 pa_strnull(bt_audio_strname(rsp
->name
)),
294 pa_strnull(bt_audio_strname(expected_name
)));
301 /* Run from main thread */
302 static int parse_caps(struct userdata
*u
, uint8_t seid
, const struct bt_get_capabilities_rsp
*rsp
) {
304 const codec_capabilities_t
*codec
;
309 bytes_left
= rsp
->h
.length
- sizeof(*rsp
);
311 if (bytes_left
< sizeof(codec_capabilities_t
)) {
312 pa_log_error("Packet too small to store codec information.");
316 codec
= (codec_capabilities_t
*) rsp
->data
; /** ALIGNMENT? **/
318 pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left
, (unsigned long) sizeof(*codec
));
320 if (((u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) && codec
->transport
!= BT_CAPABILITIES_TRANSPORT_A2DP
) ||
321 ((u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) && codec
->transport
!= BT_CAPABILITIES_TRANSPORT_SCO
)) {
322 pa_log_error("Got capabilities for wrong codec.");
326 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
328 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->hsp
.pcm_capabilities
))
331 pa_assert(codec
->type
== BT_HFP_CODEC_PCM
);
333 if (codec
->configured
&& seid
== 0)
336 memcpy(&u
->hsp
.pcm_capabilities
, codec
, sizeof(u
->hsp
.pcm_capabilities
));
338 } else if (u
->profile
== PROFILE_A2DP
) {
340 while (bytes_left
> 0) {
341 if ((codec
->type
== BT_A2DP_SBC_SINK
) && !codec
->lock
)
344 bytes_left
-= codec
->length
;
345 codec
= (const codec_capabilities_t
*) ((const uint8_t*) codec
+ codec
->length
);
348 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->a2dp
.sbc_capabilities
))
351 pa_assert(codec
->type
== BT_A2DP_SBC_SINK
);
353 if (codec
->configured
&& seid
== 0)
356 memcpy(&u
->a2dp
.sbc_capabilities
, codec
, sizeof(u
->a2dp
.sbc_capabilities
));
358 } else if (u
->profile
== PROFILE_A2DP_SOURCE
) {
360 while (bytes_left
> 0) {
361 if ((codec
->type
== BT_A2DP_SBC_SOURCE
) && !codec
->lock
)
364 bytes_left
-= codec
->length
;
365 codec
= (const codec_capabilities_t
*) ((const uint8_t*) codec
+ codec
->length
);
368 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->a2dp
.sbc_capabilities
))
371 pa_assert(codec
->type
== BT_A2DP_SBC_SOURCE
);
373 if (codec
->configured
&& seid
== 0)
376 memcpy(&u
->a2dp
.sbc_capabilities
, codec
, sizeof(u
->a2dp
.sbc_capabilities
));
382 /* Run from main thread */
383 static int get_caps(struct userdata
*u
, uint8_t seid
) {
385 struct bt_get_capabilities_req getcaps_req
;
386 struct bt_get_capabilities_rsp getcaps_rsp
;
387 bt_audio_error_t error
;
388 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
394 memset(&msg
, 0, sizeof(msg
));
395 msg
.getcaps_req
.h
.type
= BT_REQUEST
;
396 msg
.getcaps_req
.h
.name
= BT_GET_CAPABILITIES
;
397 msg
.getcaps_req
.h
.length
= sizeof(msg
.getcaps_req
);
398 msg
.getcaps_req
.seid
= seid
;
400 pa_strlcpy(msg
.getcaps_req
.object
, u
->path
, sizeof(msg
.getcaps_req
.object
));
401 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
)
402 msg
.getcaps_req
.transport
= BT_CAPABILITIES_TRANSPORT_A2DP
;
404 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
405 msg
.getcaps_req
.transport
= BT_CAPABILITIES_TRANSPORT_SCO
;
407 msg
.getcaps_req
.flags
= u
->auto_connect
? BT_FLAG_AUTOCONNECT
: 0;
409 if (service_send(u
, &msg
.getcaps_req
.h
) < 0)
412 if (service_expect(u
, &msg
.getcaps_rsp
.h
, sizeof(msg
), BT_GET_CAPABILITIES
, 0) < 0)
415 ret
= parse_caps(u
, seid
, &msg
.getcaps_rsp
);
419 return get_caps(u
, ret
);
422 /* Run from main thread */
423 static uint8_t a2dp_default_bitpool(uint8_t freq
, uint8_t mode
) {
426 case BT_SBC_SAMPLING_FREQ_16000
:
427 case BT_SBC_SAMPLING_FREQ_32000
:
430 case BT_SBC_SAMPLING_FREQ_44100
:
433 case BT_A2DP_CHANNEL_MODE_MONO
:
434 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
437 case BT_A2DP_CHANNEL_MODE_STEREO
:
438 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
442 pa_log_warn("Invalid channel mode %u", mode
);
446 case BT_SBC_SAMPLING_FREQ_48000
:
449 case BT_A2DP_CHANNEL_MODE_MONO
:
450 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
453 case BT_A2DP_CHANNEL_MODE_STEREO
:
454 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
458 pa_log_warn("Invalid channel mode %u", mode
);
463 pa_log_warn("Invalid sampling freq %u", freq
);
468 /* Run from main thread */
469 static int setup_a2dp(struct userdata
*u
) {
470 sbc_capabilities_t
*cap
;
473 static const struct {
477 { 16000U, BT_SBC_SAMPLING_FREQ_16000
},
478 { 32000U, BT_SBC_SAMPLING_FREQ_32000
},
479 { 44100U, BT_SBC_SAMPLING_FREQ_44100
},
480 { 48000U, BT_SBC_SAMPLING_FREQ_48000
}
484 pa_assert(u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
);
486 cap
= &u
->a2dp
.sbc_capabilities
;
488 /* Find the lowest freq that is at least as high as the requested
490 for (i
= 0; (unsigned) i
< PA_ELEMENTSOF(freq_table
); i
++)
491 if (freq_table
[i
].rate
>= u
->sample_spec
.rate
&& (cap
->frequency
& freq_table
[i
].cap
)) {
492 u
->sample_spec
.rate
= freq_table
[i
].rate
;
493 cap
->frequency
= freq_table
[i
].cap
;
497 if ((unsigned) i
== PA_ELEMENTSOF(freq_table
)) {
498 for (--i
; i
>= 0; i
--) {
499 if (cap
->frequency
& freq_table
[i
].cap
) {
500 u
->sample_spec
.rate
= freq_table
[i
].rate
;
501 cap
->frequency
= freq_table
[i
].cap
;
507 pa_log("Not suitable sample rate");
512 pa_assert((unsigned) i
< PA_ELEMENTSOF(freq_table
));
514 if (cap
->capability
.configured
)
517 if (u
->sample_spec
.channels
<= 1) {
518 if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_MONO
) {
519 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_MONO
;
520 u
->sample_spec
.channels
= 1;
522 u
->sample_spec
.channels
= 2;
525 if (u
->sample_spec
.channels
>= 2) {
526 u
->sample_spec
.channels
= 2;
528 if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_JOINT_STEREO
)
529 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_JOINT_STEREO
;
530 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_STEREO
)
531 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_STEREO
;
532 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
)
533 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
;
534 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_MONO
) {
535 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_MONO
;
536 u
->sample_spec
.channels
= 1;
538 pa_log("No supported channel modes");
543 if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_16
)
544 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_16
;
545 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_12
)
546 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_12
;
547 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_8
)
548 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_8
;
549 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_4
)
550 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_4
;
552 pa_log_error("No supported block lengths");
556 if (cap
->subbands
& BT_A2DP_SUBBANDS_8
)
557 cap
->subbands
= BT_A2DP_SUBBANDS_8
;
558 else if (cap
->subbands
& BT_A2DP_SUBBANDS_4
)
559 cap
->subbands
= BT_A2DP_SUBBANDS_4
;
561 pa_log_error("No supported subbands");
565 if (cap
->allocation_method
& BT_A2DP_ALLOCATION_LOUDNESS
)
566 cap
->allocation_method
= BT_A2DP_ALLOCATION_LOUDNESS
;
567 else if (cap
->allocation_method
& BT_A2DP_ALLOCATION_SNR
)
568 cap
->allocation_method
= BT_A2DP_ALLOCATION_SNR
;
570 cap
->min_bitpool
= (uint8_t) PA_MAX(MIN_BITPOOL
, cap
->min_bitpool
);
571 cap
->max_bitpool
= (uint8_t) PA_MIN(a2dp_default_bitpool(cap
->frequency
, cap
->channel_mode
), cap
->max_bitpool
);
576 /* Run from main thread */
577 static void setup_sbc(struct a2dp_info
*a2dp
) {
578 sbc_capabilities_t
*active_capabilities
;
582 active_capabilities
= &a2dp
->sbc_capabilities
;
584 if (a2dp
->sbc_initialized
)
585 sbc_reinit(&a2dp
->sbc
, 0);
587 sbc_init(&a2dp
->sbc
, 0);
588 a2dp
->sbc_initialized
= TRUE
;
590 switch (active_capabilities
->frequency
) {
591 case BT_SBC_SAMPLING_FREQ_16000
:
592 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
594 case BT_SBC_SAMPLING_FREQ_32000
:
595 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
597 case BT_SBC_SAMPLING_FREQ_44100
:
598 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
600 case BT_SBC_SAMPLING_FREQ_48000
:
601 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
604 pa_assert_not_reached();
607 switch (active_capabilities
->channel_mode
) {
608 case BT_A2DP_CHANNEL_MODE_MONO
:
609 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
611 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
612 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
614 case BT_A2DP_CHANNEL_MODE_STEREO
:
615 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
617 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
618 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
621 pa_assert_not_reached();
624 switch (active_capabilities
->allocation_method
) {
625 case BT_A2DP_ALLOCATION_SNR
:
626 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
628 case BT_A2DP_ALLOCATION_LOUDNESS
:
629 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
632 pa_assert_not_reached();
635 switch (active_capabilities
->subbands
) {
636 case BT_A2DP_SUBBANDS_4
:
637 a2dp
->sbc
.subbands
= SBC_SB_4
;
639 case BT_A2DP_SUBBANDS_8
:
640 a2dp
->sbc
.subbands
= SBC_SB_8
;
643 pa_assert_not_reached();
646 switch (active_capabilities
->block_length
) {
647 case BT_A2DP_BLOCK_LENGTH_4
:
648 a2dp
->sbc
.blocks
= SBC_BLK_4
;
650 case BT_A2DP_BLOCK_LENGTH_8
:
651 a2dp
->sbc
.blocks
= SBC_BLK_8
;
653 case BT_A2DP_BLOCK_LENGTH_12
:
654 a2dp
->sbc
.blocks
= SBC_BLK_12
;
656 case BT_A2DP_BLOCK_LENGTH_16
:
657 a2dp
->sbc
.blocks
= SBC_BLK_16
;
660 pa_assert_not_reached();
663 a2dp
->sbc
.bitpool
= active_capabilities
->max_bitpool
;
664 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
665 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
668 /* Run from main thread */
669 static int set_conf(struct userdata
*u
) {
671 struct bt_open_req open_req
;
672 struct bt_open_rsp open_rsp
;
673 struct bt_set_configuration_req setconf_req
;
674 struct bt_set_configuration_rsp setconf_rsp
;
675 bt_audio_error_t error
;
676 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
679 memset(&msg
, 0, sizeof(msg
));
680 msg
.open_req
.h
.type
= BT_REQUEST
;
681 msg
.open_req
.h
.name
= BT_OPEN
;
682 msg
.open_req
.h
.length
= sizeof(msg
.open_req
);
684 pa_strlcpy(msg
.open_req
.object
, u
->path
, sizeof(msg
.open_req
.object
));
685 msg
.open_req
.seid
= (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) ? u
->a2dp
.sbc_capabilities
.capability
.seid
: BT_A2DP_SEID_RANGE
+ 1;
686 msg
.open_req
.lock
= (u
->profile
== PROFILE_A2DP
) ? BT_WRITE_LOCK
: BT_READ_LOCK
| BT_WRITE_LOCK
;
688 if (service_send(u
, &msg
.open_req
.h
) < 0)
691 if (service_expect(u
, &msg
.open_rsp
.h
, sizeof(msg
), BT_OPEN
, sizeof(msg
.open_rsp
)) < 0)
694 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
695 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
697 if (setup_a2dp(u
) < 0)
700 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
702 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
703 u
->sample_spec
.channels
= 1;
704 u
->sample_spec
.rate
= 8000;
707 memset(&msg
, 0, sizeof(msg
));
708 msg
.setconf_req
.h
.type
= BT_REQUEST
;
709 msg
.setconf_req
.h
.name
= BT_SET_CONFIGURATION
;
710 msg
.setconf_req
.h
.length
= sizeof(msg
.setconf_req
);
712 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
713 memcpy(&msg
.setconf_req
.codec
, &u
->a2dp
.sbc_capabilities
, sizeof(u
->a2dp
.sbc_capabilities
));
715 msg
.setconf_req
.codec
.transport
= BT_CAPABILITIES_TRANSPORT_SCO
;
716 msg
.setconf_req
.codec
.seid
= BT_A2DP_SEID_RANGE
+ 1;
717 msg
.setconf_req
.codec
.length
= sizeof(pcm_capabilities_t
);
719 msg
.setconf_req
.h
.length
+= msg
.setconf_req
.codec
.length
- sizeof(msg
.setconf_req
.codec
);
721 if (service_send(u
, &msg
.setconf_req
.h
) < 0)
724 if (service_expect(u
, &msg
.setconf_rsp
.h
, sizeof(msg
), BT_SET_CONFIGURATION
, sizeof(msg
.setconf_rsp
)) < 0)
727 u
->link_mtu
= msg
.setconf_rsp
.link_mtu
;
729 /* setup SBC encoder now we agree on parameters */
730 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
734 ((u
->link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
735 / u
->a2dp
.frame_length
738 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
739 u
->a2dp
.sbc
.allocation
, u
->a2dp
.sbc
.subbands
, u
->a2dp
.sbc
.blocks
, u
->a2dp
.sbc
.bitpool
);
741 u
->block_size
= u
->link_mtu
;
746 /* from IO thread, except in SCO over PCM */
748 static int setup_stream(struct userdata
*u
) {
749 struct pollfd
*pollfd
;
752 pa_make_fd_nonblock(u
->stream_fd
);
753 pa_make_socket_low_delay(u
->stream_fd
);
756 if (setsockopt(u
->stream_fd
, SOL_SOCKET
, SO_TIMESTAMP
, &one
, sizeof(one
)) < 0)
757 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno
));
759 pa_log_debug("Stream properly set up, we're ready to roll!");
761 u
->rtpoll_item
= pa_rtpoll_item_new(u
->rtpoll
, PA_RTPOLL_NEVER
, 1);
762 pollfd
= pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
);
763 pollfd
->fd
= u
->stream_fd
;
764 pollfd
->events
= pollfd
->revents
= 0;
766 u
->read_index
= u
->write_index
= 0;
770 u
->read_smoother
= pa_smoother_new(
782 static int start_stream_fd(struct userdata
*u
) {
784 bt_audio_msg_header_t rsp
;
785 struct bt_start_stream_req start_req
;
786 struct bt_start_stream_rsp start_rsp
;
787 struct bt_new_stream_ind streamfd_ind
;
788 bt_audio_error_t error
;
789 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
793 pa_assert(u
->rtpoll
);
794 pa_assert(!u
->rtpoll_item
);
795 pa_assert(u
->stream_fd
< 0);
797 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
798 msg
.start_req
.h
.type
= BT_REQUEST
;
799 msg
.start_req
.h
.name
= BT_START_STREAM
;
800 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
802 if (service_send(u
, &msg
.start_req
.h
) < 0)
805 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_START_STREAM
, sizeof(msg
.start_rsp
)) < 0)
808 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_NEW_STREAM
, sizeof(msg
.streamfd_ind
)) < 0)
811 if ((u
->stream_fd
= bt_audio_service_get_data_fd(u
->service_fd
)) < 0) {
812 pa_log("Failed to get stream fd from audio service.");
816 return setup_stream(u
);
820 static int stop_stream_fd(struct userdata
*u
) {
822 bt_audio_msg_header_t rsp
;
823 struct bt_stop_stream_req start_req
;
824 struct bt_stop_stream_rsp start_rsp
;
825 bt_audio_error_t error
;
826 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
831 pa_assert(u
->rtpoll
);
833 if (u
->rtpoll_item
) {
834 pa_rtpoll_item_free(u
->rtpoll_item
);
835 u
->rtpoll_item
= NULL
;
838 if (u
->stream_fd
>= 0) {
839 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
840 msg
.start_req
.h
.type
= BT_REQUEST
;
841 msg
.start_req
.h
.name
= BT_STOP_STREAM
;
842 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
844 if (service_send(u
, &msg
.start_req
.h
) < 0 ||
845 service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_STOP_STREAM
, sizeof(msg
.start_rsp
)) < 0)
848 pa_close(u
->stream_fd
);
852 if (u
->read_smoother
) {
853 pa_smoother_free(u
->read_smoother
);
854 u
->read_smoother
= NULL
;
860 static void bt_transport_release(struct userdata
*u
) {
861 const char *accesstype
= "rw";
862 const pa_bluetooth_transport
*t
;
864 /* Ignore if already released */
868 pa_log_debug("Releasing transport %s", u
->transport
);
870 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
872 pa_bluetooth_transport_release(t
, accesstype
);
874 pa_xfree(u
->accesstype
);
875 u
->accesstype
= NULL
;
877 if (u
->rtpoll_item
) {
878 pa_rtpoll_item_free(u
->rtpoll_item
);
879 u
->rtpoll_item
= NULL
;
882 if (u
->stream_fd
>= 0) {
883 pa_close(u
->stream_fd
);
887 if (u
->read_smoother
) {
888 pa_smoother_free(u
->read_smoother
);
889 u
->read_smoother
= NULL
;
893 static int bt_transport_acquire(struct userdata
*u
, pa_bool_t start
) {
894 const char *accesstype
= "rw";
895 const pa_bluetooth_transport
*t
;
903 pa_log_debug("Acquiring transport %s", u
->transport
);
905 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
907 pa_log("Transport %s no longer available", u
->transport
);
908 pa_xfree(u
->transport
);
913 u
->stream_fd
= pa_bluetooth_transport_acquire(t
, accesstype
);
914 if (u
->stream_fd
< 0)
917 u
->accesstype
= pa_xstrdup(accesstype
);
918 pa_log_info("Transport %s acquired: fd %d", u
->transport
, u
->stream_fd
);
924 pa_log_info("Transport %s resuming", u
->transport
);
925 return setup_stream(u
);
928 /* Run from IO thread */
929 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
930 struct userdata
*u
= PA_SINK(o
)->userdata
;
931 pa_bool_t failed
= FALSE
;
934 pa_assert(u
->sink
== PA_SINK(o
));
938 case PA_SINK_MESSAGE_SET_STATE
:
940 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
942 case PA_SINK_SUSPENDED
:
943 pa_assert(PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
));
945 /* Stop the device if the source is suspended as well */
946 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
) {
947 /* We deliberately ignore whether stopping
948 * actually worked. Since the stream_fd is
949 * closed it doesn't really matter */
951 bt_transport_release(u
);
959 case PA_SINK_RUNNING
:
960 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
963 /* Resume the device if the source was suspended as well */
964 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
) {
966 if (bt_transport_acquire(u
, TRUE
) < 0)
968 } else if (start_stream_fd(u
) < 0)
973 case PA_SINK_UNLINKED
:
975 case PA_SINK_INVALID_STATE
:
980 case PA_SINK_MESSAGE_GET_LATENCY
: {
982 if (u
->read_smoother
) {
985 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
986 wi
= pa_bytes_to_usec(u
->write_index
+ u
->block_size
, &u
->sample_spec
);
988 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
992 ri
= pa_rtclock_now() - u
->started_at
;
993 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
995 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
998 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
1003 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
1005 return (r
< 0 || !failed
) ? r
: -1;
1008 /* Run from IO thread */
1009 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
1010 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
1011 pa_bool_t failed
= FALSE
;
1014 pa_assert(u
->source
== PA_SOURCE(o
));
1018 case PA_SOURCE_MESSAGE_SET_STATE
:
1020 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
1022 case PA_SOURCE_SUSPENDED
:
1023 pa_assert(PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
));
1025 /* Stop the device if the sink is suspended as well */
1026 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
) {
1028 bt_transport_release(u
);
1033 if (u
->read_smoother
)
1034 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
1037 case PA_SOURCE_IDLE
:
1038 case PA_SOURCE_RUNNING
:
1039 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
1042 /* Resume the device if the sink was suspended as well */
1043 if (!u
->sink
|| u
->sink
->thread_info
.state
== PA_SINK_SUSPENDED
) {
1045 if (bt_transport_acquire(u
, TRUE
) < 0)
1047 } else if (start_stream_fd(u
) < 0)
1050 /* We don't resume the smoother here. Instead we
1051 * wait until the first packet arrives */
1054 case PA_SOURCE_UNLINKED
:
1055 case PA_SOURCE_INIT
:
1056 case PA_SOURCE_INVALID_STATE
:
1061 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
1064 if (u
->read_smoother
) {
1065 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
1066 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
1068 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
1070 *((pa_usec_t
*) data
) = 0;
1077 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
1079 return (r
< 0 || !failed
) ? r
: -1;
1082 /* Run from IO thread */
1083 static int hsp_process_render(struct userdata
*u
) {
1087 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
1090 /* First, render some data */
1091 if (!u
->write_memchunk
.memblock
)
1092 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1094 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1100 /* Now write that data to the socket. The socket is of type
1101 * SEQPACKET, and we generated the data of the MTU size, so this
1102 * should just work. */
1104 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1105 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
1106 pa_memblock_release(u
->write_memchunk
.memblock
);
1113 /* Retry right away if we got interrupted */
1116 else if (errno
== EAGAIN
)
1117 /* Hmm, apparently the socket was not writable, give up for now */
1120 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
1125 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
1127 if ((size_t) l
!= u
->write_memchunk
.length
) {
1128 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1129 (unsigned long long) l
,
1130 (unsigned long long) u
->write_memchunk
.length
);
1135 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1136 pa_memblock_unref(u
->write_memchunk
.memblock
);
1137 pa_memchunk_reset(&u
->write_memchunk
);
1146 /* Run from IO thread */
1147 static int hsp_process_push(struct userdata
*u
) {
1149 pa_memchunk memchunk
;
1152 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
1153 pa_assert(u
->source
);
1154 pa_assert(u
->read_smoother
);
1156 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1157 memchunk
.index
= memchunk
.length
= 0;
1166 pa_bool_t found_tstamp
= FALSE
;
1169 memset(&m
, 0, sizeof(m
));
1170 memset(&aux
, 0, sizeof(aux
));
1171 memset(&iov
, 0, sizeof(iov
));
1175 m
.msg_control
= aux
;
1176 m
.msg_controllen
= sizeof(aux
);
1178 p
= pa_memblock_acquire(memchunk
.memblock
);
1180 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
1181 l
= recvmsg(u
->stream_fd
, &m
, 0);
1182 pa_memblock_release(memchunk
.memblock
);
1186 if (l
< 0 && errno
== EINTR
)
1187 /* Retry right away if we got interrupted */
1190 else if (l
< 0 && errno
== EAGAIN
)
1191 /* Hmm, apparently the socket was not readable, give up for now. */
1194 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1199 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
1201 memchunk
.length
= (size_t) l
;
1202 u
->read_index
+= (uint64_t) l
;
1204 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
1205 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
1206 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
1207 pa_rtclock_from_wallclock(tv
);
1208 tstamp
= pa_timeval_load(tv
);
1209 found_tstamp
= TRUE
;
1213 if (!found_tstamp
) {
1214 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1215 tstamp
= pa_rtclock_now();
1218 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1219 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1221 pa_source_post(u
->source
, &memchunk
);
1227 pa_memblock_unref(memchunk
.memblock
);
1232 /* Run from IO thread */
1233 static void a2dp_prepare_buffer(struct userdata
*u
) {
1236 if (u
->a2dp
.buffer_size
>= u
->link_mtu
)
1239 u
->a2dp
.buffer_size
= 2 * u
->link_mtu
;
1240 pa_xfree(u
->a2dp
.buffer
);
1241 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
1244 /* Run from IO thread */
1245 static int a2dp_process_render(struct userdata
*u
) {
1246 struct a2dp_info
*a2dp
;
1247 struct rtp_header
*header
;
1248 struct rtp_payload
*payload
;
1252 size_t to_write
, to_encode
;
1253 unsigned frame_count
;
1257 pa_assert(u
->profile
== PROFILE_A2DP
);
1260 /* First, render some data */
1261 if (!u
->write_memchunk
.memblock
)
1262 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1264 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1266 a2dp_prepare_buffer(u
);
1269 header
= a2dp
->buffer
;
1270 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1274 /* Try to create a packet of the full MTU */
1276 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1277 to_encode
= u
->write_memchunk
.length
;
1279 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1280 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
1282 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
1286 encoded
= sbc_encode(&a2dp
->sbc
,
1291 if (PA_UNLIKELY(encoded
<= 0)) {
1292 pa_log_error("SBC encoding error (%li)", (long) encoded
);
1293 pa_memblock_release(u
->write_memchunk
.memblock
);
1297 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
1298 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
1300 pa_assert_fp((size_t) encoded
<= to_encode
);
1301 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
1303 pa_assert_fp((size_t) written
<= to_write
);
1304 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
1306 p
= (const uint8_t*) p
+ encoded
;
1307 to_encode
-= encoded
;
1309 d
= (uint8_t*) d
+ written
;
1310 to_write
-= written
;
1315 pa_memblock_release(u
->write_memchunk
.memblock
);
1317 pa_assert(to_encode
== 0);
1320 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
1323 /* write it to the fifo */
1324 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
1327 header
->sequence_number
= htons(a2dp
->seq_num
++);
1328 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
1329 header
->ssrc
= htonl(1);
1330 payload
->frame_count
= frame_count
;
1332 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
1337 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
1344 /* Retry right away if we got interrupted */
1347 else if (errno
== EAGAIN
)
1348 /* Hmm, apparently the socket was not writable, give up for now */
1351 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
1356 pa_assert((size_t) l
<= nbytes
);
1358 if ((size_t) l
!= nbytes
) {
1359 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1360 (unsigned long long) l
,
1361 (unsigned long long) nbytes
);
1366 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1367 pa_memblock_unref(u
->write_memchunk
.memblock
);
1368 pa_memchunk_reset(&u
->write_memchunk
);
1378 static int a2dp_process_push(struct userdata
*u
) {
1380 pa_memchunk memchunk
;
1383 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
1384 pa_assert(u
->source
);
1385 pa_assert(u
->read_smoother
);
1387 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1388 memchunk
.index
= memchunk
.length
= 0;
1391 pa_bool_t found_tstamp
= FALSE
;
1393 struct a2dp_info
*a2dp
;
1394 struct rtp_header
*header
;
1395 struct rtp_payload
*payload
;
1399 size_t to_write
, to_decode
;
1400 unsigned frame_count
;
1402 a2dp_prepare_buffer(u
);
1405 header
= a2dp
->buffer
;
1406 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1408 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
1412 if (l
< 0 && errno
== EINTR
)
1413 /* Retry right away if we got interrupted */
1416 else if (l
< 0 && errno
== EAGAIN
)
1417 /* Hmm, apparently the socket was not readable, give up for now. */
1420 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1425 pa_assert((size_t) l
<= a2dp
->buffer_size
);
1427 u
->read_index
+= (uint64_t) l
;
1429 /* TODO: get timestamp from rtp */
1430 if (!found_tstamp
) {
1431 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
1432 tstamp
= pa_rtclock_now();
1435 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1436 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1438 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1439 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
1441 d
= pa_memblock_acquire(memchunk
.memblock
);
1442 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
1444 while (PA_LIKELY(to_decode
> 0 && to_write
> 0)) {
1448 decoded
= sbc_decode(&a2dp
->sbc
,
1453 if (PA_UNLIKELY(decoded
<= 0)) {
1454 pa_log_error("SBC decoding error (%li)", (long) decoded
);
1455 pa_memblock_release(memchunk
.memblock
);
1456 pa_memblock_unref(memchunk
.memblock
);
1460 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
1461 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
1463 pa_assert_fp((size_t) decoded
<= to_decode
);
1464 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
1466 pa_assert_fp((size_t) written
<= to_write
);
1467 pa_assert_fp((size_t) written
== a2dp
->codesize
);
1469 p
= (const uint8_t*) p
+ decoded
;
1470 to_decode
-= decoded
;
1472 d
= (uint8_t*) d
+ written
;
1473 to_write
-= written
;
1478 pa_memblock_release(memchunk
.memblock
);
1480 pa_source_post(u
->source
, &memchunk
);
1486 pa_memblock_unref(memchunk
.memblock
);
1491 static void thread_func(void *userdata
) {
1492 struct userdata
*u
= userdata
;
1493 unsigned do_write
= 0;
1494 pa_bool_t writable
= FALSE
;
1498 pa_log_debug("IO Thread starting up");
1500 if (u
->core
->realtime_scheduling
)
1501 pa_make_realtime(u
->core
->realtime_priority
);
1503 pa_thread_mq_install(&u
->thread_mq
);
1506 if (bt_transport_acquire(u
, TRUE
) < 0)
1508 } else if (start_stream_fd(u
) < 0)
1512 struct pollfd
*pollfd
;
1514 pa_bool_t disable_timer
= TRUE
;
1516 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1518 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
1520 /* We should send two blocks to the device before we expect
1523 if (u
->write_index
== 0 && u
->read_index
<= 0)
1526 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
1529 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
1530 n_read
= hsp_process_push(u
);
1532 n_read
= a2dp_process_push(u
);
1537 /* We just read something, so we are supposed to write something, too */
1542 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1544 if (u
->sink
->thread_info
.rewind_requested
)
1545 pa_sink_process_rewind(u
->sink
, 0);
1548 if (pollfd
->revents
& POLLOUT
)
1551 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1552 pa_usec_t time_passed
;
1553 pa_usec_t audio_sent
;
1555 /* Hmm, there is no input stream we could synchronize
1556 * to. So let's do things by time */
1558 time_passed
= pa_rtclock_now() - u
->started_at
;
1559 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1561 if (audio_sent
<= time_passed
) {
1562 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1564 /* Never try to catch up for more than 100ms */
1565 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1566 pa_usec_t skip_usec
;
1567 uint64_t skip_bytes
;
1569 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1570 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1572 if (skip_bytes
> 0) {
1575 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1576 (unsigned long long) skip_usec
,
1577 (unsigned long long) skip_bytes
);
1579 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1580 pa_memblock_unref(tmp
.memblock
);
1581 u
->write_index
+= skip_bytes
;
1589 if (writable
&& do_write
> 0) {
1592 if (u
->write_index
<= 0)
1593 u
->started_at
= pa_rtclock_now();
1595 if (u
->profile
== PROFILE_A2DP
) {
1596 if ((n_written
= a2dp_process_render(u
)) < 0)
1599 if ((n_written
= hsp_process_render(u
)) < 0)
1604 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1606 do_write
-= n_written
;
1610 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1611 pa_usec_t time_passed
, next_write_at
, sleep_for
;
1613 /* Hmm, there is no input stream we could synchronize
1614 * to. So let's estimate when we need to wake up the latest */
1616 time_passed
= pa_rtclock_now() - u
->started_at
;
1617 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1618 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1620 /* 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); */
1622 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1623 disable_timer
= FALSE
;
1629 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1631 /* Hmm, nothing to do. Let's sleep */
1633 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1634 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1636 if ((ret
= pa_rtpoll_run(u
->rtpoll
, TRUE
)) < 0)
1642 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1644 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1645 pa_log_info("FD error: %s%s%s%s",
1646 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1647 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1648 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1649 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1655 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1656 pa_log_debug("IO thread failed");
1657 pa_asyncmsgq_post(u
->thread_mq
.outq
, PA_MSGOBJECT(u
->core
), PA_CORE_MESSAGE_UNLOAD_MODULE
, u
->module
, 0, NULL
, NULL
);
1658 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1661 pa_log_debug("IO thread shutting down");
1664 /* Run from main thread */
1665 static DBusHandlerResult
filter_cb(DBusConnection
*bus
, DBusMessage
*m
, void *userdata
) {
1671 pa_assert_se(u
= userdata
);
1673 dbus_error_init(&err
);
1675 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1676 dbus_message_get_interface(m
),
1677 dbus_message_get_path(m
),
1678 dbus_message_get_member(m
));
1680 if (!dbus_message_has_path(m
, u
->path
))
1683 if (dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged") ||
1684 dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1689 if (!dbus_message_get_args(m
, &err
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
) || gain
> 15) {
1690 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err
.message
);
1694 if (u
->profile
== PROFILE_HSP
) {
1695 if (u
->sink
&& dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged")) {
1697 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1698 pa_sink_volume_changed(u
->sink
, &v
);
1700 } else if (u
->source
&& dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1702 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1703 pa_source_volume_changed(u
->source
, &v
);
1709 dbus_error_free(&err
);
1711 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
1714 /* Run from main thread */
1715 static void sink_set_volume_cb(pa_sink
*s
) {
1716 struct userdata
*u
= s
->userdata
;
1722 if (u
->profile
!= PROFILE_HSP
)
1725 gain
= (pa_cvolume_max(&s
->real_volume
) * 15) / PA_VOLUME_NORM
;
1730 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1732 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetSpeakerGain"));
1733 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1734 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1735 dbus_message_unref(m
);
1738 /* Run from main thread */
1739 static void source_set_volume_cb(pa_source
*s
) {
1740 struct userdata
*u
= s
->userdata
;
1746 if (u
->profile
!= PROFILE_HSP
)
1749 gain
= (pa_cvolume_max(&s
->volume
) * 15) / PA_VOLUME_NORM
;
1754 pa_cvolume_set(&s
->volume
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1756 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetMicrophoneGain"));
1757 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1758 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1759 dbus_message_unref(m
);
1762 /* Run from main thread */
1763 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, pa_bool_t
*namereg_fail
) {
1769 pa_assert(device_id
);
1770 pa_assert(namereg_fail
);
1772 t
= pa_sprintf_malloc("%s_name", type
);
1773 n
= pa_modargs_get_value(ma
, t
, NULL
);
1777 *namereg_fail
= TRUE
;
1778 return pa_xstrdup(n
);
1781 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1782 *namereg_fail
= TRUE
;
1785 *namereg_fail
= FALSE
;
1788 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1793 static void sco_over_pcm_state_update(struct userdata
*u
) {
1795 pa_assert(USE_SCO_OVER_PCM(u
));
1797 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1798 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1800 if (u
->service_fd
>= 0)
1805 pa_log_debug("Resuming SCO over PCM");
1806 if (init_profile(u
) < 0)
1807 pa_log("Can't resume SCO over PCM");
1810 bt_transport_acquire(u
, TRUE
);
1815 if (u
->service_fd
< 0)
1819 bt_transport_release(u
);
1823 pa_log_debug("Closing SCO over PCM");
1824 pa_close(u
->service_fd
);
1829 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
1831 pa_sink_assert_ref(s
);
1834 if (s
!= u
->hsp
.sco_sink
)
1837 sco_over_pcm_state_update(u
);
1842 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
1844 pa_source_assert_ref(s
);
1847 if (s
!= u
->hsp
.sco_source
)
1850 sco_over_pcm_state_update(u
);
1857 /* Run from main thread */
1858 static int add_sink(struct userdata
*u
) {
1861 if (USE_SCO_OVER_PCM(u
)) {
1864 u
->sink
= u
->hsp
.sco_sink
;
1865 p
= pa_proplist_new();
1866 pa_proplist_sets(p
, "bluetooth.protocol", "sco");
1867 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
1868 pa_proplist_free(p
);
1870 if (!u
->hsp
.sink_state_changed_slot
)
1871 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
);
1877 pa_sink_new_data data
;
1880 pa_sink_new_data_init(&data
);
1881 data
.driver
= __FILE__
;
1882 data
.module
= u
->module
;
1883 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1884 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP
? "a2dp" : "sco");
1885 if (u
->profile
== PROFILE_HSP
)
1886 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1887 data
.card
= u
->card
;
1888 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
1889 data
.namereg_fail
= b
;
1891 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1892 pa_log("Invalid properties");
1893 pa_sink_new_data_done(&data
);
1897 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
| (u
->profile
== PROFILE_HSP
? PA_SINK_HW_VOLUME_CTRL
: 0));
1898 pa_sink_new_data_done(&data
);
1901 pa_log_error("Failed to create sink");
1905 u
->sink
->userdata
= u
;
1906 u
->sink
->parent
.process_msg
= sink_process_msg
;
1908 pa_sink_set_max_request(u
->sink
, u
->block_size
);
1909 pa_sink_set_fixed_latency(u
->sink
,
1910 (u
->profile
== PROFILE_A2DP
? FIXED_LATENCY_PLAYBACK_A2DP
: FIXED_LATENCY_PLAYBACK_HSP
) +
1911 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
1914 if (u
->profile
== PROFILE_HSP
) {
1915 u
->sink
->set_volume
= sink_set_volume_cb
;
1916 u
->sink
->n_volume_steps
= 16;
1922 /* Run from main thread */
1923 static int add_source(struct userdata
*u
) {
1926 if (USE_SCO_OVER_PCM(u
)) {
1927 u
->source
= u
->hsp
.sco_source
;
1928 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", "hsp");
1930 if (!u
->hsp
.source_state_changed_slot
)
1931 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
);
1937 pa_source_new_data data
;
1940 pa_source_new_data_init(&data
);
1941 data
.driver
= __FILE__
;
1942 data
.module
= u
->module
;
1943 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1944 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP_SOURCE
? "a2dp_source" : "hsp");
1945 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
))
1946 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1947 data
.card
= u
->card
;
1948 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
1949 data
.namereg_fail
= b
;
1951 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1952 pa_log("Invalid properties");
1953 pa_source_new_data_done(&data
);
1957 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
| (u
->profile
== PROFILE_HSP
? PA_SOURCE_HW_VOLUME_CTRL
: 0));
1958 pa_source_new_data_done(&data
);
1961 pa_log_error("Failed to create source");
1965 u
->source
->userdata
= u
;
1966 u
->source
->parent
.process_msg
= source_process_msg
;
1968 pa_source_set_fixed_latency(u
->source
,
1969 (u
->profile
== PROFILE_A2DP_SOURCE
? FIXED_LATENCY_RECORD_A2DP
: FIXED_LATENCY_RECORD_HSP
) +
1970 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
1973 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
1974 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", (u
->hsp
.pcm_capabilities
.flags
& BT_PCM_FLAG_NREC
) ? "1" : "0");
1976 if (u
->profile
== PROFILE_HSP
) {
1977 u
->source
->set_volume
= source_set_volume_cb
;
1978 u
->source
->n_volume_steps
= 16;
1984 /* Run from main thread */
1985 static void shutdown_bt(struct userdata
*u
) {
1988 if (u
->stream_fd
>= 0) {
1989 pa_close(u
->stream_fd
);
1992 u
->stream_write_type
= 0;
1995 if (u
->service_fd
>= 0) {
1996 pa_close(u
->service_fd
);
1998 u
->service_write_type
= 0;
1999 u
->service_read_type
= 0;
2002 if (u
->write_memchunk
.memblock
) {
2003 pa_memblock_unref(u
->write_memchunk
.memblock
);
2004 pa_memchunk_reset(&u
->write_memchunk
);
2008 static int bt_transport_config_a2dp(struct userdata
*u
) {
2009 const pa_bluetooth_transport
*t
;
2010 struct a2dp_info
*a2dp
= &u
->a2dp
;
2011 sbc_capabilities_raw_t
*config
;
2013 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
2016 config
= (sbc_capabilities_raw_t
*) t
->config
;
2018 if (a2dp
->sbc_initialized
)
2019 sbc_reinit(&a2dp
->sbc
, 0);
2021 sbc_init(&a2dp
->sbc
, 0);
2022 a2dp
->sbc_initialized
= TRUE
;
2024 switch (config
->frequency
) {
2025 case BT_SBC_SAMPLING_FREQ_16000
:
2026 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
2028 case BT_SBC_SAMPLING_FREQ_32000
:
2029 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
2031 case BT_SBC_SAMPLING_FREQ_44100
:
2032 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
2034 case BT_SBC_SAMPLING_FREQ_48000
:
2035 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
2038 pa_assert_not_reached();
2041 switch (config
->channel_mode
) {
2042 case BT_A2DP_CHANNEL_MODE_MONO
:
2043 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
2045 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
2046 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
2048 case BT_A2DP_CHANNEL_MODE_STEREO
:
2049 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
2051 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
2052 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
2055 pa_assert_not_reached();
2058 switch (config
->allocation_method
) {
2059 case BT_A2DP_ALLOCATION_SNR
:
2060 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
2062 case BT_A2DP_ALLOCATION_LOUDNESS
:
2063 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
2066 pa_assert_not_reached();
2069 switch (config
->subbands
) {
2070 case BT_A2DP_SUBBANDS_4
:
2071 a2dp
->sbc
.subbands
= SBC_SB_4
;
2073 case BT_A2DP_SUBBANDS_8
:
2074 a2dp
->sbc
.subbands
= SBC_SB_8
;
2077 pa_assert_not_reached();
2080 switch (config
->block_length
) {
2081 case BT_A2DP_BLOCK_LENGTH_4
:
2082 a2dp
->sbc
.blocks
= SBC_BLK_4
;
2084 case BT_A2DP_BLOCK_LENGTH_8
:
2085 a2dp
->sbc
.blocks
= SBC_BLK_8
;
2087 case BT_A2DP_BLOCK_LENGTH_12
:
2088 a2dp
->sbc
.blocks
= SBC_BLK_12
;
2090 case BT_A2DP_BLOCK_LENGTH_16
:
2091 a2dp
->sbc
.blocks
= SBC_BLK_16
;
2094 pa_assert_not_reached();
2097 a2dp
->sbc
.bitpool
= config
->max_bitpool
;
2098 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
2099 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
2102 ((u
->link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
2103 / a2dp
->frame_length
2106 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
2107 a2dp
->sbc
.allocation
, a2dp
->sbc
.subbands
, a2dp
->sbc
.blocks
, a2dp
->sbc
.bitpool
);
2112 static int bt_transport_config(struct userdata
*u
) {
2113 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
2114 u
->block_size
= u
->link_mtu
;
2118 return bt_transport_config_a2dp(u
);
2121 static int parse_transport_property(struct userdata
*u
, DBusMessageIter
*i
) {
2123 DBusMessageIter variant_i
;
2128 if (dbus_message_iter_get_arg_type(i
) != DBUS_TYPE_STRING
) {
2129 pa_log("Property name not a string.");
2133 dbus_message_iter_get_basic(i
, &key
);
2135 if (!dbus_message_iter_next(i
)) {
2136 pa_log("Property value missing");
2140 if (dbus_message_iter_get_arg_type(i
) != DBUS_TYPE_VARIANT
) {
2141 pa_log("Property value not a variant.");
2145 dbus_message_iter_recurse(i
, &variant_i
);
2147 switch (dbus_message_iter_get_arg_type(&variant_i
)) {
2149 case DBUS_TYPE_UINT16
: {
2152 dbus_message_iter_get_basic(&variant_i
, &value
);
2154 if (pa_streq(key
, "OMTU"))
2155 u
->link_mtu
= value
;
2165 /* Run from main thread */
2166 static int bt_transport_open(struct userdata
*u
) {
2168 DBusMessageIter arg_i
, element_i
;
2171 if (bt_transport_acquire(u
, FALSE
) < 0)
2174 dbus_error_init(&err
);
2176 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->transport
, "org.bluez.MediaTransport", "GetProperties"));
2177 r
= dbus_connection_send_with_reply_and_block(pa_dbus_connection_get(u
->connection
), m
, -1, &err
);
2179 if (dbus_error_is_set(&err
) || !r
) {
2180 pa_log("Failed to get transport properties: %s", err
.message
);
2184 if (!dbus_message_iter_init(r
, &arg_i
)) {
2185 pa_log("GetProperties reply has no arguments.");
2189 if (dbus_message_iter_get_arg_type(&arg_i
) != DBUS_TYPE_ARRAY
) {
2190 pa_log("GetProperties argument is not an array.");
2194 dbus_message_iter_recurse(&arg_i
, &element_i
);
2195 while (dbus_message_iter_get_arg_type(&element_i
) != DBUS_TYPE_INVALID
) {
2197 if (dbus_message_iter_get_arg_type(&element_i
) == DBUS_TYPE_DICT_ENTRY
) {
2198 DBusMessageIter dict_i
;
2200 dbus_message_iter_recurse(&element_i
, &dict_i
);
2202 parse_transport_property(u
, &dict_i
);
2205 if (!dbus_message_iter_next(&element_i
))
2209 return bt_transport_config(u
);
2212 dbus_message_unref(r
);
2216 /* Run from main thread */
2217 static int init_bt(struct userdata
*u
) {
2222 u
->stream_write_type
= 0;
2223 u
->service_write_type
= 0;
2224 u
->service_read_type
= 0;
2226 if ((u
->service_fd
= bt_audio_service_open()) < 0) {
2227 pa_log_warn("Bluetooth audio service not available");
2231 pa_log_debug("Connected to the bluetooth audio service");
2236 /* Run from main thread */
2237 static int setup_bt(struct userdata
*u
) {
2238 const pa_bluetooth_device
*d
;
2239 const pa_bluetooth_transport
*t
;
2243 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
2244 pa_log_error("Failed to get device object.");
2248 /* release transport if exist */
2250 bt_transport_release(u
);
2251 pa_xfree(u
->transport
);
2252 u
->transport
= NULL
;
2255 /* check if profile has a transport */
2256 t
= pa_bluetooth_device_get_transport(d
, u
->profile
);
2258 u
->transport
= pa_xstrdup(t
->path
);
2259 return bt_transport_open(u
);
2262 if (get_caps(u
, 0) < 0)
2265 pa_log_debug("Got device capabilities");
2267 if (set_conf(u
) < 0)
2270 pa_log_debug("Connection to the device configured");
2273 if (USE_SCO_OVER_PCM(u
)) {
2274 pa_log_debug("Configured to use SCO over PCM");
2279 pa_log_debug("Got the stream socket");
2284 /* Run from main thread */
2285 static int init_profile(struct userdata
*u
) {
2288 pa_assert(u
->profile
!= PROFILE_OFF
);
2290 if (setup_bt(u
) < 0)
2293 if (u
->profile
== PROFILE_A2DP
||
2294 u
->profile
== PROFILE_HSP
||
2295 u
->profile
== PROFILE_HFGW
)
2296 if (add_sink(u
) < 0)
2299 if (u
->profile
== PROFILE_HSP
||
2300 u
->profile
== PROFILE_A2DP_SOURCE
||
2301 u
->profile
== PROFILE_HFGW
)
2302 if (add_source(u
) < 0)
2308 /* Run from main thread */
2309 static void stop_thread(struct userdata
*u
) {
2313 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
2314 pa_thread_free(u
->thread
);
2318 if (u
->rtpoll_item
) {
2319 pa_rtpoll_item_free(u
->rtpoll_item
);
2320 u
->rtpoll_item
= NULL
;
2323 if (u
->hsp
.sink_state_changed_slot
) {
2324 pa_hook_slot_free(u
->hsp
.sink_state_changed_slot
);
2325 u
->hsp
.sink_state_changed_slot
= NULL
;
2328 if (u
->hsp
.source_state_changed_slot
) {
2329 pa_hook_slot_free(u
->hsp
.source_state_changed_slot
);
2330 u
->hsp
.source_state_changed_slot
= NULL
;
2334 pa_sink_unref(u
->sink
);
2339 pa_source_unref(u
->source
);
2344 pa_thread_mq_done(&u
->thread_mq
);
2346 pa_rtpoll_free(u
->rtpoll
);
2350 if (u
->read_smoother
) {
2351 pa_smoother_free(u
->read_smoother
);
2352 u
->read_smoother
= NULL
;
2356 /* Run from main thread */
2357 static int start_thread(struct userdata
*u
) {
2359 pa_assert(!u
->thread
);
2360 pa_assert(!u
->rtpoll
);
2361 pa_assert(!u
->rtpoll_item
);
2363 u
->rtpoll
= pa_rtpoll_new();
2364 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
2367 if (USE_SCO_OVER_PCM(u
)) {
2369 if (bt_transport_acquire(u
, TRUE
) < 0)
2371 } else if (start_stream_fd(u
) < 0)
2374 pa_sink_ref(u
->sink
);
2375 pa_source_ref(u
->source
);
2376 /* FIXME: monitor stream_fd error */
2381 if (!(u
->thread
= pa_thread_new("bluetooth", thread_func
, u
))) {
2382 pa_log_error("Failed to create IO thread");
2388 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
2389 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
2390 pa_sink_put(u
->sink
);
2392 if (u
->sink
->set_volume
)
2393 u
->sink
->set_volume(u
->sink
);
2397 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
2398 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
2399 pa_source_put(u
->source
);
2401 if (u
->source
->set_volume
)
2402 u
->source
->set_volume(u
->source
);
2408 /* Run from main thread */
2409 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
2412 pa_queue
*inputs
= NULL
, *outputs
= NULL
;
2413 const pa_bluetooth_device
*device
;
2416 pa_assert(new_profile
);
2417 pa_assert_se(u
= c
->userdata
);
2419 d
= PA_CARD_PROFILE_DATA(new_profile
);
2421 if (!(device
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
2422 pa_log_error("Failed to get device object.");
2426 /* The state signal is sent by bluez, so it is racy to check
2427 strictly for CONNECTED, we should also accept STREAMING state
2428 as being good enough. However, if the profile is used
2429 concurrently (which is unlikely), ipc will fail later on, and
2430 module will be unloaded. */
2431 if (device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) {
2432 pa_log_warn("HSP is not connected, refused to switch profile");
2435 else if (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) {
2436 pa_log_warn("A2DP is not connected, refused to switch profile");
2439 else if (device
->hfgw_state
<= PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
) {
2440 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
2445 inputs
= pa_sink_move_all_start(u
->sink
, NULL
);
2447 if (!USE_SCO_OVER_PCM(u
))
2449 pa_sink_unlink(u
->sink
);
2453 outputs
= pa_source_move_all_start(u
->source
, NULL
);
2455 if (!USE_SCO_OVER_PCM(u
))
2457 pa_source_unlink(u
->source
);
2464 u
->sample_spec
= u
->requested_sample_spec
;
2468 if (u
->profile
!= PROFILE_OFF
)
2471 if (u
->sink
|| u
->source
)
2476 pa_sink_move_all_finish(u
->sink
, inputs
, FALSE
);
2478 pa_sink_move_all_fail(inputs
);
2483 pa_source_move_all_finish(u
->source
, outputs
, FALSE
);
2485 pa_source_move_all_fail(outputs
);
2491 /* Run from main thread */
2492 static int add_card(struct userdata
*u
, const pa_bluetooth_device
*device
) {
2493 pa_card_new_data data
;
2499 const char *default_profile
;
2504 pa_card_new_data_init(&data
);
2505 data
.driver
= __FILE__
;
2506 data
.module
= u
->module
;
2508 n
= pa_bluetooth_cleanup_name(device
->name
);
2509 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2511 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2512 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2513 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2514 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2515 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2516 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2517 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2518 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2519 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2520 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2521 data
.namereg_fail
= b
;
2523 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2524 pa_log("Invalid properties");
2525 pa_card_new_data_done(&data
);
2529 data
.profiles
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
2531 /* we base hsp/a2dp availability on UUIDs.
2532 Ideally, it would be based on "Connected" state, but
2533 we can't afford to wait for this information when
2534 we are loaded with profile="hsp", for instance */
2535 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SINK_UUID
)) {
2536 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2540 p
->max_sink_channels
= 2;
2541 p
->max_source_channels
= 0;
2543 d
= PA_CARD_PROFILE_DATA(p
);
2546 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2549 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SOURCE_UUID
)) {
2550 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2554 p
->max_sink_channels
= 0;
2555 p
->max_source_channels
= 2;
2557 d
= PA_CARD_PROFILE_DATA(p
);
2558 *d
= PROFILE_A2DP_SOURCE
;
2560 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2563 if (pa_bluetooth_uuid_has(device
->uuids
, HSP_HS_UUID
) ||
2564 pa_bluetooth_uuid_has(device
->uuids
, HFP_HS_UUID
)) {
2565 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2569 p
->max_sink_channels
= 1;
2570 p
->max_source_channels
= 1;
2572 d
= PA_CARD_PROFILE_DATA(p
);
2575 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2578 if (pa_bluetooth_uuid_has(device
->uuids
, HFP_AG_UUID
)) {
2579 p
= pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile
));
2583 p
->max_sink_channels
= 1;
2584 p
->max_source_channels
= 1;
2586 d
= PA_CARD_PROFILE_DATA(p
);
2589 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2592 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2594 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2595 d
= PA_CARD_PROFILE_DATA(p
);
2597 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2599 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2600 if (pa_hashmap_get(data
.profiles
, default_profile
))
2601 pa_card_new_data_set_profile(&data
, default_profile
);
2603 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2606 u
->card
= pa_card_new(u
->core
, &data
);
2607 pa_card_new_data_done(&data
);
2610 pa_log("Failed to allocate card.");
2614 u
->card
->userdata
= u
;
2615 u
->card
->set_profile
= card_set_profile
;
2617 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2619 if ((device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) ||
2620 (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) ||
2621 (device
->hfgw_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
)) {
2622 pa_log_warn("Default profile not connected, selecting off profile");
2623 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2624 u
->card
->save_profile
= FALSE
;
2627 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2633 /* Run from main thread */
2634 static const pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2635 const pa_bluetooth_device
*d
= NULL
;
2639 if (!address
&& !path
) {
2640 pa_log_error("Failed to get device address/path from module arguments.");
2645 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2646 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2650 if (address
&& !(pa_streq(d
->address
, address
))) {
2651 pa_log_error("Passed path %s address %s != %s don't match.", path
, d
->address
, address
);
2656 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2657 pa_log_error("%s is not known.", address
);
2663 u
->address
= pa_xstrdup(d
->address
);
2664 u
->path
= pa_xstrdup(d
->path
);
2670 /* Run from main thread */
2671 static int setup_dbus(struct userdata
*u
) {
2674 dbus_error_init(&err
);
2676 u
->connection
= pa_dbus_bus_get(u
->core
, DBUS_BUS_SYSTEM
, &err
);
2678 if (dbus_error_is_set(&err
) || !u
->connection
) {
2679 pa_log("Failed to get D-Bus connection: %s", err
.message
);
2680 dbus_error_free(&err
);
2687 int pa__init(pa_module
* m
) {
2691 const char *address
, *path
;
2693 char *mike
, *speaker
;
2694 const pa_bluetooth_device
*device
;
2698 dbus_error_init(&err
);
2700 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
2701 pa_log_error("Failed to parse module arguments");
2705 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
2710 u
->sample_spec
= m
->core
->default_sample_spec
;
2714 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
2715 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
2716 pa_log("SCO sink not found");
2720 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
2721 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
2722 pa_log("SCO source not found");
2727 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
2728 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
2729 pa_log_error("Failed to get rate from module arguments");
2733 u
->auto_connect
= TRUE
;
2734 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
2735 pa_log("Failed to parse auto_connect= argument");
2739 channels
= u
->sample_spec
.channels
;
2740 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
2741 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
2742 pa_log_error("Failed to get channels from module arguments");
2745 u
->sample_spec
.channels
= (uint8_t) channels
;
2746 u
->requested_sample_spec
= u
->sample_spec
;
2748 address
= pa_modargs_get_value(ma
, "address", NULL
);
2749 path
= pa_modargs_get_value(ma
, "path", NULL
);
2751 if (setup_dbus(u
) < 0)
2754 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
2757 if (!(device
= find_device(u
, address
, path
)))
2760 /* Add the card structure. This will also initialize the default profile */
2761 if (add_card(u
, device
) < 0)
2764 if (!dbus_connection_add_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
, NULL
)) {
2765 pa_log_error("Failed to add filter function");
2768 u
->filter_added
= TRUE
;
2770 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2771 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2773 if (pa_dbus_add_matches(
2774 pa_dbus_connection_get(u
->connection
), &err
,
2782 pa_log("Failed to add D-Bus matches: %s", err
.message
);
2789 /* Connect to the BT service */
2792 if (u
->profile
!= PROFILE_OFF
)
2793 if (init_profile(u
) < 0)
2796 if (u
->sink
|| u
->source
)
2797 if (start_thread(u
) < 0)
2806 dbus_error_free(&err
);
2811 int pa__get_n_used(pa_module
*m
) {
2815 pa_assert_se(u
= m
->userdata
);
2818 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
2819 (u
->source
? pa_source_linked_by(u
->source
) : 0);
2822 void pa__done(pa_module
*m
) {
2826 if (!(u
= m
->userdata
))
2831 && !USE_SCO_OVER_PCM(u
)
2834 pa_sink_unlink(u
->sink
);
2838 && !USE_SCO_OVER_PCM(u
)
2841 pa_source_unlink(u
->source
);
2845 if (u
->connection
) {
2848 char *speaker
, *mike
;
2849 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2850 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2852 pa_dbus_remove_matches(pa_dbus_connection_get(u
->connection
), speaker
, mike
, NULL
);
2858 if (u
->filter_added
)
2859 dbus_connection_remove_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
);
2861 pa_dbus_connection_unref(u
->connection
);
2865 pa_card_free(u
->card
);
2867 if (u
->read_smoother
)
2868 pa_smoother_free(u
->read_smoother
);
2873 pa_xfree(u
->a2dp
.buffer
);
2875 sbc_finish(&u
->a2dp
.sbc
);
2878 pa_modargs_free(u
->modargs
);
2880 pa_xfree(u
->address
);
2884 bt_transport_release(u
);
2885 pa_xfree(u
->transport
);
2889 pa_bluetooth_discovery_unref(u
->discovery
);