diff options
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-alsacore-link.c | 154 | ||||
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-alsacore-link.h | 37 | ||||
-rw-r--r-- | src/4a-internals-hal/4a-internals-hal-cb.c | 84 |
3 files changed, 199 insertions, 76 deletions
diff --git a/src/4a-internals-hal/4a-internals-hal-alsacore-link.c b/src/4a-internals-hal/4a-internals-hal-alsacore-link.c index 7b2fd5f..99b50a8 100644 --- a/src/4a-internals-hal/4a-internals-hal-alsacore-link.c +++ b/src/4a-internals-hal/4a-internals-hal-alsacore-link.c @@ -66,6 +66,160 @@ snd_ctl_elem_type_t InternalHalMapsAlsaTypeToEnum(const char *label) } /******************************************************************************* + * Internals HAL - Alsacore events handler function * + ******************************************************************************/ + +enum aslacoreEventType InternalHalGetAlsaCoreEventType(const char *evtLabel) +{ + if(! evtLabel) + return ALSACORE_UNRECOGNIZED_EVENT; + + if(! strncmp(&evtLabel[ALSACORE_EVENT_NAME_BEGIN], + ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX, + ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX_LENGTH)) + return ALSACORE_EVENT_CARD_CONTROL_CHANGE; + + return ALSACORE_UNRECOGNIZED_EVENT; +} + +int InternalHalHandleAlsaCoreCardControlEvent(afb_api_t apiHandle, + const char *evtLabel, + json_object *eventJ, + struct HalData *currentHalData) +{ + int numid, cardidx; + + json_object *valuesJ, *normalizedValuesJ; + + CtlSourceT source; + + struct InternalHalAlsaMap *currentHalMapControl; + + if(! apiHandle || ! evtLabel || ! eventJ || ! currentHalData) { + AFB_API_ERROR(apiHandle, "Invalid argument(s)"); + return -1; + } + + if(sscanf(&evtLabel[ALSACORE_CARD_CONTROL_EVENT_BEGIN], "%d", &cardidx) != 1) { + AFB_API_ERROR(apiHandle, + "Did not succeed to get ALSA card number of the modified control : evtname=%s [msg=%s]", + evtLabel, + json_object_get_string(eventJ)); + return -2; + } + + if(wrap_json_unpack(eventJ, "{s:i s:o}", "id", &numid, "val", &valuesJ)) { + AFB_API_ERROR(apiHandle, + "Invalid alsacore modified control event received label=%s value=%s", + evtLabel, + json_object_get_string(eventJ)); + return -3; + } + + if(cds_list_empty(¤tHalData->internalHalData->halMapListHead)) { + AFB_API_ERROR(apiHandle, + "No halmap data is available, cannot handle alsacore event label=%s value=%s", + evtLabel, + json_object_get_string(eventJ)); + return -4; + } + + // Search for corresponding numid in ALSA controls list, if found, launch callback (if available) + cds_list_for_each_entry(currentHalMapControl, ¤tHalData->internalHalData->halMapListHead, node) { + if(currentHalMapControl->cardNb != cardidx || + ! currentHalMapControl->ctl.alsaCtlProperties || + currentHalMapControl->ctl.numid != numid) + continue; + + if(currentHalMapControl->action) { + memset(&source, 0, sizeof(CtlSourceT)); + source.uid = currentHalMapControl->action->uid; + source.api = currentHalMapControl->action->api; + + ActionExecOne(&source, currentHalMapControl->action, valuesJ); + } + else if(currentHalMapControl->actionJ) { + AFB_API_WARNING(apiHandle, + "The alsa control id '%i' is corresponding to a known control which " + "has a registered action, but action is not ready to be executed", + numid); + } + else { + AFB_API_NOTICE(apiHandle, + "The alsa control id '%i' is corresponding to a known control " + "but without any action registered", + numid); + } + + if(! currentHalMapControl->alsaControlEvent || + InternalHalConvertJsonValues(apiHandle, + currentHalMapControl->ctl.alsaCtlProperties, + valuesJ, + &normalizedValuesJ, + CONVERSION_ALSACORE_TO_NORMALIZED) || + (afb_event_push(currentHalMapControl->alsaControlEvent, normalizedValuesJ) < 0)) { + AFB_API_ERROR(apiHandle, + "Couldn't generate an event for known halmap %s (alsa control id %i)", + currentHalMapControl->uid, + currentHalMapControl->ctl.numid); + } + + return 0; + } + + AFB_API_INFO(apiHandle, + "Alsacore event with an unrecognized numid: %i, evtname=%s [msg=%s]", + numid, + evtLabel, + json_object_get_string(eventJ)); + + return 1; + +} + +int InternalHalHandleAlsaCoreEvents(afb_api_t apiHandle, + const char *evtLabel, + json_object *eventJ, + struct HalData *currentHalData) +{ + int returned; + + if(! apiHandle || ! evtLabel || ! eventJ || ! currentHalData) { + AFB_API_ERROR(apiHandle, "Invalid argument(s)"); + return -1; + } + + switch(InternalHalGetAlsaCoreEventType(evtLabel)) { + case ALSACORE_EVENT_CARD_CONTROL_CHANGE: + returned = InternalHalHandleAlsaCoreCardControlEvent(apiHandle, evtLabel, eventJ, currentHalData); + if(returned < 0) { + AFB_API_ERROR(apiHandle, + "Error %i caught when tried to handle alsacore card control event evtname=%s [msg=%s]", + returned, + evtLabel, + json_object_get_string(eventJ)); + return -2; + } + else if(returned > 0) { + AFB_API_INFO(apiHandle, + "Warning %i raised when tried to handle alsacore card control event evtname=%s [msg=%s]", + returned, + evtLabel, + json_object_get_string(eventJ)); + } + return 0; + + case ALSACORE_UNRECOGNIZED_EVENT: + default: + AFB_API_NOTICE(apiHandle, + "Alsacore event with an unrecognized evtname=%s [msg=%s]", + evtLabel, + json_object_get_string(eventJ)); + return 1; + } +} + +/******************************************************************************* * Internals HAL - Alsacore calls funtions * ******************************************************************************/ diff --git a/src/4a-internals-hal/4a-internals-hal-alsacore-link.h b/src/4a-internals-hal/4a-internals-hal-alsacore-link.h index 84a096a..0694a81 100644 --- a/src/4a-internals-hal/4a-internals-hal-alsacore-link.h +++ b/src/4a-internals-hal/4a-internals-hal-alsacore-link.h @@ -19,6 +19,7 @@ #define _INTERNALS_HAL_ALSACORE_LINK_INCLUDE_ #include <stdio.h> +#include <string.h> #include <wrap-json.h> @@ -29,17 +30,31 @@ #include <ctl-config.h> #include "4a-hal-utilities-alsa-data.h" +#include "4a-hal-utilities-data.h" -#define ALSACORE_API "alsacore" +#define ALSACORE_API "alsacore" +#define ALSACORE_API_NAME_LENGTH strlen(ALSACORE_API) -#define ALSACORE_SUBSCRIBE_VERB "subscribe" -#define ALSACORE_UNSUBSCRIBE_VERB "unsubscribe" -#define ALSACORE_GETINFO_VERB "infoget" -#define ALSACORE_CTLGET_VERB "ctlget" -#define ALSACORE_CTLSET_VERB "ctlset" -#define ALSACORE_ADDCTL_VERB "addcustomctl" +#define ALSACORE_SUBSCRIBE_VERB "subscribe" +#define ALSACORE_UNSUBSCRIBE_VERB "unsubscribe" +#define ALSACORE_GETINFO_VERB "infoget" +#define ALSACORE_CTLGET_VERB "ctlget" +#define ALSACORE_CTLSET_VERB "ctlset" +#define ALSACORE_ADDCTL_VERB "addcustomctl" -#define ALSACORE_CARD_CONTROL_EVENT_NAME "controls" +#define ALSACORE_CARD_CONTROL_EVENT_NAME "controls" + +#define ALSACORE_EVENT_NAME_BEGIN (ALSACORE_API_NAME_LENGTH + 1) +#define ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX "hw:" +#define ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX_LENGTH strlen(ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX) +#define ALSACORE_CARD_CONTROL_EVENT_BEGIN (ALSACORE_EVENT_NAME_BEGIN + ALSACORE_CARD_CONTROL_EVENT_NAME_PREFIX_LENGTH) + +// Enum for handled alsacore events + +enum aslacoreEventType { + ALSACORE_EVENT_CARD_CONTROL_CHANGE = 0, + ALSACORE_UNRECOGNIZED_EVENT = 1 +}; // Enum for the type of subscription/unsubscription to do with alsacore enum AlsacoreSubscribeUnsubscribeType { @@ -50,6 +65,12 @@ enum AlsacoreSubscribeUnsubscribeType { // Alsa control types map from string function snd_ctl_elem_type_t InternalHalMapsAlsaTypeToEnum(const char *label); +// Internals HAL alsacore events handler function +int InternalHalHandleAlsaCoreEvents(afb_api_t apiHandle, + const char *evtLabel, + json_object *eventJ, + struct HalData *currentHalData); + // Internals HAL alsacore calls funtions int InternalHalGetCardInfo(afb_api_t apiHandle, json_object *requestJ, json_object **responseJ); int InternalHalSubscribeToAlsacoreCardEvent(afb_api_t apiHandle, char *cardId); diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c index 34fbe74..65ff96d 100644 --- a/src/4a-internals-hal/4a-internals-hal-cb.c +++ b/src/4a-internals-hal/4a-internals-hal-cb.c @@ -37,15 +37,11 @@ void InternalHalDispatchApiEvent(afb_api_t apiHandle, const char *evtLabel, json_object *eventJ) { - int numid, idx = 0, cardidx; + int error; CtlConfigT *ctrlConfig; - CtlSourceT source; struct HalData *currentHalData; - struct InternalHalAlsaMap *currentHalMapControl; - - json_object *valuesJ, *normalizedValuesJ; AFB_API_DEBUG(apiHandle, "Evtname=%s [msg=%s]", evtLabel, json_object_get_string(eventJ)); @@ -61,79 +57,31 @@ void InternalHalDispatchApiEvent(afb_api_t apiHandle, const char *evtLabel, json return; } - // Extract sound card index from event - while(evtLabel[idx] != '\0' && evtLabel[idx] != ':') - idx++; - - if(evtLabel[idx] != '\0' && - (sscanf(&evtLabel[idx + 1], "%d", &cardidx) == 1)) { - if(wrap_json_unpack(eventJ, "{s:i s:o}", "id", &numid, "val", &valuesJ)) { + if((strlen(evtLabel) > ALSACORE_API_NAME_LENGTH) && + ! strncmp(evtLabel, ALSACORE_API, ALSACORE_API_NAME_LENGTH)) { + error = InternalHalHandleAlsaCoreEvents(apiHandle, evtLabel, eventJ, currentHalData); + if(error < 0) { AFB_API_ERROR(apiHandle, - "Invalid alsacore event received label=%s value=%s", + "Error %i caught when tried to handle alsacore event evtname=%s [msg=%s]", + error, evtLabel, json_object_get_string(eventJ)); return; } - - if(cds_list_empty(¤tHalData->internalHalData->halMapListHead)) { - AFB_API_ERROR(apiHandle, "No halmap data is available, cannot handle alsacore event"); - return; + else if(error > 0) { + AFB_API_INFO(apiHandle, + "Warning %i raised when tried to handle alsacore event evtname=%s [msg=%s]", + error, + evtLabel, + json_object_get_string(eventJ)); } - - // Search for corresponding numid in ALSA controls list, if found, launch callback (if available) - cds_list_for_each_entry(currentHalMapControl, ¤tHalData->internalHalData->halMapListHead, node) { - if(currentHalMapControl->cardNb == cardidx && - currentHalMapControl->ctl.alsaCtlProperties && - currentHalMapControl->ctl.numid == numid) { - if(currentHalMapControl->action) { - memset(&source, 0, sizeof(CtlSourceT)); - source.uid = currentHalMapControl->action->uid; - source.api = currentHalMapControl->action->api; - - (void) ActionExecOne(&source, currentHalMapControl->action, valuesJ); - } - else if(currentHalMapControl->actionJ) { - AFB_API_WARNING(apiHandle, - "The alsa control id '%i' is corresponding to a known control which " - "has a registered action, but action is not ready to be executed", - numid); - return; - } - else { - AFB_API_NOTICE(apiHandle, - "The alsa control id '%i' is corresponding to a known control " - "but without any action registered", - numid); - } - - if(! currentHalMapControl->alsaControlEvent || - InternalHalConvertJsonValues(apiHandle, - currentHalMapControl->ctl.alsaCtlProperties, - valuesJ, - &normalizedValuesJ, - CONVERSION_ALSACORE_TO_NORMALIZED) || - (afb_event_push(currentHalMapControl->alsaControlEvent, normalizedValuesJ) < 0)) { - AFB_API_ERROR(apiHandle, - "Couldn't generate an event for known halmap %s (alsa control id %i)", - currentHalMapControl->uid, - currentHalMapControl->ctl.numid); - } - - return; - } + else { + return; } - - AFB_API_WARNING(apiHandle, - "Alsacore event with an unrecognized numid: %i, evtname=%s [msg=%s]", - numid, - evtLabel, - json_object_get_string(eventJ)); - - return; } AFB_API_INFO(apiHandle, - "Not an alsacore event '%s' [msg=%s]", + "Not an internally handled event '%s' [msg=%s]", evtLabel, json_object_get_string(eventJ)); |