X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=mm_sound_client.c;h=95e5a251274b8e8ec7fcadd3217e91e77816190b;hb=5669ffe9cf86a1d9915f66eeea75c32b6f479b9b;hp=3cbdf918dc6f76d75801aa6a87bc549c0c0c1388;hpb=dfb5e4dc334843165c987b46d9b7f4c659c6505d;p=platform%2Fcore%2Fmultimedia%2Flibmm-sound.git diff --git a/mm_sound_client.c b/mm_sound_client.c index 3cbdf91..95e5a25 100644 --- a/mm_sound_client.c +++ b/mm_sound_client.c @@ -26,6 +26,7 @@ #include #include #include +#include #include "include/mm_sound.h" #include "include/mm_sound_client.h" @@ -37,6 +38,64 @@ #define CLIENT_HANDLE_MAX 256 #define VOLUME_TYPE_LEN 64 +#define VOLUME_MAX_MULTIMEDIA 16 +#define VOLUME_MAX_BASIC 8 + +#define VCONF_KEY_VOLUME_PREFIX "file/private/sound/volume" +#define VCONF_KEY_VOLUME_TYPE_SYSTEM VCONF_KEY_VOLUME_PREFIX"/system" +#define VCONF_KEY_VOLUME_TYPE_NOTIFICATION VCONF_KEY_VOLUME_PREFIX"/notification" +#define VCONF_KEY_VOLUME_TYPE_ALARM VCONF_KEY_VOLUME_PREFIX"/alarm" +#define VCONF_KEY_VOLUME_TYPE_RINGTONE VCONF_KEY_VOLUME_PREFIX"/ringtone" +#define VCONF_KEY_VOLUME_TYPE_MEDIA VCONF_KEY_VOLUME_PREFIX"/media" +#define VCONF_KEY_VOLUME_TYPE_CALL VCONF_KEY_VOLUME_PREFIX"/call" +#define VCONF_KEY_VOLUME_TYPE_VOIP VCONF_KEY_VOLUME_PREFIX"/voip" +#define VCONF_KEY_VOLUME_TYPE_VOICE VCONF_KEY_VOLUME_PREFIX"/voice" +#define VCONF_KEY_VOLUME_TYPE_ANDROID VCONF_KEY_VOLUME_PREFIX"/fixed" + +#define VCONF_KEY_MUTE_PREFIX "file/private/sound/mute" +#define VCONF_KEY_MUTE_TYPE_SYSTEM VCONF_KEY_MUTE_PREFIX"/system" +#define VCONF_KEY_MUTE_TYPE_NOTIFICATION VCONF_KEY_MUTE_PREFIX"/notification" +#define VCONF_KEY_MUTE_TYPE_ALARM VCONF_KEY_MUTE_PREFIX"/alarm" +#define VCONF_KEY_MUTE_TYPE_RINGTONE VCONF_KEY_MUTE_PREFIX"/ringtone" +#define VCONF_KEY_MUTE_TYPE_MEDIA VCONF_KEY_MUTE_PREFIX"/media" +#define VCONF_KEY_MUTE_TYPE_CALL VCONF_KEY_MUTE_PREFIX"/call" +#define VCONF_KEY_MUTE_TYPE_VOIP VCONF_KEY_MUTE_PREFIX"/voip" +#define VCONF_KEY_MUTE_TYPE_VOICE VCONF_KEY_MUTE_PREFIX"/voice" + +static char *g_volume_vconf[VOLUME_TYPE_MAX] = { + VCONF_KEY_VOLUME_TYPE_SYSTEM, /* VOLUME_TYPE_SYSTEM */ + VCONF_KEY_VOLUME_TYPE_NOTIFICATION, /* VOLUME_TYPE_NOTIFICATION */ + VCONF_KEY_VOLUME_TYPE_ALARM, /* VOLUME_TYPE_ALARM */ + VCONF_KEY_VOLUME_TYPE_RINGTONE, /* VOLUME_TYPE_RINGTONE */ + VCONF_KEY_VOLUME_TYPE_MEDIA, /* VOLUME_TYPE_MEDIA */ + VCONF_KEY_VOLUME_TYPE_CALL, /* VOLUME_TYPE_CALL */ + VCONF_KEY_VOLUME_TYPE_VOIP, /* VOLUME_TYPE_VOIP */ + VCONF_KEY_VOLUME_TYPE_VOICE, /* VOLUME_TYPE_VOICE */ + VCONF_KEY_VOLUME_TYPE_ANDROID /* VOLUME_TYPE_FIXED */ +}; + +static char *g_mute_vconf[] = { + VCONF_KEY_MUTE_TYPE_SYSTEM, /* MUTE_TYPE_SYSTEM */ + VCONF_KEY_MUTE_TYPE_NOTIFICATION, /* MUTE_TYPE_NOTIFICATION */ + VCONF_KEY_MUTE_TYPE_ALARM, /* MUTE_TYPE_ALARM */ + VCONF_KEY_MUTE_TYPE_RINGTONE, /* MUTE_TYPE_RINGTONE */ + VCONF_KEY_MUTE_TYPE_MEDIA, /* MUTE_TYPE_MEDIA */ + VCONF_KEY_MUTE_TYPE_CALL, /* MUTE_TYPE_CALL */ + VCONF_KEY_MUTE_TYPE_VOIP, /* MUTE_TYPE_VOIP */ + VCONF_KEY_MUTE_TYPE_VOICE, /* MUTE_TYPE_VOICE */ +}; + +static char *g_volume_str[VOLUME_TYPE_MAX] = { + "SYSTEM", + "NOTIFICATION", + "ALARM", + "RINGTONE", + "MEDIA", + "CALL", + "VOIP", + "VOICE", + "FIXED", +}; struct callback_data { void *user_cb; @@ -69,6 +128,35 @@ typedef struct _focus_idle_event { int data; } focus_idle_event_t; +static int _validate_volume(volume_type_t type, int level) +{ + if (level < 0) + return -1; + + switch (type) { + case VOLUME_TYPE_CALL: + case VOLUME_TYPE_VOIP: + if (level >= VOLUME_MAX_BASIC) { + return -1; + } + break; + case VOLUME_TYPE_SYSTEM: + case VOLUME_TYPE_MEDIA: + case VOLUME_TYPE_ALARM: + case VOLUME_TYPE_NOTIFICATION: + case VOLUME_TYPE_RINGTONE: + case VOLUME_TYPE_VOICE: + if (level >= VOLUME_MAX_MULTIMEDIA) { + return -1; + } + break; + default: + return -1; + break; + } + return 0; +} + int mm_sound_client_initialize(void) { int ret = MM_ERROR_NONE; @@ -724,24 +812,61 @@ static int __convert_volume_type_to_int(const char *volume_type_str, volume_type return ret; } -int mm_sound_client_set_volume_by_type(const int volume_type, const unsigned int volume_level) +int mm_sound_client_set_volume_by_type(volume_type_t type, const unsigned int level) { int ret = MM_ERROR_NONE; char *type_str = NULL; debug_fenter(); - if ((ret = __convert_volume_type_to_str(volume_type, &type_str)) != MM_ERROR_NONE) { + if (type >= VOLUME_TYPE_MAX) { + debug_error("invalid volume type %d", type); + return MM_ERROR_INVALID_ARGUMENT; + } + + /* Check input param */ + if (0 > _validate_volume(type, (int)level)) { + debug_error("invalid level %u of %s", level, g_volume_str[type]); + return MM_ERROR_INVALID_ARGUMENT; + } + + if ((ret = __convert_volume_type_to_str(type, &type_str)) != MM_ERROR_NONE) { debug_error("volume type convert failed"); goto failed; } - ret = mm_sound_proxy_set_volume_by_type(type_str, volume_level); + ret = mm_sound_proxy_set_volume_by_type(type_str, level); failed: debug_fleave(); return ret; } +int mm_sound_client_get_volume_by_type(volume_type_t type, unsigned int *level) +{ + int ret = MM_ERROR_NONE; + int vconf_value = 0; + + if (level == NULL) { + debug_error("invalid argument, level is null"); + return MM_ERROR_INVALID_ARGUMENT; + } + + if (type >= VOLUME_TYPE_MAX) { + debug_error("invalid volume type %d", type); + return MM_ERROR_INVALID_ARGUMENT; + } + + /* Get volume value from VCONF */ + if (vconf_get_int(g_volume_vconf[type], &vconf_value)) { + debug_error("vconf_get_int(%s) failed..\n", g_volume_vconf[type]); + return MM_ERROR_SOUND_INTERNAL; + } + + *level = vconf_value; + + return ret; +} + static void _mm_sound_volume_changed_callback_wrapper_func(const char *direction, const char *volume_type_str, int volume_level, void *userdata) { @@ -792,6 +917,54 @@ int mm_sound_client_remove_volume_changed_callback(unsigned int subs_id) return ret; } +int mm_sound_client_set_mute_by_type(volume_type_t type, bool mute) +{ + int ret = MM_ERROR_NONE; + char *type_str = NULL; + + debug_fenter(); + + if (type > VOLUME_TYPE_VOICE) { + debug_error("invalid volume type %d", type); + return MM_ERROR_INVALID_ARGUMENT; + } + + if ((ret = __convert_volume_type_to_str(type, &type_str)) != MM_ERROR_NONE) { + debug_error("volume type convert failed"); + goto failed; + } + + ret = mm_sound_proxy_set_mute_by_type(type_str, mute); + +failed: + debug_fleave(); + return ret; +} + +int mm_sound_client_get_mute_by_type(volume_type_t type, bool *muted) +{ + int ret = MM_ERROR_NONE; + int vconf_value = 0; + + debug_fenter(); + + if (type > VOLUME_TYPE_VOICE) { + debug_error("invalid volume type %d", type); + return MM_ERROR_INVALID_ARGUMENT; + } + + /* Get mute state from VCONF */ + if (vconf_get_bool(g_mute_vconf[type], &vconf_value)) { + debug_error("vconf_get_int(%s) failed..\n", g_mute_vconf[type]); + return MM_ERROR_SOUND_INTERNAL; + } + + *muted = (bool)vconf_value; + + debug_fleave(); + return ret; +} + int mm_sound_client_set_filter_by_type(const char *stream_type, const char *filter_name, const char *filter_parameters, const char *filter_group) { int ret = MM_ERROR_NONE;