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/rtclock.h>
32 #include <pulse/sample.h>
33 #include <pulse/timeval.h>
34 #include <pulse/xmalloc.h>
36 #include <pulsecore/i18n.h>
37 #include <pulsecore/module.h>
38 #include <pulsecore/modargs.h>
39 #include <pulsecore/core-rtclock.h>
40 #include <pulsecore/core-util.h>
41 #include <pulsecore/core-error.h>
42 #include <pulsecore/shared.h>
43 #include <pulsecore/socket-util.h>
44 #include <pulsecore/thread.h>
45 #include <pulsecore/thread-mq.h>
46 #include <pulsecore/poll.h>
47 #include <pulsecore/rtpoll.h>
48 #include <pulsecore/time-smoother.h>
49 #include <pulsecore/namereg.h>
50 #include <pulsecore/dbus-shared.h>
52 #include "module-bluetooth-device-symdef.h"
55 #include "a2dp-codecs.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
);
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> "
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
[] = {
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 */
120 pcm_capabilities_t pcm_capabilities
;
122 void (*sco_sink_set_volume
)(pa_sink
*s
);
123 pa_source
*sco_source
;
124 void (*sco_source_set_volume
)(pa_source
*s
);
125 pa_hook_slot
*sink_state_changed_slot
;
126 pa_hook_slot
*source_state_changed_slot
;
127 pa_hook_slot
*nrec_changed_slot
;
130 struct bluetooth_msg
{
135 typedef struct bluetooth_msg bluetooth_msg
;
136 PA_DEFINE_PRIVATE_CLASS(bluetooth_msg
, pa_msgobject
);
137 #define BLUETOOTH_MSG(o) (bluetooth_msg_cast(o))
148 pa_bluetooth_discovery
*discovery
;
149 pa_bool_t auto_connect
;
151 pa_dbus_connection
*connection
;
157 pa_thread_mq thread_mq
;
159 pa_rtpoll_item
*rtpoll_item
;
163 uint64_t read_index
, write_index
;
164 pa_usec_t started_at
;
165 pa_smoother
*read_smoother
;
167 pa_memchunk write_memchunk
;
169 pa_sample_spec sample_spec
, requested_sample_spec
;
177 struct a2dp_info a2dp
;
180 enum profile profile
;
184 int stream_write_type
;
185 int service_write_type
, service_read_type
;
187 pa_bool_t filter_added
;
191 BLUETOOTH_MESSAGE_IO_THREAD_FAILED
,
192 BLUETOOTH_MESSAGE_MAX
195 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
196 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
197 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
198 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
200 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
202 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
204 static int init_bt(struct userdata
*u
);
205 static int init_profile(struct userdata
*u
);
207 static int service_send(struct userdata
*u
, const bt_audio_msg_header_t
*msg
) {
212 pa_assert(msg
->length
> 0);
214 if (u
->service_fd
< 0) {
215 pa_log_warn("Service not connected");
219 pa_log_debug("Sending %s -> %s",
220 pa_strnull(bt_audio_strtype(msg
->type
)),
221 pa_strnull(bt_audio_strname(msg
->name
)));
223 if ((r
= pa_loop_write(u
->service_fd
, msg
, msg
->length
, &u
->service_write_type
)) == (ssize_t
) msg
->length
)
227 pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno
));
229 pa_log_error("Short write()");
234 static int service_recv(struct userdata
*u
, bt_audio_msg_header_t
*msg
, size_t room
) {
238 pa_assert(u
->service_fd
>= 0);
240 pa_assert(room
>= sizeof(*msg
));
242 pa_log_debug("Trying to receive message from audio service...");
244 /* First, read the header */
245 if ((r
= pa_loop_read(u
->service_fd
, msg
, sizeof(*msg
), &u
->service_read_type
)) != sizeof(*msg
))
248 if (msg
->length
< sizeof(*msg
)) {
249 pa_log_error("Invalid message size.");
253 if (msg
->length
> room
) {
254 pa_log_error("Not enough room.");
258 /* Secondly, read the payload */
259 if (msg
->length
> sizeof(*msg
)) {
261 size_t remains
= msg
->length
- sizeof(*msg
);
263 if ((r
= pa_loop_read(u
->service_fd
,
264 (uint8_t*) msg
+ sizeof(*msg
),
266 &u
->service_read_type
)) != (ssize_t
) remains
)
270 pa_log_debug("Received %s <- %s",
271 pa_strnull(bt_audio_strtype(msg
->type
)),
272 pa_strnull(bt_audio_strname(msg
->name
)));
279 pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno
));
281 pa_log_error("Short read()");
286 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
) {
290 pa_assert(u
->service_fd
>= 0);
293 if ((r
= service_recv(u
, rsp
, room
)) < 0)
296 if ((rsp
->type
!= BT_INDICATION
&& rsp
->type
!= BT_RESPONSE
) ||
297 rsp
->name
!= expected_name
||
298 (expected_size
> 0 && rsp
->length
!= expected_size
)) {
300 if (rsp
->type
== BT_ERROR
&& rsp
->length
== sizeof(bt_audio_error_t
))
301 pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t
*) rsp
)->posix_errno
));
303 pa_log_error("Bogus message %s received while %s was expected",
304 pa_strnull(bt_audio_strname(rsp
->name
)),
305 pa_strnull(bt_audio_strname(expected_name
)));
312 /* Run from main thread */
313 static int parse_caps(struct userdata
*u
, uint8_t seid
, const struct bt_get_capabilities_rsp
*rsp
) {
315 const codec_capabilities_t
*codec
;
320 bytes_left
= rsp
->h
.length
- sizeof(*rsp
);
322 if (bytes_left
< sizeof(codec_capabilities_t
)) {
323 pa_log_error("Packet too small to store codec information.");
327 codec
= (codec_capabilities_t
*) rsp
->data
; /** ALIGNMENT? **/
329 pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left
, (unsigned long) sizeof(*codec
));
331 if (((u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) && codec
->transport
!= BT_CAPABILITIES_TRANSPORT_A2DP
) ||
332 ((u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) && codec
->transport
!= BT_CAPABILITIES_TRANSPORT_SCO
)) {
333 pa_log_error("Got capabilities for wrong codec.");
337 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
339 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->hsp
.pcm_capabilities
))
342 pa_assert(codec
->type
== BT_HFP_CODEC_PCM
);
344 if (codec
->configured
&& seid
== 0)
347 memcpy(&u
->hsp
.pcm_capabilities
, codec
, sizeof(u
->hsp
.pcm_capabilities
));
349 } else if (u
->profile
== PROFILE_A2DP
) {
351 while (bytes_left
> 0) {
352 if ((codec
->type
== BT_A2DP_SBC_SINK
) && !codec
->lock
)
355 bytes_left
-= codec
->length
;
356 codec
= (const codec_capabilities_t
*) ((const uint8_t*) codec
+ codec
->length
);
359 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->a2dp
.sbc_capabilities
))
362 pa_assert(codec
->type
== BT_A2DP_SBC_SINK
);
364 if (codec
->configured
&& seid
== 0)
367 memcpy(&u
->a2dp
.sbc_capabilities
, codec
, sizeof(u
->a2dp
.sbc_capabilities
));
369 } else if (u
->profile
== PROFILE_A2DP_SOURCE
) {
371 while (bytes_left
> 0) {
372 if ((codec
->type
== BT_A2DP_SBC_SOURCE
) && !codec
->lock
)
375 bytes_left
-= codec
->length
;
376 codec
= (const codec_capabilities_t
*) ((const uint8_t*) codec
+ codec
->length
);
379 if (bytes_left
<= 0 || codec
->length
!= sizeof(u
->a2dp
.sbc_capabilities
))
382 pa_assert(codec
->type
== BT_A2DP_SBC_SOURCE
);
384 if (codec
->configured
&& seid
== 0)
387 memcpy(&u
->a2dp
.sbc_capabilities
, codec
, sizeof(u
->a2dp
.sbc_capabilities
));
393 /* Run from main thread */
394 static int get_caps(struct userdata
*u
, uint8_t seid
) {
396 struct bt_get_capabilities_req getcaps_req
;
397 struct bt_get_capabilities_rsp getcaps_rsp
;
398 bt_audio_error_t error
;
399 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
405 memset(&msg
, 0, sizeof(msg
));
406 msg
.getcaps_req
.h
.type
= BT_REQUEST
;
407 msg
.getcaps_req
.h
.name
= BT_GET_CAPABILITIES
;
408 msg
.getcaps_req
.h
.length
= sizeof(msg
.getcaps_req
);
409 msg
.getcaps_req
.seid
= seid
;
411 pa_strlcpy(msg
.getcaps_req
.object
, u
->path
, sizeof(msg
.getcaps_req
.object
));
412 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
)
413 msg
.getcaps_req
.transport
= BT_CAPABILITIES_TRANSPORT_A2DP
;
415 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
416 msg
.getcaps_req
.transport
= BT_CAPABILITIES_TRANSPORT_SCO
;
418 msg
.getcaps_req
.flags
= u
->auto_connect
? BT_FLAG_AUTOCONNECT
: 0;
420 if (service_send(u
, &msg
.getcaps_req
.h
) < 0)
423 if (service_expect(u
, &msg
.getcaps_rsp
.h
, sizeof(msg
), BT_GET_CAPABILITIES
, 0) < 0)
426 ret
= parse_caps(u
, seid
, &msg
.getcaps_rsp
);
430 return get_caps(u
, ret
);
433 /* Run from main thread */
434 static uint8_t a2dp_default_bitpool(uint8_t freq
, uint8_t mode
) {
437 case BT_SBC_SAMPLING_FREQ_16000
:
438 case BT_SBC_SAMPLING_FREQ_32000
:
441 case BT_SBC_SAMPLING_FREQ_44100
:
444 case BT_A2DP_CHANNEL_MODE_MONO
:
445 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
448 case BT_A2DP_CHANNEL_MODE_STEREO
:
449 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
453 pa_log_warn("Invalid channel mode %u", mode
);
457 case BT_SBC_SAMPLING_FREQ_48000
:
460 case BT_A2DP_CHANNEL_MODE_MONO
:
461 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
464 case BT_A2DP_CHANNEL_MODE_STEREO
:
465 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
469 pa_log_warn("Invalid channel mode %u", mode
);
474 pa_log_warn("Invalid sampling freq %u", freq
);
479 /* Run from main thread */
480 static int setup_a2dp(struct userdata
*u
) {
481 sbc_capabilities_t
*cap
;
484 static const struct {
488 { 16000U, BT_SBC_SAMPLING_FREQ_16000
},
489 { 32000U, BT_SBC_SAMPLING_FREQ_32000
},
490 { 44100U, BT_SBC_SAMPLING_FREQ_44100
},
491 { 48000U, BT_SBC_SAMPLING_FREQ_48000
}
495 pa_assert(u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
);
497 cap
= &u
->a2dp
.sbc_capabilities
;
499 /* Find the lowest freq that is at least as high as the requested
501 for (i
= 0; (unsigned) i
< PA_ELEMENTSOF(freq_table
); i
++)
502 if (freq_table
[i
].rate
>= u
->sample_spec
.rate
&& (cap
->frequency
& freq_table
[i
].cap
)) {
503 u
->sample_spec
.rate
= freq_table
[i
].rate
;
504 cap
->frequency
= freq_table
[i
].cap
;
508 if ((unsigned) i
== PA_ELEMENTSOF(freq_table
)) {
509 for (--i
; i
>= 0; i
--) {
510 if (cap
->frequency
& freq_table
[i
].cap
) {
511 u
->sample_spec
.rate
= freq_table
[i
].rate
;
512 cap
->frequency
= freq_table
[i
].cap
;
518 pa_log("Not suitable sample rate");
523 pa_assert((unsigned) i
< PA_ELEMENTSOF(freq_table
));
525 if (cap
->capability
.configured
)
528 if (u
->sample_spec
.channels
<= 1) {
529 if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_MONO
) {
530 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_MONO
;
531 u
->sample_spec
.channels
= 1;
533 u
->sample_spec
.channels
= 2;
536 if (u
->sample_spec
.channels
>= 2) {
537 u
->sample_spec
.channels
= 2;
539 if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_JOINT_STEREO
)
540 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_JOINT_STEREO
;
541 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_STEREO
)
542 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_STEREO
;
543 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
)
544 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
;
545 else if (cap
->channel_mode
& BT_A2DP_CHANNEL_MODE_MONO
) {
546 cap
->channel_mode
= BT_A2DP_CHANNEL_MODE_MONO
;
547 u
->sample_spec
.channels
= 1;
549 pa_log("No supported channel modes");
554 if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_16
)
555 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_16
;
556 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_12
)
557 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_12
;
558 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_8
)
559 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_8
;
560 else if (cap
->block_length
& BT_A2DP_BLOCK_LENGTH_4
)
561 cap
->block_length
= BT_A2DP_BLOCK_LENGTH_4
;
563 pa_log_error("No supported block lengths");
567 if (cap
->subbands
& BT_A2DP_SUBBANDS_8
)
568 cap
->subbands
= BT_A2DP_SUBBANDS_8
;
569 else if (cap
->subbands
& BT_A2DP_SUBBANDS_4
)
570 cap
->subbands
= BT_A2DP_SUBBANDS_4
;
572 pa_log_error("No supported subbands");
576 if (cap
->allocation_method
& BT_A2DP_ALLOCATION_LOUDNESS
)
577 cap
->allocation_method
= BT_A2DP_ALLOCATION_LOUDNESS
;
578 else if (cap
->allocation_method
& BT_A2DP_ALLOCATION_SNR
)
579 cap
->allocation_method
= BT_A2DP_ALLOCATION_SNR
;
581 cap
->min_bitpool
= (uint8_t) PA_MAX(MIN_BITPOOL
, cap
->min_bitpool
);
582 cap
->max_bitpool
= (uint8_t) PA_MIN(a2dp_default_bitpool(cap
->frequency
, cap
->channel_mode
), cap
->max_bitpool
);
587 /* Run from main thread */
588 static void setup_sbc(struct a2dp_info
*a2dp
, enum profile p
) {
589 sbc_capabilities_t
*active_capabilities
;
593 active_capabilities
= &a2dp
->sbc_capabilities
;
595 if (a2dp
->sbc_initialized
)
596 sbc_reinit(&a2dp
->sbc
, 0);
598 sbc_init(&a2dp
->sbc
, 0);
599 a2dp
->sbc_initialized
= TRUE
;
601 switch (active_capabilities
->frequency
) {
602 case BT_SBC_SAMPLING_FREQ_16000
:
603 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
605 case BT_SBC_SAMPLING_FREQ_32000
:
606 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
608 case BT_SBC_SAMPLING_FREQ_44100
:
609 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
611 case BT_SBC_SAMPLING_FREQ_48000
:
612 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
615 pa_assert_not_reached();
618 switch (active_capabilities
->channel_mode
) {
619 case BT_A2DP_CHANNEL_MODE_MONO
:
620 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
622 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
623 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
625 case BT_A2DP_CHANNEL_MODE_STEREO
:
626 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
628 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
629 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
632 pa_assert_not_reached();
635 switch (active_capabilities
->allocation_method
) {
636 case BT_A2DP_ALLOCATION_SNR
:
637 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
639 case BT_A2DP_ALLOCATION_LOUDNESS
:
640 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
643 pa_assert_not_reached();
646 switch (active_capabilities
->subbands
) {
647 case BT_A2DP_SUBBANDS_4
:
648 a2dp
->sbc
.subbands
= SBC_SB_4
;
650 case BT_A2DP_SUBBANDS_8
:
651 a2dp
->sbc
.subbands
= SBC_SB_8
;
654 pa_assert_not_reached();
657 switch (active_capabilities
->block_length
) {
658 case BT_A2DP_BLOCK_LENGTH_4
:
659 a2dp
->sbc
.blocks
= SBC_BLK_4
;
661 case BT_A2DP_BLOCK_LENGTH_8
:
662 a2dp
->sbc
.blocks
= SBC_BLK_8
;
664 case BT_A2DP_BLOCK_LENGTH_12
:
665 a2dp
->sbc
.blocks
= SBC_BLK_12
;
667 case BT_A2DP_BLOCK_LENGTH_16
:
668 a2dp
->sbc
.blocks
= SBC_BLK_16
;
671 pa_assert_not_reached();
674 a2dp
->min_bitpool
= active_capabilities
->min_bitpool
;
675 a2dp
->max_bitpool
= active_capabilities
->max_bitpool
;
677 /* Set minimum bitpool for source to get the maximum possible block_size */
678 a2dp
->sbc
.bitpool
= p
== PROFILE_A2DP
? a2dp
->max_bitpool
: a2dp
->min_bitpool
;
679 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
680 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
683 /* Run from main thread */
684 static int set_conf(struct userdata
*u
) {
686 struct bt_open_req open_req
;
687 struct bt_open_rsp open_rsp
;
688 struct bt_set_configuration_req setconf_req
;
689 struct bt_set_configuration_rsp setconf_rsp
;
690 bt_audio_error_t error
;
691 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
694 memset(&msg
, 0, sizeof(msg
));
695 msg
.open_req
.h
.type
= BT_REQUEST
;
696 msg
.open_req
.h
.name
= BT_OPEN
;
697 msg
.open_req
.h
.length
= sizeof(msg
.open_req
);
699 pa_strlcpy(msg
.open_req
.object
, u
->path
, sizeof(msg
.open_req
.object
));
700 msg
.open_req
.seid
= (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) ? u
->a2dp
.sbc_capabilities
.capability
.seid
: BT_A2DP_SEID_RANGE
+ 1;
701 msg
.open_req
.lock
= (u
->profile
== PROFILE_A2DP
) ? BT_WRITE_LOCK
: BT_READ_LOCK
| BT_WRITE_LOCK
;
703 if (service_send(u
, &msg
.open_req
.h
) < 0)
706 if (service_expect(u
, &msg
.open_rsp
.h
, sizeof(msg
), BT_OPEN
, sizeof(msg
.open_rsp
)) < 0)
709 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
710 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
712 if (setup_a2dp(u
) < 0)
715 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
717 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
718 u
->sample_spec
.channels
= 1;
719 u
->sample_spec
.rate
= 8000;
722 memset(&msg
, 0, sizeof(msg
));
723 msg
.setconf_req
.h
.type
= BT_REQUEST
;
724 msg
.setconf_req
.h
.name
= BT_SET_CONFIGURATION
;
725 msg
.setconf_req
.h
.length
= sizeof(msg
.setconf_req
);
727 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
728 memcpy(&msg
.setconf_req
.codec
, &u
->a2dp
.sbc_capabilities
, sizeof(u
->a2dp
.sbc_capabilities
));
730 msg
.setconf_req
.codec
.transport
= BT_CAPABILITIES_TRANSPORT_SCO
;
731 msg
.setconf_req
.codec
.seid
= BT_A2DP_SEID_RANGE
+ 1;
732 msg
.setconf_req
.codec
.length
= sizeof(pcm_capabilities_t
);
734 msg
.setconf_req
.h
.length
+= msg
.setconf_req
.codec
.length
- sizeof(msg
.setconf_req
.codec
);
736 if (service_send(u
, &msg
.setconf_req
.h
) < 0)
739 if (service_expect(u
, &msg
.setconf_rsp
.h
, sizeof(msg
), BT_SET_CONFIGURATION
, sizeof(msg
.setconf_rsp
)) < 0)
742 u
->link_mtu
= msg
.setconf_rsp
.link_mtu
;
744 /* setup SBC encoder now we agree on parameters */
745 if (u
->profile
== PROFILE_A2DP
|| u
->profile
== PROFILE_A2DP_SOURCE
) {
746 setup_sbc(&u
->a2dp
, u
->profile
);
749 ((u
->link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
750 / u
->a2dp
.frame_length
753 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
754 u
->a2dp
.sbc
.allocation
, u
->a2dp
.sbc
.subbands
, u
->a2dp
.sbc
.blocks
, u
->a2dp
.sbc
.bitpool
);
756 u
->block_size
= u
->link_mtu
;
762 static void a2dp_set_bitpool(struct userdata
*u
, uint8_t bitpool
)
764 struct a2dp_info
*a2dp
;
770 if (a2dp
->sbc
.bitpool
== bitpool
)
773 if (bitpool
> a2dp
->max_bitpool
)
774 bitpool
= a2dp
->max_bitpool
;
775 else if (bitpool
< a2dp
->min_bitpool
)
776 bitpool
= a2dp
->min_bitpool
;
778 a2dp
->sbc
.bitpool
= bitpool
;
780 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
781 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
783 pa_log_debug("Bitpool has changed to %u", a2dp
->sbc
.bitpool
);
786 (u
->link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
787 / a2dp
->frame_length
* a2dp
->codesize
;
789 pa_sink_set_max_request_within_thread(u
->sink
, u
->block_size
);
790 pa_sink_set_fixed_latency_within_thread(u
->sink
,
791 FIXED_LATENCY_PLAYBACK_A2DP
+ pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
794 /* from IO thread, except in SCO over PCM */
796 static int setup_stream(struct userdata
*u
) {
797 struct pollfd
*pollfd
;
800 pa_make_fd_nonblock(u
->stream_fd
);
801 pa_make_socket_low_delay(u
->stream_fd
);
804 if (setsockopt(u
->stream_fd
, SOL_SOCKET
, SO_TIMESTAMP
, &one
, sizeof(one
)) < 0)
805 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno
));
807 pa_log_debug("Stream properly set up, we're ready to roll!");
809 if (u
->profile
== PROFILE_A2DP
)
810 a2dp_set_bitpool(u
, u
->a2dp
.max_bitpool
);
812 u
->rtpoll_item
= pa_rtpoll_item_new(u
->rtpoll
, PA_RTPOLL_NEVER
, 1);
813 pollfd
= pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
);
814 pollfd
->fd
= u
->stream_fd
;
815 pollfd
->events
= pollfd
->revents
= 0;
817 u
->read_index
= u
->write_index
= 0;
821 u
->read_smoother
= pa_smoother_new(
833 static int start_stream_fd(struct userdata
*u
) {
835 bt_audio_msg_header_t rsp
;
836 struct bt_start_stream_req start_req
;
837 struct bt_start_stream_rsp start_rsp
;
838 struct bt_new_stream_ind streamfd_ind
;
839 bt_audio_error_t error
;
840 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
844 pa_assert(u
->rtpoll
);
845 pa_assert(!u
->rtpoll_item
);
846 pa_assert(u
->stream_fd
< 0);
848 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
849 msg
.start_req
.h
.type
= BT_REQUEST
;
850 msg
.start_req
.h
.name
= BT_START_STREAM
;
851 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
853 if (service_send(u
, &msg
.start_req
.h
) < 0)
856 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_START_STREAM
, sizeof(msg
.start_rsp
)) < 0)
859 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_NEW_STREAM
, sizeof(msg
.streamfd_ind
)) < 0)
862 if ((u
->stream_fd
= bt_audio_service_get_data_fd(u
->service_fd
)) < 0) {
863 pa_log("Failed to get stream fd from audio service.");
867 return setup_stream(u
);
871 static int stop_stream_fd(struct userdata
*u
) {
873 bt_audio_msg_header_t rsp
;
874 struct bt_stop_stream_req start_req
;
875 struct bt_stop_stream_rsp start_rsp
;
876 bt_audio_error_t error
;
877 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
882 pa_assert(u
->rtpoll
);
884 if (u
->rtpoll_item
) {
885 pa_rtpoll_item_free(u
->rtpoll_item
);
886 u
->rtpoll_item
= NULL
;
889 if (u
->stream_fd
>= 0) {
890 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
891 msg
.start_req
.h
.type
= BT_REQUEST
;
892 msg
.start_req
.h
.name
= BT_STOP_STREAM
;
893 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
895 if (service_send(u
, &msg
.start_req
.h
) < 0 ||
896 service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_STOP_STREAM
, sizeof(msg
.start_rsp
)) < 0)
899 pa_close(u
->stream_fd
);
903 if (u
->read_smoother
) {
904 pa_smoother_free(u
->read_smoother
);
905 u
->read_smoother
= NULL
;
911 static void bt_transport_release(struct userdata
*u
) {
912 const char *accesstype
= "rw";
913 const pa_bluetooth_transport
*t
;
915 /* Ignore if already released */
919 pa_log_debug("Releasing transport %s", u
->transport
);
921 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
923 pa_bluetooth_transport_release(t
, accesstype
);
925 pa_xfree(u
->accesstype
);
926 u
->accesstype
= NULL
;
928 if (u
->rtpoll_item
) {
929 pa_rtpoll_item_free(u
->rtpoll_item
);
930 u
->rtpoll_item
= NULL
;
933 if (u
->stream_fd
>= 0) {
934 pa_close(u
->stream_fd
);
938 if (u
->read_smoother
) {
939 pa_smoother_free(u
->read_smoother
);
940 u
->read_smoother
= NULL
;
944 static int bt_transport_acquire(struct userdata
*u
, pa_bool_t start
) {
945 const char *accesstype
= "rw";
946 const pa_bluetooth_transport
*t
;
954 pa_log_debug("Acquiring transport %s", u
->transport
);
956 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
958 pa_log("Transport %s no longer available", u
->transport
);
959 pa_xfree(u
->transport
);
964 /* FIXME: Handle in/out MTU properly when unix socket is not longer supported */
965 u
->stream_fd
= pa_bluetooth_transport_acquire(t
, accesstype
, NULL
, &u
->link_mtu
);
966 if (u
->stream_fd
< 0)
969 u
->accesstype
= pa_xstrdup(accesstype
);
970 pa_log_info("Transport %s acquired: fd %d", u
->transport
, u
->stream_fd
);
976 pa_log_info("Transport %s resuming", u
->transport
);
977 return setup_stream(u
);
980 /* Run from IO thread */
981 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
982 struct userdata
*u
= PA_SINK(o
)->userdata
;
983 pa_bool_t failed
= FALSE
;
986 pa_assert(u
->sink
== PA_SINK(o
));
990 case PA_SINK_MESSAGE_SET_STATE
:
992 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
994 case PA_SINK_SUSPENDED
:
995 pa_assert(PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
));
997 /* Stop the device if the source is suspended as well */
998 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
) {
999 /* We deliberately ignore whether stopping
1000 * actually worked. Since the stream_fd is
1001 * closed it doesn't really matter */
1003 bt_transport_release(u
);
1011 case PA_SINK_RUNNING
:
1012 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
1015 /* Resume the device if the source was suspended as well */
1016 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
) {
1018 if (bt_transport_acquire(u
, TRUE
) < 0)
1020 } else if (start_stream_fd(u
) < 0)
1025 case PA_SINK_UNLINKED
:
1027 case PA_SINK_INVALID_STATE
:
1032 case PA_SINK_MESSAGE_GET_LATENCY
: {
1034 if (u
->read_smoother
) {
1037 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
1038 wi
= pa_bytes_to_usec(u
->write_index
+ u
->block_size
, &u
->sample_spec
);
1040 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
1044 ri
= pa_rtclock_now() - u
->started_at
;
1045 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1047 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
1050 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
1055 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
1057 return (r
< 0 || !failed
) ? r
: -1;
1060 /* Run from IO thread */
1061 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
1062 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
1063 pa_bool_t failed
= FALSE
;
1066 pa_assert(u
->source
== PA_SOURCE(o
));
1070 case PA_SOURCE_MESSAGE_SET_STATE
:
1072 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
1074 case PA_SOURCE_SUSPENDED
:
1075 pa_assert(PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
));
1077 /* Stop the device if the sink is suspended as well */
1078 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
) {
1080 bt_transport_release(u
);
1085 if (u
->read_smoother
)
1086 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
1089 case PA_SOURCE_IDLE
:
1090 case PA_SOURCE_RUNNING
:
1091 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
1094 /* Resume the device if the sink was suspended as well */
1095 if (!u
->sink
|| u
->sink
->thread_info
.state
== PA_SINK_SUSPENDED
) {
1097 if (bt_transport_acquire(u
, TRUE
) < 0)
1099 } else if (start_stream_fd(u
) < 0)
1102 /* We don't resume the smoother here. Instead we
1103 * wait until the first packet arrives */
1106 case PA_SOURCE_UNLINKED
:
1107 case PA_SOURCE_INIT
:
1108 case PA_SOURCE_INVALID_STATE
:
1113 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
1116 if (u
->read_smoother
) {
1117 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
1118 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
1120 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
1122 *((pa_usec_t
*) data
) = 0;
1129 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
1131 return (r
< 0 || !failed
) ? r
: -1;
1134 /* Called from main thread context */
1135 static int device_process_msg(pa_msgobject
*obj
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
1136 struct bluetooth_msg
*u
= BLUETOOTH_MSG(obj
);
1139 case BLUETOOTH_MESSAGE_IO_THREAD_FAILED
: {
1140 if (u
->card
->module
->unload_requested
)
1143 pa_log_debug("Switching the profile to off due to IO thread failure.");
1145 if (pa_card_set_profile(u
->card
, "off", FALSE
) < 0)
1146 pa_log_debug("Failed to switch profile to off");
1153 /* Run from IO thread */
1154 static int hsp_process_render(struct userdata
*u
) {
1158 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
1161 /* First, render some data */
1162 if (!u
->write_memchunk
.memblock
)
1163 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1165 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1171 /* Now write that data to the socket. The socket is of type
1172 * SEQPACKET, and we generated the data of the MTU size, so this
1173 * should just work. */
1175 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1176 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
1177 pa_memblock_release(u
->write_memchunk
.memblock
);
1184 /* Retry right away if we got interrupted */
1187 else if (errno
== EAGAIN
)
1188 /* Hmm, apparently the socket was not writable, give up for now */
1191 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
1196 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
1198 if ((size_t) l
!= u
->write_memchunk
.length
) {
1199 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1200 (unsigned long long) l
,
1201 (unsigned long long) u
->write_memchunk
.length
);
1206 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1207 pa_memblock_unref(u
->write_memchunk
.memblock
);
1208 pa_memchunk_reset(&u
->write_memchunk
);
1217 /* Run from IO thread */
1218 static int hsp_process_push(struct userdata
*u
) {
1220 pa_memchunk memchunk
;
1223 pa_assert(u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
);
1224 pa_assert(u
->source
);
1225 pa_assert(u
->read_smoother
);
1227 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1228 memchunk
.index
= memchunk
.length
= 0;
1237 pa_bool_t found_tstamp
= FALSE
;
1240 memset(&m
, 0, sizeof(m
));
1241 memset(&aux
, 0, sizeof(aux
));
1242 memset(&iov
, 0, sizeof(iov
));
1246 m
.msg_control
= aux
;
1247 m
.msg_controllen
= sizeof(aux
);
1249 p
= pa_memblock_acquire(memchunk
.memblock
);
1251 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
1252 l
= recvmsg(u
->stream_fd
, &m
, 0);
1253 pa_memblock_release(memchunk
.memblock
);
1257 if (l
< 0 && errno
== EINTR
)
1258 /* Retry right away if we got interrupted */
1261 else if (l
< 0 && errno
== EAGAIN
)
1262 /* Hmm, apparently the socket was not readable, give up for now. */
1265 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1270 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
1272 memchunk
.length
= (size_t) l
;
1273 u
->read_index
+= (uint64_t) l
;
1275 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
1276 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
1277 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
1278 pa_rtclock_from_wallclock(tv
);
1279 tstamp
= pa_timeval_load(tv
);
1280 found_tstamp
= TRUE
;
1284 if (!found_tstamp
) {
1285 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1286 tstamp
= pa_rtclock_now();
1289 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1290 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1292 pa_source_post(u
->source
, &memchunk
);
1298 pa_memblock_unref(memchunk
.memblock
);
1303 /* Run from IO thread */
1304 static void a2dp_prepare_buffer(struct userdata
*u
) {
1307 if (u
->a2dp
.buffer_size
>= u
->link_mtu
)
1310 u
->a2dp
.buffer_size
= 2 * u
->link_mtu
;
1311 pa_xfree(u
->a2dp
.buffer
);
1312 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
1315 /* Run from IO thread */
1316 static int a2dp_process_render(struct userdata
*u
) {
1317 struct a2dp_info
*a2dp
;
1318 struct rtp_header
*header
;
1319 struct rtp_payload
*payload
;
1323 size_t to_write
, to_encode
;
1324 unsigned frame_count
;
1328 pa_assert(u
->profile
== PROFILE_A2DP
);
1331 /* First, render some data */
1332 if (!u
->write_memchunk
.memblock
)
1333 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1335 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1337 a2dp_prepare_buffer(u
);
1340 header
= a2dp
->buffer
;
1341 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1345 /* Try to create a packet of the full MTU */
1347 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1348 to_encode
= u
->write_memchunk
.length
;
1350 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1351 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
1353 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
1357 encoded
= sbc_encode(&a2dp
->sbc
,
1362 if (PA_UNLIKELY(encoded
<= 0)) {
1363 pa_log_error("SBC encoding error (%li)", (long) encoded
);
1364 pa_memblock_release(u
->write_memchunk
.memblock
);
1368 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
1369 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
1371 pa_assert_fp((size_t) encoded
<= to_encode
);
1372 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
1374 pa_assert_fp((size_t) written
<= to_write
);
1375 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
1377 p
= (const uint8_t*) p
+ encoded
;
1378 to_encode
-= encoded
;
1380 d
= (uint8_t*) d
+ written
;
1381 to_write
-= written
;
1386 pa_memblock_release(u
->write_memchunk
.memblock
);
1388 pa_assert(to_encode
== 0);
1391 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
1394 /* write it to the fifo */
1395 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
1398 header
->sequence_number
= htons(a2dp
->seq_num
++);
1399 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
1400 header
->ssrc
= htonl(1);
1401 payload
->frame_count
= frame_count
;
1403 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
1408 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
1415 /* Retry right away if we got interrupted */
1418 else if (errno
== EAGAIN
)
1419 /* Hmm, apparently the socket was not writable, give up for now */
1422 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
1427 pa_assert((size_t) l
<= nbytes
);
1429 if ((size_t) l
!= nbytes
) {
1430 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1431 (unsigned long long) l
,
1432 (unsigned long long) nbytes
);
1437 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1438 pa_memblock_unref(u
->write_memchunk
.memblock
);
1439 pa_memchunk_reset(&u
->write_memchunk
);
1449 static int a2dp_process_push(struct userdata
*u
) {
1451 pa_memchunk memchunk
;
1454 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
1455 pa_assert(u
->source
);
1456 pa_assert(u
->read_smoother
);
1458 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1459 memchunk
.index
= memchunk
.length
= 0;
1462 pa_bool_t found_tstamp
= FALSE
;
1464 struct a2dp_info
*a2dp
;
1465 struct rtp_header
*header
;
1466 struct rtp_payload
*payload
;
1470 size_t to_write
, to_decode
;
1472 a2dp_prepare_buffer(u
);
1475 header
= a2dp
->buffer
;
1476 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1478 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
1482 if (l
< 0 && errno
== EINTR
)
1483 /* Retry right away if we got interrupted */
1486 else if (l
< 0 && errno
== EAGAIN
)
1487 /* Hmm, apparently the socket was not readable, give up for now. */
1490 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1495 pa_assert((size_t) l
<= a2dp
->buffer_size
);
1497 u
->read_index
+= (uint64_t) l
;
1499 /* TODO: get timestamp from rtp */
1500 if (!found_tstamp
) {
1501 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
1502 tstamp
= pa_rtclock_now();
1505 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1506 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1508 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1509 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
1511 d
= pa_memblock_acquire(memchunk
.memblock
);
1512 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
1514 while (PA_LIKELY(to_decode
> 0)) {
1518 decoded
= sbc_decode(&a2dp
->sbc
,
1523 if (PA_UNLIKELY(decoded
<= 0)) {
1524 pa_log_error("SBC decoding error (%li)", (long) decoded
);
1525 pa_memblock_release(memchunk
.memblock
);
1526 pa_memblock_unref(memchunk
.memblock
);
1530 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
1531 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
1533 /* Reset frame length, it can be changed due to bitpool change */
1534 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
1536 pa_assert_fp((size_t) decoded
<= to_decode
);
1537 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
1539 pa_assert_fp((size_t) written
== a2dp
->codesize
);
1541 p
= (const uint8_t*) p
+ decoded
;
1542 to_decode
-= decoded
;
1544 d
= (uint8_t*) d
+ written
;
1545 to_write
-= written
;
1548 memchunk
.length
-= to_write
;
1550 pa_memblock_release(memchunk
.memblock
);
1552 pa_source_post(u
->source
, &memchunk
);
1558 pa_memblock_unref(memchunk
.memblock
);
1563 static void a2dp_reduce_bitpool(struct userdata
*u
)
1565 struct a2dp_info
*a2dp
;
1572 /* Check if bitpool is already at its limit */
1573 if (a2dp
->sbc
.bitpool
<= BITPOOL_DEC_LIMIT
)
1576 bitpool
= a2dp
->sbc
.bitpool
- BITPOOL_DEC_STEP
;
1578 if (bitpool
< BITPOOL_DEC_LIMIT
)
1579 bitpool
= BITPOOL_DEC_LIMIT
;
1581 a2dp_set_bitpool(u
, bitpool
);
1584 static void thread_func(void *userdata
) {
1585 struct userdata
*u
= userdata
;
1586 unsigned do_write
= 0;
1587 pa_bool_t writable
= FALSE
;
1591 pa_log_debug("IO Thread starting up");
1593 if (u
->core
->realtime_scheduling
)
1594 pa_make_realtime(u
->core
->realtime_priority
);
1596 pa_thread_mq_install(&u
->thread_mq
);
1599 if (bt_transport_acquire(u
, TRUE
) < 0)
1601 } else if (start_stream_fd(u
) < 0)
1605 struct pollfd
*pollfd
;
1607 pa_bool_t disable_timer
= TRUE
;
1609 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1611 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
1613 /* We should send two blocks to the device before we expect
1616 if (u
->write_index
== 0 && u
->read_index
<= 0)
1619 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
1622 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
)
1623 n_read
= hsp_process_push(u
);
1625 n_read
= a2dp_process_push(u
);
1630 /* We just read something, so we are supposed to write something, too */
1635 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1637 if (u
->sink
->thread_info
.rewind_requested
)
1638 pa_sink_process_rewind(u
->sink
, 0);
1641 if (pollfd
->revents
& POLLOUT
)
1644 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1645 pa_usec_t time_passed
;
1646 pa_usec_t audio_sent
;
1648 /* Hmm, there is no input stream we could synchronize
1649 * to. So let's do things by time */
1651 time_passed
= pa_rtclock_now() - u
->started_at
;
1652 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1654 if (audio_sent
<= time_passed
) {
1655 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1657 /* Never try to catch up for more than 100ms */
1658 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1659 pa_usec_t skip_usec
;
1660 uint64_t skip_bytes
;
1662 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1663 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1665 if (skip_bytes
> 0) {
1668 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1669 (unsigned long long) skip_usec
,
1670 (unsigned long long) skip_bytes
);
1672 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1673 pa_memblock_unref(tmp
.memblock
);
1674 u
->write_index
+= skip_bytes
;
1676 if (u
->profile
== PROFILE_A2DP
)
1677 a2dp_reduce_bitpool(u
);
1685 if (writable
&& do_write
> 0) {
1688 if (u
->write_index
<= 0)
1689 u
->started_at
= pa_rtclock_now();
1691 if (u
->profile
== PROFILE_A2DP
) {
1692 if ((n_written
= a2dp_process_render(u
)) < 0)
1695 if ((n_written
= hsp_process_render(u
)) < 0)
1700 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1702 do_write
-= n_written
;
1706 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0) {
1707 pa_usec_t sleep_for
;
1708 pa_usec_t time_passed
, next_write_at
;
1711 /* Hmm, there is no input stream we could synchronize
1712 * to. So let's estimate when we need to wake up the latest */
1713 time_passed
= pa_rtclock_now() - u
->started_at
;
1714 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1715 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1716 /* 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); */
1718 /* drop stream every 500 ms */
1719 sleep_for
= PA_USEC_PER_MSEC
* 500;
1721 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1722 disable_timer
= FALSE
;
1728 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1730 /* Hmm, nothing to do. Let's sleep */
1732 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1733 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1735 if ((ret
= pa_rtpoll_run(u
->rtpoll
, TRUE
)) < 0) {
1736 pa_log_debug("pa_rtpoll_run failed with: %d", ret
);
1740 pa_log_debug("IO thread shutdown requested, stopping cleanly");
1742 bt_transport_release(u
);
1748 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1750 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1751 pa_log_info("FD error: %s%s%s%s",
1752 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1753 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1754 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1755 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1761 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1762 pa_log_debug("IO thread failed");
1763 pa_asyncmsgq_post(pa_thread_mq_get()->outq
, PA_MSGOBJECT(u
->msg
), BLUETOOTH_MESSAGE_IO_THREAD_FAILED
, NULL
, 0, NULL
, NULL
);
1764 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1767 pa_log_debug("IO thread shutting down");
1770 /* Run from main thread */
1771 static DBusHandlerResult
filter_cb(DBusConnection
*bus
, DBusMessage
*m
, void *userdata
) {
1777 pa_assert_se(u
= userdata
);
1779 dbus_error_init(&err
);
1781 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1782 dbus_message_get_interface(m
),
1783 dbus_message_get_path(m
),
1784 dbus_message_get_member(m
));
1786 if (!dbus_message_has_path(m
, u
->path
) && !dbus_message_has_path(m
, u
->transport
))
1789 if (dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged") ||
1790 dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1795 if (!dbus_message_get_args(m
, &err
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
) || gain
> HSP_MAX_GAIN
) {
1796 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err
.message
);
1800 if (u
->profile
== PROFILE_HSP
) {
1801 if (u
->sink
&& dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged")) {
1802 pa_volume_t volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1804 /* increment volume by one to correct rounding errors */
1805 if (volume
< PA_VOLUME_NORM
)
1808 pa_cvolume_set(&v
, u
->sample_spec
.channels
, volume
);
1809 pa_sink_volume_changed(u
->sink
, &v
);
1811 } else if (u
->source
&& dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1812 pa_volume_t volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1814 /* increment volume by one to correct rounding errors */
1815 if (volume
< PA_VOLUME_NORM
)
1818 pa_cvolume_set(&v
, u
->sample_spec
.channels
, volume
);
1819 pa_source_volume_changed(u
->source
, &v
);
1822 } else if (dbus_message_is_signal(m
, "org.bluez.HandsfreeGateway", "PropertyChanged")) {
1824 DBusMessageIter iter
;
1825 DBusMessageIter variant
;
1826 pa_bt_audio_state_t state
= PA_BT_AUDIO_STATE_INVALID
;
1828 if (!dbus_message_iter_init(m
, &iter
)) {
1829 pa_log("Failed to parse PropertyChanged: %s", err
.message
);
1833 if (dbus_message_iter_get_arg_type(&iter
) != DBUS_TYPE_STRING
) {
1834 pa_log("Property name not a string.");
1838 dbus_message_iter_get_basic(&iter
, &key
);
1840 if (!dbus_message_iter_next(&iter
)) {
1841 pa_log("Property value missing");
1845 dbus_message_iter_recurse(&iter
, &variant
);
1847 if (dbus_message_iter_get_arg_type(&variant
) == DBUS_TYPE_STRING
) {
1849 dbus_message_iter_get_basic(&variant
, &value
);
1851 if (pa_streq(key
, "State")) {
1852 pa_log_debug("dbus: HSHFAG property 'State' changed to value '%s'", value
);
1853 state
= pa_bt_audio_state_from_string(value
);
1858 case PA_BT_AUDIO_STATE_INVALID
:
1859 case PA_BT_AUDIO_STATE_DISCONNECTED
:
1860 case PA_BT_AUDIO_STATE_CONNECTED
:
1861 case PA_BT_AUDIO_STATE_CONNECTING
:
1864 case PA_BT_AUDIO_STATE_PLAYING
:
1866 pa_log_debug("Changing profile to hfgw");
1867 if (pa_card_set_profile(u
->card
, "hfgw", FALSE
) < 0)
1868 pa_log("Failed to change profile to hfgw");
1875 dbus_error_free(&err
);
1877 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
1880 /* Run from main thread */
1881 static void sink_set_volume_cb(pa_sink
*s
) {
1891 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1892 u
= pa_shared_get(s
->core
, k
);
1896 pa_assert(u
->sink
== s
);
1897 pa_assert(u
->profile
== PROFILE_HSP
);
1899 gain
= (pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
) / PA_VOLUME_NORM
;
1901 if (gain
> HSP_MAX_GAIN
)
1902 gain
= HSP_MAX_GAIN
;
1904 volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1906 /* increment volume by one to correct rounding errors */
1907 if (volume
< PA_VOLUME_NORM
)
1910 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1912 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetSpeakerGain"));
1913 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1914 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1915 dbus_message_unref(m
);
1918 /* Run from main thread */
1919 static void source_set_volume_cb(pa_source
*s
) {
1929 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) s
);
1930 u
= pa_shared_get(s
->core
, k
);
1934 pa_assert(u
->source
== s
);
1935 pa_assert(u
->profile
== PROFILE_HSP
);
1937 gain
= (pa_cvolume_max(&s
->real_volume
) * HSP_MAX_GAIN
) / PA_VOLUME_NORM
;
1939 if (gain
> HSP_MAX_GAIN
)
1940 gain
= HSP_MAX_GAIN
;
1942 volume
= (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ HSP_MAX_GAIN
);
1944 /* increment volume by one to correct rounding errors */
1945 if (volume
< PA_VOLUME_NORM
)
1948 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, volume
);
1950 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetMicrophoneGain"));
1951 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1952 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1953 dbus_message_unref(m
);
1956 /* Run from main thread */
1957 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, pa_bool_t
*namereg_fail
) {
1963 pa_assert(device_id
);
1964 pa_assert(namereg_fail
);
1966 t
= pa_sprintf_malloc("%s_name", type
);
1967 n
= pa_modargs_get_value(ma
, t
, NULL
);
1971 *namereg_fail
= TRUE
;
1972 return pa_xstrdup(n
);
1975 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1976 *namereg_fail
= TRUE
;
1979 *namereg_fail
= FALSE
;
1982 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1985 static int sco_over_pcm_state_update(struct userdata
*u
, pa_bool_t changed
) {
1987 pa_assert(USE_SCO_OVER_PCM(u
));
1989 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1990 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1992 if (u
->service_fd
>= 0 && u
->stream_fd
>= 0)
1997 pa_log_debug("Resuming SCO over PCM");
1998 if (init_profile(u
) < 0) {
1999 pa_log("Can't resume SCO over PCM");
2004 return bt_transport_acquire(u
, TRUE
);
2006 return start_stream_fd(u
);
2010 if (u
->service_fd
< 0 && u
->stream_fd
< 0)
2013 pa_log_debug("Closing SCO over PCM");
2016 bt_transport_release(u
);
2017 else if (u
->stream_fd
>= 0)
2020 if (u
->service_fd
>= 0) {
2021 pa_close(u
->service_fd
);
2029 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
2031 pa_sink_assert_ref(s
);
2034 if (s
!= u
->hsp
.sco_sink
)
2037 sco_over_pcm_state_update(u
, TRUE
);
2042 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
2044 pa_source_assert_ref(s
);
2047 if (s
!= u
->hsp
.sco_source
)
2050 sco_over_pcm_state_update(u
, TRUE
);
2055 static pa_hook_result_t
nrec_changed_cb(pa_bluetooth_transport
*t
, void *call_data
, struct userdata
*u
) {
2061 p
= pa_proplist_new();
2062 pa_proplist_sets(p
, "bluetooth.nrec", t
->nrec
? "1" : "0");
2063 pa_source_update_proplist(u
->source
, PA_UPDATE_REPLACE
, p
);
2064 pa_proplist_free(p
);
2069 static void connect_ports(struct userdata
*u
, void *sink_or_source_new_data
, pa_direction_t direction
) {
2071 pa_sink_new_data
*sink_new_data
;
2072 pa_source_new_data
*source_new_data
;
2074 pa_device_port
*port
;
2076 if (direction
== PA_DIRECTION_OUTPUT
)
2077 data
.sink_new_data
= sink_or_source_new_data
;
2079 data
.source_new_data
= sink_or_source_new_data
;
2081 switch (u
->profile
) {
2083 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-output"));
2084 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
2085 pa_device_port_ref(port
);
2088 case PROFILE_A2DP_SOURCE
:
2089 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "a2dp-input"));
2090 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
2091 pa_device_port_ref(port
);
2095 if (direction
== PA_DIRECTION_OUTPUT
) {
2096 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-output"));
2097 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
2099 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hsp-input"));
2100 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
2102 pa_device_port_ref(port
);
2106 if (direction
== PA_DIRECTION_OUTPUT
) {
2107 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-output"));
2108 pa_assert_se(pa_hashmap_put(data
.sink_new_data
->ports
, port
->name
, port
) >= 0);
2110 pa_assert_se(port
= pa_hashmap_get(u
->card
->ports
, "hfgw-input"));
2111 pa_assert_se(pa_hashmap_put(data
.source_new_data
->ports
, port
->name
, port
) >= 0);
2113 pa_device_port_ref(port
);
2117 pa_assert_not_reached();
2121 /* Run from main thread */
2122 static int add_sink(struct userdata
*u
) {
2125 if (USE_SCO_OVER_PCM(u
)) {
2128 u
->sink
= u
->hsp
.sco_sink
;
2129 p
= pa_proplist_new();
2130 pa_proplist_sets(p
, "bluetooth.protocol", "sco");
2131 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
2132 pa_proplist_free(p
);
2134 if (!u
->hsp
.sink_state_changed_slot
)
2135 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
);
2138 pa_sink_new_data data
;
2141 pa_sink_new_data_init(&data
);
2142 data
.driver
= __FILE__
;
2143 data
.module
= u
->module
;
2144 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
2145 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP
? "a2dp" : "sco");
2146 if (u
->profile
== PROFILE_HSP
)
2147 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
2148 data
.card
= u
->card
;
2149 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
2150 data
.namereg_fail
= b
;
2152 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2153 pa_log("Invalid properties");
2154 pa_sink_new_data_done(&data
);
2157 connect_ports(u
, &data
, PA_DIRECTION_OUTPUT
);
2159 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
);
2160 pa_sink_new_data_done(&data
);
2163 pa_log_error("Failed to create sink");
2167 u
->sink
->userdata
= u
;
2168 u
->sink
->parent
.process_msg
= sink_process_msg
;
2170 pa_sink_set_max_request(u
->sink
, u
->block_size
);
2171 pa_sink_set_fixed_latency(u
->sink
,
2172 (u
->profile
== PROFILE_A2DP
? FIXED_LATENCY_PLAYBACK_A2DP
: FIXED_LATENCY_PLAYBACK_HSP
) +
2173 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
2176 if (u
->profile
== PROFILE_HSP
) {
2177 pa_sink_set_set_volume_callback(u
->sink
, sink_set_volume_cb
);
2178 u
->sink
->n_volume_steps
= 16;
2180 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
2181 pa_shared_set(u
->core
, k
, u
);
2188 /* Run from main thread */
2189 static int add_source(struct userdata
*u
) {
2192 if (USE_SCO_OVER_PCM(u
)) {
2193 u
->source
= u
->hsp
.sco_source
;
2194 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", "hsp");
2196 if (!u
->hsp
.source_state_changed_slot
)
2197 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
);
2200 pa_source_new_data data
;
2203 pa_source_new_data_init(&data
);
2204 data
.driver
= __FILE__
;
2205 data
.module
= u
->module
;
2206 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
2207 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP_SOURCE
? "a2dp_source" : "hsp");
2208 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
))
2209 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
2211 data
.card
= u
->card
;
2212 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
2213 data
.namereg_fail
= b
;
2215 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2216 pa_log("Invalid properties");
2217 pa_source_new_data_done(&data
);
2221 connect_ports(u
, &data
, PA_DIRECTION_INPUT
);
2222 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
);
2223 pa_source_new_data_done(&data
);
2226 pa_log_error("Failed to create source");
2230 u
->source
->userdata
= u
;
2231 u
->source
->parent
.process_msg
= source_process_msg
;
2233 pa_source_set_fixed_latency(u
->source
,
2234 (u
->profile
== PROFILE_A2DP_SOURCE
? FIXED_LATENCY_RECORD_A2DP
: FIXED_LATENCY_RECORD_HSP
) +
2235 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
2238 if ((u
->profile
== PROFILE_HSP
) || (u
->profile
== PROFILE_HFGW
)) {
2240 pa_bluetooth_transport
*t
;
2241 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
2243 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", t
->nrec
? "1" : "0");
2245 if (!u
->hsp
.nrec_changed_slot
)
2246 u
->hsp
.nrec_changed_slot
= pa_hook_connect(&t
->hooks
[PA_BLUETOOTH_TRANSPORT_HOOK_NREC_CHANGED
], PA_HOOK_NORMAL
, (pa_hook_cb_t
) nrec_changed_cb
, u
);
2248 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", (u
->hsp
.pcm_capabilities
.flags
& BT_PCM_FLAG_NREC
) ? "1" : "0");
2251 if (u
->profile
== PROFILE_HSP
) {
2252 pa_source_set_set_volume_callback(u
->source
, source_set_volume_cb
);
2253 u
->source
->n_volume_steps
= 16;
2255 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
2256 pa_shared_set(u
->core
, k
, u
);
2263 /* Run from main thread */
2264 static void shutdown_bt(struct userdata
*u
) {
2267 if (u
->stream_fd
>= 0) {
2268 pa_close(u
->stream_fd
);
2271 u
->stream_write_type
= 0;
2274 if (u
->service_fd
>= 0) {
2275 pa_close(u
->service_fd
);
2277 u
->service_write_type
= 0;
2278 u
->service_read_type
= 0;
2281 if (u
->write_memchunk
.memblock
) {
2282 pa_memblock_unref(u
->write_memchunk
.memblock
);
2283 pa_memchunk_reset(&u
->write_memchunk
);
2287 static int bt_transport_config_a2dp(struct userdata
*u
) {
2288 const pa_bluetooth_transport
*t
;
2289 struct a2dp_info
*a2dp
= &u
->a2dp
;
2292 t
= pa_bluetooth_discovery_get_transport(u
->discovery
, u
->transport
);
2295 config
= (a2dp_sbc_t
*) t
->config
;
2297 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
2299 if (a2dp
->sbc_initialized
)
2300 sbc_reinit(&a2dp
->sbc
, 0);
2302 sbc_init(&a2dp
->sbc
, 0);
2303 a2dp
->sbc_initialized
= TRUE
;
2305 switch (config
->frequency
) {
2306 case BT_SBC_SAMPLING_FREQ_16000
:
2307 a2dp
->sbc
.frequency
= SBC_FREQ_16000
;
2308 u
->sample_spec
.rate
= 16000U;
2310 case BT_SBC_SAMPLING_FREQ_32000
:
2311 a2dp
->sbc
.frequency
= SBC_FREQ_32000
;
2312 u
->sample_spec
.rate
= 32000U;
2314 case BT_SBC_SAMPLING_FREQ_44100
:
2315 a2dp
->sbc
.frequency
= SBC_FREQ_44100
;
2316 u
->sample_spec
.rate
= 44100U;
2318 case BT_SBC_SAMPLING_FREQ_48000
:
2319 a2dp
->sbc
.frequency
= SBC_FREQ_48000
;
2320 u
->sample_spec
.rate
= 48000U;
2323 pa_assert_not_reached();
2326 switch (config
->channel_mode
) {
2327 case BT_A2DP_CHANNEL_MODE_MONO
:
2328 a2dp
->sbc
.mode
= SBC_MODE_MONO
;
2329 u
->sample_spec
.channels
= 1;
2331 case BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL
:
2332 a2dp
->sbc
.mode
= SBC_MODE_DUAL_CHANNEL
;
2333 u
->sample_spec
.channels
= 2;
2335 case BT_A2DP_CHANNEL_MODE_STEREO
:
2336 a2dp
->sbc
.mode
= SBC_MODE_STEREO
;
2337 u
->sample_spec
.channels
= 2;
2339 case BT_A2DP_CHANNEL_MODE_JOINT_STEREO
:
2340 a2dp
->sbc
.mode
= SBC_MODE_JOINT_STEREO
;
2341 u
->sample_spec
.channels
= 2;
2344 pa_assert_not_reached();
2347 switch (config
->allocation_method
) {
2348 case BT_A2DP_ALLOCATION_SNR
:
2349 a2dp
->sbc
.allocation
= SBC_AM_SNR
;
2351 case BT_A2DP_ALLOCATION_LOUDNESS
:
2352 a2dp
->sbc
.allocation
= SBC_AM_LOUDNESS
;
2355 pa_assert_not_reached();
2358 switch (config
->subbands
) {
2359 case BT_A2DP_SUBBANDS_4
:
2360 a2dp
->sbc
.subbands
= SBC_SB_4
;
2362 case BT_A2DP_SUBBANDS_8
:
2363 a2dp
->sbc
.subbands
= SBC_SB_8
;
2366 pa_assert_not_reached();
2369 switch (config
->block_length
) {
2370 case BT_A2DP_BLOCK_LENGTH_4
:
2371 a2dp
->sbc
.blocks
= SBC_BLK_4
;
2373 case BT_A2DP_BLOCK_LENGTH_8
:
2374 a2dp
->sbc
.blocks
= SBC_BLK_8
;
2376 case BT_A2DP_BLOCK_LENGTH_12
:
2377 a2dp
->sbc
.blocks
= SBC_BLK_12
;
2379 case BT_A2DP_BLOCK_LENGTH_16
:
2380 a2dp
->sbc
.blocks
= SBC_BLK_16
;
2383 pa_assert_not_reached();
2386 a2dp
->min_bitpool
= config
->min_bitpool
;
2387 a2dp
->max_bitpool
= config
->max_bitpool
;
2389 /* Set minimum bitpool for source to get the maximum possible block_size */
2390 a2dp
->sbc
.bitpool
= u
->profile
== PROFILE_A2DP
? a2dp
->max_bitpool
: a2dp
->min_bitpool
;
2391 a2dp
->codesize
= sbc_get_codesize(&a2dp
->sbc
);
2392 a2dp
->frame_length
= sbc_get_frame_length(&a2dp
->sbc
);
2395 ((u
->link_mtu
- sizeof(struct rtp_header
) - sizeof(struct rtp_payload
))
2396 / a2dp
->frame_length
2399 pa_log_info("SBC parameters:\n\tallocation=%u\n\tsubbands=%u\n\tblocks=%u\n\tbitpool=%u\n",
2400 a2dp
->sbc
.allocation
, a2dp
->sbc
.subbands
, a2dp
->sbc
.blocks
, a2dp
->sbc
.bitpool
);
2405 static int bt_transport_config(struct userdata
*u
) {
2406 if (u
->profile
== PROFILE_HSP
|| u
->profile
== PROFILE_HFGW
) {
2407 u
->block_size
= u
->link_mtu
;
2408 u
->sample_spec
.format
= PA_SAMPLE_S16LE
;
2409 u
->sample_spec
.channels
= 1;
2410 u
->sample_spec
.rate
= 8000;
2414 return bt_transport_config_a2dp(u
);
2417 /* Run from main thread */
2418 static int bt_transport_open(struct userdata
*u
) {
2419 if (bt_transport_acquire(u
, FALSE
) < 0)
2422 return bt_transport_config(u
);
2425 /* Run from main thread */
2426 static int init_bt(struct userdata
*u
) {
2431 u
->stream_write_type
= 0;
2432 u
->service_write_type
= 0;
2433 u
->service_read_type
= 0;
2435 if ((u
->service_fd
= bt_audio_service_open()) < 0) {
2436 pa_log_warn("Bluetooth audio service not available");
2440 pa_log_debug("Connected to the bluetooth audio service");
2445 /* Run from main thread */
2446 static int setup_bt(struct userdata
*u
) {
2447 const pa_bluetooth_device
*d
;
2448 const pa_bluetooth_transport
*t
;
2452 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
2453 pa_log_error("Failed to get device object.");
2457 /* release transport if exist */
2459 bt_transport_release(u
);
2460 pa_xfree(u
->transport
);
2461 u
->transport
= NULL
;
2464 /* check if profile has a transport */
2465 t
= pa_bluetooth_device_get_transport(d
, u
->profile
);
2467 u
->transport
= pa_xstrdup(t
->path
);
2468 return bt_transport_open(u
);
2471 if (get_caps(u
, 0) < 0)
2474 pa_log_debug("Got device capabilities");
2476 if (set_conf(u
) < 0)
2479 pa_log_debug("Connection to the device configured");
2481 if (USE_SCO_OVER_PCM(u
)) {
2482 pa_log_debug("Configured to use SCO over PCM");
2486 pa_log_debug("Got the stream socket");
2491 /* Run from main thread */
2492 static int init_profile(struct userdata
*u
) {
2495 pa_assert(u
->profile
!= PROFILE_OFF
);
2497 if (setup_bt(u
) < 0)
2500 if (u
->profile
== PROFILE_A2DP
||
2501 u
->profile
== PROFILE_HSP
||
2502 u
->profile
== PROFILE_HFGW
)
2503 if (add_sink(u
) < 0)
2506 if (u
->profile
== PROFILE_HSP
||
2507 u
->profile
== PROFILE_A2DP_SOURCE
||
2508 u
->profile
== PROFILE_HFGW
)
2509 if (add_source(u
) < 0)
2515 /* Run from main thread */
2516 static void stop_thread(struct userdata
*u
) {
2522 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
2523 pa_thread_free(u
->thread
);
2527 if (u
->rtpoll_item
) {
2528 pa_rtpoll_item_free(u
->rtpoll_item
);
2529 u
->rtpoll_item
= NULL
;
2532 if (u
->hsp
.sink_state_changed_slot
) {
2533 pa_hook_slot_free(u
->hsp
.sink_state_changed_slot
);
2534 u
->hsp
.sink_state_changed_slot
= NULL
;
2537 if (u
->hsp
.source_state_changed_slot
) {
2538 pa_hook_slot_free(u
->hsp
.source_state_changed_slot
);
2539 u
->hsp
.source_state_changed_slot
= NULL
;
2542 if (u
->hsp
.nrec_changed_slot
) {
2543 pa_hook_slot_free(u
->hsp
.nrec_changed_slot
);
2544 u
->hsp
.nrec_changed_slot
= NULL
;
2548 if (u
->profile
== PROFILE_HSP
) {
2549 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
2550 pa_shared_remove(u
->core
, k
);
2554 pa_sink_unref(u
->sink
);
2559 if (u
->profile
== PROFILE_HSP
) {
2560 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
2561 pa_shared_remove(u
->core
, k
);
2565 pa_source_unref(u
->source
);
2570 pa_thread_mq_done(&u
->thread_mq
);
2572 pa_rtpoll_free(u
->rtpoll
);
2576 if (u
->read_smoother
) {
2577 pa_smoother_free(u
->read_smoother
);
2578 u
->read_smoother
= NULL
;
2582 /* Run from main thread */
2583 static int start_thread(struct userdata
*u
) {
2585 pa_assert(!u
->thread
);
2586 pa_assert(!u
->rtpoll
);
2587 pa_assert(!u
->rtpoll_item
);
2589 u
->rtpoll
= pa_rtpoll_new();
2590 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
2592 if (USE_SCO_OVER_PCM(u
)) {
2593 if (sco_over_pcm_state_update(u
, FALSE
) < 0) {
2597 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->sink
);
2598 pa_shared_remove(u
->core
, k
);
2603 k
= pa_sprintf_malloc("bluetooth-device@%p", (void*) u
->source
);
2604 pa_shared_remove(u
->core
, k
);
2611 pa_sink_ref(u
->sink
);
2612 pa_source_ref(u
->source
);
2613 /* FIXME: monitor stream_fd error */
2617 if (!(u
->thread
= pa_thread_new("bluetooth", thread_func
, u
))) {
2618 pa_log_error("Failed to create IO thread");
2624 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
2625 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
2626 pa_sink_put(u
->sink
);
2628 if (u
->sink
->set_volume
)
2629 u
->sink
->set_volume(u
->sink
);
2633 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
2634 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
2635 pa_source_put(u
->source
);
2637 if (u
->source
->set_volume
)
2638 u
->source
->set_volume(u
->source
);
2644 static void save_sco_volume_callbacks(struct userdata
*u
) {
2646 pa_assert(USE_SCO_OVER_PCM(u
));
2648 u
->hsp
.sco_sink_set_volume
= u
->hsp
.sco_sink
->set_volume
;
2649 u
->hsp
.sco_source_set_volume
= u
->hsp
.sco_source
->set_volume
;
2652 static void restore_sco_volume_callbacks(struct userdata
*u
) {
2654 pa_assert(USE_SCO_OVER_PCM(u
));
2656 pa_sink_set_set_volume_callback(u
->hsp
.sco_sink
, u
->hsp
.sco_sink_set_volume
);
2657 pa_source_set_set_volume_callback(u
->hsp
.sco_source
, u
->hsp
.sco_source_set_volume
);
2660 /* Run from main thread */
2661 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
2664 pa_queue
*inputs
= NULL
, *outputs
= NULL
;
2665 const pa_bluetooth_device
*device
;
2668 pa_assert(new_profile
);
2669 pa_assert_se(u
= c
->userdata
);
2671 d
= PA_CARD_PROFILE_DATA(new_profile
);
2673 if (!(device
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
2674 pa_log_error("Failed to get device object.");
2678 /* The state signal is sent by bluez, so it is racy to check
2679 strictly for CONNECTED, we should also accept STREAMING state
2680 as being good enough. However, if the profile is used
2681 concurrently (which is unlikely), ipc will fail later on, and
2682 module will be unloaded. */
2683 if (device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) {
2684 pa_log_warn("HSP is not connected, refused to switch profile");
2687 else if (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) {
2688 pa_log_warn("A2DP is not connected, refused to switch profile");
2691 else if (device
->hfgw_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
) {
2692 pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
2697 inputs
= pa_sink_move_all_start(u
->sink
, NULL
);
2699 if (!USE_SCO_OVER_PCM(u
))
2700 pa_sink_unlink(u
->sink
);
2704 outputs
= pa_source_move_all_start(u
->source
, NULL
);
2706 if (!USE_SCO_OVER_PCM(u
))
2707 pa_source_unlink(u
->source
);
2712 if (u
->profile
!= PROFILE_OFF
&& u
->transport
) {
2713 bt_transport_release(u
);
2714 pa_xfree(u
->transport
);
2715 u
->transport
= NULL
;
2720 if (USE_SCO_OVER_PCM(u
))
2721 restore_sco_volume_callbacks(u
);
2724 u
->sample_spec
= u
->requested_sample_spec
;
2726 if (USE_SCO_OVER_PCM(u
))
2727 save_sco_volume_callbacks(u
);
2731 if (u
->profile
!= PROFILE_OFF
)
2734 if (u
->sink
|| u
->source
)
2739 pa_sink_move_all_finish(u
->sink
, inputs
, FALSE
);
2741 pa_sink_move_all_fail(inputs
);
2746 pa_source_move_all_finish(u
->source
, outputs
, FALSE
);
2748 pa_source_move_all_fail(outputs
);
2754 static void create_ports_for_profile(struct userdata
*u
, pa_card_new_data
*card_new_data
, pa_card_profile
*profile
) {
2755 pa_device_port
*port
;
2758 d
= PA_CARD_PROFILE_DATA(profile
);
2762 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-output", _("Bluetooth High Quality (A2DP)"), 0));
2763 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2764 port
->is_output
= 1;
2766 port
->priority
= profile
->priority
* 100;
2767 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2770 case PROFILE_A2DP_SOURCE
:
2771 pa_assert_se(port
= pa_device_port_new(u
->core
, "a2dp-input", _("Bluetooth High Quality (A2DP)"), 0));
2772 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2773 port
->is_output
= 0;
2775 port
->priority
= profile
->priority
* 100;
2776 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2780 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-output", _("Bluetooth Telephony (HSP/HFP)"), 0));
2781 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2782 port
->is_output
= 1;
2784 port
->priority
= profile
->priority
* 100;
2785 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2787 pa_assert_se(port
= pa_device_port_new(u
->core
, "hsp-input", _("Bluetooth Telephony (HSP/HFP)"), 0));
2788 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2789 port
->is_output
= 0;
2791 port
->priority
= profile
->priority
* 100;
2792 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2796 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-output", _("Bluetooth Handsfree Gateway"), 0));
2797 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2798 port
->is_output
= 1;
2800 port
->priority
= profile
->priority
* 100;
2801 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2803 pa_assert_se(port
= pa_device_port_new(u
->core
, "hfgw-input", _("Bluetooth Handsfree Gateway"), 0));
2804 pa_assert_se(pa_hashmap_put(card_new_data
->ports
, port
->name
, port
) >= 0);
2805 port
->is_output
= 0;
2807 port
->priority
= profile
->priority
* 100;
2808 pa_hashmap_put(port
->profiles
, profile
->name
, profile
);
2812 pa_assert_not_reached();
2817 /* Run from main thread */
2818 static int add_card(struct userdata
*u
, const pa_bluetooth_device
*device
) {
2819 pa_card_new_data data
;
2825 const char *default_profile
;
2830 pa_card_new_data_init(&data
);
2831 data
.driver
= __FILE__
;
2832 data
.module
= u
->module
;
2834 n
= pa_bluetooth_cleanup_name(device
->name
);
2835 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2837 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2838 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2839 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2840 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2841 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2842 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2843 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2844 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2845 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2846 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2847 data
.namereg_fail
= b
;
2849 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2850 pa_log("Invalid properties");
2851 pa_card_new_data_done(&data
);
2855 /* we base hsp/a2dp availability on UUIDs.
2856 Ideally, it would be based on "Connected" state, but
2857 we can't afford to wait for this information when
2858 we are loaded with profile="hsp", for instance */
2859 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SINK_UUID
)) {
2860 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2864 p
->max_sink_channels
= 2;
2865 p
->max_source_channels
= 0;
2867 d
= PA_CARD_PROFILE_DATA(p
);
2869 create_ports_for_profile(u
, &data
, p
);
2871 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2874 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SOURCE_UUID
)) {
2875 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2879 p
->max_sink_channels
= 0;
2880 p
->max_source_channels
= 2;
2882 d
= PA_CARD_PROFILE_DATA(p
);
2883 *d
= PROFILE_A2DP_SOURCE
;
2884 create_ports_for_profile(u
, &data
, p
);
2886 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2889 if (pa_bluetooth_uuid_has(device
->uuids
, HSP_HS_UUID
) ||
2890 pa_bluetooth_uuid_has(device
->uuids
, HFP_HS_UUID
)) {
2891 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2895 p
->max_sink_channels
= 1;
2896 p
->max_source_channels
= 1;
2898 d
= PA_CARD_PROFILE_DATA(p
);
2900 create_ports_for_profile(u
, &data
, p
);
2902 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2905 if (pa_bluetooth_uuid_has(device
->uuids
, HFP_AG_UUID
)) {
2906 p
= pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile
));
2910 p
->max_sink_channels
= 1;
2911 p
->max_source_channels
= 1;
2913 d
= PA_CARD_PROFILE_DATA(p
);
2915 create_ports_for_profile(u
, &data
, p
);
2917 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2920 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2922 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2923 d
= PA_CARD_PROFILE_DATA(p
);
2925 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2927 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2928 if (pa_hashmap_get(data
.profiles
, default_profile
))
2929 pa_card_new_data_set_profile(&data
, default_profile
);
2931 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2934 u
->card
= pa_card_new(u
->core
, &data
);
2935 pa_card_new_data_done(&data
);
2938 pa_log("Failed to allocate card.");
2942 u
->card
->userdata
= u
;
2943 u
->card
->set_profile
= card_set_profile
;
2945 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2947 if ((device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) ||
2948 (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) ||
2949 (device
->hfgw_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HFGW
)) {
2950 pa_log_warn("Default profile not connected, selecting off profile");
2951 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2952 u
->card
->save_profile
= FALSE
;
2955 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2958 if (USE_SCO_OVER_PCM(u
))
2959 save_sco_volume_callbacks(u
);
2964 /* Run from main thread */
2965 static const pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2966 const pa_bluetooth_device
*d
= NULL
;
2970 if (!address
&& !path
) {
2971 pa_log_error("Failed to get device address/path from module arguments.");
2976 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2977 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2981 if (address
&& !(pa_streq(d
->address
, address
))) {
2982 pa_log_error("Passed path %s address %s != %s don't match.", path
, d
->address
, address
);
2987 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2988 pa_log_error("%s is not known.", address
);
2994 u
->address
= pa_xstrdup(d
->address
);
2995 u
->path
= pa_xstrdup(d
->path
);
3001 /* Run from main thread */
3002 static int setup_dbus(struct userdata
*u
) {
3005 dbus_error_init(&err
);
3007 u
->connection
= pa_dbus_bus_get(u
->core
, DBUS_BUS_SYSTEM
, &err
);
3009 if (dbus_error_is_set(&err
) || !u
->connection
) {
3010 pa_log("Failed to get D-Bus connection: %s", err
.message
);
3011 dbus_error_free(&err
);
3018 int pa__init(pa_module
* m
) {
3022 const char *address
, *path
;
3024 char *mike
, *speaker
;
3025 const pa_bluetooth_device
*device
;
3029 dbus_error_init(&err
);
3031 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
3032 pa_log_error("Failed to parse module arguments");
3036 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
3041 u
->sample_spec
= m
->core
->default_sample_spec
;
3044 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
3045 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
3046 pa_log("SCO sink not found");
3050 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
3051 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
3052 pa_log("SCO source not found");
3056 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
3057 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
3058 pa_log_error("Failed to get rate from module arguments");
3062 u
->auto_connect
= TRUE
;
3063 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
3064 pa_log("Failed to parse auto_connect= argument");
3068 channels
= u
->sample_spec
.channels
;
3069 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
3070 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
3071 pa_log_error("Failed to get channels from module arguments");
3074 u
->sample_spec
.channels
= (uint8_t) channels
;
3075 u
->requested_sample_spec
= u
->sample_spec
;
3077 address
= pa_modargs_get_value(ma
, "address", NULL
);
3078 path
= pa_modargs_get_value(ma
, "path", NULL
);
3080 if (setup_dbus(u
) < 0)
3083 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
3086 if (!(device
= find_device(u
, address
, path
)))
3089 /* Add the card structure. This will also initialize the default profile */
3090 if (add_card(u
, device
) < 0)
3093 if (!(u
->msg
= pa_msgobject_new(bluetooth_msg
)))
3096 u
->msg
->parent
.process_msg
= device_process_msg
;
3097 u
->msg
->card
= u
->card
;
3099 if (!dbus_connection_add_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
, NULL
)) {
3100 pa_log_error("Failed to add filter function");
3103 u
->filter_added
= TRUE
;
3105 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
3106 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
3108 if (pa_dbus_add_matches(
3109 pa_dbus_connection_get(u
->connection
), &err
,
3112 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
3113 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
3119 pa_log("Failed to add D-Bus matches: %s", err
.message
);
3126 /* Connect to the BT service */
3129 if (u
->profile
!= PROFILE_OFF
)
3130 if (init_profile(u
) < 0)
3133 if (u
->sink
|| u
->source
)
3134 if (start_thread(u
) < 0)
3143 dbus_error_free(&err
);
3148 int pa__get_n_used(pa_module
*m
) {
3152 pa_assert_se(u
= m
->userdata
);
3155 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
3156 (u
->source
? pa_source_linked_by(u
->source
) : 0);
3159 void pa__done(pa_module
*m
) {
3164 if (!(u
= m
->userdata
))
3167 if (u
->sink
&& !USE_SCO_OVER_PCM(u
))
3168 pa_sink_unlink(u
->sink
);
3170 if (u
->source
&& !USE_SCO_OVER_PCM(u
))
3171 pa_source_unlink(u
->source
);
3175 if (USE_SCO_OVER_PCM(u
))
3176 restore_sco_volume_callbacks(u
);
3178 if (u
->connection
) {
3181 char *speaker
, *mike
;
3182 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
3183 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
3185 pa_dbus_remove_matches(pa_dbus_connection_get(u
->connection
), speaker
, mike
,
3186 "type='signal',sender='org.bluez',interface='org.bluez.MediaTransport',member='PropertyChanged'",
3187 "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
3194 if (u
->filter_added
)
3195 dbus_connection_remove_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
);
3197 pa_dbus_connection_unref(u
->connection
);
3204 pa_card_free(u
->card
);
3206 if (u
->read_smoother
)
3207 pa_smoother_free(u
->read_smoother
);
3212 pa_xfree(u
->a2dp
.buffer
);
3214 sbc_finish(&u
->a2dp
.sbc
);
3217 pa_modargs_free(u
->modargs
);
3219 pa_xfree(u
->address
);
3223 bt_transport_release(u
);
3224 pa_xfree(u
->transport
);
3228 pa_bluetooth_discovery_unref(u
->discovery
);