int coreconnector_stop(struct core_connector *co, void* param) { if (co->socket) { assert(0); return 0; } if (!co->socket) return 0; start_close(co->socket); co->socket = 0; return 0; }
static void handle_close_req(struct unix_client *client, struct bt_close_req *req) { if (!client->dev) goto failed; start_close(client->dev, client, TRUE); return; failed: unix_ipc_error(client, BT_CLOSE, EIO); }
void unix_device_removed(struct audio_device *dev) { GSList *l; DBG("unix_device_removed(%p)", dev); l = clients; while (l) { struct unix_client *client = l->data; l = l->next; if (client->dev == dev) { clients = g_slist_remove(clients, client); start_close(client->dev, client, FALSE); client_free(client); } } }
static gboolean client_cb(GIOChannel *chan, GIOCondition cond, gpointer data) { char buf[BT_SUGGESTED_BUFFER_SIZE]; bt_audio_msg_header_t *msghdr = (void *) buf; struct unix_client *client = data; int len; const char *type, *name; if (cond & G_IO_NVAL) return FALSE; if (cond & (G_IO_HUP | G_IO_ERR)) { DBG("Unix client disconnected (fd=%d)", client->sock); goto failed; } memset(buf, 0, sizeof(buf)); len = recv(client->sock, buf, sizeof(buf), 0); if (len < 0) { error("recv: %s (%d)", strerror(errno), errno); goto failed; } type = bt_audio_strtype(msghdr->type); name = bt_audio_strname(msghdr->name); DBG("Audio API: %s <- %s", type, name); if (msghdr->length != len) { error("Invalid message: length mismatch"); goto failed; } switch (msghdr->name) { case BT_GET_CAPABILITIES: handle_getcapabilities_req(client, (struct bt_get_capabilities_req *) msghdr); break; case BT_OPEN: handle_open_req(client, (struct bt_open_req *) msghdr); break; case BT_SET_CONFIGURATION: handle_setconfiguration_req(client, (struct bt_set_configuration_req *) msghdr); break; case BT_START_STREAM: handle_streamstart_req(client, (struct bt_start_stream_req *) msghdr); break; case BT_STOP_STREAM: handle_streamstop_req(client, (struct bt_stop_stream_req *) msghdr); break; case BT_CLOSE: handle_close_req(client, (struct bt_close_req *) msghdr); break; case BT_CONTROL: handle_control_req(client, (struct bt_control_req *) msghdr); break; case BT_DELAY_REPORT: handle_delay_report_req(client, (struct bt_delay_report_req *) msghdr); break; default: error("Audio API: received unexpected message name %d", msghdr->name); } return TRUE; failed: clients = g_slist_remove(clients, client); start_close(client->dev, client, FALSE); client_free(client); return FALSE; }