int source_disconnect(struct audio_device *dev, gboolean shutdown) { struct source *source = dev->source; if (!source->session) return -ENOTCONN; if (shutdown) avdtp_set_device_disconnect(source->session, TRUE); /* cancel pending connect */ if (source->connect_id > 0) { a2dp_cancel(dev, source->connect_id); source->connect_id = 0; audio_source_connected(dev->btd_dev, -ECANCELED); avdtp_unref(source->session); source->session = NULL; return 0; } /* disconnect already ongoing */ if (source->disconnect_id > 0) return -EBUSY; if (!source->stream) return -ENOTCONN; return avdtp_close(source->session, source->stream, FALSE); }
gboolean sink_shutdown(struct sink *sink) { if (!sink->session) return FALSE; avdtp_set_device_disconnect(sink->session, TRUE); /* cancel pending connect */ if (sink->connect) { struct pending_request *pending = sink->connect; if (pending->msg) error_failed(pending->conn, pending->msg, "Stream setup failed"); pending_request_free(sink->dev, pending); sink->connect = NULL; avdtp_unref(sink->session); sink->session = NULL; return TRUE; } /* disconnect already ongoing */ if (sink->disconnect) return TRUE; if (!sink->stream) return FALSE; if (avdtp_close(sink->session, sink->stream, FALSE) < 0) return FALSE; return TRUE; }
int sink_disconnect(struct audio_device *dev, gboolean shutdown) { struct sink *sink = dev->sink; if (!sink->session) return -ENOTCONN; if (shutdown) avdtp_set_device_disconnect(sink->session, TRUE); /* cancel pending connect */ if (sink->connect_id > 0) { a2dp_cancel(dev, sink->connect_id); sink->connect_id = 0; btd_service_connecting_complete(sink->service, -ECANCELED); avdtp_unref(sink->session); sink->session = NULL; return 0; } /* disconnect already ongoing */ if (sink->disconnect_id > 0) return -EBUSY; if (!sink->stream) return -ENOTCONN; return avdtp_close(sink->session, sink->stream, FALSE); }