void apply_individual_ratio(pa_stream_manager *m, pa_object *stream, double volume_linear, pa_cvolume *result) {
bool is_sink_input = false;
double result_linear;
- double individual_ratio;
- double master_ratio;
- double group_ratio;
- double result_ratio;
+ double individual_ratio = 1.0;
+ double master_ratio = 1.0;
+ double group_ratio = 1.0;
+ double result_ratio = 1.0;
pa_volume_t volume;
uint32_t index;
unsigned channels;
individual_ratio, index, result_linear);
/* Here's calculation before calling HAL API */
- if (!(volume_type = pa_proplist_gets(GET_STREAM_PROPLIST(stream, stream_type), PA_PROP_MEDIA_TIZEN_VOLUME_TYPE))) {
- pa_log_error("no volume type");
- return;
- }
role = pa_proplist_gets(GET_STREAM_PROPLIST(stream, stream_type), PA_PROP_MEDIA_ROLE);
stream_direction = is_sink_input ? STREAM_DIRECTION_OUT : STREAM_DIRECTION_IN;
volumes = m->volume_infos;
pa_log_error("could not get volume_info, volume_type[%s]", MASTER_VOLUME_TYPE);
return;
}
- master_ratio = v->is_hal_volume_type ? 1.0 : (double)v->values[stream_direction].current_level / MASTER_VOLUME_LEVEL_MAX;
- if (!(v = pa_hashmap_get(volumes, volume_type))) {
- pa_log_error("could not get volume_info, volume_type[%s]", volume_type);
- return;
+ if (!v->is_hal_volume_type)
+ master_ratio = (double)v->values[stream_direction].current_level / MASTER_VOLUME_LEVEL_MAX;
+
+ /* Update a group ratio only when the volume type exists */
+ if ((volume_type = pa_proplist_gets(GET_STREAM_PROPLIST(stream, stream_type), PA_PROP_MEDIA_TIZEN_VOLUME_TYPE))) {
+ if (!(v = pa_hashmap_get(volumes, volume_type))) {
+ pa_log_error("could not get volume_info, volume_type[%s]", volume_type);
+ return;
+ }
+ if (!v->is_hal_volume_type)
+ group_ratio = (double)v->values[stream_direction].current_level /
+ (pa_idxset_size(v->values[stream_direction].idx_volume_values) - 1);
}
- group_ratio = v->is_hal_volume_type ? 1.0 : (double)v->values[stream_direction].current_level / (pa_idxset_size(v->values[stream_direction].idx_volume_values) - 1);
+
result_ratio = master_ratio * group_ratio * individual_ratio;
pa_log_debug("role(%s), volume_type(%s) : master_ratio(%f), group_ratio(%f), individual_ratio(%f) => result_ratio(%f) to HAL",
role, volume_type, master_ratio, group_ratio, individual_ratio, result_ratio);
if (!(volume_type_str = pa_proplist_gets(GET_STREAM_PROPLIST(s, stream_type), PA_PROP_MEDIA_TIZEN_VOLUME_TYPE))) {
pa_log_debug("idx[%u] doesn't have volume type", idx);
- return -1;
+ goto apply_individual_ratio;
}
/* Check if it is related to HAL volume */
modifier_gain, *modifier_gain_value, volume_linear);
}
+apply_individual_ratio:
if (stream_type == STREAM_SINK_INPUT) {
((pa_sink_input*)s)->individual_volume_ratio = ratio;
apply_individual_ratio(m, s, volume_linear, &cv);