From 10c42e135b22bf323836100ede042ec47ddb22a1 Mon Sep 17 00:00:00 2001
From: fulup <fulup.arfoll@iot.bzh>
Date: Tue, 27 Jun 2017 18:21:20 +0200
Subject: Work in Progress

---
 HAL-afb/HAL-interface/hal-interface.c | 104 +++++++++++++---------------------
 HAL-afb/HAL-interface/hal-interface.h |  14 +++--
 HAL-afb/HDA-intel/IntelHdaHAL.c       |  24 ++++----
 3 files changed, 62 insertions(+), 80 deletions(-)

(limited to 'HAL-afb')

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
 };
+
-- 
cgit