diff --git a/doc/media-api.txt b/doc/media-api.txt
index b15ad61..5e052b4 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
Acquire transport file descriptor and the MTU for read
and write respectively.
+ fd, uint16, uint16 TryAcquire()
+
+ Acquire transport file descriptor only if the transport
+ is in "pending" state at the time the message is
+ received by BlueZ. Otherwise no request will be sent
+ to the remote device and the function will just fail.
+
void Release()
Releases file descriptor.
diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c
index 2626ade..f0391de 100644
--- a/profiles/audio/transport.c
+++ b/profiles/audio/transport.c
return NULL;
}
+static DBusMessage *try_acquire(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_transport *transport = data;
+ struct media_owner *owner;
+ struct media_request *req;
+ guint id;
+
+ if (transport->owner != NULL)
+ return btd_error_not_authorized(msg);
+
+ if (transport->state >= TRANSPORT_STATE_REQUESTING)
+ return btd_error_not_authorized(msg);
+
+ if (transport->state != TRANSPORT_STATE_PENDING)
+ return btd_error_failed(msg, "Transport not playing");
+
+ owner = media_owner_create(msg);
+ id = transport->resume(transport, owner);
+ if (id == 0) {
+ media_owner_free(owner);
+ return btd_error_not_authorized(msg);
+ }
+
+ req = media_request_create(msg, id);
+ media_owner_add(owner, req);
+ media_transport_set_owner(transport, owner);
+
+ return NULL;
+}
+
static DBusMessage *release(DBusConnection *conn, DBusMessage *msg,
void *data)
{
GDBUS_ARGS({ "fd", "h" }, { "mtu_r", "q" },
{ "mtu_w", "q" } ),
acquire) },
+ { GDBUS_ASYNC_METHOD("TryAcquire",
+ NULL,
+ GDBUS_ARGS({ "fd", "h" }, { "mtu_r", "q" },
+ { "mtu_w", "q" }),
+ try_acquire) },
{ GDBUS_ASYNC_METHOD("Release", NULL, NULL, release) },
{ },
};