diff options
author | Fulup Ar Foll <fulup@iot.bzh> | 2017-03-11 00:27:30 +0100 |
---|---|---|
committer | Fulup Ar Foll <fulup@iot.bzh> | 2017-03-11 00:27:30 +0100 |
commit | 521281617cec5d89725c4844eac68b5a772fab57 (patch) | |
tree | 74a5a5154c88cdae485fd2f139d50f3bf003ae9d /AlsaSound/HALayer/Shared/SharedHalLib.c | |
parent | 5cb52e556fed8eb0cf74d1052fe413fbb7406b0e (diff) |
Work in Progress
Static/Dynamic Lib Fixed.
Source Tree cleaned up
Compile but to be tested
Business Logic not done
Diffstat (limited to 'AlsaSound/HALayer/Shared/SharedHalLib.c')
-rw-r--r-- | AlsaSound/HALayer/Shared/SharedHalLib.c | 252 |
1 files changed, 0 insertions, 252 deletions
diff --git a/AlsaSound/HALayer/Shared/SharedHalLib.c b/AlsaSound/HALayer/Shared/SharedHalLib.c deleted file mode 100644 index ffa25e0..0000000 --- a/AlsaSound/HALayer/Shared/SharedHalLib.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2016 "IoT.bzh" - * Author Fulup Ar Foll <fulup@iot.bzh> - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * reference: - * amixer contents; amixer controls; - * http://www.tldp.org/HOWTO/Alsa-sound-6.html - */ -#define _GNU_SOURCE // needed for vasprintf -#include <stdio.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <netdb.h> -#include <fcntl.h> -#include <math.h> -#include <sys/time.h> -#include <sys/types.h> - -#include <json-c/json.h> -#include <afb/afb-binding.h> -#include <afb/afb-service-itf.h> - -#include "MiscHelpers.h" -#include "AlsaHalIface.h" - -typdef struct { - int numid; -} shareHallMap_T; - -static struct afb_service srvitf; -static const struct afb_binding_interface *afbIface; -static shareHallMap_T *shareHallMap; - - -STATIC void localping(struct afb_req request) { - json_object *query = afb_req_json(request); - afb_req_success(request, query, NULL); -} - -// 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); - struct json_object *x, *resp = NULL; - const char *info = NULL; - - 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; - } - - // 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 -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) { - const char *devid = afb_req_value(request, "devid"); - if (devid == NULL) { - afb_req_fail_f (request, "devid-missing", "devid=hw:xxx missing"); - } -} - -// Call when all bindings are loaded and ready to accept request -STATIC void halGetVol(struct afb_req request) { - - // Should call here Hardware Alsa Abstraction Layer for corresponding Sound Card - afb_req_success (request, NULL, NULL); - return; - -} - -STATIC void halSetVol(struct afb_req request) { - const char *arg; - const char *pcm; - - arg = afb_req_value(request, "vol"); - if (arg == NULL) { - afb_req_fail_f (request, "argument-missing", "vol=[0,100] missing"); - goto OnErrorExit; - } - - pcm = afb_req_value(request, "pcm"); - if (pcm == NULL) pcm="Master"; - - // Should call here Hardware Alsa Abstraction Layer for corresponding Sound Card - afb_req_success (request, NULL, NULL); - return; - - OnErrorExit: - return; - -} - -// this is call when after all bindings are loaded -STATIC int halGetControl(struct afb_service service) { - srvitf = service; - struct json_object *queryin, *queryout, *ctls, *devid; - - // get query from request - queryin = afb_req_json(request); - - // check devid was given - devid= json_object_object_get(queryin,"devid"); - if (!ctls) { - afb_req_fail_f(request, "devid-notfound", "No DevID given query=[%s]", json_object_get_string(queryin)); - goto OnErrorExit; - } - - // loop on requested controls - ctls= json_object_object_get(queryin,"ctls"); - if (!ctls || json_object_array_length(ctls) <= 0) { - afb_req_fail_f(request, "ctls-notfound", "No Controls given query=[%s]", json_object_get_string(queryin)); - goto OnErrorExit; - } - - for (int idx=0; idx< json_object_array_length(ctls), idx++) { - struct json_object *ctl; - halControlEnumT control; - int value; - - // each controls should be halControlEnumT+value - ctl = json_object_array_get_idx(ctls, idx); - if (json_object_array_length(ctl != 2)) { - afb_req_fail_f(request, "ctl-invalid", "Invalid Control devid=%s ctl=[%s]"json_object_get_string(devid), json_object_get_string(cls)); - goto OnErrorExit; - } - - // As HAL and Business logic use the same AlsaMixerHal.h direct conversion is not an issue - control = (halControlEnumT)json_object_get_int(json_object_array_get_idx(ctl,0)); - value = json_object_get_int(json_object_array_get_idx(ctl,0)); - - if (control >= EndHalCrlTag || control <= StartHalCrlTag) { - afb_req_fail_f(request, "ctl-invalid", "Invalid Control devid=%s ctl=[%s] should be [%d=%d]" - , json_object_get_string(devid), json_object_get_string(cls)), StartHalCrlTag, EndHalCrlTag; - goto OnErrorExit; - } - - - default: - NOTICE (afbIface, "audioLogicOpenCB2 unknown HAL control=[%s]", json_object_get_string(ctl)): - } - } - - - // register HAL with Alsa Low Level Binder devid=hw:0&numid=1&quiet=0 - queryurl=json_object_new_object(); - json_object_object_add(queryurl, "prefix",json_object_new_string(alsaHalBinding.v1.prefix)); - json_object_object_add(queryurl, "name" ,json_object_new_string(alsaHalSndCard.name)); - afb_service_call(srvitf, "alsacore", "registerHal", queryurl, halGetControlCB, queryurl); - - - afb_req_success (request, sndctrls, NULL); - return; - -OnErrorExit: - -}; - -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 afbBindingV1ServiceEvent(const char *evtname, struct json_object *object) { - - NOTICE (afbIface, "afbBindingV1ServiceEvent evtname=%s [msg=%s]", evtname, json_object_to_json_string(object)); -} - -// this is call when after all bindings are loaded -PUBLIC int afbBindingV1ServiceInit(struct afb_service service) { - srvitf = service; - struct json_object *queryurl; - - // API prefix is used as sndcard halname - alsaHalBinding.v1.prefix= prefix; - - // register HAL with Alsa Low Level Binder - queryurl=json_object_new_object(); - json_object_object_add(ctx->queryurl, "prefix",json_object_new_string(alsaHalBinding.v1.prefix)); - json_object_object_add(ctx->queryurl, "name" ,json_object_new_string(alsaHalSndCard.name)); - afb_service_call(srvitf, "alsacore", "registerHal", queryurl, halInitCB, NULL); - - return 0; -}; - - -// Every HAL export the same API & Interface Mapping from SndCard to AudioLogic is done through alsaHalSndCardT -STATIC const struct afb_verb_desc_v1 halSharedApi[] = { - /* VERB'S NAME SESSION MANAGEMENT FUNCTION TO CALL SHORT DESCRIPTION */ - { .name= "ping" , .session= AFB_SESSION_NONE, .callback= localping, .info= "Ping Binding" }, - { .name= "getcontrol", .session= AFB_SESSION_NONE, .callback= halGetControl,.info= "Get Control" }, - { .name= "setvolume", .session= AFB_SESSION_NONE, .callback= halSetVol, .info= "Set Volume" }, - { .name= "getvolume", .session= AFB_SESSION_NONE, .callback= halGetVol, .info= "Get Volume" }, - { .name= "subscribe", .session= AFB_SESSION_NONE, .callback= halSubscribe, .info= "Subscribe AudioBinding Events" }, - { .name= NULL } /* marker for end of the array */ -}; - -// Process HAL mapping from alsaHalSndCardT before registering HAL binder -PUBLIC const struct afb_binding *afbBindingV1Register(const struct afb_binding_interface *itf) { - int count; - afbIface= itf; // need to keep a static trace of binder interface for avances functions - alsaHalBinding.verbs=halSharedApi; // complete sndcard specific alsaHalBinding with standard HAL APIs - alsaHalCtlMapT *alsaHalCtls = MapalsaHalSndCard.alsaHalCtlsMap; // Get sndcard specific HAL control mapping - - if (alsaHalCtls == NULL) { - ERROR (afbIface, "afbBindingV1Register Fail alsaHalCtlsMap==NULL"); - return NULL; - } - - // Create a zone to store HAL high/low level mapping - shareHallMap = calloc (EndHalCrlTag * sizeof(shareHallMap_T)); - for (int idx= 0; alsaHalCtlsMap[idx].numid != 0; idx++) { - shareHallMap[alsaHalCtlsMap[idx].]->numid = alsaHalCtlsMap[idx].numid; - } - - return alsaHalBinding; /* returns the description of the binding */ -} |