aboutsummaryrefslogtreecommitdiffstats
path: root/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2018-06-09 00:30:40 +0200
committerJonathan Aillet <jonathan.aillet@iot.bzh>2018-10-08 15:52:51 +0200
commit0f6d2131882e05e230f648626b81586c052b4da0 (patch)
treebe871b747128f8fe51c6a7d3ffb3aab6f3ac26b1 /4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c
parentcc1ec41093c3b0db3b8bdf8e8949ecdacceda190 (diff)
Move mixer attach at hal startup
Move mixer attach at hal startup instead of making attachment possible only with a verb. Now, if the hal audio device is detected at startup, it will automatically be attached to the mixer. As it is useless now, the verb used to attach mixer has been deleted. Change-Id: I32c8b829ac37fb31ede4fe8830a6f2a699c0835c Signed-off-by: Jonathan Aillet <jonathan.aillet@iot.bzh>
Diffstat (limited to '4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c')
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c109
1 files changed, 99 insertions, 10 deletions
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c
index 56a50a8..93901a4 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c
@@ -21,31 +21,29 @@
#include <string.h>
#include <stdbool.h>
+#include "../4a-hal-utilities/4a-hal-utilities-appfw-responses-handler.h"
#include "../4a-hal-utilities/4a-hal-utilities-verbs-loader.h"
#include "4a-hal-controllers-mixer-handler.h"
#include "4a-hal-controllers-cb.h"
/*******************************************************************************
- * HAL controllers handle mixer response function *
+ * HAL controllers handle mixer calls functions *
******************************************************************************/
-int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *mixerResponseJ)
+int HalCtlsHandleMixerAttachResponse(AFB_ApiT apiHandle, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *mixerResponseJ)
{
int err = (int) MIXER_NO_ERROR;
unsigned int idx;
char *currentStreamName, *currentStreamCardId;
- AFB_ApiT apiHandle;
-
struct HalUtlApiVerb *CtlHalDynApiStreamVerbs;
json_object *currentStreamJ;
- apiHandle = (AFB_ApiT) afb_request_get_dynapi(request);
if(! apiHandle) {
- AFB_ReqWarning(request, "%s: Can't get current hal api handle", __func__);
+ AFB_ApiError(apiHandle, "%s: Can't get current hal api handle", __func__);
return (int) MIXER_ERROR_API_UNAVAILABLE;
}
@@ -58,7 +56,7 @@ int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT
break;
default:
currentHalStreamsData->count = 0;
- AFB_ReqWarning(request, "%s: no streams returned", __func__);
+ AFB_ApiWarning(apiHandle, "%s: no streams returned", __func__);
return (int) MIXER_ERROR_NO_STREAMS;
}
@@ -75,11 +73,11 @@ int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT
currentStreamJ = mixerResponseJ;
if(wrap_json_unpack(currentStreamJ, "{s:s}", "uid", &currentStreamName)) {
- AFB_ReqWarning(request, "%s: can't find name in current stream object", __func__);
+ AFB_ApiError(apiHandle, "%s: can't find name in current stream object", __func__);
err += (int) MIXER_ERROR_STREAM_NAME_UNAVAILABLE;
}
else if(wrap_json_unpack(currentStreamJ, "{s:s}", "alsa", &currentStreamCardId)) {
- AFB_ReqWarning(request, "%s: can't find card id in current stream object", __func__);
+ AFB_ApiError(apiHandle, "%s: can't find card id in current stream object", __func__);
err += (int) MIXER_ERROR_STREAM_CARDID_UNAVAILABLE;
}
else {
@@ -93,9 +91,100 @@ int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT
}
if(HalUtlLoadVerbs(apiHandle, CtlHalDynApiStreamVerbs)) {
- AFB_ReqWarning(request, "%s: error while creating verbs for streams", __func__);
+ AFB_ApiError(apiHandle, "%s: error while creating verbs for streams", __func__);
err += (int) MIXER_ERROR_COULDNT_ADD_STREAMS_AS_VERB;
}
return err;
+}
+
+int HalCtlsAttachToMixer(AFB_ApiT apiHandle)
+{
+ unsigned int err;
+
+ char *apiToCall, *returnedStatus = NULL, *returnedInfo = NULL;
+
+ enum CallError returnedError;
+
+ CtlConfigT *ctrlConfig;
+
+ struct SpecificHalData *currentCtlHalData;
+
+ json_object *returnJ, *toReturnJ;
+
+ ctrlConfig = (CtlConfigT *) afb_dynapi_get_userdata(apiHandle);
+ if(! ctrlConfig) {
+ AFB_ApiError(apiHandle, "%s: Can't get current hal controller config", __func__);
+ return -1;
+ }
+
+ currentCtlHalData = (struct SpecificHalData *) ctrlConfig->external;
+ if(! currentCtlHalData) {
+ AFB_ApiError(apiHandle, "%s: Can't get current hal controller data", __func__);
+ return -2;
+ }
+
+ apiToCall = currentCtlHalData->ctlHalSpecificData->mixerApiName;
+ if(! apiToCall) {
+ AFB_ApiError(apiHandle, "%s: Can't get mixer api", __func__);
+ return -3;
+ }
+
+ switch(currentCtlHalData->status) {
+ case HAL_STATUS_UNAVAILABLE:
+ AFB_ApiError(apiHandle, "%s: Seems that the hal corresponding card was not found by alsacore at startup", __func__);
+ return -4;
+
+ case HAL_STATUS_READY:
+ AFB_ApiNotice(apiHandle, "%s: Seems that the hal mixer is already initialized", __func__);
+ return 1;
+
+ case HAL_STATUS_AVAILABLE:
+ break;
+ }
+
+ if(AFB_ServiceSync(apiHandle, apiToCall, MIXER_ATTACH_VERB, json_object_get(currentCtlHalData->ctlHalSpecificData->halMixerJ), &returnJ)) {
+ returnedError = HalUtlHandleAppFwCallError(apiHandle, apiToCall, MIXER_ATTACH_VERB, returnJ, &returnedStatus, &returnedInfo);
+ AFB_ApiWarning(apiHandle,
+ "Error %i during call to verb %s of %s api with status '%s' and info '%s'",
+ (int) returnedError,
+ apiToCall,
+ MIXER_ATTACH_VERB,
+ returnedStatus ? returnedStatus : "not returned",
+ returnedInfo ? returnedInfo : "not returned");
+ return -6;
+ }
+ else if(json_object_object_get_ex(returnJ, "response", &toReturnJ)) {
+ err = HalCtlsHandleMixerAttachResponse(apiHandle, &currentCtlHalData->ctlHalSpecificData->ctlHalStreamsData, toReturnJ);
+ if(err != (int) MIXER_NO_ERROR) {
+ AFB_ApiError(apiHandle,
+ "%s: Seems that %s call to api %s succeed but this warning was risen by response decoder : %i '%s'",
+ __func__,
+ MIXER_ATTACH_VERB,
+ apiToCall,
+ err,
+ json_object_get_string(toReturnJ));
+ return -7;
+ }
+
+ AFB_ApiNotice(apiHandle,
+ "%s: Seems that %s call to api %s succeed with no warning raised : '%s'",
+ __func__,
+ MIXER_ATTACH_VERB,
+ apiToCall,
+ json_object_get_string(toReturnJ));
+
+ currentCtlHalData->status = HAL_STATUS_READY;
+ }
+ else {
+ AFB_ApiError(apiHandle,
+ "%s: Seems that %s call to api %s succeed, but response is not valid : '%s'",
+ __func__,
+ MIXER_ATTACH_VERB,
+ apiToCall,
+ json_object_get_string(returnJ));
+ return -8;
+ }
+
+ return 0;
} \ No newline at end of file