From a589dbe9c4f002e5aa07dac70f8b42aa00d261dc Mon Sep 17 00:00:00 2001 From: Janos Kovacs Date: Sun, 21 Nov 2010 04:16:57 +0200 Subject: support for manager forced release --- client/client.c | 9 +++++++++ src/res-conn.c | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/client.c b/client/client.c index 5cc9cfe..edcbac8 100644 --- a/client/client.c +++ b/client/client.c @@ -541,6 +541,7 @@ static void create_manager(void) resproto_set_handler(rconn, RESMSG_UNREGISTER, manager_receive_message); resproto_set_handler(rconn, RESMSG_GRANT , manager_receive_message); resproto_set_handler(rconn, RESMSG_ADVICE , manager_receive_message); + resproto_set_handler(rconn, RESMSG_RELEASE , manager_receive_message); connect_to_manager(rconn); } @@ -713,6 +714,14 @@ static void manager_receive_message(resmsg_t *msg, resset_t *rs, void *data) print_input(); break; + case RESMSG_RELEASE: + print_message("release request from manager"); + memset(&req, 0, sizeof(resmsg_t)); + req.possess.type = RESMSG_RELEASE; + manager_send_message(&req); + print_input(); + break; + default: if (config.verbose) { print_message("%s(): unexpected message type %d (%s)", diff --git a/src/res-conn.c b/src/res-conn.c index 46efe83..3ecbeb6 100644 --- a/src/res-conn.c +++ b/src/res-conn.c @@ -50,7 +50,7 @@ static int client_valid_message[RESMSG_MAX] = { [RESMSG_UNREGISTER] = VALID , [RESMSG_UPDATE ] = INVALID , [RESMSG_ACQUIRE ] = INVALID , - [RESMSG_RELEASE ] = INVALID , + [RESMSG_RELEASE ] = VALID , [RESMSG_GRANT ] = VALID , [RESMSG_ADVICE ] = VALID , [RESMSG_AUDIO ] = INVALID , -- cgit v1.2.3 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