#endif
static void __mmradio_volume_changed_cb(volume_type_t type, unsigned int volume, void *user_data);
-static int __mmradio_set_total_volume(mm_radio_t *radio);
+static int __mmradio_set_media_volume(mm_radio_t *radio, unsigned int level);
int _mmradio_apply_region(mm_radio_t *radio, MMRadioRegionType region, bool update)
{
if (ret != MM_ERROR_NONE)
MMRADIO_LOG_WARNING("failed to get MEDIA_VOLUME");
- MMRADIO_VOLUME_LOCK(radio);
- radio->media_volume = volume;
- MMRADIO_VOLUME_UNLOCK(radio);
-
- ret = __mmradio_set_total_volume(radio);
- if (ret == MM_ERROR_NOT_SUPPORT_API) {
- MMRADIO_LOG_WARNING("radio_hal_set_volume is not supported");
- } else if (ret) {
- MMRADIO_LOG_ERROR("failed to radio_hal_set_volume\n");
+ ret = __mmradio_set_media_volume(radio, volume);
+ if (ret != MM_ERROR_NONE) {
+ MMRADIO_LOG_ERROR("failed to media volume");
goto error1;
}
}
#endif
-static int __mmradio_set_total_volume(mm_radio_t *radio)
-{
- int ret = MM_ERROR_NONE;
- float total_volume = 0.0f;
-
- MMRADIO_CHECK_INSTANCE(radio);
-
- MMRADIO_VOLUME_LOCK(radio);
- if (radio->max_media_volume != 0)
- total_volume = ((float)radio->media_volume / (float)radio->max_media_volume) * radio->local_volume;
- else
- MMRADIO_LOG_WARNING("max media voulme is zero");
-
- ret = radio_hal_set_volume(radio->hal_inf, total_volume);
- if (ret != MM_ERROR_NONE)
- MMRADIO_LOG_ERROR("radio_hal_set_volume error");
-
- MMRADIO_VOLUME_UNLOCK(radio);
- return ret;
-
-}
-
static void __mmradio_volume_changed_cb(volume_type_t type, unsigned int volume, void *user_data)
{
mm_radio_t *radio = (mm_radio_t *)user_data;
+ int ret = MM_ERROR_NONE;
MMRADIO_CHECK_INSTANCE_RETURN_VOID(radio);
if (type == VOLUME_TYPE_MEDIA) {
MMRADIO_LOG_DEBUG("Change FM Radio volume to %d", volume);
- MMRADIO_VOLUME_LOCK(radio);
- radio->media_volume = volume;
- MMRADIO_VOLUME_UNLOCK(radio);
- __mmradio_set_total_volume(radio);
+ ret = __mmradio_set_media_volume(radio, volume);
+ if (ret != MM_ERROR_NONE)
+ MMRADIO_LOG_ERROR("__mmradio_set_media_volume error");
+ return;
}
}
radio->local_volume = volume;
MMRADIO_VOLUME_UNLOCK(radio);
- ret = __mmradio_set_total_volume(radio);
+ ret = radio_hal_set_volume(radio->hal_inf, volume);
+ if (ret != MM_ERROR_NONE)
+ MMRADIO_LOG_ERROR("radio_hal_set_volume error");
MMRADIO_LOG_FLEAVE();
- return ret;
+ return ret;
}
int _mmradio_get_volume(mm_radio_t *radio, float *pVolume)
{
int ret = MM_ERROR_NONE;
- float total_volume = 0.0;
float volume = 0.0;
MMRADIO_LOG_FENTER();
return_val_if_fail(pVolume, MM_ERROR_INVALID_ARGUMENT);
- ret = radio_hal_get_volume(radio->hal_inf, &total_volume);
+ ret = radio_hal_get_volume(radio->hal_inf, &volume);
if (ret != MM_ERROR_NONE) {
MMRADIO_LOG_ERROR("radio_hal_get_volume error");
*pVolume = 0;
}
MMRADIO_VOLUME_LOCK(radio);
+ radio->local_volume = volume;
+ *pVolume = (float)radio->local_volume;
+ MMRADIO_VOLUME_UNLOCK(radio);
- if (radio->media_volume)
- volume = total_volume * ((float)radio->max_media_volume / (float)radio->media_volume);
+ MMRADIO_LOG_FLEAVE();
- MMRADIO_LOG_DEBUG("total_volume = %f, max_media_volue = %d, media_volume = %d, volume = %f",
- total_volume, radio->max_media_volume, radio->media_volume, volume);
+ return ret;
+}
- /* update volume in handle */
- if (fabs(radio->local_volume - volume) >= FLT_EPSILON)
- radio->local_volume = volume;
+static int __mmradio_set_media_volume(mm_radio_t *radio, unsigned int level)
+{
+ int ret = MM_ERROR_NONE;
- *pVolume = (float)radio->local_volume;
+ MMRADIO_LOG_FENTER();
+
+ MMRADIO_CHECK_INSTANCE(radio);
+ MMRADIO_CHECK_STATE_RETURN_IF_FAIL(radio, MMRADIO_COMMAND_SET_VOLUME);
+
+ MMRADIO_LOG_DEBUG("Setting %d volume\n", level);
+
+ MMRADIO_VOLUME_LOCK(radio);
+ radio->media_volume = level;
MMRADIO_VOLUME_UNLOCK(radio);
+ ret = radio_hal_set_media_volume(radio->hal_inf, level);
+ if (ret != MM_ERROR_NONE)
+ MMRADIO_LOG_ERROR("radio_hal_set_media_volume error");
+
MMRADIO_LOG_FLEAVE();
return ret;
h->intf.get_signal_strength = dlsym(h->dl_handle, "radio_get_signal_strength");
h->intf.get_volume = dlsym(h->dl_handle, "radio_get_volume");
h->intf.set_volume = dlsym(h->dl_handle, "radio_set_volume");
+ h->intf.set_media_volume = dlsym(h->dl_handle, "radio_set_media_volume");
if (h->intf.init == NULL || h->intf.deinit == NULL) {
MMRADIO_LOG_ERROR("could not get mandatory funtion");
}
} else {
MMRADIO_LOG_ERROR("open radio hal_interface failed : %s", dlerror());
- return MM_ERROR_RADIO_INTERNAL;
+ ret = MM_ERROR_RADIO_INTERNAL;
+ goto FAIL;
}
*handle = h;
}
+int radio_hal_set_media_volume(mm_radio_hal_interface *radio_handle, uint32_t level)
+{
+ radio_error_t ret = RADIO_ERROR_NONE;
+ MMRADIO_CHECK_ARG(radio_handle);
+ if (radio_handle->intf.set_media_volume) {
+ ret = radio_handle->intf.set_media_volume(radio_handle->rh_handle, level);
+ if (ret != RADIO_ERROR_NONE)
+ return __convert_error_code(ret, (char *)__FUNCTION__);
+ } else {
+ MMRADIO_LOG_WARNING("radio_hal set_media_volume is NULL");
+ return MM_ERROR_NOT_SUPPORT_API;
+ }
+ return MM_ERROR_NONE;
+}
#ifdef __cplusplus
}