PA_CORE_HOOK_SAMPLE_CACHE_NEW,
PA_CORE_HOOK_SAMPLE_CACHE_CHANGED,
PA_CORE_HOOK_SAMPLE_CACHE_UNLINK,
+#ifdef __TIZEN__
+ PA_CORE_HOOK_SINK_INPUT_RAMP_FINISH,
+#endif
PA_CORE_HOOK_MAX
} pa_core_hook_t;
if (ramp->ramps[i].target == PA_VOLUME_NORM) {
vol[i] = 1.0;
}
+ ramp->finished = true;
} else {
vol[i] = ramp->ramps[i].curr = calc_volume_ramp_table[ramp->ramps[i].type] (&ramp->ramps[i]);
ramp->ramps[i].left--;
dst->ramps[j].end = dst->ramps[i].end;
}
+ dst->finished = false;
+
return dst;
}
typedef struct pa_cvolume_ramp_int {
uint8_t channels;
pa_volume_ramp_int ramps[PA_CHANNELS_MAX];
+ bool finished;
} pa_cvolume_ramp_int;
pa_cvolume_ramp_int* pa_cvolume_ramp_convert(const pa_cvolume_ramp *src, pa_cvolume_ramp_int *dst, int sample_rate);
void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink bytes */, pa_memchunk *chunk, pa_cvolume *volume) {
bool do_volume_adj_here, need_volume_factor_sink;
bool volume_is_norm;
+#ifdef TIZEN_VOLUME_RAMP
+ bool prev_ramp_finished = false;
+#endif
size_t block_size_max_sink, block_size_max_sink_input;
size_t ilength;
size_t ilength_full;
#ifdef TIZEN_VOLUME_RAMP
check_and_apply_silence(i);
+
+ prev_ramp_finished = i->thread_info.ramp.finished;
#endif
if (!i->thread_info.resampler) {
#ifdef TIZEN_PCM_DUMP
pa_sink_input_write_pcm_dump(i, chunk);
#endif
+#ifdef TIZEN_VOLUME_RAMP
+ /* Hook fire only if ramp is finished. Note that it does not mean all the ramped data
+ * is written to the device, hence it needs to be improved later on. */
+ if (!prev_ramp_finished && i->thread_info.ramp.finished) {
+ pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_RAMP_FINISH], i);
+ i->thread_info.ramp.finished = false;
+ }
+#endif
}
/* Called from thread context */