diff options
Diffstat (limited to 'HAL-afb/HAL-interface/hal-volramp.c')
-rw-r--r-- | HAL-afb/HAL-interface/hal-volramp.c | 161 |
1 files changed, 90 insertions, 71 deletions
diff --git a/HAL-afb/HAL-interface/hal-volramp.c b/HAL-afb/HAL-interface/hal-volramp.c index 6343a06..eb39aae 100644 --- a/HAL-afb/HAL-interface/hal-volramp.c +++ b/HAL-afb/HAL-interface/hal-volramp.c @@ -19,26 +19,26 @@ #define _GNU_SOURCE // needed for vasprintf #include "hal-interface.h" -STATIC int RampTimerCB (sd_event_source* source,uint64_t timer, void* handle) { - halVolRampT *volRamp= (halVolRampT*)handle; - int err; - uint64_t usec; +STATIC int RampTimerCB(sd_event_source* source, uint64_t timer, void* handle) { + halVolRampT *volRamp = (halVolRampT*) handle; + int err; + uint64_t usec; // RampDown if (volRamp->current > volRamp->target) { - volRamp->current = volRamp->current - volRamp->stepDown; - if (volRamp->current < volRamp->target) volRamp->current = volRamp->target; + volRamp->current = volRamp->current - volRamp->stepDown; + if (volRamp->current < volRamp->target) volRamp->current = volRamp->target; } - + // RampUp if (volRamp->current < volRamp->target) { - volRamp->current = volRamp->current + volRamp->stepUp; - if (volRamp->current > volRamp->target) volRamp->current = volRamp->target; + volRamp->current = volRamp->current + volRamp->stepUp; + if (volRamp->current > volRamp->target) volRamp->current = volRamp->target; } - + // request current Volume Level err = halSetCtlByTag(volRamp->slave, volRamp->current); - if (err) goto OnErrorExit; + if (err) goto OnErrorExit; // we reach target stop volram event if (volRamp->current == volRamp->target) sd_event_source_unref(source); @@ -46,121 +46,140 @@ STATIC int RampTimerCB (sd_event_source* source,uint64_t timer, void* handle) { // otherwise validate timer for a new run sd_event_now(afb_daemon_get_event_loop(), CLOCK_MONOTONIC, &usec); sd_event_source_set_enabled(source, SD_EVENT_ONESHOT); - err=sd_event_source_set_time(source, usec+volRamp->delay); + err = sd_event_source_set_time(source, usec + volRamp->delay); } return 0; - - OnErrorExit: - AFB_WARNING ("RampTimerCB Fail to set HAL ctl tag=%d vol=%d", Master_Playback_Volume, volRamp->current); + +OnErrorExit: + AFB_WARNING("RampTimerCB Fail to set HAL ctl tag=%d vol=%d", Master_Playback_Volume, volRamp->current); sd_event_source_unref(source); // abandon VolRamp return -1; } -/* UCS2 Interface Timer Callback */ STATIC void SetRampTimer(void *handle) { - halVolRampT *volRamp= (halVolRampT*)handle; - - uint64_t usec; - /* set a timer with 250ms accuracy */ - sd_event_now(afb_daemon_get_event_loop(), CLOCK_MONOTONIC, &usec); - sd_event_add_time(afb_daemon_get_event_loop(), &volRamp->evtsrc, CLOCK_MONOTONIC, usec, 250, RampTimerCB, volRamp); + halVolRampT *volRamp = (halVolRampT*) handle; + uint64_t usec; + + // set a timer with ~250us accuracy + sd_event_now(afb_daemon_get_event_loop(), CLOCK_MONOTONIC, &usec); + sd_event_add_time(afb_daemon_get_event_loop(), &volRamp->evtsrc, CLOCK_MONOTONIC, usec, 250, RampTimerCB, volRamp); } -STATIC int volumeDoRamp (halVolRampT *volRamp, int numid, json_object *volumeJ) { +STATIC int volumeDoRamp(halVolRampT *volRamp, int numid, json_object *volumeJ) { json_object *responseJ; - + // request current Volume Level responseJ = halGetCtlByTag(volRamp->slave); if (!responseJ) { - AFB_WARNING ("volumeDoRamp Fail to get HAL ctl tag=%d", Master_Playback_Volume); + AFB_WARNING("volumeDoRamp Fail to get HAL ctl tag=%d", Master_Playback_Volume); goto OnErrorExit; - } - + } + // use 1st volume value as target for ramping switch (json_object_get_type(volumeJ)) { case json_type_array: - volRamp->target=json_object_get_int(json_object_array_get_idx(volumeJ,0)); + volRamp->target = json_object_get_int(json_object_array_get_idx(volumeJ, 0)); break; - + case json_type_int: - volRamp->target=json_object_get_int(volumeJ); + volRamp->target = json_object_get_int(volumeJ); break; - + default: - AFB_WARNING ("volumeDoRamp Invalid volumeJ=%s", json_object_get_string(volumeJ)); + AFB_WARNING("volumeDoRamp Invalid volumeJ=%s", json_object_get_string(volumeJ)); goto OnErrorExit; } - + // use 1st volume value as current for ramping switch (json_object_get_type(responseJ)) { case json_type_array: - volRamp->current=json_object_get_int(json_object_array_get_idx(responseJ,0)); + volRamp->current = json_object_get_int(json_object_array_get_idx(responseJ, 0)); break; - + case json_type_int: - volRamp->current=json_object_get_int(responseJ); + volRamp->current = json_object_get_int(responseJ); break; - + default: - AFB_WARNING ("volumeDoRamp Invalid reponseJ=%s", json_object_get_string(responseJ)); + AFB_WARNING("volumeDoRamp Invalid reponseJ=%s", json_object_get_string(responseJ)); goto OnErrorExit; } - - SetRampTimer (volRamp); - + + SetRampTimer(volRamp); + return 0; - OnErrorExit: +OnErrorExit: return -1; } - -PUBLIC void volumeRamp (halCtlsEnumT halTag, alsaHalCtlMapT *ctl, void* handle, json_object *valJ) { +PUBLIC void volumeRamp(halCtlsTagT halTag, alsaHalCtlMapT *ctl, void* handle, json_object *valJ) { halVolRampT *volRamp = (halVolRampT*) handle; json_object *tmpJ; - if (json_object_get_type(valJ) != json_type_array || volRamp==NULL) goto OnErrorExit; - + if (json_object_get_type(valJ) != json_type_array || volRamp == NULL) goto OnErrorExit; + switch (halTag) { - case Vol_Ramp: - tmpJ = json_object_array_get_idx(valJ, 0); - volumeDoRamp (volRamp, ctl->numid, tmpJ); + + // Only config use wellknown tag. Default is DoVolRamp + default: + tmpJ = json_object_array_get_idx(valJ, 0); + volumeDoRamp(volRamp, ctl->numid, tmpJ); break; - + case Vol_Ramp_Set_Mode: - tmpJ = json_object_array_get_idx(valJ, 0); - volRamp->mode = json_object_get_int (tmpJ); + tmpJ = json_object_array_get_idx(valJ, 0); + volRamp->mode = json_object_get_int(tmpJ); + switch (volRamp->mode) { + + case RAMP_VOL_SMOOTH: + volRamp->delay = 100 * 1000; + volRamp->stepDown = 1; + volRamp->stepUp = 1; + break; + + case RAMP_VOL_NORMAL: + volRamp->delay = 100 * 1000; + volRamp->stepDown = 3; + volRamp->stepUp = 2; + break; + + case RAMP_VOL_EMERGENCY: + volRamp->delay = 50 * 1000; + volRamp->stepDown = 6; + volRamp->stepUp = 2; + break; + + default: + goto OnErrorExit; + } break; - + case Vol_Ramp_Set_Slave: - tmpJ = json_object_array_get_idx(valJ, 0); - volRamp->slave = json_object_get_int (tmpJ); + tmpJ = json_object_array_get_idx(valJ, 0); + volRamp->slave = json_object_get_int(tmpJ); break; - + case Vol_Ramp_Set_Delay: - tmpJ = json_object_array_get_idx(valJ, 0); - volRamp->delay = 1000*json_object_get_int (tmpJ); + tmpJ = json_object_array_get_idx(valJ, 0); + volRamp->delay = 1000 * json_object_get_int(tmpJ); break; case Vol_Ramp_Set_Down: - tmpJ = json_object_array_get_idx(valJ, 0); - volRamp->stepDown = json_object_get_int (tmpJ); + tmpJ = json_object_array_get_idx(valJ, 0); + volRamp->stepDown = json_object_get_int(tmpJ); break; case Vol_Ramp_Set_Up: - tmpJ = json_object_array_get_idx(valJ, 0); - volRamp->stepUp = json_object_get_int (tmpJ); + tmpJ = json_object_array_get_idx(valJ, 0); + volRamp->stepUp = json_object_get_int(tmpJ); break; - - default: - goto OnErrorExit; } - + + return; + +OnErrorExit: + AFB_WARNING("volumeRamp: Invalid Ctrl Event halCtlsTagT=%d numid=%d name=%s value=%s", halTag, ctl->numid, ctl->name, json_object_get_string(valJ)); return; - - OnErrorExit: - AFB_WARNING ("Invalid Ctrl Event halCtlsEnumT=%d numid=%d name=%s value=%s", halTag, ctl->numid, ctl->name, json_object_get_string(valJ)); - return; } -
\ No newline at end of file |