static int avrcp_device_add_session(struct avrcp_device *dev, int fd, uint16_t imtu, uint16_t omtu) { struct hal_ev_avrcp_remote_features ev; char address[18]; dev->session = avrcp_new(fd, imtu, omtu, dev->version); if (!dev->session) return -EINVAL; avrcp_set_destroy_cb(dev->session, disconnect_cb, dev); avrcp_set_passthrough_handlers(dev->session, passthrough_handlers, dev); avrcp_register_player(dev->session, &control_ind, &control_cfm, dev); dev->queue = g_queue_new(); ba2str(&dev->dst, address); /* FIXME: get the real name of the device */ avrcp_init_uinput(dev->session, "bluetooth", address); bdaddr2android(&dev->dst, ev.bdaddr); ev.features = HAL_AVRCP_FEATURE_NONE; DBG("version 0x%02x", dev->version); if (dev->version < 0x0103) goto done; ev.features |= HAL_AVRCP_FEATURE_METADATA; if (dev->version < 0x0104) goto done; ev.features |= HAL_AVRCP_FEATURE_ABSOLUTE_VOLUME; avrcp_get_capabilities(dev->session, CAP_EVENTS_SUPPORTED); done: ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP, HAL_EV_AVRCP_REMOTE_FEATURES, sizeof(ev), &ev); return 0; }
static struct media_player *media_player_create(struct media_adapter *adapter, const char *sender, const char *path, int *err) { DBusConnection *conn = btd_get_dbus_connection(); struct media_player *mp; mp = g_new0(struct media_player, 1); mp->adapter = adapter; mp->sender = g_strdup(sender); mp->path = g_strdup(path); mp->timer = g_timer_new(); mp->watch = g_dbus_add_disconnect_watch(conn, sender, media_player_exit, mp, NULL); mp->properties_watch = g_dbus_add_properties_watch(conn, sender, path, MEDIA_PLAYER_INTERFACE, properties_changed, mp, NULL); mp->seek_watch = g_dbus_add_signal_watch(conn, sender, path, MEDIA_PLAYER_INTERFACE, "Seeked", position_changed, mp, NULL); mp->player = avrcp_register_player(adapter->btd_adapter, &player_cb, mp, media_player_free); if (!mp->player) { if (err) *err = -EPROTONOSUPPORT; media_player_destroy(mp); return NULL; } mp->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); adapter->players = g_slist_append(adapter->players, mp); info("Player registered: sender=%s path=%s", sender, path); if (err) *err = 0; return mp; }