diff options
Diffstat (limited to 'HAL-afb')
-rw-r--r-- | HAL-afb/HAL-interface/hal-interface.c | 104 | ||||
-rw-r--r-- | HAL-afb/HAL-interface/hal-interface.h | 14 | ||||
-rw-r--r-- | HAL-afb/HDA-intel/IntelHdaHAL.c | 24 |
3 files changed, 62 insertions, 80 deletions
diff --git a/HAL-afb/HAL-interface/hal-interface.c b/HAL-afb/HAL-interface/hal-interface.c index 510ed2a..2c6595f 100644 --- a/HAL-afb/HAL-interface/hal-interface.c +++ b/HAL-afb/HAL-interface/hal-interface.c @@ -36,9 +36,6 @@ typedef struct { int numid; } shareHallMap_T; - -static struct afb_service srvitf; -static const struct afb_binding_interface *afbIface; static shareHallMap_T *shareHallMap; // Force specific HAL to depend on ShareHalLib @@ -46,12 +43,12 @@ PUBLIC char* SharedHalLibVersion="1.0"; // This callback when api/alsacore/subscribe returns STATIC void alsaSubcribeCB(void *handle, int iserror, struct json_object *result) { - struct afb_req request = afb_req_unstore(handle); + afb_req request = afb_req_unstore(handle); struct json_object *x, *resp = NULL; const char *info = NULL; if (result) { - INFO(afbIface, "result=[%s]\n", json_object_to_json_string(result)); + INFO( "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; @@ -65,23 +62,8 @@ STATIC void alsaSubcribeCB(void *handle, int iserror, struct json_object *result afb_req_unref(request); } -// Create and subscribe to alsacore ctl events - -STATIC void halMonitor(struct afb_req request) { - - // save request in session as it might be used after return by callback - struct afb_req *handle = afb_req_store(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); - - // success/failure messages return from callback -} - // Subscribe to AudioBinding events - -STATIC void halSubscribe(struct afb_req request) { +STATIC void halSubscribe(afb_req request) { const char *devid = afb_req_value(request, "devid"); if (devid == NULL) { afb_req_fail_f(request, "devid-missing", "devid=hw:xxx missing"); @@ -89,8 +71,7 @@ STATIC void halSubscribe(struct afb_req request) { } // Call when all bindings are loaded and ready to accept request - -STATIC void halGetVol(struct afb_req request) { +STATIC void halGetVol(afb_req request) { // Should call here Hardware Alsa Abstraction Layer for corresponding Sound Card afb_req_success(request, NULL, NULL); @@ -98,7 +79,7 @@ STATIC void halGetVol(struct afb_req request) { } -STATIC void halSetVol(struct afb_req request) { +STATIC void halSetVol(afb_req request) { const char *arg; const char *pcm; @@ -148,7 +129,7 @@ STATIC void halGetControlCB(void *handle, int iserror, struct json_object *resul struct json_object *response; // retrieve request and check for errors - struct afb_req request = afb_req_unstore(handle); + afb_req request = afb_req_unstore(handle); if (!cbCheckResponse(request, iserror, result)) goto OnExit; // Get response from object @@ -208,7 +189,7 @@ STATIC void halGetControlCB(void *handle, int iserror, struct json_object *resul // Translate high level control to low level and call lower layer -STATIC void halGetCtls(struct afb_req request) { +STATIC void halGetCtls(afb_req request) { struct json_object *queryin, *queryout, *ctlsin, *devid; struct json_object *ctlsout = json_object_new_array(); @@ -251,47 +232,42 @@ STATIC void halGetCtls(struct afb_req request) { json_object_object_add(queryout, "devid", devid); json_object_object_add(queryout, "ctls", ctlsout); - // save request context dans call lowlevel API - struct afb_req *handle = afb_req_store(request); - afb_service_call(srvitf, "alsacore", "getctl", queryout, halGetControlCB, handle); + // Fulup afb_service_call("alsacore", "getctl", queryout, halGetControlCB, handle); OnExit: // Under normal situation success/failure is set from callback return; }; -STATIC void halInitCB(void *handle, int iserror, struct json_object *result) { - struct json_object *queryurl = (json_object*) handle; - - if (iserror) NOTICE(afbIface, "halInitCB: registration alsaHAL query=[%s] Fail", json_object_to_json_string(queryurl)); - else DEBUG(afbIface, "halInitCB: registration alsaHAL card=[%s] Success", json_object_to_json_string(queryurl)); -} // This receive all event this binding subscribe to PUBLIC void afbServiceEvent(const char *evtname, struct json_object *object) { - NOTICE(daemon, "afbBindingV1ServiceEvent evtname=%s [msg=%s]", evtname, json_object_to_json_string(object)); + NOTICE("afbBindingV1ServiceEvent evtname=%s [msg=%s]", evtname, json_object_to_json_string(object)); } // this is call when after all bindings are loaded -STATIC int afbServiceInit(struct afb_service service) { +STATIC int afbServiceInit() { int rc=0, err; - srvitf = service; - struct json_object *queryurl, jResponse; + struct json_object *queryurl, *jResponse; alsaHalMapT *halCtls = alsaHalSndCard.ctls; // Get sndcard specific HAL control mapping if (alsaHalSndCard.initCB) { - rc= (alsaHalSndCard.initCB) (afbIface, service); + rc= (alsaHalSndCard.initCB)(); if (rc != 0) goto OnErrorExit; } + err= afb_daemon_require_api("alsacore", 1); + // register HAL with Alsa Low Level Binder queryurl = json_object_new_object(); - json_object_object_add(queryurl, "prefix", json_object_new_string(alsaHalSndCard.prefix)); + json_object_object_add(queryurl, "prefix", json_object_new_string(sndCardApiPrefix)); json_object_object_add(queryurl, "name", json_object_new_string(alsaHalSndCard.name)); - err= afb_req_subcall_sync (request, "alsacore", "registerHal", queryurl, &jResponse); + + afb_service_call_sync("alsacore", "registerHal", queryurl, &jResponse); + err= afb_service_call_sync ("alsacore", "registerHal", queryurl, &jResponse); if (err) { - ERROR (daemon, "Fail to register HAL to ALSA lowlevel binding"); + ERROR ("Fail to register HAL to ALSA lowlevel binding"); goto OnErrorExit; } json_object_put(queryurl); @@ -300,29 +276,28 @@ STATIC int afbServiceInit(struct afb_service service) { for (int idx = 0; halCtls[idx].alsa.numid != 0; idx++) { if (halCtls[idx].cb.callback != NULL) { queryurl = json_object_new_object(); - if (json_object_new_string(halCtls[idx].alsa.name) json_object_object_add(queryurl, "name" , json_object_new_string(halCtls[idx].alsa.name)); - if (json_object_new_string(halCtls[idx].alsa.numid) json_object_object_add(queryurl, "numid" , json_object_new_int(halCtls[idx].alsa.numid)); - if (json_object_new_string(halCtls[idx].alsa.minval) json_object_object_add(queryurl, "minval", json_object_new_int(halCtls[idx].alsa.minval)); - if (json_object_new_string(halCtls[idx].alsa.maxval) json_object_object_add(queryurl, "maxval", json_object_new_int(halCtls[idx].alsa.maxval)); - if (json_object_new_string(halCtls[idx].alsa.step) json_object_object_add(queryurl, "step" , json_object_new_int(halCtls[idx].alsa.step)); - if (json_object_new_string(halCtls[idx].alsa.type) json_object_object_add(queryurl, "type" , json_object_new_int(halCtls[idx].alsa.type)); + if (halCtls[idx].alsa.name) json_object_object_add(queryurl, "name" , json_object_new_string(halCtls[idx].alsa.name)); + if (halCtls[idx].alsa.numid) json_object_object_add(queryurl, "numid" , json_object_new_int(halCtls[idx].alsa.numid)); + if (halCtls[idx].alsa.minval) json_object_object_add(queryurl, "minval", json_object_new_int(halCtls[idx].alsa.minval)); + if (halCtls[idx].alsa.maxval) json_object_object_add(queryurl, "maxval", json_object_new_int(halCtls[idx].alsa.maxval)); + if (halCtls[idx].alsa.step) json_object_object_add(queryurl, "step" , json_object_new_int(halCtls[idx].alsa.step)); + if (halCtls[idx].alsa.type) json_object_object_add(queryurl, "type" , json_object_new_int(halCtls[idx].alsa.type)); - err= afb_req_subcall_sync (request, "alsacore", "addUserCtl", queryurl, &jResponse); + err= afb_service_call_sync ("alsacore", "addUserCtl", queryurl, &jResponse); if (err) { - ERROR (daemon, "Fail to register Callback for ctrl=[%s]", halCtls[idx].alsa.name); + ERROR ("Fail to register Callback for ctrl=[%s]", halCtls[idx].alsa.name); goto OnErrorExit; } } } // finally register for alsa lowlevel event - err= afb_req_subcall_sync (request, "alsacore", "subscribe", queryurl, &jResponse); + err= afb_service_call_sync ("alsacore", "subscribe", queryurl, &jResponse); if (err) { - ERROR (daemon, "Fail subscribing to ALSA lowlevel events"); + ERROR ("Fail subscribing to ALSA lowlevel events"); goto OnErrorExit; } - return (0); OnErrorExit: @@ -330,20 +305,21 @@ STATIC int afbServiceInit(struct afb_service service) { }; // Every HAL export the same API & Interface Mapping from SndCard to AudioLogic is done through alsaHalSndCardT -static const struct afb_verb_v2 halSharedApi[] = { +STATIC afb_verb_v2 halSharedApi[] = { /* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */ - { .verb = "ping", .callback = pingtest, .info = "Ping Binding"}, - { .verb = "getctls", .callback = halGetCtls, .info = "Get Control"}, - { .verb = "setvol", .callback = halSetVol, .info = "Set Volume"}, - { .verb = "getvol", .callback = halGetVol, .info = "Get Volume"}, - { .verb = "subscribe", .callback = halSubscribe,.info = "Subscribe Alsa Events"}, - { .verb = "monitor", .callback = halMonitor ,.info = "Monitor Alsa Events"}, + { .verb = "ping", .callback = pingtest}, + { .verb = "getctls", .callback = halGetCtls}, + { .verb = "setvol", .callback = halSetVol}, + { .verb = "getvol", .callback = halGetVol}, + { .verb = "subscribe", .callback = halSubscribe}, + { .verb = "monitor", .callback = halMonitor}, { .verb = NULL} /* marker for end of the array */ }; -const struct afb_binding_v2 afbBindingV2 = { - .api = "audio-hal", - .specification = "", + +PUBLIC const struct afb_binding_v2 afbBindingV2 = { + .api = sndCardApiPrefix, + .specification = NULL, .verbs = halSharedApi, .preinit = NULL, .init = afbServiceInit, diff --git a/HAL-afb/HAL-interface/hal-interface.h b/HAL-afb/HAL-interface/hal-interface.h index 6aebb6e..e08ec18 100644 --- a/HAL-afb/HAL-interface/hal-interface.h +++ b/HAL-afb/HAL-interface/hal-interface.h @@ -19,6 +19,8 @@ #define SHAREHALLIB_H #include <stdio.h> +#include <alsa/asoundlib.h> + #include "audio-interface.h" typedef struct { @@ -37,8 +39,11 @@ typedef struct { // avoid compiler warning [Jose does not like typedef :) ] typedef struct afb_service alsaHalServiceT; +// static value for HAL sound card API prefix +extern const char sndCardApiPrefix[]; + typedef struct { - struct json_object* (*callback)(alsaHalServiceT service, int control, int value, alsaHalCtlMapT *map, void* handle); + struct json_object* (*callback)(alsaHalCtlMapT *control, void* handle); void* handle; } alsaHalCbMapT; @@ -48,17 +53,16 @@ typedef struct { char* info; } alsaHalMapT; -typedef struct { - const char *prefix; + +typedef const struct { const char *name; const char *info; alsaHalMapT *ctls; - int (*initCB) (const struct afb_binding_interface *itf, struct afb_service service); + int (*initCB) (void); } alsaHalSndCardT; PUBLIC alsaHalSndCardT alsaHalSndCard; -PUBLIC char* SharedHalLibVersion; #endif /* SHAREHALLIB_H */ diff --git a/HAL-afb/HDA-intel/IntelHdaHAL.c b/HAL-afb/HDA-intel/IntelHdaHAL.c index 6967c1f..98ac442 100644 --- a/HAL-afb/HDA-intel/IntelHdaHAL.c +++ b/HAL-afb/HDA-intel/IntelHdaHAL.c @@ -18,25 +18,22 @@ #include "hal-interface.h" #include "audio-interface.h" -// Force a hard dependency to ShareHallLib -PUBLIC char* SharedHalLibVersion; - // Init is call after all binding are loaded -STATIC int IntelHalInit (const struct afb_binding_interface *itf, struct afb_service service) { - DEBUG (itf, "IntelHalBinding Initialised"); +STATIC int IntelHalInit (void) { + DEBUG ("IntelHalBinding Initialised"); return 0; // 0=OK } -STATIC void MasterOnOff (void * handle) { - static powerStatus=0; +STATIC void MasterOnOff (alsaHalCtlMapT *control, void* handle) { + static int powerStatus=0; if (! powerStatus) { powerStatus = 1; - DEBUG (itf, "Power Set to On"); + DEBUG ("Power Set to On"); } else { powerStatus = 0; - DEBUG (itf, "Power Set to Off"); + DEBUG ("Power Set to Off"); } } @@ -57,7 +54,7 @@ STATIC alsaHalMapT alsaHalMap[]= { { .alsa={.control=PCM_Playback_Volume ,.numid=27, .name="Play-Vol" , .values=2,.minval=0,.maxval= 255,.step=0}, .info= "PCM Playback Volume" }, { .alsa={.control=PCM_Playback_Switch ,.numid=17, .name="Play-Switch" , .values=1,.minval=0,.maxval= 1 ,.step=0}, .info= "Master Playback Switch" }, { .alsa={.control=Capture_Volume ,.numid=12, .name="Capt-vol" , .values=2,.minval=0,.maxval= 31 ,.step=0}, .info= "Capture Volume" }, - { .alsa={.control=Master_OnOff_Switch ,.numid=1000, .name="Power-Switch"}, .cb={.callback=MasterOnOff, .handle=NULL}} /* marker for end of the array */ + { .alsa={.control=Master_OnOff_Switch ,.numid=99, .name="Power-Switch"}, .cb={.callback=MasterOnOff, .handle=NULL}, .info= "OnOff Global Switch"}, { .alsa={.numid=0}, .cb={.callback=NULL, .handle=NULL}} /* marker for end of the array */ } ; @@ -72,10 +69,15 @@ STATIC alsaHalMapT alsaHalMap[]= { * http://localhost:1234/api/alsacore/getcardid?devid=hw:xxx * ***********************************************************************************/ + +// API prefix should be unique for each snd card +PUBLIC const char sndCardApiPrefix[] = "intel-hda"; + +// HAL sound card controls mapping PUBLIC alsaHalSndCardT alsaHalSndCard = { .name = "HDA Intel PCH", .info = "Hardware Abstraction Layer for IntelHDA sound card", .ctls = alsaHalMap, - .prefix="intel-hda", .initCB=IntelHalInit, // if NULL no initcallback }; + |