diff options
Diffstat (limited to 'alsa-hook')
-rw-r--r-- | alsa-hook/PolicyAlsaHook.c | 51 |
1 files changed, 37 insertions, 14 deletions
diff --git a/alsa-hook/PolicyAlsaHook.c b/alsa-hook/PolicyAlsaHook.c index 3fbf40e..6f88bca 100644 --- a/alsa-hook/PolicyAlsaHook.c +++ b/alsa-hook/PolicyAlsaHook.c @@ -78,6 +78,7 @@ typedef struct { typedef struct { const char *search; const char *value; + long ivalue; int signal; } afbEventT; @@ -136,7 +137,7 @@ void OnEventCB(void *handle, const char *event, int evtid, struct json_object *d afbClientT *afbClient = (afbClientT*) handle; afbEventT **afbEvent = afbClient->event; json_object *tmpJ; - int done; + int signal=0, index; // if no event handler just ignore events if (!afbEvent) goto OnErrorExit; @@ -144,17 +145,32 @@ void OnEventCB(void *handle, const char *event, int evtid, struct json_object *d if (afbClient->verbose) printf("ON-EVENT processing signal event=%s search=%s\n", event, json_object_get_string(dataJ)); // loop on event/signal mapping table - for (int index=0; afbEvent[index]!= NULL; index++) { + for (index=0; afbEvent[index]!= NULL; index++) { + int done; + done = json_object_object_get_ex(dataJ,afbEvent[index]->search, &tmpJ); if (done) { - const char *value=json_object_get_string(tmpJ); - if (!strcmp(afbEvent[index]->value, value)) { - if (afbEvent[index]->signal) { - if (afbClient->verbose) printf("ON-EVENT search=%s value=%s signal=%d\n", afbEvent[index]->search, value, afbEvent[index]->signal); - if (afbEvent[index]->signal) kill (getpid(), afbEvent[index]->signal); - } + + if (afbEvent[index]->value) { + // search value is a string + if (json_object_get_type(tmpJ) != json_type_string) goto OnErrorExit; + const char *value=json_object_get_string(tmpJ); + if (!strcmp(afbEvent[index]->value, value)) signal=afbEvent[index]->signal; + + } else { + + // search value is an integer + if (json_object_get_type(tmpJ) != json_type_int) goto OnErrorExit; + int ivalue=json_object_get_int(tmpJ); + if (ivalue == afbEvent[index]->ivalue) signal=afbEvent[index]->signal; } - } + break; + + } + } + if (signal) { + if (afbClient->verbose) printf("ON-EVENT self-signal search=%s signal=%d\n", afbEvent[index]->search, afbEvent[index]->signal); + if (afbEvent[index]->signal) kill (getpid(), afbEvent[index]->signal); } return; @@ -503,17 +519,24 @@ static int AlsaGetEvents (snd_config_t *node, afbEventT **afbEvent, const char*i err = snd_config_search(ctlconfig, "value", &itemConf); if (!err) { const char *value; - if (snd_config_get_string(itemConf, &value) < 0) { - SNDERR("Invalid event/signal 'value' should be a string %s", confEvents); - goto OnErrorExit; + switch (snd_config_get_type(itemConf)) { + case SND_CONFIG_TYPE_INTEGER: + snd_config_get_integer(itemConf, &afbEvent[callCount]->ivalue); + break; + + case SND_CONFIG_TYPE_STRING: + snd_config_get_string(itemConf, &value); + afbEvent[callCount]->value=strdup(value); + break; + default: + SNDERR("Invalid event/signal 'value' should be a string %s", confEvents); + goto OnErrorExit; } - afbEvent[callCount]->value=strdup(value); } else { SNDERR("Missing 'value' from event/signal 'value' from signal definition %s", confEvents); goto OnErrorExit; } - // move to next call if any callCount ++; if (callCount == MAX_EVT_CALL) { |