From 00217a97622ede06191513124da2d4ddea65ce6b Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Sun, 21 Nov 2010 04:17:46 +0200 Subject: C API support for forced release --- src/resource.c | 22 ++++++++++++++++++++++ src/resource.h | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/resource.c b/src/resource.c index c82c05a..3006a4f 100644 --- a/src/resource.c +++ b/src/resource.c @@ -119,6 +119,7 @@ static void connect_to_manager(resconn_t *, resource_set_t *); static void disconnect_from_manager(resmsg_t *, resset_t *,void *); static void receive_grant_message(resmsg_t *, resset_t *, void *); static void receive_advice_message(resmsg_t *, resset_t *, void *); +static void receive_release_message(resmsg_t *, resset_t *, void *); static int send_register_message(resource_set_t *, uint32_t); static int send_unregister_message(resource_set_t *, uint32_t); static int send_update_message(resource_set_t *, uint32_t); @@ -330,6 +331,11 @@ EXPORT int resource_set_release(resource_set_t *rs) } +EXPORT int resource_set_is_acquiring(resource_set_t *rs) +{ + return (rs && rs->acquire) ? TRUE : FALSE; +} + static DBusConnection *get_dbus(void) { @@ -370,6 +376,7 @@ static resconn_t *get_manager(DBusConnection *dbus) resproto_set_handler(mgr, RESMSG_UNREGISTER, disconnect_from_manager); resproto_set_handler(mgr, RESMSG_GRANT , receive_grant_message ); resproto_set_handler(mgr, RESMSG_ADVICE , receive_advice_message ); + resproto_set_handler(mgr, RESMSG_RELEASE , receive_release_message); } return mgr; @@ -431,6 +438,9 @@ static void receive_grant_message(resmsg_t *msg, resset_t *resset, void *data) if (rs != NULL && resset == rs->resset) { resource_log("recived grant %u (resources 0x%x)", rn, gr); + if (!gr && (resset->mode & RESOURCE_AUTO_RELEASE)) + rs->acquire = FALSE; + rs->grantcb.function(rs, gr, rs->grantcb.data); } } @@ -449,6 +459,18 @@ static void receive_advice_message(resmsg_t *msg, resset_t *resset, void *data) } } +static void receive_release_message(resmsg_t *msg,resset_t *resset,void *data) +{ + resource_set_t *rs = resset->userdata; + + (void)data; + + if (rs != NULL && resset == rs->resset) { + rs->acquire = FALSE; + push_request(rs, RESMSG_RELEASE, NULL,NULL); + } +} + static int send_register_message(resource_set_t *rs, uint32_t rn) { resset_t *resset; diff --git a/src/resource.h b/src/resource.h index d0c006b..9722903 100644 --- a/src/resource.h +++ b/src/resource.h @@ -77,7 +77,7 @@ int resource_set_configure_audio(resource_set_t *resource_set, int resource_set_acquire(resource_set_t *resource_set); int resource_set_release(resource_set_t *resource_set); - +int resource_set_is_acquiring(resource_set_t *resource_set); #ifdef __cplusplus -- cgit v1.2.3