diff --git a/profiles/audio/control.c b/profiles/audio/control.c
index 1600fce..642fdd5 100644
--- a/profiles/audio/control.c
+++ b/profiles/audio/control.c
static unsigned int avctp_id = 0;
-struct pending_request {
- audio_device_cb cb;
- void *data;
- unsigned int id;
-};
-
struct control {
struct avctp *session;
gboolean target;
- struct pending_request *connect;
};
-static void pending_request_free(struct audio_device *dev,
- struct pending_request *pending,
- int err)
-{
- if (pending->cb)
- pending->cb(dev, err, pending->data);
-
- g_free(pending);
-}
-
static void state_changed(struct audio_device *dev, avctp_state_t old_state,
avctp_state_t new_state, void *user_data)
{
case AVCTP_STATE_DISCONNECTED:
control->session = NULL;
- if (control->connect) {
- pending_request_free(dev, control->connect, -EIO);
- control->connect = NULL;
+ if (old_state != AVCTP_STATE_CONNECTED) {
+ audio_control_connected(dev->btd_dev, -EIO);
+ break;
}
- if (old_state != AVCTP_STATE_CONNECTED)
- break;
+ audio_control_disconnected(dev->btd_dev, 0);
g_dbus_emit_property_changed(conn, path,
AUDIO_CONTROL_INTERFACE, "Connected");
break;
case AVCTP_STATE_CONNECTED:
- if (control->connect) {
- pending_request_free(dev, control->connect, 0);
- control->connect = NULL;
- }
+ audio_control_connected(dev->btd_dev, 0);
g_dbus_emit_property_changed(conn, path,
AUDIO_CONTROL_INTERFACE, "Connected");
}
}
-int control_connect(struct audio_device *dev, audio_device_cb cb, void *data)
+int control_connect(struct audio_device *dev)
{
struct control *control = dev->control;
- struct pending_request *pending;
if (control->session)
return -EALREADY;
if (!control->target)
return -ENOTSUP;
- if (control->connect)
- return -EINPROGRESS;
-
control->session = avctp_connect(dev);
if (!control->session)
return -EIO;
- pending = g_new0(struct pending_request, 1);
- pending->cb = cb;
- pending->data = data;
- control->connect = pending;
-
return 0;
}
-int control_disconnect(struct audio_device *dev, audio_device_cb cb,
- void *data)
+int control_disconnect(struct audio_device *dev)
{
struct control *control = dev->control;
if (!control->session)
return -ENOTCONN;
- /* cancel pending connect */
- if (control->connect) {
- pending_request_free(dev, control->connect, -ECANCELED);
- control->connect = NULL;
- }
-
avctp_disconnect(control->session);
- if (cb)
- cb(dev, 0, data);
-
return 0;
-
}
static DBusMessage *key_pressed(DBusConnection *conn, DBusMessage *msg,
if (control->session)
avctp_disconnect(control->session);
- if (control->connect)
- pending_request_free(dev, control->connect, -ECANCELED);
-
g_free(control);
dev->control = NULL;
}
diff --git a/profiles/audio/control.h b/profiles/audio/control.h
index 878dd1e..001b564 100644
--- a/profiles/audio/control.h
+++ b/profiles/audio/control.h
void control_unregister(struct audio_device *dev);
gboolean control_is_active(struct audio_device *dev);
-int control_connect(struct audio_device *dev, audio_device_cb cb, void *data);
-int control_disconnect(struct audio_device *dev, audio_device_cb cb,
- void *data);
+int control_connect(struct audio_device *dev);
+int control_disconnect(struct audio_device *dev);
diff --git a/profiles/audio/manager.c b/profiles/audio/manager.c
index 422316e..620127c 100644
--- a/profiles/audio/manager.c
+++ b/profiles/audio/manager.c
return -1;
}
- return control_connect(audio_dev, connect_cb, profile);
+ return control_connect(audio_dev);
}
static int avrcp_control_disconnect(struct btd_device *dev,
return -1;
}
- return control_disconnect(audio_dev, disconnect_cb, profile);
+ return control_disconnect(audio_dev);
}
static struct audio_adapter *audio_adapter_ref(struct audio_adapter *adp)
device_profile_connected(dev, &a2dp_source_profile, err);
}
+void audio_control_connected(struct btd_device *dev, int err)
+{
+ device_profile_connected(dev, &avrcp_profile, err);
+}
+
+void audio_control_disconnected(struct btd_device *dev, int err)
+{
+ device_profile_disconnected(dev, &avrcp_profile, err);
+}
+
int audio_manager_init(GKeyFile *conf)
{
char **list;
diff --git a/profiles/audio/manager.h b/profiles/audio/manager.h
index 2b924dc..e70d795 100644
--- a/profiles/audio/manager.h
+++ b/profiles/audio/manager.h
void audio_sink_disconnected(struct btd_device *dev, int err);
void audio_source_connected(struct btd_device *dev, int err);
void audio_source_disconnected(struct btd_device *dev, int err);
+void audio_control_connected(struct btd_device *dev, int err);
+void audio_control_disconnected(struct btd_device *dev, int err);
int audio_manager_init(GKeyFile *config);
void audio_manager_exit(void);