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
29 #include <sys/ioctl.h>
30 #include <linux/sockios.h>
31 #include <arpa/inet.h>
33 #include <pulse/i18n.h>
34 #include <pulse/rtclock.h>
35 #include <pulse/sample.h>
36 #include <pulse/timeval.h>
37 #include <pulse/xmalloc.h>
39 #include <pulsecore/module.h>
40 #include <pulsecore/modargs.h>
41 #include <pulsecore/core-rtclock.h>
42 #include <pulsecore/core-util.h>
43 #include <pulsecore/core-error.h>
44 #include <pulsecore/socket-util.h>
45 #include <pulsecore/thread.h>
46 #include <pulsecore/thread-mq.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"
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> "
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
;
145 pa_bluetooth_discovery
*discovery
;
146 pa_bool_t auto_connect
;
148 pa_dbus_connection
*connection
;
154 pa_thread_mq thread_mq
;
156 pa_rtpoll_item
*rtpoll_item
;
159 uint64_t read_index
, write_index
;
160 pa_usec_t started_at
;
161 pa_smoother
*read_smoother
;
163 pa_memchunk write_memchunk
;
165 pa_sample_spec sample_spec
, requested_sample_spec
;
173 struct a2dp_info a2dp
;
176 enum profile profile
;
180 int stream_write_type
;
181 int service_write_type
, service_read_type
;
183 pa_bool_t filter_added
;
186 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
187 #define FIXED_LATENCY_RECORD_A2DP (25*PA_USEC_PER_MSEC)
188 #define FIXED_LATENCY_PLAYBACK_HSP (125*PA_USEC_PER_MSEC)
189 #define FIXED_LATENCY_RECORD_HSP (25*PA_USEC_PER_MSEC)
191 #define MAX_PLAYBACK_CATCH_UP_USEC (100*PA_USEC_PER_MSEC)
194 #define USE_SCO_OVER_PCM(u) (u->profile == PROFILE_HSP && (u->hsp.sco_sink && u->hsp.sco_source))
197 static int init_bt(struct userdata
*u
);
198 static int init_profile(struct userdata
*u
);
200 static int service_send(struct userdata
*u
, const bt_audio_msg_header_t
*msg
) {
204 pa_assert(u
->service_fd
>= 0);
206 pa_assert(msg
->length
> 0);
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
&& codec
->transport
!= BT_CAPABILITIES_TRANSPORT_SCO
)) {
322 pa_log_error("Got capabilities for wrong codec.");
326 if (u
->profile
== PROFILE_HSP
) {
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
);
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
);
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 */
747 static int start_stream_fd(struct userdata
*u
) {
749 bt_audio_msg_header_t rsp
;
750 struct bt_start_stream_req start_req
;
751 struct bt_start_stream_rsp start_rsp
;
752 struct bt_new_stream_ind streamfd_ind
;
753 bt_audio_error_t error
;
754 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
756 struct pollfd
*pollfd
;
760 pa_assert(u
->rtpoll
);
761 pa_assert(!u
->rtpoll_item
);
762 pa_assert(u
->stream_fd
< 0);
764 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
765 msg
.start_req
.h
.type
= BT_REQUEST
;
766 msg
.start_req
.h
.name
= BT_START_STREAM
;
767 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
769 if (service_send(u
, &msg
.start_req
.h
) < 0)
772 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_START_STREAM
, sizeof(msg
.start_rsp
)) < 0)
775 if (service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_NEW_STREAM
, sizeof(msg
.streamfd_ind
)) < 0)
778 if ((u
->stream_fd
= bt_audio_service_get_data_fd(u
->service_fd
)) < 0) {
779 pa_log("Failed to get stream fd from audio service.");
783 pa_make_fd_nonblock(u
->stream_fd
);
784 pa_make_socket_low_delay(u
->stream_fd
);
787 if (setsockopt(u
->stream_fd
, SOL_SOCKET
, SO_TIMESTAMP
, &one
, sizeof(one
)) < 0)
788 pa_log_warn("Failed to enable SO_TIMESTAMP: %s", pa_cstrerror(errno
));
790 pa_log_debug("Stream properly set up, we're ready to roll!");
792 u
->rtpoll_item
= pa_rtpoll_item_new(u
->rtpoll
, PA_RTPOLL_NEVER
, 1);
793 pollfd
= pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
);
794 pollfd
->fd
= u
->stream_fd
;
795 pollfd
->events
= pollfd
->revents
= 0;
797 u
->read_index
= u
->write_index
= 0;
801 u
->read_smoother
= pa_smoother_new(
814 static int stop_stream_fd(struct userdata
*u
) {
816 bt_audio_msg_header_t rsp
;
817 struct bt_stop_stream_req start_req
;
818 struct bt_stop_stream_rsp start_rsp
;
819 bt_audio_error_t error
;
820 uint8_t buf
[BT_SUGGESTED_BUFFER_SIZE
];
825 pa_assert(u
->rtpoll
);
827 if (u
->rtpoll_item
) {
828 pa_rtpoll_item_free(u
->rtpoll_item
);
829 u
->rtpoll_item
= NULL
;
832 if (u
->stream_fd
>= 0) {
833 memset(msg
.buf
, 0, BT_SUGGESTED_BUFFER_SIZE
);
834 msg
.start_req
.h
.type
= BT_REQUEST
;
835 msg
.start_req
.h
.name
= BT_STOP_STREAM
;
836 msg
.start_req
.h
.length
= sizeof(msg
.start_req
);
838 if (service_send(u
, &msg
.start_req
.h
) < 0 ||
839 service_expect(u
, &msg
.rsp
, sizeof(msg
), BT_STOP_STREAM
, sizeof(msg
.start_rsp
)) < 0)
842 pa_close(u
->stream_fd
);
846 if (u
->read_smoother
) {
847 pa_smoother_free(u
->read_smoother
);
848 u
->read_smoother
= NULL
;
854 /* Run from IO thread */
855 static int sink_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
856 struct userdata
*u
= PA_SINK(o
)->userdata
;
857 pa_bool_t failed
= FALSE
;
860 pa_assert(u
->sink
== PA_SINK(o
));
864 case PA_SINK_MESSAGE_SET_STATE
:
866 switch ((pa_sink_state_t
) PA_PTR_TO_UINT(data
)) {
868 case PA_SINK_SUSPENDED
:
869 pa_assert(PA_SINK_IS_OPENED(u
->sink
->thread_info
.state
));
871 /* Stop the device if the source is suspended as well */
872 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
)
873 /* We deliberately ignore whether stopping
874 * actually worked. Since the stream_fd is
875 * closed it doesn't really matter */
881 case PA_SINK_RUNNING
:
882 if (u
->sink
->thread_info
.state
!= PA_SINK_SUSPENDED
)
885 /* Resume the device if the source was suspended as well */
886 if (!u
->source
|| u
->source
->state
== PA_SOURCE_SUSPENDED
)
887 if (start_stream_fd(u
) < 0)
891 case PA_SINK_UNLINKED
:
893 case PA_SINK_INVALID_STATE
:
898 case PA_SINK_MESSAGE_GET_LATENCY
: {
900 if (u
->read_smoother
) {
903 ri
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
904 wi
= pa_bytes_to_usec(u
->write_index
+ u
->block_size
, &u
->sample_spec
);
906 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
910 ri
= pa_rtclock_now() - u
->started_at
;
911 wi
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
913 *((pa_usec_t
*) data
) = wi
> ri
? wi
- ri
: 0;
916 *((pa_usec_t
*) data
) += u
->sink
->thread_info
.fixed_latency
;
921 r
= pa_sink_process_msg(o
, code
, data
, offset
, chunk
);
923 return (r
< 0 || !failed
) ? r
: -1;
926 /* Run from IO thread */
927 static int source_process_msg(pa_msgobject
*o
, int code
, void *data
, int64_t offset
, pa_memchunk
*chunk
) {
928 struct userdata
*u
= PA_SOURCE(o
)->userdata
;
929 pa_bool_t failed
= FALSE
;
932 pa_assert(u
->source
== PA_SOURCE(o
));
936 case PA_SOURCE_MESSAGE_SET_STATE
:
938 switch ((pa_source_state_t
) PA_PTR_TO_UINT(data
)) {
940 case PA_SOURCE_SUSPENDED
:
941 pa_assert(PA_SOURCE_IS_OPENED(u
->source
->thread_info
.state
));
943 /* Stop the device if the sink is suspended as well */
944 if (!u
->sink
|| u
->sink
->state
== PA_SINK_SUSPENDED
)
947 if (u
->read_smoother
)
948 pa_smoother_pause(u
->read_smoother
, pa_rtclock_now());
952 case PA_SOURCE_RUNNING
:
953 if (u
->source
->thread_info
.state
!= PA_SOURCE_SUSPENDED
)
956 /* Resume the device if the sink was suspended as well */
957 if (!u
->sink
|| u
->sink
->thread_info
.state
== PA_SINK_SUSPENDED
)
958 if (start_stream_fd(u
) < 0)
961 /* We don't resume the smoother here. Instead we
962 * wait until the first packet arrives */
965 case PA_SOURCE_UNLINKED
:
967 case PA_SOURCE_INVALID_STATE
:
972 case PA_SOURCE_MESSAGE_GET_LATENCY
: {
975 if (u
->read_smoother
) {
976 wi
= pa_smoother_get(u
->read_smoother
, pa_rtclock_now());
977 ri
= pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
);
979 *((pa_usec_t
*) data
) = (wi
> ri
? wi
- ri
: 0) + u
->source
->thread_info
.fixed_latency
;
981 *((pa_usec_t
*) data
) = 0;
988 r
= pa_source_process_msg(o
, code
, data
, offset
, chunk
);
990 return (r
< 0 || !failed
) ? r
: -1;
993 /* Run from IO thread */
994 static int hsp_process_render(struct userdata
*u
) {
998 pa_assert(u
->profile
== PROFILE_HSP
);
1001 /* First, render some data */
1002 if (!u
->write_memchunk
.memblock
)
1003 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1005 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1011 /* Now write that data to the socket. The socket is of type
1012 * SEQPACKET, and we generated the data of the MTU size, so this
1013 * should just work. */
1015 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1016 l
= pa_write(u
->stream_fd
, p
, u
->write_memchunk
.length
, &u
->stream_write_type
);
1017 pa_memblock_release(u
->write_memchunk
.memblock
);
1024 /* Retry right away if we got interrupted */
1027 else if (errno
== EAGAIN
)
1028 /* Hmm, apparently the socket was not writable, give up for now */
1031 pa_log_error("Failed to write data to SCO socket: %s", pa_cstrerror(errno
));
1036 pa_assert((size_t) l
<= u
->write_memchunk
.length
);
1038 if ((size_t) l
!= u
->write_memchunk
.length
) {
1039 pa_log_error("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1040 (unsigned long long) l
,
1041 (unsigned long long) u
->write_memchunk
.length
);
1046 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1047 pa_memblock_unref(u
->write_memchunk
.memblock
);
1048 pa_memchunk_reset(&u
->write_memchunk
);
1057 /* Run from IO thread */
1058 static int hsp_process_push(struct userdata
*u
) {
1060 pa_memchunk memchunk
;
1063 pa_assert(u
->profile
== PROFILE_HSP
);
1064 pa_assert(u
->source
);
1065 pa_assert(u
->read_smoother
);
1067 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1068 memchunk
.index
= memchunk
.length
= 0;
1077 pa_bool_t found_tstamp
= FALSE
;
1080 memset(&m
, 0, sizeof(m
));
1081 memset(&aux
, 0, sizeof(aux
));
1082 memset(&iov
, 0, sizeof(iov
));
1086 m
.msg_control
= aux
;
1087 m
.msg_controllen
= sizeof(aux
);
1089 p
= pa_memblock_acquire(memchunk
.memblock
);
1091 iov
.iov_len
= pa_memblock_get_length(memchunk
.memblock
);
1092 l
= recvmsg(u
->stream_fd
, &m
, 0);
1093 pa_memblock_release(memchunk
.memblock
);
1097 if (l
< 0 && errno
== EINTR
)
1098 /* Retry right away if we got interrupted */
1101 else if (l
< 0 && errno
== EAGAIN
)
1102 /* Hmm, apparently the socket was not readable, give up for now. */
1105 pa_log_error("Failed to read data from SCO socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1110 pa_assert((size_t) l
<= pa_memblock_get_length(memchunk
.memblock
));
1112 memchunk
.length
= (size_t) l
;
1113 u
->read_index
+= (uint64_t) l
;
1115 for (cm
= CMSG_FIRSTHDR(&m
); cm
; cm
= CMSG_NXTHDR(&m
, cm
))
1116 if (cm
->cmsg_level
== SOL_SOCKET
&& cm
->cmsg_type
== SO_TIMESTAMP
) {
1117 struct timeval
*tv
= (struct timeval
*) CMSG_DATA(cm
);
1118 pa_rtclock_from_wallclock(tv
);
1119 tstamp
= pa_timeval_load(tv
);
1120 found_tstamp
= TRUE
;
1124 if (!found_tstamp
) {
1125 pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!");
1126 tstamp
= pa_rtclock_now();
1129 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1130 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1132 pa_source_post(u
->source
, &memchunk
);
1138 pa_memblock_unref(memchunk
.memblock
);
1143 /* Run from IO thread */
1144 static void a2dp_prepare_buffer(struct userdata
*u
) {
1147 if (u
->a2dp
.buffer_size
>= u
->link_mtu
)
1150 u
->a2dp
.buffer_size
= 2 * u
->link_mtu
;
1151 pa_xfree(u
->a2dp
.buffer
);
1152 u
->a2dp
.buffer
= pa_xmalloc(u
->a2dp
.buffer_size
);
1155 /* Run from IO thread */
1156 static int a2dp_process_render(struct userdata
*u
) {
1157 struct a2dp_info
*a2dp
;
1158 struct rtp_header
*header
;
1159 struct rtp_payload
*payload
;
1163 size_t to_write
, to_encode
;
1164 unsigned frame_count
;
1168 pa_assert(u
->profile
== PROFILE_A2DP
);
1171 /* First, render some data */
1172 if (!u
->write_memchunk
.memblock
)
1173 pa_sink_render_full(u
->sink
, u
->block_size
, &u
->write_memchunk
);
1175 pa_assert(u
->write_memchunk
.length
== u
->block_size
);
1177 a2dp_prepare_buffer(u
);
1180 header
= a2dp
->buffer
;
1181 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1185 /* Try to create a packet of the full MTU */
1187 p
= (const uint8_t*) pa_memblock_acquire(u
->write_memchunk
.memblock
) + u
->write_memchunk
.index
;
1188 to_encode
= u
->write_memchunk
.length
;
1190 d
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1191 to_write
= a2dp
->buffer_size
- sizeof(*header
) - sizeof(*payload
);
1193 while (PA_LIKELY(to_encode
> 0 && to_write
> 0)) {
1197 encoded
= sbc_encode(&a2dp
->sbc
,
1202 if (PA_UNLIKELY(encoded
<= 0)) {
1203 pa_log_error("SBC encoding error (%li)", (long) encoded
);
1204 pa_memblock_release(u
->write_memchunk
.memblock
);
1208 /* pa_log_debug("SBC: encoded: %lu; written: %lu", (unsigned long) encoded, (unsigned long) written); */
1209 /* pa_log_debug("SBC: codesize: %lu; frame_length: %lu", (unsigned long) a2dp->codesize, (unsigned long) a2dp->frame_length); */
1211 pa_assert_fp((size_t) encoded
<= to_encode
);
1212 pa_assert_fp((size_t) encoded
== a2dp
->codesize
);
1214 pa_assert_fp((size_t) written
<= to_write
);
1215 pa_assert_fp((size_t) written
== a2dp
->frame_length
);
1217 p
= (const uint8_t*) p
+ encoded
;
1218 to_encode
-= encoded
;
1220 d
= (uint8_t*) d
+ written
;
1221 to_write
-= written
;
1226 pa_memblock_release(u
->write_memchunk
.memblock
);
1228 pa_assert(to_encode
== 0);
1231 pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp
->sbc
)));
1234 /* write it to the fifo */
1235 memset(a2dp
->buffer
, 0, sizeof(*header
) + sizeof(*payload
));
1238 header
->sequence_number
= htons(a2dp
->seq_num
++);
1239 header
->timestamp
= htonl(u
->write_index
/ pa_frame_size(&u
->sample_spec
));
1240 header
->ssrc
= htonl(1);
1241 payload
->frame_count
= frame_count
;
1243 nbytes
= (uint8_t*) d
- (uint8_t*) a2dp
->buffer
;
1248 l
= pa_write(u
->stream_fd
, a2dp
->buffer
, nbytes
, &u
->stream_write_type
);
1255 /* Retry right away if we got interrupted */
1258 else if (errno
== EAGAIN
)
1259 /* Hmm, apparently the socket was not writable, give up for now */
1262 pa_log_error("Failed to write data to socket: %s", pa_cstrerror(errno
));
1267 pa_assert((size_t) l
<= nbytes
);
1269 if ((size_t) l
!= nbytes
) {
1270 pa_log_warn("Wrote memory block to socket only partially! %llu written, wanted to write %llu.",
1271 (unsigned long long) l
,
1272 (unsigned long long) nbytes
);
1277 u
->write_index
+= (uint64_t) u
->write_memchunk
.length
;
1278 pa_memblock_unref(u
->write_memchunk
.memblock
);
1279 pa_memchunk_reset(&u
->write_memchunk
);
1289 static int a2dp_process_push(struct userdata
*u
) {
1291 pa_memchunk memchunk
;
1294 pa_assert(u
->profile
== PROFILE_A2DP_SOURCE
);
1295 pa_assert(u
->source
);
1296 pa_assert(u
->read_smoother
);
1298 memchunk
.memblock
= pa_memblock_new(u
->core
->mempool
, u
->block_size
);
1299 memchunk
.index
= memchunk
.length
= 0;
1302 pa_bool_t found_tstamp
= FALSE
;
1304 struct a2dp_info
*a2dp
;
1305 struct rtp_header
*header
;
1306 struct rtp_payload
*payload
;
1310 size_t to_write
, to_decode
;
1311 unsigned frame_count
;
1313 a2dp_prepare_buffer(u
);
1316 header
= a2dp
->buffer
;
1317 payload
= (struct rtp_payload
*) ((uint8_t*) a2dp
->buffer
+ sizeof(*header
));
1319 l
= pa_read(u
->stream_fd
, a2dp
->buffer
, a2dp
->buffer_size
, &u
->stream_write_type
);
1323 if (l
< 0 && errno
== EINTR
)
1324 /* Retry right away if we got interrupted */
1327 else if (l
< 0 && errno
== EAGAIN
)
1328 /* Hmm, apparently the socket was not readable, give up for now. */
1331 pa_log_error("Failed to read data from socket: %s", l
< 0 ? pa_cstrerror(errno
) : "EOF");
1336 pa_assert((size_t) l
<= a2dp
->buffer_size
);
1338 u
->read_index
+= (uint64_t) l
;
1340 /* TODO: get timestamp from rtp */
1341 if (!found_tstamp
) {
1342 /* pa_log_warn("Couldn't find SO_TIMESTAMP data in auxiliary recvmsg() data!"); */
1343 tstamp
= pa_rtclock_now();
1346 pa_smoother_put(u
->read_smoother
, tstamp
, pa_bytes_to_usec(u
->read_index
, &u
->sample_spec
));
1347 pa_smoother_resume(u
->read_smoother
, tstamp
, TRUE
);
1349 p
= (uint8_t*) a2dp
->buffer
+ sizeof(*header
) + sizeof(*payload
);
1350 to_decode
= l
- sizeof(*header
) - sizeof(*payload
);
1352 d
= pa_memblock_acquire(memchunk
.memblock
);
1353 to_write
= memchunk
.length
= pa_memblock_get_length(memchunk
.memblock
);
1355 while (PA_LIKELY(to_decode
> 0 && to_write
> 0)) {
1359 decoded
= sbc_decode(&a2dp
->sbc
,
1364 if (PA_UNLIKELY(decoded
<= 0)) {
1365 pa_log_error("SBC decoding error (%li)", (long) decoded
);
1366 pa_memblock_release(memchunk
.memblock
);
1367 pa_memblock_unref(memchunk
.memblock
);
1371 /* pa_log_debug("SBC: decoded: %lu; written: %lu", (unsigned long) decoded, (unsigned long) written); */
1372 /* pa_log_debug("SBC: frame_length: %lu; codesize: %lu", (unsigned long) a2dp->frame_length, (unsigned long) a2dp->codesize); */
1374 pa_assert_fp((size_t) decoded
<= to_decode
);
1375 pa_assert_fp((size_t) decoded
== a2dp
->frame_length
);
1377 pa_assert_fp((size_t) written
<= to_write
);
1378 pa_assert_fp((size_t) written
== a2dp
->codesize
);
1380 p
= (const uint8_t*) p
+ decoded
;
1381 to_decode
-= decoded
;
1383 d
= (uint8_t*) d
+ written
;
1384 to_write
-= written
;
1389 pa_memblock_release(memchunk
.memblock
);
1391 pa_source_post(u
->source
, &memchunk
);
1397 pa_memblock_unref(memchunk
.memblock
);
1402 static void thread_func(void *userdata
) {
1403 struct userdata
*u
= userdata
;
1404 unsigned do_write
= 0;
1405 pa_bool_t writable
= FALSE
;
1409 pa_log_debug("IO Thread starting up");
1411 if (u
->core
->realtime_scheduling
)
1412 pa_make_realtime(u
->core
->realtime_priority
);
1414 pa_thread_mq_install(&u
->thread_mq
);
1416 if (start_stream_fd(u
) < 0)
1420 struct pollfd
*pollfd
;
1422 pa_bool_t disable_timer
= TRUE
;
1424 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1426 if (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) {
1428 /* We should send two blocks to the device before we expect
1431 if (u
->write_index
== 0 && u
->read_index
<= 0)
1434 if (pollfd
&& (pollfd
->revents
& POLLIN
)) {
1437 if (u
->profile
== PROFILE_HSP
)
1438 n_read
= hsp_process_push(u
);
1440 n_read
= a2dp_process_push(u
);
1445 /* We just read something, so we are supposed to write something, too */
1450 if (u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
)) {
1452 if (u
->sink
->thread_info
.rewind_requested
)
1453 pa_sink_process_rewind(u
->sink
, 0);
1456 if (pollfd
->revents
& POLLOUT
)
1459 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1460 pa_usec_t time_passed
;
1461 pa_usec_t audio_sent
;
1463 /* Hmm, there is no input stream we could synchronize
1464 * to. So let's do things by time */
1466 time_passed
= pa_rtclock_now() - u
->started_at
;
1467 audio_sent
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1469 if (audio_sent
<= time_passed
) {
1470 pa_usec_t audio_to_send
= time_passed
- audio_sent
;
1472 /* Never try to catch up for more than 100ms */
1473 if (u
->write_index
> 0 && audio_to_send
> MAX_PLAYBACK_CATCH_UP_USEC
) {
1474 pa_usec_t skip_usec
;
1475 uint64_t skip_bytes
;
1477 skip_usec
= audio_to_send
- MAX_PLAYBACK_CATCH_UP_USEC
;
1478 skip_bytes
= pa_usec_to_bytes(skip_usec
, &u
->sample_spec
);
1480 if (skip_bytes
> 0) {
1483 pa_log_warn("Skipping %llu us (= %llu bytes) in audio stream",
1484 (unsigned long long) skip_usec
,
1485 (unsigned long long) skip_bytes
);
1487 pa_sink_render_full(u
->sink
, skip_bytes
, &tmp
);
1488 pa_memblock_unref(tmp
.memblock
);
1489 u
->write_index
+= skip_bytes
;
1497 if (writable
&& do_write
> 0) {
1500 if (u
->write_index
<= 0)
1501 u
->started_at
= pa_rtclock_now();
1503 if (u
->profile
== PROFILE_A2DP
) {
1504 if ((n_written
= a2dp_process_render(u
)) < 0)
1507 if ((n_written
= hsp_process_render(u
)) < 0)
1512 pa_log("Broken kernel: we got EAGAIN on write() after POLLOUT!");
1514 do_write
-= n_written
;
1518 if ((!u
->source
|| !PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
)) && do_write
<= 0 && writable
) {
1519 pa_usec_t time_passed
, next_write_at
, sleep_for
;
1521 /* Hmm, there is no input stream we could synchronize
1522 * to. So let's estimate when we need to wake up the latest */
1524 time_passed
= pa_rtclock_now() - u
->started_at
;
1525 next_write_at
= pa_bytes_to_usec(u
->write_index
, &u
->sample_spec
);
1526 sleep_for
= time_passed
< next_write_at
? next_write_at
- time_passed
: 0;
1528 /* 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); */
1530 pa_rtpoll_set_timer_relative(u
->rtpoll
, sleep_for
);
1531 disable_timer
= FALSE
;
1537 pa_rtpoll_set_timer_disabled(u
->rtpoll
);
1539 /* Hmm, nothing to do. Let's sleep */
1541 pollfd
->events
= (short) (((u
->sink
&& PA_SINK_IS_LINKED(u
->sink
->thread_info
.state
) && !writable
) ? POLLOUT
: 0) |
1542 (u
->source
&& PA_SOURCE_IS_LINKED(u
->source
->thread_info
.state
) ? POLLIN
: 0));
1544 if ((ret
= pa_rtpoll_run(u
->rtpoll
, TRUE
)) < 0)
1550 pollfd
= u
->rtpoll_item
? pa_rtpoll_item_get_pollfd(u
->rtpoll_item
, NULL
) : NULL
;
1552 if (pollfd
&& (pollfd
->revents
& ~(POLLOUT
|POLLIN
))) {
1553 pa_log_info("FD error: %s%s%s%s",
1554 pollfd
->revents
& POLLERR
? "POLLERR " :"",
1555 pollfd
->revents
& POLLHUP
? "POLLHUP " :"",
1556 pollfd
->revents
& POLLPRI
? "POLLPRI " :"",
1557 pollfd
->revents
& POLLNVAL
? "POLLNVAL " :"");
1563 /* If this was no regular exit from the loop we have to continue processing messages until we receive PA_MESSAGE_SHUTDOWN */
1564 pa_log_debug("IO thread failed");
1565 pa_asyncmsgq_post(u
->thread_mq
.outq
, PA_MSGOBJECT(u
->core
), PA_CORE_MESSAGE_UNLOAD_MODULE
, u
->module
, 0, NULL
, NULL
);
1566 pa_asyncmsgq_wait_for(u
->thread_mq
.inq
, PA_MESSAGE_SHUTDOWN
);
1569 pa_log_debug("IO thread shutting down");
1572 /* Run from main thread */
1573 static DBusHandlerResult
filter_cb(DBusConnection
*bus
, DBusMessage
*m
, void *userdata
) {
1579 pa_assert_se(u
= userdata
);
1581 dbus_error_init(&err
);
1583 pa_log_debug("dbus: interface=%s, path=%s, member=%s\n",
1584 dbus_message_get_interface(m
),
1585 dbus_message_get_path(m
),
1586 dbus_message_get_member(m
));
1588 if (!dbus_message_has_path(m
, u
->path
))
1591 if (dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged") ||
1592 dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1597 if (!dbus_message_get_args(m
, &err
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
) || gain
> 15) {
1598 pa_log("Failed to parse org.bluez.Headset.{Speaker|Microphone}GainChanged: %s", err
.message
);
1602 if (u
->profile
== PROFILE_HSP
) {
1603 if (u
->sink
&& dbus_message_is_signal(m
, "org.bluez.Headset", "SpeakerGainChanged")) {
1605 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1606 pa_sink_volume_changed(u
->sink
, &v
);
1608 } else if (u
->source
&& dbus_message_is_signal(m
, "org.bluez.Headset", "MicrophoneGainChanged")) {
1610 pa_cvolume_set(&v
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1611 pa_source_volume_changed(u
->source
, &v
);
1617 dbus_error_free(&err
);
1619 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED
;
1622 /* Run from main thread */
1623 static void sink_set_volume_cb(pa_sink
*s
) {
1624 struct userdata
*u
= s
->userdata
;
1630 if (u
->profile
!= PROFILE_HSP
)
1633 gain
= (pa_cvolume_max(&s
->real_volume
) * 15) / PA_VOLUME_NORM
;
1638 pa_cvolume_set(&s
->real_volume
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1640 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetSpeakerGain"));
1641 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1642 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1643 dbus_message_unref(m
);
1646 /* Run from main thread */
1647 static void source_set_volume_cb(pa_source
*s
) {
1648 struct userdata
*u
= s
->userdata
;
1654 if (u
->profile
!= PROFILE_HSP
)
1657 gain
= (pa_cvolume_max(&s
->volume
) * 15) / PA_VOLUME_NORM
;
1662 pa_cvolume_set(&s
->volume
, u
->sample_spec
.channels
, (pa_volume_t
) (gain
* PA_VOLUME_NORM
/ 15));
1664 pa_assert_se(m
= dbus_message_new_method_call("org.bluez", u
->path
, "org.bluez.Headset", "SetMicrophoneGain"));
1665 pa_assert_se(dbus_message_append_args(m
, DBUS_TYPE_UINT16
, &gain
, DBUS_TYPE_INVALID
));
1666 pa_assert_se(dbus_connection_send(pa_dbus_connection_get(u
->connection
), m
, NULL
));
1667 dbus_message_unref(m
);
1670 /* Run from main thread */
1671 static char *get_name(const char *type
, pa_modargs
*ma
, const char *device_id
, pa_bool_t
*namereg_fail
) {
1677 pa_assert(device_id
);
1678 pa_assert(namereg_fail
);
1680 t
= pa_sprintf_malloc("%s_name", type
);
1681 n
= pa_modargs_get_value(ma
, t
, NULL
);
1685 *namereg_fail
= TRUE
;
1686 return pa_xstrdup(n
);
1689 if ((n
= pa_modargs_get_value(ma
, "name", NULL
)))
1690 *namereg_fail
= TRUE
;
1693 *namereg_fail
= FALSE
;
1696 return pa_sprintf_malloc("bluez_%s.%s", type
, n
);
1701 static void sco_over_pcm_state_update(struct userdata
*u
) {
1703 pa_assert(USE_SCO_OVER_PCM(u
));
1705 if (PA_SINK_IS_OPENED(pa_sink_get_state(u
->hsp
.sco_sink
)) ||
1706 PA_SOURCE_IS_OPENED(pa_source_get_state(u
->hsp
.sco_source
))) {
1708 if (u
->service_fd
>= 0)
1711 pa_log_debug("Resuming SCO over PCM");
1712 if ((init_bt(u
) < 0) || (init_profile(u
) < 0))
1713 pa_log("Can't resume SCO over PCM");
1718 if (u
->service_fd
< 0)
1723 pa_log_debug("Closing SCO over PCM");
1724 pa_close(u
->service_fd
);
1729 static pa_hook_result_t
sink_state_changed_cb(pa_core
*c
, pa_sink
*s
, struct userdata
*u
) {
1731 pa_sink_assert_ref(s
);
1734 if (s
!= u
->hsp
.sco_sink
)
1737 sco_over_pcm_state_update(u
);
1742 static pa_hook_result_t
source_state_changed_cb(pa_core
*c
, pa_source
*s
, struct userdata
*u
) {
1744 pa_source_assert_ref(s
);
1747 if (s
!= u
->hsp
.sco_source
)
1750 sco_over_pcm_state_update(u
);
1757 /* Run from main thread */
1758 static int add_sink(struct userdata
*u
) {
1761 if (USE_SCO_OVER_PCM(u
)) {
1764 u
->sink
= u
->hsp
.sco_sink
;
1765 p
= pa_proplist_new();
1766 pa_proplist_sets(p
, "bluetooth.protocol", "sco");
1767 pa_proplist_update(u
->sink
->proplist
, PA_UPDATE_MERGE
, p
);
1768 pa_proplist_free(p
);
1770 if (!u
->hsp
.sink_state_changed_slot
)
1771 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
);
1777 pa_sink_new_data data
;
1780 pa_sink_new_data_init(&data
);
1781 data
.driver
= __FILE__
;
1782 data
.module
= u
->module
;
1783 pa_sink_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1784 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP
? "a2dp" : "sco");
1785 if (u
->profile
== PROFILE_HSP
)
1786 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1787 data
.card
= u
->card
;
1788 data
.name
= get_name("sink", u
->modargs
, u
->address
, &b
);
1789 data
.namereg_fail
= b
;
1791 if (pa_modargs_get_proplist(u
->modargs
, "sink_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1792 pa_log("Invalid properties");
1793 pa_sink_new_data_done(&data
);
1797 u
->sink
= pa_sink_new(u
->core
, &data
, PA_SINK_HARDWARE
|PA_SINK_LATENCY
| (u
->profile
== PROFILE_HSP
? PA_SINK_HW_VOLUME_CTRL
: 0));
1798 pa_sink_new_data_done(&data
);
1801 pa_log_error("Failed to create sink");
1805 u
->sink
->userdata
= u
;
1806 u
->sink
->parent
.process_msg
= sink_process_msg
;
1808 pa_sink_set_max_request(u
->sink
, u
->block_size
);
1809 pa_sink_set_fixed_latency(u
->sink
,
1810 (u
->profile
== PROFILE_A2DP
? FIXED_LATENCY_PLAYBACK_A2DP
: FIXED_LATENCY_PLAYBACK_HSP
) +
1811 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
1814 if (u
->profile
== PROFILE_HSP
) {
1815 u
->sink
->set_volume
= sink_set_volume_cb
;
1816 u
->sink
->n_volume_steps
= 16;
1822 /* Run from main thread */
1823 static int add_source(struct userdata
*u
) {
1826 if (USE_SCO_OVER_PCM(u
)) {
1827 u
->source
= u
->hsp
.sco_source
;
1828 pa_proplist_sets(u
->source
->proplist
, "bluetooth.protocol", "hsp");
1830 if (!u
->hsp
.source_state_changed_slot
)
1831 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
);
1837 pa_source_new_data data
;
1840 pa_source_new_data_init(&data
);
1841 data
.driver
= __FILE__
;
1842 data
.module
= u
->module
;
1843 pa_source_new_data_set_sample_spec(&data
, &u
->sample_spec
);
1844 pa_proplist_sets(data
.proplist
, "bluetooth.protocol", u
->profile
== PROFILE_A2DP_SOURCE
? "a2dp_source" : "hsp");
1845 if (u
->profile
== PROFILE_HSP
)
1846 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_INTENDED_ROLES
, "phone");
1847 data
.card
= u
->card
;
1848 data
.name
= get_name("source", u
->modargs
, u
->address
, &b
);
1849 data
.namereg_fail
= b
;
1851 if (pa_modargs_get_proplist(u
->modargs
, "source_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
1852 pa_log("Invalid properties");
1853 pa_source_new_data_done(&data
);
1857 u
->source
= pa_source_new(u
->core
, &data
, PA_SOURCE_HARDWARE
|PA_SOURCE_LATENCY
| (u
->profile
== PROFILE_HSP
? PA_SOURCE_HW_VOLUME_CTRL
: 0));
1858 pa_source_new_data_done(&data
);
1861 pa_log_error("Failed to create source");
1865 u
->source
->userdata
= u
;
1866 u
->source
->parent
.process_msg
= source_process_msg
;
1868 pa_source_set_fixed_latency(u
->source
,
1869 (u
->profile
== PROFILE_A2DP_SOURCE
? FIXED_LATENCY_RECORD_A2DP
: FIXED_LATENCY_RECORD_HSP
) +
1870 pa_bytes_to_usec(u
->block_size
, &u
->sample_spec
));
1873 if (u
->profile
== PROFILE_HSP
) {
1874 pa_proplist_sets(u
->source
->proplist
, "bluetooth.nrec", (u
->hsp
.pcm_capabilities
.flags
& BT_PCM_FLAG_NREC
) ? "1" : "0");
1875 u
->source
->set_volume
= source_set_volume_cb
;
1876 u
->source
->n_volume_steps
= 16;
1882 /* Run from main thread */
1883 static void shutdown_bt(struct userdata
*u
) {
1886 if (u
->stream_fd
>= 0) {
1887 pa_close(u
->stream_fd
);
1890 u
->stream_write_type
= 0;
1893 if (u
->service_fd
>= 0) {
1894 pa_close(u
->service_fd
);
1896 u
->service_write_type
= 0;
1897 u
->service_read_type
= 0;
1900 if (u
->write_memchunk
.memblock
) {
1901 pa_memblock_unref(u
->write_memchunk
.memblock
);
1902 pa_memchunk_reset(&u
->write_memchunk
);
1906 /* Run from main thread */
1907 static int init_bt(struct userdata
*u
) {
1912 u
->stream_write_type
= 0;
1913 u
->service_write_type
= 0;
1914 u
->service_read_type
= 0;
1916 if ((u
->service_fd
= bt_audio_service_open()) < 0) {
1917 pa_log_error("Couldn't connect to bluetooth audio service");
1921 pa_log_debug("Connected to the bluetooth audio service");
1926 /* Run from main thread */
1927 static int setup_bt(struct userdata
*u
) {
1930 if (get_caps(u
, 0) < 0)
1933 pa_log_debug("Got device capabilities");
1935 if (set_conf(u
) < 0)
1938 pa_log_debug("Connection to the device configured");
1941 if (USE_SCO_OVER_PCM(u
)) {
1942 pa_log_debug("Configured to use SCO over PCM");
1947 pa_log_debug("Got the stream socket");
1952 /* Run from main thread */
1953 static int init_profile(struct userdata
*u
) {
1956 pa_assert(u
->profile
!= PROFILE_OFF
);
1958 if (setup_bt(u
) < 0)
1961 if (u
->profile
== PROFILE_A2DP
||
1962 u
->profile
== PROFILE_HSP
)
1963 if (add_sink(u
) < 0)
1966 if (u
->profile
== PROFILE_HSP
||
1967 u
->profile
== PROFILE_A2DP_SOURCE
)
1968 if (add_source(u
) < 0)
1974 /* Run from main thread */
1975 static void stop_thread(struct userdata
*u
) {
1979 pa_asyncmsgq_send(u
->thread_mq
.inq
, NULL
, PA_MESSAGE_SHUTDOWN
, NULL
, 0, NULL
);
1980 pa_thread_free(u
->thread
);
1984 if (u
->rtpoll_item
) {
1985 pa_rtpoll_item_free(u
->rtpoll_item
);
1986 u
->rtpoll_item
= NULL
;
1989 if (u
->hsp
.sink_state_changed_slot
) {
1990 pa_hook_slot_free(u
->hsp
.sink_state_changed_slot
);
1991 u
->hsp
.sink_state_changed_slot
= NULL
;
1994 if (u
->hsp
.source_state_changed_slot
) {
1995 pa_hook_slot_free(u
->hsp
.source_state_changed_slot
);
1996 u
->hsp
.source_state_changed_slot
= NULL
;
2000 pa_sink_unref(u
->sink
);
2005 pa_source_unref(u
->source
);
2010 pa_thread_mq_done(&u
->thread_mq
);
2012 pa_rtpoll_free(u
->rtpoll
);
2016 if (u
->read_smoother
) {
2017 pa_smoother_free(u
->read_smoother
);
2018 u
->read_smoother
= NULL
;
2022 /* Run from main thread */
2023 static int start_thread(struct userdata
*u
) {
2025 pa_assert(!u
->thread
);
2026 pa_assert(!u
->rtpoll
);
2027 pa_assert(!u
->rtpoll_item
);
2029 u
->rtpoll
= pa_rtpoll_new();
2030 pa_thread_mq_init(&u
->thread_mq
, u
->core
->mainloop
, u
->rtpoll
);
2033 if (USE_SCO_OVER_PCM(u
)) {
2034 if (start_stream_fd(u
) < 0)
2037 pa_sink_ref(u
->sink
);
2038 pa_source_ref(u
->source
);
2039 /* FIXME: monitor stream_fd error */
2044 if (!(u
->thread
= pa_thread_new(thread_func
, u
))) {
2045 pa_log_error("Failed to create IO thread");
2051 pa_sink_set_asyncmsgq(u
->sink
, u
->thread_mq
.inq
);
2052 pa_sink_set_rtpoll(u
->sink
, u
->rtpoll
);
2053 pa_sink_put(u
->sink
);
2055 if (u
->sink
->set_volume
)
2056 u
->sink
->set_volume(u
->sink
);
2060 pa_source_set_asyncmsgq(u
->source
, u
->thread_mq
.inq
);
2061 pa_source_set_rtpoll(u
->source
, u
->rtpoll
);
2062 pa_source_put(u
->source
);
2064 if (u
->source
->set_volume
)
2065 u
->source
->set_volume(u
->source
);
2071 /* Run from main thread */
2072 static int card_set_profile(pa_card
*c
, pa_card_profile
*new_profile
) {
2075 pa_queue
*inputs
= NULL
, *outputs
= NULL
;
2076 const pa_bluetooth_device
*device
;
2079 pa_assert(new_profile
);
2080 pa_assert_se(u
= c
->userdata
);
2082 d
= PA_CARD_PROFILE_DATA(new_profile
);
2084 if (!(device
= pa_bluetooth_discovery_get_by_path(u
->discovery
, u
->path
))) {
2085 pa_log_error("Failed to get device object.");
2089 /* The state signal is sent by bluez, so it is racy to check
2090 strictly for CONNECTED, we should also accept STREAMING state
2091 as being good enough. However, if the profile is used
2092 concurrently (which is unlikely), ipc will fail later on, and
2093 module will be unloaded. */
2094 if (device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) {
2095 pa_log_warn("HSP is not connected, refused to switch profile");
2098 else if (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
) {
2099 pa_log_warn("A2DP is not connected, refused to switch profile");
2104 inputs
= pa_sink_move_all_start(u
->sink
, NULL
);
2106 if (!USE_SCO_OVER_PCM(u
))
2108 pa_sink_unlink(u
->sink
);
2112 outputs
= pa_source_move_all_start(u
->source
, NULL
);
2114 if (!USE_SCO_OVER_PCM(u
))
2116 pa_source_unlink(u
->source
);
2123 u
->sample_spec
= u
->requested_sample_spec
;
2127 if (u
->profile
!= PROFILE_OFF
)
2130 if (u
->sink
|| u
->source
)
2135 pa_sink_move_all_finish(u
->sink
, inputs
, FALSE
);
2137 pa_sink_move_all_fail(inputs
);
2142 pa_source_move_all_finish(u
->source
, outputs
, FALSE
);
2144 pa_source_move_all_fail(outputs
);
2150 /* Run from main thread */
2151 static int add_card(struct userdata
*u
, const pa_bluetooth_device
*device
) {
2152 pa_card_new_data data
;
2158 const char *default_profile
;
2163 pa_card_new_data_init(&data
);
2164 data
.driver
= __FILE__
;
2165 data
.module
= u
->module
;
2167 n
= pa_bluetooth_cleanup_name(device
->name
);
2168 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_DESCRIPTION
, n
);
2170 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_STRING
, device
->address
);
2171 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_API
, "bluez");
2172 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_CLASS
, "sound");
2173 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_BUS
, "bluetooth");
2174 if ((ff
= pa_bluetooth_get_form_factor(device
->class)))
2175 pa_proplist_sets(data
.proplist
, PA_PROP_DEVICE_FORM_FACTOR
, ff
);
2176 pa_proplist_sets(data
.proplist
, "bluez.path", device
->path
);
2177 pa_proplist_setf(data
.proplist
, "bluez.class", "0x%06x", (unsigned) device
->class);
2178 pa_proplist_sets(data
.proplist
, "bluez.name", device
->name
);
2179 data
.name
= get_name("card", u
->modargs
, device
->address
, &b
);
2180 data
.namereg_fail
= b
;
2182 if (pa_modargs_get_proplist(u
->modargs
, "card_properties", data
.proplist
, PA_UPDATE_REPLACE
) < 0) {
2183 pa_log("Invalid properties");
2184 pa_card_new_data_done(&data
);
2188 data
.profiles
= pa_hashmap_new(pa_idxset_string_hash_func
, pa_idxset_string_compare_func
);
2190 /* we base hsp/a2dp availability on UUIDs.
2191 Ideally, it would be based on "Connected" state, but
2192 we can't afford to wait for this information when
2193 we are loaded with profile="hsp", for instance */
2194 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SINK_UUID
)) {
2195 p
= pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile
));
2199 p
->max_sink_channels
= 2;
2200 p
->max_source_channels
= 0;
2202 d
= PA_CARD_PROFILE_DATA(p
);
2205 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2208 if (pa_bluetooth_uuid_has(device
->uuids
, A2DP_SOURCE_UUID
)) {
2209 p
= pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(enum profile
));
2213 p
->max_sink_channels
= 0;
2214 p
->max_source_channels
= 2;
2216 d
= PA_CARD_PROFILE_DATA(p
);
2217 *d
= PROFILE_A2DP_SOURCE
;
2219 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2222 if (pa_bluetooth_uuid_has(device
->uuids
, HSP_HS_UUID
) ||
2223 pa_bluetooth_uuid_has(device
->uuids
, HFP_HS_UUID
)) {
2224 p
= pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile
));
2228 p
->max_sink_channels
= 1;
2229 p
->max_source_channels
= 1;
2231 d
= PA_CARD_PROFILE_DATA(p
);
2234 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2237 pa_assert(!pa_hashmap_isempty(data
.profiles
));
2239 p
= pa_card_profile_new("off", _("Off"), sizeof(enum profile
));
2240 d
= PA_CARD_PROFILE_DATA(p
);
2242 pa_hashmap_put(data
.profiles
, p
->name
, p
);
2244 if ((default_profile
= pa_modargs_get_value(u
->modargs
, "profile", NULL
))) {
2245 if (pa_hashmap_get(data
.profiles
, default_profile
))
2246 pa_card_new_data_set_profile(&data
, default_profile
);
2248 pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile
);
2251 u
->card
= pa_card_new(u
->core
, &data
);
2252 pa_card_new_data_done(&data
);
2255 pa_log("Failed to allocate card.");
2259 u
->card
->userdata
= u
;
2260 u
->card
->set_profile
= card_set_profile
;
2262 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2264 if ((device
->headset_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_HSP
) ||
2265 (device
->audio_sink_state
< PA_BT_AUDIO_STATE_CONNECTED
&& *d
== PROFILE_A2DP
)) {
2266 pa_log_warn("Default profile not connected, selecting off profile");
2267 u
->card
->active_profile
= pa_hashmap_get(u
->card
->profiles
, "off");
2268 u
->card
->save_profile
= FALSE
;
2271 d
= PA_CARD_PROFILE_DATA(u
->card
->active_profile
);
2277 /* Run from main thread */
2278 static const pa_bluetooth_device
* find_device(struct userdata
*u
, const char *address
, const char *path
) {
2279 const pa_bluetooth_device
*d
= NULL
;
2283 if (!address
&& !path
) {
2284 pa_log_error("Failed to get device address/path from module arguments.");
2289 if (!(d
= pa_bluetooth_discovery_get_by_path(u
->discovery
, path
))) {
2290 pa_log_error("%s is not a valid BlueZ audio device.", path
);
2294 if (address
&& !(pa_streq(d
->address
, address
))) {
2295 pa_log_error("Passed path %s and address %s don't match.", path
, address
);
2300 if (!(d
= pa_bluetooth_discovery_get_by_address(u
->discovery
, address
))) {
2301 pa_log_error("%s is not known.", address
);
2307 u
->address
= pa_xstrdup(d
->address
);
2308 u
->path
= pa_xstrdup(d
->path
);
2314 /* Run from main thread */
2315 static int setup_dbus(struct userdata
*u
) {
2318 dbus_error_init(&err
);
2320 u
->connection
= pa_dbus_bus_get(u
->core
, DBUS_BUS_SYSTEM
, &err
);
2322 if (dbus_error_is_set(&err
) || !u
->connection
) {
2323 pa_log("Failed to get D-Bus connection: %s", err
.message
);
2324 dbus_error_free(&err
);
2331 int pa__init(pa_module
* m
) {
2335 const char *address
, *path
;
2337 char *mike
, *speaker
;
2338 const pa_bluetooth_device
*device
;
2342 dbus_error_init(&err
);
2344 if (!(ma
= pa_modargs_new(m
->argument
, valid_modargs
))) {
2345 pa_log_error("Failed to parse module arguments");
2349 m
->userdata
= u
= pa_xnew0(struct userdata
, 1);
2354 u
->sample_spec
= m
->core
->default_sample_spec
;
2358 if (pa_modargs_get_value(ma
, "sco_sink", NULL
) &&
2359 !(u
->hsp
.sco_sink
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_sink", NULL
), PA_NAMEREG_SINK
))) {
2360 pa_log("SCO sink not found");
2364 if (pa_modargs_get_value(ma
, "sco_source", NULL
) &&
2365 !(u
->hsp
.sco_source
= pa_namereg_get(m
->core
, pa_modargs_get_value(ma
, "sco_source", NULL
), PA_NAMEREG_SOURCE
))) {
2366 pa_log("SCO source not found");
2371 if (pa_modargs_get_value_u32(ma
, "rate", &u
->sample_spec
.rate
) < 0 ||
2372 u
->sample_spec
.rate
<= 0 || u
->sample_spec
.rate
> PA_RATE_MAX
) {
2373 pa_log_error("Failed to get rate from module arguments");
2377 u
->auto_connect
= TRUE
;
2378 if (pa_modargs_get_value_boolean(ma
, "auto_connect", &u
->auto_connect
)) {
2379 pa_log("Failed to parse auto_connect= argument");
2383 channels
= u
->sample_spec
.channels
;
2384 if (pa_modargs_get_value_u32(ma
, "channels", &channels
) < 0 ||
2385 channels
<= 0 || channels
> PA_CHANNELS_MAX
) {
2386 pa_log_error("Failed to get channels from module arguments");
2389 u
->sample_spec
.channels
= (uint8_t) channels
;
2390 u
->requested_sample_spec
= u
->sample_spec
;
2392 address
= pa_modargs_get_value(ma
, "address", NULL
);
2393 path
= pa_modargs_get_value(ma
, "path", NULL
);
2395 if (setup_dbus(u
) < 0)
2398 if (!(u
->discovery
= pa_bluetooth_discovery_get(m
->core
)))
2401 if (!(device
= find_device(u
, address
, path
)))
2404 /* Add the card structure. This will also initialize the default profile */
2405 if (add_card(u
, device
) < 0)
2408 /* Connect to the BT service and query capabilities */
2412 if (!dbus_connection_add_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
, NULL
)) {
2413 pa_log_error("Failed to add filter function");
2416 u
->filter_added
= TRUE
;
2418 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2419 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2421 if (pa_dbus_add_matches(
2422 pa_dbus_connection_get(u
->connection
), &err
,
2430 pa_log("Failed to add D-Bus matches: %s", err
.message
);
2437 if (u
->profile
!= PROFILE_OFF
)
2438 if (init_profile(u
) < 0)
2441 if (u
->sink
|| u
->source
)
2442 if (start_thread(u
) < 0)
2451 dbus_error_free(&err
);
2456 int pa__get_n_used(pa_module
*m
) {
2460 pa_assert_se(u
= m
->userdata
);
2463 (u
->sink
? pa_sink_linked_by(u
->sink
) : 0) +
2464 (u
->source
? pa_source_linked_by(u
->source
) : 0);
2467 void pa__done(pa_module
*m
) {
2471 if (!(u
= m
->userdata
))
2476 && !USE_SCO_OVER_PCM(u
)
2479 pa_sink_unlink(u
->sink
);
2483 && !USE_SCO_OVER_PCM(u
)
2486 pa_source_unlink(u
->source
);
2490 if (u
->connection
) {
2493 char *speaker
, *mike
;
2494 speaker
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u
->path
);
2495 mike
= pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u
->path
);
2497 pa_dbus_remove_matches(pa_dbus_connection_get(u
->connection
),
2506 if (u
->filter_added
)
2507 dbus_connection_remove_filter(pa_dbus_connection_get(u
->connection
), filter_cb
, u
);
2509 pa_dbus_connection_unref(u
->connection
);
2513 pa_card_free(u
->card
);
2515 if (u
->read_smoother
)
2516 pa_smoother_free(u
->read_smoother
);
2521 pa_xfree(u
->a2dp
.buffer
);
2523 sbc_finish(&u
->a2dp
.sbc
);
2526 pa_modargs_free(u
->modargs
);
2528 pa_xfree(u
->address
);
2532 pa_bluetooth_discovery_unref(u
->discovery
);