aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/4a-internals-hal/4a-internals-hal-cb.c182
1 files changed, 182 insertions, 0 deletions
diff --git a/src/4a-internals-hal/4a-internals-hal-cb.c b/src/4a-internals-hal/4a-internals-hal-cb.c
index d0e4909..f0becf5 100644
--- a/src/4a-internals-hal/4a-internals-hal-cb.c
+++ b/src/4a-internals-hal/4a-internals-hal-cb.c
@@ -773,6 +773,188 @@ int InternalHalProcessAllHalDependencies(afb_api_t apiHandle, json_object *Depen
return 0;
}
+int InternalHalHandleInfoGetResponse(afb_api_t apiHandle, json_object *currentResponseJ, struct InternalHalDeviceData **halDeviceDataToFill)
+{
+ int idx, arraySize, ret = 0;
+
+ struct InternalHalDeviceData *currentProbedDeviceData, *previouslyObtainedDevice;
+
+ if(! apiHandle || ! currentResponseJ || ! halDeviceDataToFill) {
+ AFB_API_ERROR(apiHandle, "Invalid argument(s)");
+ return -1;
+ }
+
+ switch(json_object_get_type(currentResponseJ)) {
+ case json_type_object:
+ currentProbedDeviceData = HalUtlAllocateAndFillProbedDeviceDataUsingInfoGetResponse(currentResponseJ);
+ if(! currentProbedDeviceData) {
+ AFB_API_ERROR(apiHandle, "Unable to decode info get response object");
+ return -2;
+ }
+
+ if(! *halDeviceDataToFill) {
+ *halDeviceDataToFill = currentProbedDeviceData;
+ break;
+ }
+
+ previouslyObtainedDevice = *halDeviceDataToFill;
+
+ if(previouslyObtainedDevice->cardNb != currentProbedDeviceData->cardNb ||
+ previouslyObtainedDevice->playbackDeviceNb != currentProbedDeviceData->playbackDeviceNb) {
+ AFB_API_WARNING(apiHandle, "Different audio devices was returned by info get call");
+ free(previouslyObtainedDevice);
+ ret = 1;
+ }
+
+ free(currentProbedDeviceData);
+ break;
+
+ case json_type_array:
+ arraySize = (int) json_object_array_length(currentResponseJ);
+ for(idx = 0; idx < arraySize; idx++) {
+ ret = InternalHalHandleInfoGetResponse(apiHandle,
+ json_object_array_get_idx(currentResponseJ, idx),
+ halDeviceDataToFill);
+ if(ret < 0) {
+ AFB_API_ERROR(apiHandle,
+ "Error %i while handling object %i of array ('%s') when handling info get response",
+ ret,
+ idx,
+ json_object_get_string(currentResponseJ));
+ ret = -3;
+ }
+
+ if(ret)
+ break;
+ }
+ break;
+
+ case json_type_string:
+ if(strcmp(json_object_get_string(currentResponseJ), "sndcard-not-found")) {
+ AFB_API_ERROR(apiHandle,
+ "Unrecognized string '%s' sent back by info get call",
+ json_object_get_string(currentResponseJ));
+ return -4;
+ }
+ break;
+
+ default:
+ AFB_API_ERROR(apiHandle, "Unrecognized info get response format");
+ return -5;
+ }
+
+ return ret;
+}
+
+int InternalHalHandleOneHalDependencies(afb_api_t apiHandle, struct InternalHalProbedDevice **halDeviceToProbe)
+{
+ int ret;
+
+ struct InternalHalProbedDevice *currentDeviceToProbe;
+
+ json_object *probedDeviceGetInfoResponseJ;
+
+ if(! apiHandle || ! halDeviceToProbe || ! *halDeviceToProbe) {
+ AFB_API_ERROR(apiHandle, "Invalid argument(s)");
+ return -1;
+ }
+
+ currentDeviceToProbe = *halDeviceToProbe;
+
+ if(! currentDeviceToProbe->uid ||
+ ! currentDeviceToProbe->requestedDeviceJ) {
+ AFB_API_ERROR(apiHandle, "Specified device to probe is not valid (uid or request is not specified)");
+ return -2;
+ }
+
+ if(! json_object_is_type(currentDeviceToProbe->requestedDeviceJ, json_type_array)) {
+ AFB_API_ERROR(apiHandle, "Device to probe request is not an array");
+ return -3;
+ }
+
+ ret = InternalHalGetCardInfo(apiHandle, json_object_get(currentDeviceToProbe->requestedDeviceJ), &probedDeviceGetInfoResponseJ);
+ if(ret) {
+ AFB_API_ERROR(apiHandle,
+ "Error %i happened when tried to get card information for dependency with uid '%s' (using request : '%s')",
+ ret,
+ currentDeviceToProbe->uid,
+ json_object_get_string(currentDeviceToProbe->requestedDeviceJ));
+ return -4;
+ }
+
+ ret = InternalHalHandleInfoGetResponse(apiHandle, probedDeviceGetInfoResponseJ, &currentDeviceToProbe->deviceData);
+ if(ret < 0) {
+ AFB_API_ERROR(apiHandle,
+ "Error %i happened when tried to handle card get info response for dependency with uid '%s' (using response : '%s')",
+ ret,
+ currentDeviceToProbe->uid,
+ json_object_get_string(probedDeviceGetInfoResponseJ));
+ return -5;
+ }
+
+ if(ret > 0) {
+ AFB_API_WARNING(apiHandle,
+ "Multiple card was found for dependency with uid '%s'(request : '%s', response : '%s')",
+ currentDeviceToProbe->uid,
+ json_object_get_string(currentDeviceToProbe->requestedDeviceJ),
+ json_object_get_string(probedDeviceGetInfoResponseJ));
+ return 1;
+ }
+ else if(! currentDeviceToProbe->deviceData) {
+ AFB_API_INFO(apiHandle,
+ "No card was found for dependency with uid '%s'(request : '%s', response : '%s')",
+ currentDeviceToProbe->uid,
+ json_object_get_string(currentDeviceToProbe->requestedDeviceJ),
+ json_object_get_string(probedDeviceGetInfoResponseJ));
+ return 2;
+ }
+
+ return 0;
+}
+
+int InternalHalHandleAllHalDependencies(afb_api_t apiHandle, struct InternalHalProbedDevice **halDevicesToProbeList)
+{
+ int ret;
+
+ struct InternalHalProbedDevice *halCurrentDeviceToProbe;
+
+ if(! apiHandle || ! halDevicesToProbeList) {
+ AFB_API_ERROR(apiHandle, "Invalid argument(s)");
+ return -1;
+ }
+
+ halCurrentDeviceToProbe = *halDevicesToProbeList;
+ if(! halCurrentDeviceToProbe) {
+ AFB_API_WARNING(apiHandle, "No device to probe in list, 'haldependencies' handling skipped");
+ return 0;
+ }
+
+ while(halCurrentDeviceToProbe) {
+ ret = InternalHalHandleOneHalDependencies(apiHandle, &halCurrentDeviceToProbe);
+ if(ret < 0) {
+ AFB_API_ERROR(apiHandle,
+ "Error %i happened when tried to handle device to probe with uid:'%s' and request:'%s'",
+ ret,
+ halCurrentDeviceToProbe->uid,
+ json_object_get_string(halCurrentDeviceToProbe->requestedDeviceJ));
+ return -2;
+ }
+
+ if(halCurrentDeviceToProbe->deviceClass == MANDATORY_PROBED_DEVICE &&
+ ! halCurrentDeviceToProbe->deviceData) {
+ AFB_API_WARNING(apiHandle,
+ "Mandatory device to probe not found, uid:'%s' and request:'%s'",
+ halCurrentDeviceToProbe->uid,
+ json_object_get_string(halCurrentDeviceToProbe->requestedDeviceJ));
+ return -3;
+ }
+
+ halCurrentDeviceToProbe = halCurrentDeviceToProbe->next;
+ }
+
+ return 0;
+}
+
/*******************************************************************************
* Internals HAL verbs functions *
******************************************************************************/