386
switch (operands[0] & 0x7F) {
388
debug("AVRCP: PLAY %s", status);
389
send_key(session->uinput, KEY_PLAYPAUSE, pressed);
392
debug("AVRCP: STOP %s", status);
393
send_key(session->uinput, KEY_STOP, pressed);
396
debug("AVRCP: PAUSE %s", status);
397
send_key(session->uinput, KEY_PLAYPAUSE, pressed);
400
debug("AVRCP: NEXT %s", status);
401
send_key(session->uinput, KEY_NEXTSONG, pressed);
404
debug("AVRCP: PREV %s", status);
405
send_key(session->uinput, KEY_PREVIOUSSONG, pressed);
408
debug("AVRCP: REWIND %s", status);
409
send_key(session->uinput, KEY_REWIND, pressed);
411
case FAST_FORWARD_OP:
412
debug("AVRCP: FAST FORWARD %s", status);
413
send_key(session->uinput, KEY_FORWARD, pressed);
416
debug("AVRCP: unknown button 0x%02X %s", operands[0] & 0x7F, status);
421
static void avctp_unref(struct avctp *session)
423
sessions = g_slist_remove(sessions, session);
425
if (session->state == AVCTP_STATE_CONNECTED) {
426
gboolean value = FALSE;
427
g_dbus_emit_signal(session->dev->conn, session->dev->path,
370
for (i = 0; key_map[i].name != NULL; i++) {
373
if ((operands[0] & 0x7F) != key_map[i].avrcp)
376
DBG("AVRCP: %s %s", key_map[i].name, status);
378
key_quirks = control->key_quirks[key_map[i].avrcp];
380
if (key_quirks & QUIRK_NO_RELEASE) {
382
DBG("AVRCP: Ignoring release");
386
DBG("AVRCP: treating key press as press + release");
387
send_key(control->uinput, key_map[i].uinput, 1);
388
send_key(control->uinput, key_map[i].uinput, 0);
392
send_key(control->uinput, key_map[i].uinput, pressed);
396
if (key_map[i].name == NULL)
397
DBG("AVRCP: unknown button 0x%02X %s",
398
operands[0] & 0x7F, status);
401
static void avctp_disconnected(struct audio_device *dev)
403
struct control *control = dev->control;
409
g_io_channel_shutdown(control->io, TRUE, NULL);
410
g_io_channel_unref(control->io);
414
if (control->io_id) {
415
g_source_remove(control->io_id);
418
if (control->state == AVCTP_STATE_CONNECTING)
419
audio_device_cancel_authorization(dev, auth_cb,
423
if (control->uinput >= 0) {
426
ba2str(&dev->dst, address);
427
DBG("AVRCP: closing uinput for %s", address);
429
ioctl(control->uinput, UI_DEV_DESTROY);
430
close(control->uinput);
431
control->uinput = -1;
435
static void avctp_set_state(struct control *control, avctp_state_t new_state)
438
struct audio_device *dev = control->dev;
439
avctp_state_t old_state = control->state;
443
case AVCTP_STATE_DISCONNECTED:
444
DBG("AVCTP Disconnected");
446
avctp_disconnected(control->dev);
448
if (old_state != AVCTP_STATE_CONNECTED)
452
g_dbus_emit_signal(dev->conn, dev->path,
428
453
AUDIO_CONTROL_INTERFACE,
429
454
"Disconnected", DBUS_TYPE_INVALID);
430
emit_property_changed(session->dev->conn, session->dev->path,
455
emit_property_changed(dev->conn, dev->path,
431
456
AUDIO_CONTROL_INTERFACE, "Connected",
432
457
DBUS_TYPE_BOOLEAN, &value);
436
g_io_channel_shutdown(session->io, TRUE, NULL);
437
g_io_channel_unref(session->io);
441
g_source_remove(session->io_id);
443
if (session->dev && session->dev->control)
444
session->dev->control->session = NULL;
446
if (session->uinput >= 0) {
447
ioctl(session->uinput, UI_DEV_DESTROY);
448
close(session->uinput);
459
if (!audio_device_is_active(dev, NULL))
460
audio_device_set_authorized(dev, FALSE);
463
case AVCTP_STATE_CONNECTING:
464
DBG("AVCTP Connecting");
466
case AVCTP_STATE_CONNECTED:
467
DBG("AVCTP Connected");
469
g_dbus_emit_signal(control->dev->conn, control->dev->path,
470
AUDIO_CONTROL_INTERFACE, "Connected",
472
emit_property_changed(control->dev->conn, control->dev->path,
473
AUDIO_CONTROL_INTERFACE, "Connected",
474
DBUS_TYPE_BOOLEAN, &value);
477
error("Invalid AVCTP state %d", new_state);
481
control->state = new_state;
483
for (l = avctp_callbacks; l != NULL; l = l->next) {
484
struct avctp_state_callback *cb = l->data;
485
cb->cb(control->dev, old_state, new_state, cb->user_data);
454
static gboolean session_cb(GIOChannel *chan, GIOCondition cond,
489
static gboolean control_cb(GIOChannel *chan, GIOCondition cond,
457
struct avctp *session = data;
492
struct control *control = data;
458
493
unsigned char buf[1024], *operands;
459
494
struct avctp_header *avctp;
460
495
struct avrcp_header *avrcp;
461
496
int ret, packet_size, operand_count, sock;
463
if (!(cond | G_IO_IN))
498
if (cond & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
466
sock = g_io_channel_unix_get_fd(session->io);
501
sock = g_io_channel_unix_get_fd(control->io);
468
503
ret = read(sock, buf, sizeof(buf));
472
debug("Got %d bytes of data for AVCTP session %p", ret, session);
507
DBG("Got %d bytes of data for AVCTP session %p", ret, control);
474
509
if ((unsigned int) ret < sizeof(struct avctp_header)) {
475
510
error("Too small AVCTP packet");
604
static void init_uinput(struct avctp *session)
643
static void init_uinput(struct control *control)
608
ba2str(&session->dst, address);
610
session->uinput = uinput_create(address);
611
if (session->uinput < 0)
645
struct audio_device *dev = control->dev;
646
char address[18], name[248 + 1];
648
device_get_name(dev->btd_dev, name, sizeof(name));
649
if (g_str_equal(name, "Nokia CK-20W")) {
650
control->key_quirks[FORWARD_OP] |= QUIRK_NO_RELEASE;
651
control->key_quirks[BACKWARD_OP] |= QUIRK_NO_RELEASE;
652
control->key_quirks[PLAY_OP] |= QUIRK_NO_RELEASE;
653
control->key_quirks[PAUSE_OP] |= QUIRK_NO_RELEASE;
656
ba2str(&dev->dst, address);
658
control->uinput = uinput_create(address);
659
if (control->uinput < 0)
612
660
error("AVRCP: failed to init uinput for %s", address);
614
debug("AVRCP: uinput initialized for %s", address);
617
static void avctp_set_state(struct avctp *session, avctp_state_t new_state)
620
avdtp_session_state_t old_state = session->state;
622
session->state = new_state;
624
for (l = avctp_callbacks; l != NULL; l = l->next) {
625
struct avctp_state_callback *cb = l->data;
626
cb->cb(session->dev, old_state, new_state, cb->user_data);
662
DBG("AVRCP: uinput initialized for %s", address);
630
665
static void avctp_connect_cb(GIOChannel *chan, GError *err, gpointer data)
632
667
struct control *control = data;
633
struct avctp *session = control->session;
634
668
char address[18];
636
670
GError *gerr = NULL;
640
debug("avctp_connect_cb: session removed while connecting");
642
g_io_channel_shutdown(chan, TRUE, NULL);
647
avctp_unref(session);
673
avctp_set_state(control, AVCTP_STATE_DISCONNECTED);
648
674
error("%s", err->message);
654
680
BT_IO_OPT_IMTU, &imtu,
655
681
BT_IO_OPT_INVALID);
657
avctp_unref(session);
683
avctp_set_state(control, AVCTP_STATE_DISCONNECTED);
658
684
error("%s", gerr->message);
659
685
g_error_free(gerr);
660
g_io_channel_shutdown(chan, TRUE, NULL);
664
debug("AVCTP: connected to %s", address);
667
session->io = g_io_channel_ref(chan);
669
init_uinput(session);
672
g_dbus_emit_signal(session->dev->conn, session->dev->path,
673
AUDIO_CONTROL_INTERFACE, "Connected",
675
emit_property_changed(session->dev->conn, session->dev->path,
676
AUDIO_CONTROL_INTERFACE, "Connected",
677
DBUS_TYPE_BOOLEAN, &value);
679
avctp_set_state(session, AVCTP_STATE_CONNECTED);
681
session->io_id = g_io_add_watch(chan,
689
DBG("AVCTP: connected to %s", address);
692
control->io = g_io_channel_ref(chan);
694
init_uinput(control);
696
avctp_set_state(control, AVCTP_STATE_CONNECTED);
698
control->io_id = g_io_add_watch(chan,
682
699
G_IO_IN | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
683
(GIOFunc) session_cb, session);
700
(GIOFunc) control_cb, control);
686
703
static void auth_cb(DBusError *derr, void *user_data)
688
705
struct control *control = user_data;
689
struct avctp *session = control->session;
690
706
GError *err = NULL;
708
if (control->io_id) {
709
g_source_remove(control->io_id);
692
713
if (derr && dbus_error_is_set(derr)) {
693
714
error("Access denied: %s", derr->message);
694
avctp_unref(session);
715
avctp_set_state(control, AVCTP_STATE_DISCONNECTED);
698
if (!bt_io_accept(session->io, avctp_connect_cb, control,
719
if (!bt_io_accept(control->io, avctp_connect_cb, control,
700
721
error("bt_io_accept: %s", err->message);
701
722
g_error_free(err);
702
avctp_unref(session);
723
avctp_set_state(control, AVCTP_STATE_DISCONNECTED);
706
727
static void avctp_confirm_cb(GIOChannel *chan, gpointer data)
708
struct avctp *session;
729
struct control *control = NULL;
709
730
struct audio_device *dev;
710
731
char address[18];
711
732
bdaddr_t src, dst;
726
session = avctp_get(&src, &dst);
729
error("Unable to create new AVCTP session");
734
error("Refusing unexpected connect from %s", address);
738
dev = manager_get_device(&src, &dst);
747
dev = manager_get_device(&src, &dst, TRUE);
740
749
error("Unable to get audio device object for %s", address);
745
dev->control = control_init(dev);
747
if (!dev->control->session)
748
dev->control->session = session;
753
avctp_set_state(session, AVCTP_STATE_CONNECTING);
754
session->io = g_io_channel_ref(chan);
756
if (avdtp_is_connected(&src, &dst)) {
757
if (!bt_io_accept(chan, avctp_connect_cb, dev->control,
754
btd_device_add_uuid(dev->btd_dev, AVRCP_REMOTE_UUID);
760
} else if (btd_request_authorization(&src, &dst,
761
AVRCP_TARGET_UUID, auth_cb, dev->control) < 0)
759
control = dev->control;
762
error("Refusing unexpected connect from %s", address);
766
avctp_set_state(control, AVCTP_STATE_CONNECTING);
767
control->io = g_io_channel_ref(chan);
769
if (audio_device_request_authorization(dev, AVRCP_TARGET_UUID,
770
auth_cb, dev->control) < 0)
773
control->io_id = g_io_add_watch(chan, G_IO_ERR | G_IO_HUP | G_IO_NVAL,
774
control_cb, control);
778
if (!control || !control->io)
768
779
g_io_channel_shutdown(chan, TRUE, NULL);
769
avctp_unref(session);
781
avctp_set_state(control, AVCTP_STATE_DISCONNECTED);
772
784
static GIOChannel *avctp_server_socket(const bdaddr_t *src, gboolean master)
970
static int avctp_send_passthrough(struct control *control, uint8_t op)
972
unsigned char buf[AVCTP_HEADER_LENGTH + AVRCP_HEADER_LENGTH + 2];
973
struct avctp_header *avctp = (void *) buf;
974
struct avrcp_header *avrcp = (void *) &buf[AVCTP_HEADER_LENGTH];
975
uint8_t *operands = &buf[AVCTP_HEADER_LENGTH + AVRCP_HEADER_LENGTH];
976
int err, sk = g_io_channel_unix_get_fd(control->io);
977
static uint8_t transaction = 0;
979
memset(buf, 0, sizeof(buf));
981
avctp->transaction = transaction++;
982
avctp->packet_type = AVCTP_PACKET_SINGLE;
983
avctp->cr = AVCTP_COMMAND;
984
avctp->pid = htons(AV_REMOTE_SVCLASS_ID);
986
avrcp->code = CTYPE_CONTROL;
987
avrcp->subunit_type = SUBUNIT_PANEL;
988
avrcp->opcode = OP_PASSTHROUGH;
990
operands[0] = op & 0x7f;
993
err = write(sk, buf, sizeof(buf));
998
avctp->transaction = transaction++;
1001
return write(sk, buf, sizeof(buf));
1004
static DBusMessage *volume_up(DBusConnection *conn, DBusMessage *msg,
1007
struct audio_device *device = data;
1008
struct control *control = device->control;
1012
reply = dbus_message_new_method_return(msg);
1016
if (control->state != AVCTP_STATE_CONNECTED)
1017
return g_dbus_create_error(msg,
1018
ERROR_INTERFACE ".NotConnected",
1019
"Device not Connected");
1021
if (!control->target)
1022
return g_dbus_create_error(msg,
1023
ERROR_INTERFACE ".NotSupported",
1024
"AVRCP Target role not supported");
1026
err = avctp_send_passthrough(control, VOL_UP_OP);
1028
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1029
"%s", strerror(-err));
1031
return dbus_message_new_method_return(msg);
1034
static DBusMessage *volume_down(DBusConnection *conn, DBusMessage *msg,
1037
struct audio_device *device = data;
1038
struct control *control = device->control;
1042
reply = dbus_message_new_method_return(msg);
1046
if (control->state != AVCTP_STATE_CONNECTED)
1047
return g_dbus_create_error(msg,
1048
ERROR_INTERFACE ".NotConnected",
1049
"Device not Connected");
1051
if (!control->target)
1052
return g_dbus_create_error(msg,
1053
ERROR_INTERFACE ".NotSupported",
1054
"AVRCP Target role not supported");
1056
err = avctp_send_passthrough(control, VOL_DOWN_OP);
1058
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1059
"%s", strerror(-err));
1061
return dbus_message_new_method_return(msg);
966
1064
static DBusMessage *control_get_properties(DBusConnection *conn,
967
1065
DBusMessage *msg, void *data)
1009
static void control_free(struct audio_device *dev)
1109
static void path_unregister(void *data)
1111
struct audio_device *dev = data;
1011
1112
struct control *control = dev->control;
1013
if (control->session)
1014
avctp_unref(control->session);
1114
DBG("Unregistered interface %s on path %s",
1115
AUDIO_CONTROL_INTERFACE, dev->path);
1117
if (control->state != AVCTP_STATE_DISCONNECTED)
1118
avctp_disconnected(dev);
1016
1120
g_free(control);
1017
1121
dev->control = NULL;
1020
static void path_unregister(void *data)
1022
struct audio_device *dev = data;
1024
debug("Unregistered interface %s on path %s",
1025
AUDIO_CONTROL_INTERFACE, dev->path);
1030
1124
void control_unregister(struct audio_device *dev)
1032
1126
g_dbus_unregister_interface(dev->conn, dev->path,
1033
1127
AUDIO_CONTROL_INTERFACE);
1036
struct control *control_init(struct audio_device *dev)
1130
void control_update(struct audio_device *dev, uint16_t uuid16)
1132
struct control *control = dev->control;
1134
if (uuid16 == AV_REMOTE_TARGET_SVCLASS_ID)
1135
control->target = TRUE;
1138
struct control *control_init(struct audio_device *dev, uint16_t uuid16)
1140
struct control *control;
1038
1142
if (!g_dbus_register_interface(dev->conn, dev->path,
1039
1143
AUDIO_CONTROL_INTERFACE,
1040
1144
control_methods, control_signals, NULL,
1041
1145
dev, path_unregister))
1044
debug("Registered interface %s on path %s",
1148
DBG("Registered interface %s on path %s",
1045
1149
AUDIO_CONTROL_INTERFACE, dev->path);
1047
return g_new0(struct control, 1);
1151
control = g_new0(struct control, 1);
1153
control->state = AVCTP_STATE_DISCONNECTED;
1154
control->uinput = -1;
1156
if (uuid16 == AV_REMOTE_TARGET_SVCLASS_ID)
1157
control->target = TRUE;
1050
1162
gboolean control_is_active(struct audio_device *dev)
1052
1164
struct control *control = dev->control;
1054
if (control->session &&
1055
control->session->state != AVCTP_STATE_DISCONNECTED)
1166
if (control && control->state != AVCTP_STATE_DISCONNECTED)