aboutsummaryrefslogtreecommitdiffstats
path: root/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
diff options
context:
space:
mode:
Diffstat (limited to '4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c')
-rw-r--r--4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c223
1 files changed, 165 insertions, 58 deletions
diff --git a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c b/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
index f66c7ca..18c4113 100644
--- a/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
+++ b/4a-hal/4a-hal-controllers/4a-hal-controllers-value-handler.c
@@ -60,31 +60,152 @@ int HalCtlsConvertPercentageToValue(int percentage, int min, int max)
* Convert json object from percentage to value *
******************************************************************************/
-int HalCtlsNormalizeJsonValues(AFB_ApiT apiHandle, struct CtlHalAlsaCtlProperties *alsaCtlProperties, json_object *toConvertJ, json_object **ConvertedJ)
+int HalCtlsConvertJsonValueForIntegerControl(AFB_ApiT apiHandle,
+ struct CtlHalAlsaCtlProperties *alsaCtlProperties,
+ json_object *toConvertJ,
+ json_object **ConvertedJ,
+ enum ConversionType requestedConversion)
{
- int err = 0, idx, count, initialValue, convertedValue;
+ int initialValue, convertedValue;
- json_type toConvertType;
- json_object *toConvertObjectJ, *convertedValueJ, *convertedArrayJ;
+ if(! json_object_is_type(toConvertJ, json_type_int)) {
+ AFB_ApiError(apiHandle,
+ "Can't convert json value, unrecognized json format (must be an integer) : '%s'",
+ json_object_get_string(toConvertJ));
+ return -1;
+ }
- toConvertType = json_object_get_type(toConvertJ);
- switch(toConvertType) {
- case json_type_array:
- count = (int) json_object_array_length(toConvertJ);
+ initialValue = json_object_get_int(toConvertJ);
+
+ switch(requestedConversion) {
+ case CONVERSION_NORMALIZED_TO_ALSACORE:
+ if(initialValue < 0 || initialValue > 100) {
+ AFB_ApiError(apiHandle,
+ "Cannot convert '%i' value, value should be between 0 and 100 ('%s')",
+ initialValue,
+ json_object_get_string(toConvertJ));
+ return -2;
+ }
+
+ convertedValue = HalCtlsConvertPercentageToValue(initialValue,
+ alsaCtlProperties->minval,
+ alsaCtlProperties->maxval);
+
+ if(convertedValue == -INT_MAX) {
+ AFB_ApiError(apiHandle,
+ "Didn't succeed to convert %i (using min %i et max %i)",
+ initialValue,
+ alsaCtlProperties->minval,
+ alsaCtlProperties->maxval);
+ return -3;
+ }
+
+ if(alsaCtlProperties->step) {
+ // Round value to the nearest step
+ convertedValue = (int) round((double) convertedValue / (double) alsaCtlProperties->step);
+ convertedValue *= alsaCtlProperties->step;
+ }
break;
- case json_type_null:
- case json_type_object:
- count = 0;
- AFB_ApiWarning(apiHandle, "Can't normalize json values :\n-- %s", json_object_get_string(toConvertJ));
- *ConvertedJ = json_object_get(toConvertJ);
- return -1;
+ case CONVERSION_ALSACORE_TO_NORMALIZED:
+ convertedValue = HalCtlsConvertValueToPercentage(initialValue,
+ alsaCtlProperties->minval,
+ alsaCtlProperties->maxval);
+
+ if(convertedValue == -INT_MAX) {
+ AFB_ApiError(apiHandle,
+ "Didn't succeed to convert %i (using min %i et max %i)",
+ initialValue,
+ alsaCtlProperties->minval,
+ alsaCtlProperties->maxval);
+ return -4;
+ }
+
+ break;
+
+ default:
+ AFB_ApiError(apiHandle,
+ "Can't convert '%i' value, unrecognized conversion type : '%i'",
+ initialValue,
+ (int) requestedConversion);
+ *ConvertedJ = NULL;
+ return -5;
+ }
+
+ *ConvertedJ = json_object_new_int(convertedValue);
+
+ return 0;
+}
+
+int HalCtlsConvertJsonValueForBooleanControl(AFB_ApiT apiHandle,
+ struct CtlHalAlsaCtlProperties *alsaCtlProperties,
+ json_object *toConvertJ,
+ json_object **ConvertedJ,
+ enum ConversionType requestedConversion)
+{
+ int initialValue;
+
+ switch(json_object_get_type(toConvertJ)) {
+ case json_type_int:
+ initialValue = json_object_get_int(toConvertJ);
+ break;
+
+ case json_type_boolean:
+ initialValue = json_object_get_boolean(toConvertJ);
+ break;
default:
- count = 1;
+ AFB_ApiError(apiHandle,
+ "Can't convert json value, unrecognized format (must be an integer or a boolean) : '%s'",
+ json_object_get_string(toConvertJ));
+ return -1;
+ }
+
+ if(initialValue < 0 || initialValue > 1) {
+ AFB_ApiError(apiHandle,
+ "Cannot convert '%i' value, value should be 0 or 1 ('%s')",
+ initialValue,
+ json_object_get_string(toConvertJ));
+ return -2;
+ }
+
+ switch(requestedConversion) {
+ case CONVERSION_NORMALIZED_TO_ALSACORE:
+ *ConvertedJ = json_object_new_int(initialValue);
break;
+
+ case CONVERSION_ALSACORE_TO_NORMALIZED:
+ *ConvertedJ = json_object_new_boolean(initialValue);
+ break;
+
+ default:
+ AFB_ApiError(apiHandle,
+ "Can't convert '%i' value, unrecognized conversion type : '%i'",
+ initialValue,
+ (int) requestedConversion);
+ *ConvertedJ = NULL;
+ return -3;
}
+ return 0;
+}
+
+int HalCtlsConvertJsonValues(AFB_ApiT apiHandle,
+ struct CtlHalAlsaCtlProperties *alsaCtlProperties,
+ json_object *toConvertJ,
+ json_object **ConvertedJ,
+ enum ConversionType requestedConversion)
+{
+ int conversionError = 0, idx, count;
+
+ json_type toConvertType;
+ json_object *toConvertObjectJ, *convertedValueJ, *convertedArrayJ;
+
+ *ConvertedJ = NULL;
+
+ toConvertType = json_object_get_type(toConvertJ);
+ count = (toConvertType == json_type_array) ? (int) json_object_array_length(toConvertJ) : 1;
+
convertedArrayJ = json_object_new_array();
for(idx = 0; idx < count; idx++) {
@@ -96,57 +217,43 @@ int HalCtlsNormalizeJsonValues(AFB_ApiT apiHandle, struct CtlHalAlsaCtlPropertie
switch(alsaCtlProperties->type) {
case SND_CTL_ELEM_TYPE_INTEGER:
case SND_CTL_ELEM_TYPE_INTEGER64:
- if(! json_object_is_type(toConvertObjectJ, json_type_int)) {
- err += -10*idx;
- AFB_ApiWarning(apiHandle,
- "Try normalize an integer control but value sent in json is not an integer : '%s'",
- json_object_get_string(toConvertObjectJ));
- convertedValueJ = toConvertObjectJ;
- break;
+ if((conversionError = HalCtlsConvertJsonValueForIntegerControl(apiHandle,
+ alsaCtlProperties,
+ toConvertObjectJ,
+ &convertedValueJ,
+ requestedConversion))) {
+ AFB_ApiError(apiHandle,
+ "Error %i happened in when trying to convert index %i for integer control ('%s')",
+ conversionError,
+ idx,
+ json_object_get_string(toConvertObjectJ));
+ json_object_put(convertedArrayJ);
+ return -(idx + 1);
}
-
- initialValue = json_object_get_int(toConvertObjectJ);
- convertedValue = HalCtlsConvertPercentageToValue(initialValue, alsaCtlProperties->minval, alsaCtlProperties->maxval);
- if(convertedValue == -INT_MAX) {
- AFB_ApiWarning(apiHandle,
- "Can't normalize %i (using min %i et max %i), value set to 0",
- initialValue,
- alsaCtlProperties->minval,
- alsaCtlProperties->maxval);
- convertedValue = 0;
- }
-
- if(alsaCtlProperties->step) {
- // Round value to the nearest step
- convertedValue = (int) round((double) convertedValue / (double) alsaCtlProperties->step);
- convertedValue *= alsaCtlProperties->step;
- }
-
- convertedValueJ = json_object_new_int(convertedValue);
break;
case SND_CTL_ELEM_TYPE_BOOLEAN:
- if(! (json_object_is_type(toConvertObjectJ, json_type_int) ||
- json_object_is_type(toConvertObjectJ, json_type_boolean))) {
- err += -1000*idx;
- AFB_ApiWarning(apiHandle,
- "Try normalize a boolean control but value sent in json is not a boolean/integer : '%s'",
- json_object_get_string(toConvertObjectJ));
- convertedValueJ = toConvertObjectJ;
- break;
+ if((conversionError = HalCtlsConvertJsonValueForBooleanControl(apiHandle,
+ alsaCtlProperties,
+ toConvertObjectJ,
+ &convertedValueJ,
+ requestedConversion))) {
+ AFB_ApiError(apiHandle,
+ "Error %i happened in when trying to convert index %i for boolean control ('%s')",
+ conversionError,
+ idx,
+ json_object_get_string(toConvertObjectJ));
+ json_object_put(convertedArrayJ);
+ return -(idx + 1);
}
-
- initialValue = json_object_get_int(toConvertObjectJ);
- convertedValueJ = json_object_new_int(initialValue ? 1 : 0);
break;
default:
- AFB_ApiWarning(apiHandle,
- "Normalization not handle for the alsa control type %i, sending back the object as it was '%s'",
- (int) alsaCtlProperties->type,
- json_object_get_string(toConvertJ));
- convertedValueJ = toConvertObjectJ;
- break;
+ AFB_ApiError(apiHandle,
+ "Conversion not handle for the alsa control type %i",
+ (int) alsaCtlProperties->type);
+ json_object_put(convertedArrayJ);
+ return -(idx + 1);
}
json_object_array_put_idx(convertedArrayJ, idx, convertedValueJ);