1 /* 2 * 3 * BlueZ - Bluetooth protocol stack for Linux 4 * 5 * Copyright (C) 2004-2009 Marcel Holtmann <marcel (at) holtmann.org> 6 * 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with this library; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 21 * 22 */ 23 24 #ifdef HAVE_CONFIG_H 25 #include <config.h> 26 #endif 27 28 #include <unistd.h> 29 #include <sys/un.h> 30 #include <sys/socket.h> 31 #include <fcntl.h> 32 #include <pthread.h> 33 34 #include <netinet/in.h> 35 36 #include <bluetooth/bluetooth.h> 37 38 #include <gst/rtp/gstrtpbuffer.h> 39 40 #include "ipc.h" 41 #include "rtp.h" 42 43 #include "gstavdtpsink.h" 44 45 GST_DEBUG_CATEGORY_STATIC(avdtp_sink_debug); 46 #define GST_CAT_DEFAULT avdtp_sink_debug 47 48 #define BUFFER_SIZE 2048 49 #define TEMPLATE_MAX_BITPOOL 64 50 #define CRC_PROTECTED 1 51 #define CRC_UNPROTECTED 0 52 53 #define DEFAULT_AUTOCONNECT TRUE 54 55 #define GST_AVDTP_SINK_MUTEX_LOCK(s) G_STMT_START { \ 56 g_mutex_lock(s->sink_lock); \ 57 } G_STMT_END 58 59 #define GST_AVDTP_SINK_MUTEX_UNLOCK(s) G_STMT_START { \ 60 g_mutex_unlock(s->sink_lock); \ 61 } G_STMT_END 62 63 64 struct bluetooth_data { 65 struct bt_get_capabilities_rsp *caps; /* Bluetooth device caps */ 66 guint link_mtu; 67 68 gchar buffer[BUFFER_SIZE]; /* Codec transfer buffer */ 69 }; 70 71 #define IS_SBC(n) (strcmp((n), "audio/x-sbc") == 0) 72 #define IS_MPEG_AUDIO(n) (strcmp((n), "audio/mpeg") == 0) 73 74 enum { 75 PROP_0, 76 PROP_DEVICE, 77 PROP_AUTOCONNECT 78 }; 79 80 GST_BOILERPLATE(GstAvdtpSink, gst_avdtp_sink, GstBaseSink, 81 GST_TYPE_BASE_SINK); 82 83 static const GstElementDetails avdtp_sink_details = 84 GST_ELEMENT_DETAILS("Bluetooth AVDTP sink", 85 "Sink/Audio", 86 "Plays audio to an A2DP device", 87 "Marcel Holtmann <marcel (at) holtmann.org>"); 88 89 static GstStaticPadTemplate avdtp_sink_factory = 90 GST_STATIC_PAD_TEMPLATE("sink", GST_PAD_SINK, GST_PAD_ALWAYS, 91 GST_STATIC_CAPS("application/x-rtp, " 92 "media = (string) \"audio\"," 93 "payload = (int) " 94 GST_RTP_PAYLOAD_DYNAMIC_STRING ", " 95 "clock-rate = (int) { 16000, 32000, " 96 "44100, 48000 }, " 97 "encoding-name = (string) \"SBC\"; " 98 "application/x-rtp, " 99 "media = (string) \"audio\", " 100 "payload = (int) " 101 GST_RTP_PAYLOAD_MPA_STRING ", " 102 "clock-rate = (int) 90000; " 103 "application/x-rtp, " 104 "media = (string) \"audio\", " 105 "payload = (int) " 106 GST_RTP_PAYLOAD_DYNAMIC_STRING ", " 107 "clock-rate = (int) 90000, " 108 "encoding-name = (string) \"MPA\"" 109 )); 110 111 static GIOError gst_avdtp_sink_audioservice_send(GstAvdtpSink *self, 112 const bt_audio_msg_header_t *msg); 113 static GIOError gst_avdtp_sink_audioservice_expect( 114 GstAvdtpSink *self, 115 bt_audio_msg_header_t *outmsg, 116 guint8 expected_name); 117 118 119 static void gst_avdtp_sink_base_init(gpointer g_class) 120 { 121 GstElementClass *element_class = GST_ELEMENT_CLASS(g_class); 122 123 gst_element_class_add_pad_template(element_class, 124 gst_static_pad_template_get(&avdtp_sink_factory)); 125 126 gst_element_class_set_details(element_class, &avdtp_sink_details); 127 } 128 129 static gboolean gst_avdtp_sink_stop(GstBaseSink *basesink) 130 { 131 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 132 133 GST_INFO_OBJECT(self, "stop"); 134 135 if (self->watch_id != 0) { 136 g_source_remove(self->watch_id); 137 self->watch_id = 0; 138 } 139 140 if (self->server) { 141 bt_audio_service_close(g_io_channel_unix_get_fd(self->server)); 142 g_io_channel_unref(self->server); 143 self->server = NULL; 144 } 145 146 if (self->stream) { 147 g_io_channel_shutdown(self->stream, TRUE, NULL); 148 g_io_channel_unref(self->stream); 149 self->stream = NULL; 150 } 151 152 if (self->data) { 153 g_free(self->data); 154 self->data = NULL; 155 } 156 157 if (self->stream_caps) { 158 gst_caps_unref(self->stream_caps); 159 self->stream_caps = NULL; 160 } 161 162 if (self->dev_caps) { 163 gst_caps_unref(self->dev_caps); 164 self->dev_caps = NULL; 165 } 166 167 return TRUE; 168 } 169 170 static void gst_avdtp_sink_finalize(GObject *object) 171 { 172 GstAvdtpSink *self = GST_AVDTP_SINK(object); 173 174 if (self->data) 175 gst_avdtp_sink_stop(GST_BASE_SINK(self)); 176 177 if (self->device) 178 g_free(self->device); 179 180 g_mutex_free(self->sink_lock); 181 182 G_OBJECT_CLASS(parent_class)->finalize(object); 183 } 184 185 static void gst_avdtp_sink_set_property(GObject *object, guint prop_id, 186 const GValue *value, GParamSpec *pspec) 187 { 188 GstAvdtpSink *sink = GST_AVDTP_SINK(object); 189 190 switch (prop_id) { 191 case PROP_DEVICE: 192 if (sink->device) 193 g_free(sink->device); 194 sink->device = g_value_dup_string(value); 195 break; 196 197 case PROP_AUTOCONNECT: 198 sink->autoconnect = g_value_get_boolean(value); 199 break; 200 default: 201 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 202 break; 203 } 204 } 205 206 static void gst_avdtp_sink_get_property(GObject *object, guint prop_id, 207 GValue *value, GParamSpec *pspec) 208 { 209 GstAvdtpSink *sink = GST_AVDTP_SINK(object); 210 211 switch (prop_id) { 212 case PROP_DEVICE: 213 g_value_set_string(value, sink->device); 214 break; 215 216 case PROP_AUTOCONNECT: 217 g_value_set_boolean(value, sink->autoconnect); 218 break; 219 default: 220 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 221 break; 222 } 223 } 224 225 static gint gst_avdtp_sink_bluetooth_recvmsg_fd(GstAvdtpSink *sink) 226 { 227 int err, ret; 228 229 ret = bt_audio_service_get_data_fd( 230 g_io_channel_unix_get_fd(sink->server)); 231 232 if (ret < 0) { 233 err = errno; 234 GST_ERROR_OBJECT(sink, "Unable to receive fd: %s (%d)", 235 strerror(err), err); 236 return -err; 237 } 238 239 sink->stream = g_io_channel_unix_new(ret); 240 GST_DEBUG_OBJECT(sink, "stream_fd=%d", ret); 241 242 return 0; 243 } 244 245 static codec_capabilities_t *gst_avdtp_find_caps(GstAvdtpSink *sink, 246 uint8_t codec_type) 247 { 248 struct bt_get_capabilities_rsp *rsp = sink->data->caps; 249 codec_capabilities_t *codec = (void *) rsp->data; 250 int bytes_left = rsp->h.length - sizeof(*rsp); 251 252 while (bytes_left > 0) { 253 if ((codec->type == codec_type) && 254 !(codec->lock & BT_WRITE_LOCK)) 255 break; 256 257 bytes_left -= codec->length; 258 codec = (void *) codec + codec->length; 259 } 260 261 if (bytes_left <= 0) 262 return NULL; 263 264 return codec; 265 } 266 267 static gboolean gst_avdtp_sink_init_sbc_pkt_conf(GstAvdtpSink *sink, 268 GstCaps *caps, 269 sbc_capabilities_t *pkt) 270 { 271 sbc_capabilities_t *cfg; 272 const GValue *value = NULL; 273 const char *pref, *name; 274 gint rate, subbands, blocks; 275 GstStructure *structure = gst_caps_get_structure(caps, 0); 276 277 cfg = (void *) gst_avdtp_find_caps(sink, BT_A2DP_SBC_SINK); 278 name = gst_structure_get_name(structure); 279 280 if (!(IS_SBC(name))) { 281 GST_ERROR_OBJECT(sink, "Unexpected format %s, " 282 "was expecting sbc", name); 283 return FALSE; 284 } 285 286 value = gst_structure_get_value(structure, "rate"); 287 rate = g_value_get_int(value); 288 if (rate == 44100) 289 cfg->frequency = BT_SBC_SAMPLING_FREQ_44100; 290 else if (rate == 48000) 291 cfg->frequency = BT_SBC_SAMPLING_FREQ_48000; 292 else if (rate == 32000) 293 cfg->frequency = BT_SBC_SAMPLING_FREQ_32000; 294 else if (rate == 16000) 295 cfg->frequency = BT_SBC_SAMPLING_FREQ_16000; 296 else { 297 GST_ERROR_OBJECT(sink, "Invalid rate while setting caps"); 298 return FALSE; 299 } 300 301 value = gst_structure_get_value(structure, "mode"); 302 pref = g_value_get_string(value); 303 if (strcmp(pref, "mono") == 0) 304 cfg->channel_mode = BT_A2DP_CHANNEL_MODE_MONO; 305 else if (strcmp(pref, "dual") == 0) 306 cfg->channel_mode = BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL; 307 else if (strcmp(pref, "stereo") == 0) 308 cfg->channel_mode = BT_A2DP_CHANNEL_MODE_STEREO; 309 else if (strcmp(pref, "joint") == 0) 310 cfg->channel_mode = BT_A2DP_CHANNEL_MODE_JOINT_STEREO; 311 else { 312 GST_ERROR_OBJECT(sink, "Invalid mode %s", pref); 313 return FALSE; 314 } 315 316 value = gst_structure_get_value(structure, "allocation"); 317 pref = g_value_get_string(value); 318 if (strcmp(pref, "loudness") == 0) 319 cfg->allocation_method = BT_A2DP_ALLOCATION_LOUDNESS; 320 else if (strcmp(pref, "snr") == 0) 321 cfg->allocation_method = BT_A2DP_ALLOCATION_SNR; 322 else { 323 GST_ERROR_OBJECT(sink, "Invalid allocation: %s", pref); 324 return FALSE; 325 } 326 327 value = gst_structure_get_value(structure, "subbands"); 328 subbands = g_value_get_int(value); 329 if (subbands == 8) 330 cfg->subbands = BT_A2DP_SUBBANDS_8; 331 else if (subbands == 4) 332 cfg->subbands = BT_A2DP_SUBBANDS_4; 333 else { 334 GST_ERROR_OBJECT(sink, "Invalid subbands %d", subbands); 335 return FALSE; 336 } 337 338 value = gst_structure_get_value(structure, "blocks"); 339 blocks = g_value_get_int(value); 340 if (blocks == 16) 341 cfg->block_length = BT_A2DP_BLOCK_LENGTH_16; 342 else if (blocks == 12) 343 cfg->block_length = BT_A2DP_BLOCK_LENGTH_12; 344 else if (blocks == 8) 345 cfg->block_length = BT_A2DP_BLOCK_LENGTH_8; 346 else if (blocks == 4) 347 cfg->block_length = BT_A2DP_BLOCK_LENGTH_4; 348 else { 349 GST_ERROR_OBJECT(sink, "Invalid blocks %d", blocks); 350 return FALSE; 351 } 352 353 value = gst_structure_get_value(structure, "bitpool"); 354 cfg->max_bitpool = cfg->min_bitpool = g_value_get_int(value); 355 356 memcpy(pkt, cfg, sizeof(*pkt)); 357 358 return TRUE; 359 } 360 361 static gboolean gst_avdtp_sink_conf_recv_stream_fd( 362 GstAvdtpSink *self) 363 { 364 struct bluetooth_data *data = self->data; 365 gint ret; 366 GIOError err; 367 GError *gerr = NULL; 368 GIOStatus status; 369 GIOFlags flags; 370 gsize read; 371 372 ret = gst_avdtp_sink_bluetooth_recvmsg_fd(self); 373 if (ret < 0) 374 return FALSE; 375 376 if (!self->stream) { 377 GST_ERROR_OBJECT(self, "Error while configuring device: " 378 "could not acquire audio socket"); 379 return FALSE; 380 } 381 382 /* set stream socket to nonblock */ 383 GST_LOG_OBJECT(self, "setting stream socket to nonblock"); 384 flags = g_io_channel_get_flags(self->stream); 385 flags |= G_IO_FLAG_NONBLOCK; 386 status = g_io_channel_set_flags(self->stream, flags, &gerr); 387 if (status != G_IO_STATUS_NORMAL) { 388 if (gerr) 389 GST_WARNING_OBJECT(self, "Error while " 390 "setting server socket to nonblock: " 391 "%s", gerr->message); 392 else 393 GST_WARNING_OBJECT(self, "Error while " 394 "setting server " 395 "socket to nonblock"); 396 } 397 398 /* It is possible there is some outstanding 399 data in the pipe - we have to empty it */ 400 GST_LOG_OBJECT(self, "emptying stream pipe"); 401 while (1) { 402 err = g_io_channel_read(self->stream, data->buffer, 403 (gsize) data->link_mtu, 404 &read); 405 if (err != G_IO_ERROR_NONE || read <= 0) 406 break; 407 } 408 409 /* set stream socket to block */ 410 GST_LOG_OBJECT(self, "setting stream socket to block"); 411 flags = g_io_channel_get_flags(self->stream); 412 flags &= ~G_IO_FLAG_NONBLOCK; 413 status = g_io_channel_set_flags(self->stream, flags, &gerr); 414 if (status != G_IO_STATUS_NORMAL) { 415 if (gerr) 416 GST_WARNING_OBJECT(self, "Error while " 417 "setting server socket to block:" 418 "%s", gerr->message); 419 else 420 GST_WARNING_OBJECT(self, "Error while " 421 "setting server " 422 "socket to block"); 423 } 424 425 memset(data->buffer, 0, sizeof(data->buffer)); 426 427 return TRUE; 428 } 429 430 static gboolean server_callback(GIOChannel *chan, 431 GIOCondition cond, gpointer data) 432 { 433 if (cond & G_IO_HUP || cond & G_IO_NVAL) 434 return FALSE; 435 else if (cond & G_IO_ERR) 436 GST_WARNING_OBJECT(GST_AVDTP_SINK(data), 437 "Untreated callback G_IO_ERR"); 438 439 return TRUE; 440 } 441 442 static GstStructure *gst_avdtp_sink_parse_sbc_caps( 443 GstAvdtpSink *self, sbc_capabilities_t *sbc) 444 { 445 GstStructure *structure; 446 GValue *value; 447 GValue *list; 448 gboolean mono, stereo; 449 450 structure = gst_structure_empty_new("audio/x-sbc"); 451 value = g_value_init(g_new0(GValue, 1), G_TYPE_STRING); 452 453 /* mode */ 454 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 455 if (sbc->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) { 456 g_value_set_static_string(value, "mono"); 457 gst_value_list_prepend_value(list, value); 458 } 459 if (sbc->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO) { 460 g_value_set_static_string(value, "stereo"); 461 gst_value_list_prepend_value(list, value); 462 } 463 if (sbc->channel_mode & BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL) { 464 g_value_set_static_string(value, "dual"); 465 gst_value_list_prepend_value(list, value); 466 } 467 if (sbc->channel_mode & BT_A2DP_CHANNEL_MODE_JOINT_STEREO) { 468 g_value_set_static_string(value, "joint"); 469 gst_value_list_prepend_value(list, value); 470 } 471 g_value_unset(value); 472 if (list) { 473 gst_structure_set_value(structure, "mode", list); 474 g_free(list); 475 list = NULL; 476 } 477 478 /* subbands */ 479 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 480 value = g_value_init(value, G_TYPE_INT); 481 if (sbc->subbands & BT_A2DP_SUBBANDS_4) { 482 g_value_set_int(value, 4); 483 gst_value_list_prepend_value(list, value); 484 } 485 if (sbc->subbands & BT_A2DP_SUBBANDS_8) { 486 g_value_set_int(value, 8); 487 gst_value_list_prepend_value(list, value); 488 } 489 g_value_unset(value); 490 if (list) { 491 gst_structure_set_value(structure, "subbands", list); 492 g_free(list); 493 list = NULL; 494 } 495 496 /* blocks */ 497 value = g_value_init(value, G_TYPE_INT); 498 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 499 if (sbc->block_length & BT_A2DP_BLOCK_LENGTH_16) { 500 g_value_set_int(value, 16); 501 gst_value_list_prepend_value(list, value); 502 } 503 if (sbc->block_length & BT_A2DP_BLOCK_LENGTH_12) { 504 g_value_set_int(value, 12); 505 gst_value_list_prepend_value(list, value); 506 } 507 if (sbc->block_length & BT_A2DP_BLOCK_LENGTH_8) { 508 g_value_set_int(value, 8); 509 gst_value_list_prepend_value(list, value); 510 } 511 if (sbc->block_length & BT_A2DP_BLOCK_LENGTH_4) { 512 g_value_set_int(value, 4); 513 gst_value_list_prepend_value(list, value); 514 } 515 g_value_unset(value); 516 if (list) { 517 gst_structure_set_value(structure, "blocks", list); 518 g_free(list); 519 list = NULL; 520 } 521 522 /* allocation */ 523 g_value_init(value, G_TYPE_STRING); 524 list = g_value_init(g_new0(GValue,1), GST_TYPE_LIST); 525 if (sbc->allocation_method & BT_A2DP_ALLOCATION_LOUDNESS) { 526 g_value_set_static_string(value, "loudness"); 527 gst_value_list_prepend_value(list, value); 528 } 529 if (sbc->allocation_method & BT_A2DP_ALLOCATION_SNR) { 530 g_value_set_static_string(value, "snr"); 531 gst_value_list_prepend_value(list, value); 532 } 533 g_value_unset(value); 534 if (list) { 535 gst_structure_set_value(structure, "allocation", list); 536 g_free(list); 537 list = NULL; 538 } 539 540 /* rate */ 541 g_value_init(value, G_TYPE_INT); 542 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 543 if (sbc->frequency & BT_SBC_SAMPLING_FREQ_48000) { 544 g_value_set_int(value, 48000); 545 gst_value_list_prepend_value(list, value); 546 } 547 if (sbc->frequency & BT_SBC_SAMPLING_FREQ_44100) { 548 g_value_set_int(value, 44100); 549 gst_value_list_prepend_value(list, value); 550 } 551 if (sbc->frequency & BT_SBC_SAMPLING_FREQ_32000) { 552 g_value_set_int(value, 32000); 553 gst_value_list_prepend_value(list, value); 554 } 555 if (sbc->frequency & BT_SBC_SAMPLING_FREQ_16000) { 556 g_value_set_int(value, 16000); 557 gst_value_list_prepend_value(list, value); 558 } 559 g_value_unset(value); 560 if (list) { 561 gst_structure_set_value(structure, "rate", list); 562 g_free(list); 563 list = NULL; 564 } 565 566 /* bitpool */ 567 value = g_value_init(value, GST_TYPE_INT_RANGE); 568 gst_value_set_int_range(value, 569 MIN(sbc->min_bitpool, TEMPLATE_MAX_BITPOOL), 570 MIN(sbc->max_bitpool, TEMPLATE_MAX_BITPOOL)); 571 gst_structure_set_value(structure, "bitpool", value); 572 g_value_unset(value); 573 574 /* channels */ 575 mono = FALSE; 576 stereo = FALSE; 577 if (sbc->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) 578 mono = TRUE; 579 if ((sbc->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO) || 580 (sbc->channel_mode & 581 BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL) || 582 (sbc->channel_mode & 583 BT_A2DP_CHANNEL_MODE_JOINT_STEREO)) 584 stereo = TRUE; 585 586 if (mono && stereo) { 587 g_value_init(value, GST_TYPE_INT_RANGE); 588 gst_value_set_int_range(value, 1, 2); 589 } else { 590 g_value_init(value, G_TYPE_INT); 591 if (mono) 592 g_value_set_int(value, 1); 593 else if (stereo) 594 g_value_set_int(value, 2); 595 else { 596 GST_ERROR_OBJECT(self, 597 "Unexpected number of channels"); 598 g_value_set_int(value, 0); 599 } 600 } 601 602 gst_structure_set_value(structure, "channels", value); 603 g_free(value); 604 605 return structure; 606 } 607 608 static GstStructure *gst_avdtp_sink_parse_mpeg_caps( 609 GstAvdtpSink *self, mpeg_capabilities_t *mpeg) 610 { 611 GstStructure *structure; 612 GValue *value; 613 GValue *list; 614 gboolean valid_layer = FALSE; 615 gboolean mono, stereo; 616 617 if (!mpeg) 618 return NULL; 619 620 GST_LOG_OBJECT(self, "parsing mpeg caps"); 621 622 structure = gst_structure_empty_new("audio/mpeg"); 623 value = g_new0(GValue, 1); 624 g_value_init(value, G_TYPE_INT); 625 626 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 627 g_value_set_int(value, 1); 628 gst_value_list_prepend_value(list, value); 629 g_value_set_int(value, 2); 630 gst_value_list_prepend_value(list, value); 631 gst_structure_set_value(structure, "mpegversion", list); 632 g_free(list); 633 634 /* layer */ 635 GST_LOG_OBJECT(self, "setting mpeg layer"); 636 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 637 if (mpeg->layer & BT_MPEG_LAYER_1) { 638 g_value_set_int(value, 1); 639 gst_value_list_prepend_value(list, value); 640 valid_layer = TRUE; 641 } 642 if (mpeg->layer & BT_MPEG_LAYER_2) { 643 g_value_set_int(value, 2); 644 gst_value_list_prepend_value(list, value); 645 valid_layer = TRUE; 646 } 647 if (mpeg->layer & BT_MPEG_LAYER_3) { 648 g_value_set_int(value, 3); 649 gst_value_list_prepend_value(list, value); 650 valid_layer = TRUE; 651 } 652 if (list) { 653 gst_structure_set_value(structure, "layer", list); 654 g_free(list); 655 list = NULL; 656 } 657 658 if (!valid_layer) { 659 gst_structure_free(structure); 660 g_free(value); 661 return NULL; 662 } 663 664 /* rate */ 665 GST_LOG_OBJECT(self, "setting mpeg rate"); 666 list = g_value_init(g_new0(GValue, 1), GST_TYPE_LIST); 667 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_48000) { 668 g_value_set_int(value, 48000); 669 gst_value_list_prepend_value(list, value); 670 } 671 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_44100) { 672 g_value_set_int(value, 44100); 673 gst_value_list_prepend_value(list, value); 674 } 675 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_32000) { 676 g_value_set_int(value, 32000); 677 gst_value_list_prepend_value(list, value); 678 } 679 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_24000) { 680 g_value_set_int(value, 24000); 681 gst_value_list_prepend_value(list, value); 682 } 683 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_22050) { 684 g_value_set_int(value, 22050); 685 gst_value_list_prepend_value(list, value); 686 } 687 if (mpeg->frequency & BT_MPEG_SAMPLING_FREQ_16000) { 688 g_value_set_int(value, 16000); 689 gst_value_list_prepend_value(list, value); 690 } 691 g_value_unset(value); 692 if (list) { 693 gst_structure_set_value(structure, "rate", list); 694 g_free(list); 695 list = NULL; 696 } 697 698 /* channels */ 699 GST_LOG_OBJECT(self, "setting mpeg channels"); 700 mono = FALSE; 701 stereo = FALSE; 702 if (mpeg->channel_mode & BT_A2DP_CHANNEL_MODE_MONO) 703 mono = TRUE; 704 if ((mpeg->channel_mode & BT_A2DP_CHANNEL_MODE_STEREO) || 705 (mpeg->channel_mode & 706 BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL) || 707 (mpeg->channel_mode & 708 BT_A2DP_CHANNEL_MODE_JOINT_STEREO)) 709 stereo = TRUE; 710 711 if (mono && stereo) { 712 g_value_init(value, GST_TYPE_INT_RANGE); 713 gst_value_set_int_range(value, 1, 2); 714 } else { 715 g_value_init(value, G_TYPE_INT); 716 if (mono) 717 g_value_set_int(value, 1); 718 else if (stereo) 719 g_value_set_int(value, 2); 720 else { 721 GST_ERROR_OBJECT(self, 722 "Unexpected number of channels"); 723 g_value_set_int(value, 0); 724 } 725 } 726 gst_structure_set_value(structure, "channels", value); 727 g_free(value); 728 729 return structure; 730 } 731 732 static gboolean gst_avdtp_sink_update_caps(GstAvdtpSink *self) 733 { 734 sbc_capabilities_t *sbc; 735 mpeg_capabilities_t *mpeg; 736 GstStructure *sbc_structure; 737 GstStructure *mpeg_structure; 738 gchar *tmp; 739 740 GST_LOG_OBJECT(self, "updating device caps"); 741 742 sbc = (void *) gst_avdtp_find_caps(self, BT_A2DP_SBC_SINK); 743 mpeg = (void *) gst_avdtp_find_caps(self, BT_A2DP_MPEG12_SINK); 744 745 sbc_structure = gst_avdtp_sink_parse_sbc_caps(self, sbc); 746 mpeg_structure = gst_avdtp_sink_parse_mpeg_caps(self, mpeg); 747 748 if (self->dev_caps != NULL) 749 gst_caps_unref(self->dev_caps); 750 self->dev_caps = gst_caps_new_full(sbc_structure, NULL); 751 if (mpeg_structure != NULL) 752 gst_caps_append_structure(self->dev_caps, mpeg_structure); 753 754 tmp = gst_caps_to_string(self->dev_caps); 755 GST_DEBUG_OBJECT(self, "Device capabilities: %s", tmp); 756 g_free(tmp); 757 758 return TRUE; 759 } 760 761 static gboolean gst_avdtp_sink_get_capabilities(GstAvdtpSink *self) 762 { 763 gchar *buf[BT_SUGGESTED_BUFFER_SIZE]; 764 struct bt_get_capabilities_req *req = (void *) buf; 765 struct bt_get_capabilities_rsp *rsp = (void *) buf; 766 GIOError io_error; 767 768 memset(req, 0, BT_SUGGESTED_BUFFER_SIZE); 769 770 req->h.type = BT_REQUEST; 771 req->h.name = BT_GET_CAPABILITIES; 772 req->h.length = sizeof(*req); 773 774 if (self->device == NULL) 775 return FALSE; 776 strncpy(req->destination, self->device, 18); 777 if (self->autoconnect) 778 req->flags |= BT_FLAG_AUTOCONNECT; 779 780 io_error = gst_avdtp_sink_audioservice_send(self, &req->h); 781 if (io_error != G_IO_ERROR_NONE) { 782 GST_ERROR_OBJECT(self, "Error while asking device caps"); 783 return FALSE; 784 } 785 786 rsp->h.length = 0; 787 io_error = gst_avdtp_sink_audioservice_expect(self, 788 &rsp->h, BT_GET_CAPABILITIES); 789 if (io_error != G_IO_ERROR_NONE) { 790 GST_ERROR_OBJECT(self, "Error while getting device caps"); 791 return FALSE; 792 } 793 794 self->data->caps = g_malloc0(rsp->h.length); 795 memcpy(self->data->caps, rsp, rsp->h.length); 796 if (!gst_avdtp_sink_update_caps(self)) { 797 GST_WARNING_OBJECT(self, "failed to update capabilities"); 798 return FALSE; 799 } 800 801 return TRUE; 802 } 803 804 static gint gst_avdtp_sink_get_channel_mode(const gchar *mode) 805 { 806 if (strcmp(mode, "stereo") == 0) 807 return BT_A2DP_CHANNEL_MODE_STEREO; 808 else if (strcmp(mode, "joint-stereo") == 0) 809 return BT_A2DP_CHANNEL_MODE_JOINT_STEREO; 810 else if (strcmp(mode, "dual-channel") == 0) 811 return BT_A2DP_CHANNEL_MODE_DUAL_CHANNEL; 812 else if (strcmp(mode, "mono") == 0) 813 return BT_A2DP_CHANNEL_MODE_MONO; 814 else 815 return -1; 816 } 817 818 static void gst_avdtp_sink_tag(const GstTagList *taglist, 819 const gchar *tag, gpointer user_data) 820 { 821 gboolean crc; 822 gchar *channel_mode = NULL; 823 GstAvdtpSink *self = GST_AVDTP_SINK(user_data); 824 825 if (strcmp(tag, "has-crc") == 0) { 826 827 if (!gst_tag_list_get_boolean(taglist, tag, &crc)) { 828 GST_WARNING_OBJECT(self, "failed to get crc tag"); 829 return; 830 } 831 832 gst_avdtp_sink_set_crc(self, crc); 833 834 } else if (strcmp(tag, "channel-mode") == 0) { 835 836 if (!gst_tag_list_get_string(taglist, tag, &channel_mode)) { 837 GST_WARNING_OBJECT(self, 838 "failed to get channel-mode tag"); 839 return; 840 } 841 842 self->channel_mode = gst_avdtp_sink_get_channel_mode( 843 channel_mode); 844 if (self->channel_mode == -1) 845 GST_WARNING_OBJECT(self, "Received invalid channel " 846 "mode: %s", channel_mode); 847 g_free(channel_mode); 848 849 } else 850 GST_DEBUG_OBJECT(self, "received unused tag: %s", tag); 851 } 852 853 static gboolean gst_avdtp_sink_event(GstBaseSink *basesink, 854 GstEvent *event) 855 { 856 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 857 GstTagList *taglist = NULL; 858 859 if (GST_EVENT_TYPE(event) == GST_EVENT_TAG) { 860 /* we check the tags, mp3 has tags that are importants and 861 * are outside caps */ 862 gst_event_parse_tag(event, &taglist); 863 gst_tag_list_foreach(taglist, gst_avdtp_sink_tag, self); 864 } 865 866 return TRUE; 867 } 868 869 static gboolean gst_avdtp_sink_start(GstBaseSink *basesink) 870 { 871 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 872 gint sk; 873 gint err; 874 875 GST_INFO_OBJECT(self, "start"); 876 877 self->watch_id = 0; 878 879 sk = bt_audio_service_open(); 880 if (sk <= 0) { 881 err = errno; 882 GST_ERROR_OBJECT(self, "Cannot open connection to bt " 883 "audio service: %s %d", strerror(err), err); 884 goto failed; 885 } 886 887 self->server = g_io_channel_unix_new(sk); 888 self->watch_id = g_io_add_watch(self->server, G_IO_HUP | G_IO_ERR | 889 G_IO_NVAL, server_callback, self); 890 891 self->data = g_new0(struct bluetooth_data, 1); 892 893 self->stream = NULL; 894 self->stream_caps = NULL; 895 self->mp3_using_crc = -1; 896 self->channel_mode = -1; 897 898 if (!gst_avdtp_sink_get_capabilities(self)) { 899 GST_ERROR_OBJECT(self, "failed to get capabilities " 900 "from device"); 901 goto failed; 902 } 903 904 return TRUE; 905 906 failed: 907 bt_audio_service_close(sk); 908 return FALSE; 909 } 910 911 static gboolean gst_avdtp_sink_stream_start(GstAvdtpSink *self) 912 { 913 gchar buf[BT_SUGGESTED_BUFFER_SIZE]; 914 struct bt_start_stream_req *req = (void *) buf; 915 struct bt_start_stream_rsp *rsp = (void *) buf; 916 struct bt_new_stream_ind *ind = (void *) buf; 917 GIOError io_error; 918 919 memset(req, 0, sizeof(buf)); 920 req->h.type = BT_REQUEST; 921 req->h.name = BT_START_STREAM; 922 req->h.length = sizeof(*req); 923 924 io_error = gst_avdtp_sink_audioservice_send(self, &req->h); 925 if (io_error != G_IO_ERROR_NONE) { 926 GST_ERROR_OBJECT(self, "Error ocurred while sending " 927 "start packet"); 928 return FALSE; 929 } 930 931 rsp->h.length = sizeof(*rsp); 932 io_error = gst_avdtp_sink_audioservice_expect(self, 933 &rsp->h, BT_START_STREAM); 934 if (io_error != G_IO_ERROR_NONE) { 935 GST_ERROR_OBJECT(self, "Error while stream " 936 "start confirmation"); 937 return FALSE; 938 } 939 940 ind->h.length = sizeof(*ind); 941 io_error = gst_avdtp_sink_audioservice_expect(self, &ind->h, 942 BT_NEW_STREAM); 943 if (io_error != G_IO_ERROR_NONE) { 944 GST_ERROR_OBJECT(self, "Error while receiving " 945 "stream filedescriptor"); 946 return FALSE; 947 } 948 949 if (!gst_avdtp_sink_conf_recv_stream_fd(self)) 950 return FALSE; 951 952 return TRUE; 953 } 954 955 static gboolean gst_avdtp_sink_init_mp3_pkt_conf( 956 GstAvdtpSink *self, GstCaps *caps, 957 mpeg_capabilities_t *pkt) 958 { 959 const GValue *value = NULL; 960 gint rate, layer; 961 const gchar *name; 962 GstStructure *structure = gst_caps_get_structure(caps, 0); 963 964 name = gst_structure_get_name(structure); 965 966 if (!(IS_MPEG_AUDIO(name))) { 967 GST_ERROR_OBJECT(self, "Unexpected format %s, " 968 "was expecting mp3", name); 969 return FALSE; 970 } 971 972 /* layer */ 973 value = gst_structure_get_value(structure, "layer"); 974 layer = g_value_get_int(value); 975 if (layer == 1) 976 pkt->layer = BT_MPEG_LAYER_1; 977 else if (layer == 2) 978 pkt->layer = BT_MPEG_LAYER_2; 979 else if (layer == 3) 980 pkt->layer = BT_MPEG_LAYER_3; 981 else { 982 GST_ERROR_OBJECT(self, "Unexpected layer: %d", layer); 983 return FALSE; 984 } 985 986 /* crc */ 987 if (self->mp3_using_crc != -1) 988 pkt->crc = self->mp3_using_crc; 989 else { 990 GST_ERROR_OBJECT(self, "No info about crc was received, " 991 " can't proceed"); 992 return FALSE; 993 } 994 995 /* channel mode */ 996 if (self->channel_mode != -1) 997 pkt->channel_mode = self->channel_mode; 998 else { 999 GST_ERROR_OBJECT(self, "No info about channel mode " 1000 "received, can't proceed"); 1001 return FALSE; 1002 } 1003 1004 /* mpf - we will only use the mandatory one */ 1005 pkt->mpf = 0; 1006 1007 value = gst_structure_get_value(structure, "rate"); 1008 rate = g_value_get_int(value); 1009 if (rate == 44100) 1010 pkt->frequency = BT_MPEG_SAMPLING_FREQ_44100; 1011 else if (rate == 48000) 1012 pkt->frequency = BT_MPEG_SAMPLING_FREQ_48000; 1013 else if (rate == 32000) 1014 pkt->frequency = BT_MPEG_SAMPLING_FREQ_32000; 1015 else if (rate == 24000) 1016 pkt->frequency = BT_MPEG_SAMPLING_FREQ_24000; 1017 else if (rate == 22050) 1018 pkt->frequency = BT_MPEG_SAMPLING_FREQ_22050; 1019 else if (rate == 16000) 1020 pkt->frequency = BT_MPEG_SAMPLING_FREQ_16000; 1021 else { 1022 GST_ERROR_OBJECT(self, "Invalid rate while setting caps"); 1023 return FALSE; 1024 } 1025 1026 /* vbr - we always say its vbr, we don't have how to know it */ 1027 pkt->bitrate = 0x8000; 1028 1029 return TRUE; 1030 } 1031 1032 static gboolean gst_avdtp_sink_configure(GstAvdtpSink *self, 1033 GstCaps *caps) 1034 { 1035 gchar buf[BT_SUGGESTED_BUFFER_SIZE]; 1036 struct bt_open_req *open_req = (void *) buf; 1037 struct bt_open_rsp *open_rsp = (void *) buf; 1038 struct bt_set_configuration_req *req = (void *) buf; 1039 struct bt_set_configuration_rsp *rsp = (void *) buf; 1040 gboolean ret; 1041 GIOError io_error; 1042 gchar *temp; 1043 GstStructure *structure; 1044 codec_capabilities_t *codec = NULL; 1045 1046 temp = gst_caps_to_string(caps); 1047 GST_DEBUG_OBJECT(self, "configuring device with caps: %s", temp); 1048 g_free(temp); 1049 1050 structure = gst_caps_get_structure(caps, 0); 1051 1052 if (gst_structure_has_name(structure, "audio/x-sbc")) 1053 codec = (void *) gst_avdtp_find_caps(self, BT_A2DP_SBC_SINK); 1054 else if (gst_structure_has_name(structure, "audio/mpeg")) 1055 codec = (void *) gst_avdtp_find_caps(self, BT_A2DP_MPEG12_SINK); 1056 1057 if (codec == NULL) { 1058 GST_ERROR_OBJECT(self, "Couldn't parse caps " 1059 "to packet configuration"); 1060 return FALSE; 1061 } 1062 1063 memset(req, 0, BT_SUGGESTED_BUFFER_SIZE); 1064 open_req->h.type = BT_REQUEST; 1065 open_req->h.name = BT_OPEN; 1066 open_req->h.length = sizeof(*open_req); 1067 1068 strncpy(open_req->destination, self->device, 18); 1069 open_req->seid = codec->seid; 1070 open_req->lock = BT_WRITE_LOCK; 1071 1072 io_error = gst_avdtp_sink_audioservice_send(self, &open_req->h); 1073 if (io_error != G_IO_ERROR_NONE) { 1074 GST_ERROR_OBJECT(self, "Error ocurred while sending " 1075 "open packet"); 1076 return FALSE; 1077 } 1078 1079 open_rsp->h.length = sizeof(*open_rsp); 1080 io_error = gst_avdtp_sink_audioservice_expect(self, 1081 &open_rsp->h, BT_OPEN); 1082 if (io_error != G_IO_ERROR_NONE) { 1083 GST_ERROR_OBJECT(self, "Error while receiving device " 1084 "confirmation"); 1085 return FALSE; 1086 } 1087 1088 memset(req, 0, sizeof(buf)); 1089 req->h.type = BT_REQUEST; 1090 req->h.name = BT_SET_CONFIGURATION; 1091 req->h.length = sizeof(*req); 1092 1093 if (codec->type == BT_A2DP_SBC_SINK) 1094 ret = gst_avdtp_sink_init_sbc_pkt_conf(self, caps, 1095 (void *) &req->codec); 1096 else 1097 ret = gst_avdtp_sink_init_mp3_pkt_conf(self, caps, 1098 (void *) &req->codec); 1099 1100 if (!ret) { 1101 GST_ERROR_OBJECT(self, "Couldn't parse caps " 1102 "to packet configuration"); 1103 return FALSE; 1104 } 1105 1106 req->h.length += req->codec.length - sizeof(req->codec); 1107 io_error = gst_avdtp_sink_audioservice_send(self, &req->h); 1108 if (io_error != G_IO_ERROR_NONE) { 1109 GST_ERROR_OBJECT(self, "Error ocurred while sending " 1110 "configurarion packet"); 1111 return FALSE; 1112 } 1113 1114 rsp->h.length = sizeof(*rsp); 1115 io_error = gst_avdtp_sink_audioservice_expect(self, 1116 &rsp->h, BT_SET_CONFIGURATION); 1117 if (io_error != G_IO_ERROR_NONE) { 1118 GST_ERROR_OBJECT(self, "Error while receiving device " 1119 "confirmation"); 1120 return FALSE; 1121 } 1122 1123 self->data->link_mtu = rsp->link_mtu; 1124 1125 return TRUE; 1126 } 1127 1128 static GstFlowReturn gst_avdtp_sink_preroll(GstBaseSink *basesink, 1129 GstBuffer *buffer) 1130 { 1131 GstAvdtpSink *sink = GST_AVDTP_SINK(basesink); 1132 gboolean ret; 1133 1134 GST_AVDTP_SINK_MUTEX_LOCK(sink); 1135 1136 ret = gst_avdtp_sink_stream_start(sink); 1137 1138 GST_AVDTP_SINK_MUTEX_UNLOCK(sink); 1139 1140 if (!ret) 1141 return GST_FLOW_ERROR; 1142 1143 return GST_FLOW_OK; 1144 } 1145 1146 static GstFlowReturn gst_avdtp_sink_render(GstBaseSink *basesink, 1147 GstBuffer *buffer) 1148 { 1149 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 1150 gsize ret; 1151 GIOError err; 1152 1153 err = g_io_channel_write(self->stream, 1154 (gchar *) GST_BUFFER_DATA(buffer), 1155 (gsize) (GST_BUFFER_SIZE(buffer)), &ret); 1156 1157 if (err != G_IO_ERROR_NONE) { 1158 GST_ERROR_OBJECT(self, "Error while writting to socket: %d %s", 1159 errno, strerror(errno)); 1160 return GST_FLOW_ERROR; 1161 } 1162 1163 return GST_FLOW_OK; 1164 } 1165 1166 static gboolean gst_avdtp_sink_unlock(GstBaseSink *basesink) 1167 { 1168 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 1169 1170 if (self->stream != NULL) 1171 g_io_channel_flush(self->stream, NULL); 1172 1173 return TRUE; 1174 } 1175 1176 static GstFlowReturn gst_avdtp_sink_buffer_alloc(GstBaseSink *basesink, 1177 guint64 offset, guint size, GstCaps *caps, 1178 GstBuffer **buf) 1179 { 1180 GstAvdtpSink *self = GST_AVDTP_SINK(basesink); 1181 1182 *buf = gst_buffer_new_and_alloc(size); 1183 if (!(*buf)) { 1184 GST_ERROR_OBJECT(self, "buffer allocation failed"); 1185 return GST_FLOW_ERROR; 1186 } 1187 1188 gst_buffer_set_caps(*buf, caps); 1189 1190 GST_BUFFER_OFFSET(*buf) = offset; 1191 1192 return GST_FLOW_OK; 1193 } 1194 1195 static void gst_avdtp_sink_class_init(GstAvdtpSinkClass *klass) 1196 { 1197 GObjectClass *object_class = G_OBJECT_CLASS(klass); 1198 GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS(klass); 1199 1200 parent_class = g_type_class_peek_parent(klass); 1201 1202 object_class->finalize = GST_DEBUG_FUNCPTR( 1203 gst_avdtp_sink_finalize); 1204 object_class->set_property = GST_DEBUG_FUNCPTR( 1205 gst_avdtp_sink_set_property); 1206 object_class->get_property = GST_DEBUG_FUNCPTR( 1207 gst_avdtp_sink_get_property); 1208 1209 basesink_class->start = GST_DEBUG_FUNCPTR(gst_avdtp_sink_start); 1210 basesink_class->stop = GST_DEBUG_FUNCPTR(gst_avdtp_sink_stop); 1211 basesink_class->render = GST_DEBUG_FUNCPTR( 1212 gst_avdtp_sink_render); 1213 basesink_class->preroll = GST_DEBUG_FUNCPTR( 1214 gst_avdtp_sink_preroll); 1215 basesink_class->unlock = GST_DEBUG_FUNCPTR( 1216 gst_avdtp_sink_unlock); 1217 basesink_class->event = GST_DEBUG_FUNCPTR( 1218 gst_avdtp_sink_event); 1219 1220 basesink_class->buffer_alloc = 1221 GST_DEBUG_FUNCPTR(gst_avdtp_sink_buffer_alloc); 1222 1223 g_object_class_install_property(object_class, PROP_DEVICE, 1224 g_param_spec_string("device", "Device", 1225 "Bluetooth remote device address", 1226 NULL, G_PARAM_READWRITE)); 1227 1228 g_object_class_install_property(object_class, PROP_AUTOCONNECT, 1229 g_param_spec_boolean("auto-connect", 1230 "Auto-connect", 1231 "Automatically attempt to connect " 1232 "to device", DEFAULT_AUTOCONNECT, 1233 G_PARAM_READWRITE)); 1234 1235 GST_DEBUG_CATEGORY_INIT(avdtp_sink_debug, "avdtpsink", 0, 1236 "A2DP headset sink element"); 1237 } 1238 1239 static void gst_avdtp_sink_init(GstAvdtpSink *self, 1240 GstAvdtpSinkClass *klass) 1241 { 1242 self->device = NULL; 1243 self->data = NULL; 1244 1245 self->stream = NULL; 1246 1247 self->dev_caps = NULL; 1248 1249 self->autoconnect = DEFAULT_AUTOCONNECT; 1250 1251 self->sink_lock = g_mutex_new(); 1252 1253 /* FIXME this is for not synchronizing with clock, should be tested 1254 * with devices to see the behaviour 1255 gst_base_sink_set_sync(GST_BASE_SINK(self), FALSE); 1256 */ 1257 } 1258 1259 static GIOError gst_avdtp_sink_audioservice_send( 1260 GstAvdtpSink *self, 1261 const bt_audio_msg_header_t *msg) 1262 { 1263 GIOError error; 1264 gsize written; 1265 const char *type, *name; 1266 uint16_t length; 1267 1268 length = msg->length ? msg->length : BT_SUGGESTED_BUFFER_SIZE; 1269 1270 error = g_io_channel_write(self->server, (const gchar *) msg, length, 1271 &written); 1272 if (error != G_IO_ERROR_NONE) 1273 GST_ERROR_OBJECT(self, "Error sending data to audio service:" 1274 " %s(%d)", strerror(errno), errno); 1275 1276 type = bt_audio_strtype(msg->type); 1277 name = bt_audio_strname(msg->name); 1278 1279 GST_DEBUG_OBJECT(self, "sent: %s -> %s", type, name); 1280 1281 return error; 1282 } 1283 1284 static GIOError gst_avdtp_sink_audioservice_recv( 1285 GstAvdtpSink *self, 1286 bt_audio_msg_header_t *inmsg) 1287 { 1288 GIOError status; 1289 gsize bytes_read; 1290 const char *type, *name; 1291 uint16_t length; 1292 1293 length = inmsg->length ? inmsg->length : BT_SUGGESTED_BUFFER_SIZE; 1294 1295 status = g_io_channel_read(self->server, (gchar *) inmsg, length, 1296 &bytes_read); 1297 if (status != G_IO_ERROR_NONE) { 1298 GST_ERROR_OBJECT(self, "Error receiving data from " 1299 "audio service"); 1300 return status; 1301 } 1302 1303 type = bt_audio_strtype(inmsg->type); 1304 if (!type) { 1305 status = G_IO_ERROR_INVAL; 1306 GST_ERROR_OBJECT(self, "Bogus message type %d " 1307 "received from audio service", 1308 inmsg->type); 1309 } 1310 1311 name = bt_audio_strname(inmsg->name); 1312 if (!name) { 1313 status = G_IO_ERROR_INVAL; 1314 GST_ERROR_OBJECT(self, "Bogus message name %d " 1315 "received from audio service", 1316 inmsg->name); 1317 } 1318 1319 if (inmsg->type == BT_ERROR) { 1320 bt_audio_error_t *err = (void *) inmsg; 1321 status = G_IO_ERROR_INVAL; 1322 GST_ERROR_OBJECT(self, "%s failed : " 1323 "%s(%d)", 1324 name, 1325 strerror(err->posix_errno), 1326 err->posix_errno); 1327 } 1328 1329 GST_DEBUG_OBJECT(self, "received: %s <- %s", type, name); 1330 1331 return status; 1332 } 1333 1334 static GIOError gst_avdtp_sink_audioservice_expect( 1335 GstAvdtpSink *self, bt_audio_msg_header_t *outmsg, 1336 guint8 expected_name) 1337 { 1338 GIOError status; 1339 1340 status = gst_avdtp_sink_audioservice_recv(self, outmsg); 1341 if (status != G_IO_ERROR_NONE) 1342 return status; 1343 1344 if (outmsg->name != expected_name) 1345 status = G_IO_ERROR_INVAL; 1346 1347 return status; 1348 } 1349 1350 gboolean gst_avdtp_sink_plugin_init(GstPlugin *plugin) 1351 { 1352 return gst_element_register(plugin, "avdtpsink", GST_RANK_NONE, 1353 GST_TYPE_AVDTP_SINK); 1354 } 1355 1356 1357 /* public functions */ 1358 GstCaps *gst_avdtp_sink_get_device_caps(GstAvdtpSink *sink) 1359 { 1360 if (sink->dev_caps == NULL) 1361 return NULL; 1362 1363 return gst_caps_copy(sink->dev_caps); 1364 } 1365 1366 gboolean gst_avdtp_sink_set_device_caps(GstAvdtpSink *self, 1367 GstCaps *caps) 1368 { 1369 gboolean ret; 1370 1371 GST_DEBUG_OBJECT(self, "setting device caps"); 1372 GST_AVDTP_SINK_MUTEX_LOCK(self); 1373 ret = gst_avdtp_sink_configure(self, caps); 1374 1375 if (self->stream_caps) 1376 gst_caps_unref(self->stream_caps); 1377 self->stream_caps = gst_caps_ref(caps); 1378 1379 GST_AVDTP_SINK_MUTEX_UNLOCK(self); 1380 1381 return ret; 1382 } 1383 1384 guint gst_avdtp_sink_get_link_mtu(GstAvdtpSink *sink) 1385 { 1386 return sink->data->link_mtu; 1387 } 1388 1389 void gst_avdtp_sink_set_device(GstAvdtpSink *self, const gchar *dev) 1390 { 1391 if (self->device != NULL) 1392 g_free(self->device); 1393 1394 GST_LOG_OBJECT(self, "Setting device: %s", dev); 1395 self->device = g_strdup(dev); 1396 } 1397 1398 gchar *gst_avdtp_sink_get_device(GstAvdtpSink *self) 1399 { 1400 return g_strdup(self->device); 1401 } 1402 1403 void gst_avdtp_sink_set_crc(GstAvdtpSink *self, gboolean crc) 1404 { 1405 gint new_crc; 1406 1407 new_crc = crc ? CRC_PROTECTED : CRC_UNPROTECTED; 1408 1409 /* test if we already received a different crc */ 1410 if (self->mp3_using_crc != -1 && new_crc != self->mp3_using_crc) { 1411 GST_WARNING_OBJECT(self, "crc changed during stream"); 1412 return; 1413 } 1414 self->mp3_using_crc = new_crc; 1415 1416 } 1417 1418 void gst_avdtp_sink_set_channel_mode(GstAvdtpSink *self, 1419 const gchar *mode) 1420 { 1421 gint new_mode; 1422 1423 new_mode = gst_avdtp_sink_get_channel_mode(mode); 1424 1425 if (self->channel_mode != -1 && new_mode != self->channel_mode) { 1426 GST_WARNING_OBJECT(self, "channel mode changed during stream"); 1427 return; 1428 } 1429 1430 self->channel_mode = new_mode; 1431 if (self->channel_mode == -1) 1432 GST_WARNING_OBJECT(self, "Received invalid channel " 1433 "mode: %s", mode); 1434 } 1435