Add AVRCP control volume up / down method
[platform/core/connectivity/bluetooth-frwk.git] / bt-service / bt-service-avrcp-controller.c
old mode 100755 (executable)
new mode 100644 (file)
index dc4f3d5..431bdb1
@@ -85,7 +85,8 @@ static char *__bt_get_control_device_path(void)
 
        BT_DBG("+");
 
-       retv_if(avrcp_control_path != NULL, avrcp_control_path);
+       if (avrcp_control_path != NULL)
+               return avrcp_control_path;
 
        retv_if(!_bt_is_headset_type_connected(BT_AVRCP,
                        connected_address), NULL);
@@ -113,7 +114,9 @@ static int __bt_media_send_control_msg(const char *name)
 
        retv_if(name == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_conn();
+       BT_INFO("Command [%s]", name);
+
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        control_path = __bt_get_control_device_path();
@@ -173,11 +176,23 @@ int _bt_avrcp_control_cmd(int type)
        case PREVIOUS:
                ret = __bt_media_send_control_msg("Previous");
                break;
-       case FAST_FORWARD:
-               ret = __bt_media_send_control_msg("FastForward");
+       case PRESS_FAST_FORWARD:
+               ret = __bt_media_send_control_msg("PressFastForward");
+               break;
+       case RELEASE_FAST_FORWARD:
+               ret = __bt_media_send_control_msg("ReleaseFastForward");
+               break;
+       case PRESS_REWIND:
+               ret = __bt_media_send_control_msg("PressRewind");
+               break;
+       case RELEASE_REWIND:
+               ret = __bt_media_send_control_msg("ReleaseRewind");
+               break;
+       case VOLUME_UP:
+               ret = __bt_media_send_control_msg("VolumeUp");
                break;
-       case REWIND:
-               ret = __bt_media_send_control_msg("Rewind");
+       case VOLUME_DOWN:
+               ret = __bt_media_send_control_msg("VolumeDown");
                break;
        default:
                BT_DBG("Invalid Type\n");
@@ -198,7 +213,7 @@ GDBusProxy *__bt_get_control_properties_proxy(void)
        retv_if(control_path == NULL, NULL);
        BT_DBG("control_path = %s", control_path);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, NULL);
 
        proxy = g_dbus_proxy_new_sync(conn,
@@ -353,6 +368,7 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
        int ret = BLUETOOTH_ERROR_NONE;
        GError *err = NULL;
        GVariant *reply = NULL;
+       GVariant *temp = NULL;
 
        BT_CHECK_PARAMETER(value, return);
 
@@ -360,7 +376,7 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_NOT_CONNECTED);
 
        reply = g_dbus_proxy_call_sync(proxy,
-                                       "Get", g_variant_new("ss", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type)),
+                                       "Get", g_variant_new("(ss)", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type)),
                                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
 
        g_object_unref(proxy);
@@ -379,15 +395,19 @@ int _bt_avrcp_control_get_property(int type, unsigned int *value)
                        case SHUFFLE:
                        case SCAN:
                        case STATUS:
-                               name = (char *)g_variant_get_string(reply, NULL);
-                               *value = __bt_media_attrval_to_val(type, name);
-                               BT_DBG("Type[%s] and Value[%s]", __bt_media_type_to_str(type), name);
+                               name = (char *)g_variant_get_data(reply);
+                               if (name)
+                                       *value = __bt_media_attrval_to_val(type, name);
+                               BT_INFO("Type[%s] and Value[%s]", __bt_media_type_to_str(type), name);
                                break;
                        case POSITION:
-                               *value = g_variant_get_uint32(reply);
+                               g_variant_get(reply, "(v)", &temp);
+                               *value = g_variant_get_uint32(temp);
+                               g_variant_unref(temp);
+                               BT_INFO("Type[%s] and Value[%d]", __bt_media_type_to_str(type), *value);
                                break;
                        default:
-                               BT_DBG("Invalid Type\n");
+                               BT_ERR("Invalid Type [%d]", type);
                                ret =  BLUETOOTH_ERROR_INTERNAL;
                        }
                }
@@ -407,19 +427,19 @@ int _bt_avrcp_control_set_property(int type, unsigned int value)
        switch (type) {
        case EQUALIZER:
                param = g_variant_new("s", equalizer_status[value].property);
-               BT_DBG("equalizer_status %s", equalizer_status[value].property);
+               BT_INFO("equalizer_status %s", equalizer_status[value].property);
                break;
        case REPEAT:
                param = g_variant_new("s", repeat_status[value].property);
-               BT_DBG("repeat_status %s", repeat_status[value].property);
+               BT_INFO("repeat_status %s", repeat_status[value].property);
                break;
        case SHUFFLE:
                param = g_variant_new("s", shuffle_settings[value].property);
-               BT_DBG("shuffle_settings %s", shuffle_settings[value].property);
+               BT_INFO("shuffle_settings %s", shuffle_settings[value].property);
                break;
        case SCAN:
                param = g_variant_new("s", scan_status[value].property);
-               BT_DBG("scan_status %s", scan_status[value].property);
+               BT_INFO("scan_status %s", scan_status[value].property);
                break;
        default:
                BT_ERR("Invalid property type: %d", type);
@@ -431,7 +451,7 @@ int _bt_avrcp_control_set_property(int type, unsigned int value)
        retv_if(proxy == NULL, BLUETOOTH_ERROR_NOT_CONNECTED);
 
        reply = g_dbus_proxy_call_sync(proxy,
-                                       "Set", g_variant_new("ssv", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type), param),
+                                       "Set", g_variant_new("(ssv)", BT_PLAYER_CONTROL_INTERFACE, __bt_media_type_to_str(type), param),
                                        G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
 
        g_object_unref(proxy);
@@ -467,21 +487,22 @@ static int __bt_avrcp_control_parse_properties(
                if (strcasecmp(key, "Title") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->title = value_string;
+                       metadata->title = g_strdup(value_string);
                } else if (strcasecmp(key, "Artist") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->artist = value_string;
+                       metadata->artist = g_strdup(value_string);
                } else if (strcasecmp(key, "Album") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->album = value_string;
+                       metadata->album = g_strdup(value_string);
                } else if (strcasecmp(key, "Genre") == 0) {
                        value_string = (char *)g_variant_get_string(value, NULL);
                        BT_DBG("Value : %s ", value_string);
-                       metadata->genre = value_string;
+                       metadata->genre = g_strdup(value_string);
                } else if (strcasecmp(key, "Duration") == 0) {
                        value_uint = g_variant_get_uint32(value);
+                       BT_DBG("Duration : %d", value_uint);
                        metadata->duration = value_uint;
                } else if (strcasecmp(key, "NumberOfTracks") == 0) {
                        value_uint = g_variant_get_uint32(value);
@@ -521,7 +542,7 @@ int _bt_avrcp_control_get_track_info(media_metadata_attributes_t *metadata)
 
        retv_if(metadata == NULL, BLUETOOTH_ERROR_INTERNAL);
 
-       conn = _bt_get_system_conn();
+       conn = _bt_gdbus_get_system_gconn();
        retv_if(conn == NULL, BLUETOOTH_ERROR_INTERNAL);
 
        control_path = __bt_get_control_device_path();
@@ -592,12 +613,13 @@ void _bt_handle_avrcp_control_event(GVariant *reply, const char *path)
                        (strcasecmp(property, "Scan") == 0) ||
                        (strcasecmp(property, "Status") == 0)) {
                                const char *valstr;
-                               unsigned int type, val;
+                               unsigned int type, val = 0;
 
                                valstr = g_variant_get_string(value, NULL);
                                BT_DBG("Value : %s ", valstr);
                                type = __bt_media_attr_to_type(property);
-                               val = __bt_media_attrval_to_val(type, valstr);
+                               if (valstr)
+                                       val = __bt_media_attrval_to_val(type, valstr);
 
                                /* Send event to application */
                                param = g_variant_new("(u)", val);
@@ -620,11 +642,15 @@ void _bt_handle_avrcp_control_event(GVariant *reply, const char *path)
                        memset(&metadata, 0x00, sizeof(media_metadata_attributes_t));
 
                        ret = __bt_avrcp_control_parse_properties(
-                                                               &metadata, reply);
+                                                               &metadata, value);
                        if (BLUETOOTH_ERROR_NONE != ret) {
                                /* Free key and value because of break unless free not required */
                                free((char *)property);
                                g_variant_unref(value);
+                               g_free((char *)metadata.title);
+                               g_free((char *)metadata.artist);
+                               g_free((char *)metadata.album);
+                               g_free((char *)metadata.genre);
                                break;
                        }