diff options
Diffstat (limited to 'AudioLogic/AudioLogicLib.c')
-rw-r--r-- | AudioLogic/AudioLogicLib.c | 153 |
1 files changed, 135 insertions, 18 deletions
diff --git a/AudioLogic/AudioLogicLib.c b/AudioLogic/AudioLogicLib.c index ebe241c..857cc9f 100644 --- a/AudioLogic/AudioLogicLib.c +++ b/AudioLogic/AudioLogicLib.c @@ -29,12 +29,34 @@ #include "AudioLogicLib.h" static struct afb_service srvitf; -#define _GNU_SOURCE // needed for vasprintf -// this function is call after all binder are loaded and initialised -PUBLIC int audioLogicInit (struct afb_service service) { - srvitf = service; - return 0; +PUBLIC void audioLogicSetVol(struct afb_req request) { + + const char *vol = afb_req_value(request, "vol"); + if (vol == NULL) { + afb_req_fail_f (request, "argument-missing", "vol=+-%[0,100] missing"); + goto ExitOnError; + } + + switch (vol[0]) { + case '+': + break; + case '-': + break; + case '%': + break; + + default: + afb_req_fail_f (request, "value-invalid", "volume should be (+-%[0-100]xxx) vol=%s", vol); + goto ExitOnError; + } + + // Should call here Hardware Alsa Abstraction Layer for corresponding Sound Card + afb_req_success (request, NULL, NULL); + return; + + ExitOnError: + return; } // This callback is fired when afb_service_call for api/alsacore/subctl returns @@ -46,44 +68,139 @@ STATIC void alsaSubcribeCB (void *handle, int iserror, struct json_object *resul if (result) { INFO (afbIface, "result=[%s]\n", json_object_to_json_string (result)); if (json_object_object_get_ex(result, "request", &x) && json_object_object_get_ex(x, "info", &x)) - info = json_object_get_string(x); - if (!json_object_object_get_ex(result, "response", &resp)) resp = NULL; - } + info = json_object_get_string(x); + if (!json_object_object_get_ex(result, "response", &resp)) resp = NULL; + } // push message respond if (iserror) afb_req_fail_f(request, "Fail", info); else afb_req_success(request, resp, info); - // free calling request - afb_req_unref(request); } // Create and subscribe to alsacore ctl events PUBLIC void audioLogicMonitor(struct afb_req request) { - // save request in session as it might be used after return by callback + // keep request for callback to respond struct afb_req *handle = afb_req_store(request); - + + // get client context + AudioLogicCtxT *ctx = afb_req_context_get(request); + // push request to low level binding - if (!handle) afb_req_fail(request, "error", "out of memory"); - else afb_service_call(srvitf, "alsacore", "subctl", json_object_get(afb_req_json(request)), alsaSubcribeCB, handle); + NOTICE (afbIface, "audioLogicMonitor ctx->devid=%s [ctx->queryurl=%s]", ctx->devid, json_object_to_json_string(ctx->queryurl)); + + if (ctx->queryurl) { + json_object_get (ctx->queryurl); // Make sure usage count does not fall to zero + afb_service_call(srvitf, "alsacore", "subscribe", ctx->queryurl, alsaSubcribeCB, handle); + } + + else afb_req_fail_f(request, "context-invalid", "No valid queryurl in client context"); // success/failure messages return from callback } +// Subscribe to AudioBinding events +PUBLIC void audioLogicSubscribe (struct afb_req request) { + + return; +} + + // Call when all bindings are loaded and ready to accept request PUBLIC void audioLogicGetVol(struct afb_req request) { + // Should call here Hardware Alsa Abstraction Layer for corresponding Sound Card afb_req_success (request, NULL, NULL); return; } -PUBLIC void audioLogicSetVol(struct afb_req request) { - +// This callback is fired when afb_service_call for api/alsacore/subctl returns +STATIC void audioLogicOpenCB (void *handle, int iserror, struct json_object *result) { + struct afb_req request = afb_req_unstore(handle); + struct json_object *response; + //INFO (afbIface, "result=[%s]\n", json_object_to_json_string (result)); - afb_req_success (request, NULL, NULL); - return; + + if (iserror) { // on error proxy information we got from lower layer + if (result) { + struct json_object *status, *info; + + if (json_object_object_get_ex(result, "request", &response)) { + json_object_object_get_ex(response, "info" , &info); + json_object_object_get_ex(response, "status", &status); + afb_req_fail(request, json_object_get_string(status), json_object_get_string(info)); + goto OnExit; + } + } else { + afb_req_fail(request, "Fail", "Unknown Error" ); + } + goto OnExit; + } + + // Get response from object + json_object_object_get_ex(result, "response", &response); + if (response) { + struct json_object *subobj; + + // attach client context to session + AudioLogicCtxT *ctx = malloc (sizeof(AudioLogicCtxT)); + + // extract information from Json Alsa Object + json_object_object_get_ex(response, "cardid", &subobj); + if (subobj) ctx->cardid= json_object_get_int(subobj); + + // store devid as an object for further alsa request + json_object_object_get_ex(response, "devid", &subobj); + if (subobj) ctx->devid= strdup(json_object_get_string(subobj)); + + json_object_object_get_ex(response, "shortname", &subobj); + if (subobj)ctx->shortname=strdup(json_object_get_string(subobj)); + + json_object_object_get_ex(response, "longname", &subobj); + if (subobj)ctx->longname=strdup(json_object_get_string(subobj)); + // add AudioLogicCtxT to Client Session + NOTICE (afbIface, "audioLogicOpen ctx->devid=[%s]", ctx->devid); + + // save queryurl with devid only for further ALSA request + ctx->queryurl=json_object_new_object(); + json_object_object_add(ctx->queryurl, "devid",json_object_new_string(ctx->devid)); + + afb_req_context_set(request, ctx, free); + } + + // release original calling request + afb_req_success(request, response, NULL); + + + OnExit: + afb_req_unref(request); + return; } +// Delegate to lowerlevel the mapping of soundcard name with soundcard ID +PUBLIC void audioLogicOpen(struct afb_req request) { + + // Delegate query to lower level + struct afb_req *handle = afb_req_store(request); + if (!handle) afb_req_fail(request, "error", "out of memory"); + else afb_service_call(srvitf, "alsacore", "getCardId", json_object_get(afb_req_json(request)), audioLogicOpenCB, handle); +} + +// Free client context create from audioLogicOpenCB +PUBLIC void audioLogicClose (struct afb_req request) { + + // retrieve current client context to print debug info + AudioLogicCtxT *ctx = (AudioLogicCtxT*) afb_req_context_get(request); + DEBUG (afbIface, "audioLogicClose cardid=%d devid=%s shortname=%s longname=%s", ctx->cardid, ctx->devid, ctx->shortname, ctx->longname); +} + + +// this function is call after all binder are loaded and initialised +PUBLIC int audioLogicInit (struct afb_service service) { + srvitf = service; + + return 0; +} |