aboutsummaryrefslogtreecommitdiffstats
path: root/4a-hal
diff options
context:
space:
mode:
Diffstat (limited to '4a-hal')
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c9
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c79
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h1
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.c109
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h8
5 files changed, 112 insertions, 94 deletions
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
index f0ef696..404ecd2 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-api-loader.c
@@ -31,6 +31,7 @@
#include "4a-hal-controllers-api-loader.h"
#include "4a-hal-controllers-alsacore-link.h"
#include "4a-hal-controllers-cb.h"
+#include "4a-hal-controllers-mixer-handler.h"
// Default api to print log when apihandle not available
AFB_ApiT AFB_default;
@@ -60,7 +61,6 @@ static struct HalUtlApiVerb CtlHalDynApiStaticVerbs[] =
{
/* VERB'S NAME FUNCTION TO CALL SHORT DESCRIPTION */
{ .verb = "list", .callback = HalCtlsListVerbs, .info = "List available verbs for this api"},
- { .verb = "init-mixer", .callback = HalCtlsInitMixer, .info = "Init Hal with 4a-softmixer"},
{ .verb = NULL } // Marker for end of the array
};
@@ -71,6 +71,8 @@ static struct HalUtlApiVerb CtlHalDynApiStaticVerbs[] =
static int HalCtlsInitOneApi(AFB_ApiT apiHandle)
{
+ int err;
+
CtlConfigT *ctrlConfig;
struct SpecificHalData *currentCtlHalData;
@@ -109,8 +111,11 @@ static int HalCtlsInitOneApi(AFB_ApiT apiHandle)
if(currentCtlHalData->sndCardId < 0)
currentCtlHalData->status = HAL_STATUS_UNAVAILABLE;
- else
+ else {
currentCtlHalData->status = HAL_STATUS_AVAILABLE;
+ if((err = HalCtlsAttachToMixer(apiHandle)))
+ AFB_ApiError(apiHandle, "%s: Error %i while attaching to mixer", __func__, err);
+ }
// TBD JAI: handle refresh of hal status for dynamic card (/dev/by-id)
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
index 5b9f2a8..98d2b0c 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.c
@@ -519,83 +519,4 @@ void HalCtlsListVerbs(AFB_ReqT request)
wrap_json_pack(&requestAnswer, "{s:o}", "streams", streamsArray);
AFB_ReqSucess(request, requestAnswer, "Requested data");
-}
-
-void HalCtlsInitMixer(AFB_ReqT request)
-{
- unsigned int err;
-
- char *apiToCall;
-
- AFB_ApiT apiHandle;
- CtlConfigT *ctrlConfig;
-
- struct SpecificHalData *currentCtlHalData;
-
- json_object *returnJ, *toReturnJ;
-
- apiHandle = (AFB_ApiT ) afb_request_get_dynapi(request);
- if(! apiHandle) {
- AFB_ReqFail(request, "api_handle", "Can't get current hal api handle");
- return;
- }
-
- ctrlConfig = (CtlConfigT *) afb_dynapi_get_userdata(apiHandle);
- if(! ctrlConfig) {
- AFB_ReqFail(request, "hal_controller_config", "Can't get current hal controller config");
- return;
- }
-
- currentCtlHalData = (struct SpecificHalData *) ctrlConfig->external;
- if(! currentCtlHalData) {
- AFB_ReqFail(request, "hal_controller_data", "Can't get current hal controller data");
- return;
- }
-
- apiToCall = currentCtlHalData->ctlHalSpecificData->mixerApiName;
- if(! apiToCall) {
- AFB_ReqFail(request, "mixer_api", "Can't get mixer api");
- return;
- }
-
- switch(currentCtlHalData->status) {
- case HAL_STATUS_UNAVAILABLE:
- AFB_ReqFail(request, "hal_unavailable", "Seems that the hal corresponding card was not found by alsacore at startup");
- return;
-
- case HAL_STATUS_READY:
- AFB_ReqSucess(request, NULL, "Seems that the hal mixer is already initialized");
- return;
-
- case HAL_STATUS_AVAILABLE:
- break;
- }
-
- if(AFB_ServiceSync(apiHandle, apiToCall, "create", json_object_get(currentCtlHalData->ctlHalSpecificData->halMixerJ), &returnJ)) {
- HalUtlHandleAppFwCallErrorInRequest(request, apiToCall, "create", returnJ, "mixer_create");
- }
- else if(json_object_object_get_ex(returnJ, "response", &toReturnJ)) {
- err = HalCtlsHandleMixerAttachResponse(request, &currentCtlHalData->ctlHalSpecificData->ctlHalStreamsData, toReturnJ);
- if(err != (int) MIXER_NO_ERROR) {
- AFB_ReqFailF(request,
- "handler_mixer_response",
- "Seems that create call to api %s succeed but this warning was risen by response decoder : %i",
- apiToCall,
- err);
- return;
- }
-
- AFB_ReqSucessF(request,
- toReturnJ,
- "Seems that create call to api %s succeed with no warning raised",
- apiToCall);
-
- currentCtlHalData->status = HAL_STATUS_READY;
- }
- else {
- AFB_ReqFailF(request,
- "invalid_response",
- "Seems that mix_new call to api %s succeed, but response is not valid",
- apiToCall);
- }
} \ No newline at end of file
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h
index e3eeeeb..014c539 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-cb.h
@@ -34,6 +34,5 @@ int HalCtlsHalMapConfig(AFB_ApiT apiHandle, CtlSectionT *section, json_object *S
// HAL controllers verbs functions
void HalCtlsActionOnStream(AFB_ReqT request);
void HalCtlsListVerbs(AFB_ReqT request);
-void HalCtlsInitMixer(AFB_ReqT request);
#endif /* _HALMGR_CB_INCLUDE_ */ \ No newline at end of file
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
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h
index 09e0dc7..74bca88 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-mixer-handler.h
@@ -22,8 +22,12 @@
#include <wrap-json.h>
+#include "afb-helpers-utils.h"
+
#include "../4a-hal-utilities/4a-hal-utilities-data.h"
+#define MIXER_ATTACH_VERB "create"
+
// Enum for the type of error detected
enum MixerStatus {
MIXER_NO_ERROR=0,
@@ -34,7 +38,7 @@ enum MixerStatus {
MIXER_ERROR_COULDNT_ADD_STREAMS_AS_VERB =-100000,
};
-// HAL controllers handle mixer response function
-int HalCtlsHandleMixerAttachResponse(AFB_ReqT request, struct CtlHalStreamsDataT *currentHalStreamsData, json_object *MixerResponseJ);
+// HAL controllers handle mixer calls functions
+int HalCtlsAttachToMixer(AFB_ApiT apiHandle);
#endif /* _HAL_CTLS_SOFTMIXER_LINK_INCLUDE_ */ \ No newline at end of file