aboutsummaryrefslogtreecommitdiffstats
path: root/alsa-binding/Alsa-RegEvt.c
diff options
context:
space:
mode:
Diffstat (limited to 'alsa-binding/Alsa-RegEvt.c')
-rw-r--r--alsa-binding/Alsa-RegEvt.c76
1 files changed, 42 insertions, 34 deletions
diff --git a/alsa-binding/Alsa-RegEvt.c b/alsa-binding/Alsa-RegEvt.c
index 28b66b1..7962963 100644
--- a/alsa-binding/Alsa-RegEvt.c
+++ b/alsa-binding/Alsa-RegEvt.c
@@ -22,6 +22,8 @@
#include <afb-timer.h>
+#include <wrap-json.h>
+
#include "Alsa-ApiHat.h"
// Defines for inotify events
@@ -93,29 +95,24 @@ STATIC int getHalIdxFromCardid (int cardid) {
return -1;
}
-PUBLIC json_object *alsaCheckQuery(afb_req_t request, queryValuesT *queryValues) {
-
- json_object *tmpJ;
- int done;
+PUBLIC char *alsaGetDevIdFromQuery(json_object *queryJ)
+{
+ char *devId = NULL;
- // get query from request
- json_object *queryInJ = afb_req_json(request);
+ if(wrap_json_unpack(queryJ, "{s:s}", "devid", &devId))
+ return NULL;
- done = json_object_object_get_ex(queryInJ, "devid", &tmpJ);
- if (!done) {
- afb_req_fail_f(request, "devid-missing", "Invalid query='%s'", json_object_get_string(queryInJ));
- goto OnErrorExit;
- }
- queryValues->devid = json_object_get_string(tmpJ);
+ return devId;
+}
- done = json_object_object_get_ex(queryInJ, "mode", &tmpJ);
- if (!done) queryValues->mode = QUERY_QUIET; // default quiet
- else queryValues->mode = json_object_get_int(tmpJ);
+PUBLIC queryModeE alsaGetModeFromQuery(json_object *queryJ)
+{
+ queryModeE mode = QUERY_QUIET;
- return queryInJ;
+ if(wrap_json_unpack(queryJ, "{s:i}", "mode", &mode))
+ return QUERY_QUIET;
-OnErrorExit:
- return NULL;
+ return mode;
}
STATIC void updateSelectedAlsaCardsAvailabilityAndFireEvents(sndCardsT *sndCards, int first, int last) {
@@ -438,23 +435,23 @@ OnErrorExit:
}
// Subscribe to every Alsa CtlEvent send by a given board
-STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT *sndCards, queryValuesT *queryValues) {
+STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT *sndCards, char* devId, queryModeE mode) {
sndHandleT *currentSndHandle = NULL;
snd_ctl_t *ctlDev = NULL;
int err, cardId;
snd_ctl_card_info_t *cardinfo;
// open control interface for devid
- err = snd_ctl_open(&ctlDev, queryValues->devid, SND_CTL_READONLY);
+ err = snd_ctl_open(&ctlDev, devId, SND_CTL_READONLY);
if (err < 0) {
- afb_req_fail_f(request, "devid-unknown", "SndCard devid=%s Not Found err=%s", queryValues->devid, snd_strerror(err));
+ afb_req_fail_f(request, "devid-unknown", "SndCard devid=%s Not Found err=%s", devId, snd_strerror(err));
goto OnErrorExit;
}
snd_ctl_card_info_alloca(&cardinfo);
err = snd_ctl_card_info(ctlDev, cardinfo);
if (err < 0) {
- afb_req_fail_f(request, "devid-invalid", "SndCard devid=%s Not Found err=%s", queryValues->devid, snd_strerror(err));
+ afb_req_fail_f(request, "devid-invalid", "SndCard devid=%s Not Found err=%s", devId, snd_strerror(err));
goto OnErrorExit;
}
@@ -471,12 +468,12 @@ STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT
if (! currentSndHandle->evtHandle) {
currentSndHandle->evtHandle = malloc(sizeof (ctrlEvtHandleT));
currentSndHandle->evtHandle->ctlDev = ctlDev;
- currentSndHandle->evtHandle->mode = queryValues->mode;
+ currentSndHandle->evtHandle->mode = mode;
// subscribe for sndctl events attached to devid
err = snd_ctl_subscribe_events(currentSndHandle->evtHandle->ctlDev, 1);
if (err < 0) {
- afb_req_fail_f(request, "subscribe-fail", "Cannot subscribe events from devid=%s err=%d", queryValues->devid, err);
+ afb_req_fail_f(request, "subscribe-fail", "Cannot subscribe events from devid=%s err=%d", devId, err);
goto OnErrorExit;
}
@@ -491,14 +488,14 @@ STATIC afb_event_t alsaEvtSubscribeAlsaControlEvent(afb_req_t request, sndCardsT
sndCtlEventCB,
currentSndHandle);
if (err < 0) {
- afb_req_fail_f(request, "register-mainloop", "Cannot hook events to mainloop devid=%s err=%d", queryValues->devid, err);
+ afb_req_fail_f(request, "register-mainloop", "Cannot hook events to mainloop devid=%s err=%d", devId, err);
goto OnErrorExit;
}
// create binder event attached to devid name
- currentSndHandle->evtHandle->afbevt = afb_daemon_make_event(queryValues->devid);
+ currentSndHandle->evtHandle->afbevt = afb_daemon_make_event(devId);
if (!afb_event_is_valid(currentSndHandle->evtHandle->afbevt)) {
- afb_req_fail_f(request, "register-event", "Cannot register new binder event name=%s", queryValues->devid);
+ afb_req_fail_f(request, "register-event", "Cannot register new binder event name=%s", devId);
goto OnErrorExit;
}
}
@@ -517,10 +514,15 @@ OnErrorExit:
// Subscribe to alsacore event
PUBLIC void alsaEvtSubcribe(afb_req_t request) {
+ int err;
+
+ queryModeE mode;
+
+ char *devId = NULL;
+
static sndCardsT *sndCards = NULL;
+
afb_event_t eventToSubscribe;
- int err;
- queryValuesT queryValues;
json_object *queryJ;
@@ -529,15 +531,21 @@ PUBLIC void alsaEvtSubcribe(afb_req_t request) {
sndCards->apiHandle = afb_req_get_api(request);
}
- queryJ = alsaCheckQuery(request, &queryValues);
- if (!queryJ) return;
+ queryJ = afb_req_json(request);
+
+ devId = alsaGetDevIdFromQuery(queryJ);
+ if (!devId) {
+ afb_req_fail_f(request, "devid-missing", "Invalid query='%s'", json_object_get_string(queryJ));
+ return;
+ }
- if(! strcasecmp(queryValues.devid, "added"))
+ mode = alsaGetModeFromQuery(queryJ);
+ if(! strcasecmp(devId, "added"))
eventToSubscribe = alsaEvtSubscribeSoundCardEvent(request, sndCards, SUBSCRIPTION_CARD_ADDED_EVENTS);
- else if(! strcasecmp(queryValues.devid, "removed"))
+ else if(! strcasecmp(devId, "removed"))
eventToSubscribe = alsaEvtSubscribeSoundCardEvent(request, sndCards, SUBSCRIPTION_CARD_REMOVED_EVENTS);
else
- eventToSubscribe = alsaEvtSubscribeAlsaControlEvent(request, sndCards, &queryValues);
+ eventToSubscribe = alsaEvtSubscribeAlsaControlEvent(request, sndCards, devId, mode);
if(! eventToSubscribe)
return;