Add support for mute API set
[platform/core/multimedia/libmm-sound.git] / mm_sound_client.c
index 3cbdf91..95e5a25 100644 (file)
@@ -26,6 +26,7 @@
 #include <glib.h>
 #include <mm_error.h>
 #include <mm_debug.h>
+#include <vconf.h>
 
 #include "include/mm_sound.h"
 #include "include/mm_sound_client.h"
 
 #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;