Fixed AVRCP controller reply pending request
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / audio / avrcp / bt-service-avrcp-ctrl.c
index e7222cc..7a43fad 100644 (file)
@@ -135,50 +135,120 @@ int _bt_avrcp_control_cmd(int type)
 
        connected = _bt_is_headset_type_connected(BT_AVRCP, connected_address);
 
-       if (connected) {
-               _bt_convert_addr_string_to_type(device_address.addr,
-                               connected_address);
-               switch (type) {
-               case RC_PASS_CMD_PLAY:
-                       status = avrcp_ct_play((bt_address_t*)&device_address);
-                       break;
-               case RC_PASS_CMD_PAUSE:
-                       status = avrcp_ct_pause((bt_address_t*)&device_address);
-                       break;
-               case RC_PASS_CMD_STOP:
-                       status = avrcp_ct_stop((bt_address_t*)&device_address);
-                       break;
-               case RC_PASS_CMD_NEXT:
-                       status = avrcp_ct_next_track((bt_address_t*)&device_address);
-                       break;
-               case RC_PASS_CMD_PREVIOUS:
-                       status = avrcp_ct_prev_track((bt_address_t*)&device_address);
-                       break;
-               case RC_PASS_CMD_PRESS_FAST_FORWARD:
-                       status = avrcp_ct_fforward((bt_address_t*)&device_address, PRESS_STATE);
-                       break;
-               case RC_PASS_CMD_RELEASE_FAST_FORWARD:
-                       status = avrcp_ct_fforward((bt_address_t*)&device_address, RELEASE_STATE);
-                       break;
-               case RC_PASS_CMD_PRESS_REWIND:
-                       status = avrcp_ct_rewind((bt_address_t*)&device_address, PRESS_STATE);
-                       break;
-               case RC_PASS_CMD_RELEASE_REWIND:
-                       status = avrcp_ct_rewind((bt_address_t*)&device_address, RELEASE_STATE);
-                       break;
-               default:
-                       break;
-               }
+       if (!connected) {
+               BT_ERR("Device is not connected:");
+               return BLUETOOTH_ERROR_NOT_CONNECTED;
+       }
 
-               if (status != OAL_STATUS_SUCCESS) {
-                       BT_ERR("Send pass through command err: [%d]", status);
-                       result = BLUETOOTH_ERROR_INTERNAL;
-               }
-       } else {
+       _bt_convert_addr_string_to_type(device_address.addr,
+                       connected_address);
+       switch (type) {
+       case RC_PASS_CMD_PLAY:
+               status = avrcp_ct_play((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_PAUSE:
+               status = avrcp_ct_pause((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_STOP:
+               status = avrcp_ct_stop((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_NEXT:
+               status = avrcp_ct_next_track((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_PREVIOUS:
+               status = avrcp_ct_prev_track((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_PRESS_FAST_FORWARD:
+               status = avrcp_ct_fforward((bt_address_t*)&device_address, PRESS_STATE);
+               break;
+       case RC_PASS_CMD_RELEASE_FAST_FORWARD:
+               status = avrcp_ct_fforward((bt_address_t*)&device_address, RELEASE_STATE);
+               break;
+       case RC_PASS_CMD_PRESS_REWIND:
+               status = avrcp_ct_rewind((bt_address_t*)&device_address, PRESS_STATE);
+               break;
+       case RC_PASS_CMD_RELEASE_REWIND:
+               status = avrcp_ct_rewind((bt_address_t*)&device_address, RELEASE_STATE);
+               break;
+       case RC_PASS_CMD_VOLUME_UP:
+               status = avrcp_ct_volume_up((bt_address_t*)&device_address);
+               break;
+       case RC_PASS_CMD_VOLUME_DOWN:
+               status = avrcp_ct_volume_down((bt_address_t*)&device_address);
+               break;
+       default:
+               break;
+       }
+
+       if (status != OAL_STATUS_SUCCESS) {
+               BT_ERR("Send pass through command err: [%d]", status);
+               result = BLUETOOTH_ERROR_INTERNAL;
+       }
+
+       return result;
+}
+
+int _bt_avrcp_control_cmd_to_dest(int type, bluetooth_device_address_t *device_address)
+{
+       char connected_address[BT_ADDRESS_STRING_SIZE + 1];
+       gboolean connected;
+       oal_status_t status = OAL_STATUS_SUCCESS;
+       int result = BLUETOOTH_ERROR_NONE;
+       BT_INFO("+");
+
+       _bt_convert_addr_type_to_string(connected_address, device_address->addr);
+
+       connected = _bt_is_headset_address_type_connected(BT_AVRCP,
+                                                               (const char *)connected_address);
+
+       if (!connected) {
                BT_ERR("Device is not connected:");
                return BLUETOOTH_ERROR_NOT_CONNECTED;
        }
 
+       switch (type) {
+       case RC_PASS_CMD_PLAY:
+               status = avrcp_ct_play((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_PAUSE:
+               status = avrcp_ct_pause((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_STOP:
+               status = avrcp_ct_stop((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_NEXT:
+               status = avrcp_ct_next_track((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_PREVIOUS:
+               status = avrcp_ct_prev_track((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_PRESS_FAST_FORWARD:
+               status = avrcp_ct_fforward((bt_address_t*)device_address, PRESS_STATE);
+               break;
+       case RC_PASS_CMD_RELEASE_FAST_FORWARD:
+               status = avrcp_ct_fforward((bt_address_t*)device_address, RELEASE_STATE);
+               break;
+       case RC_PASS_CMD_PRESS_REWIND:
+               status = avrcp_ct_rewind((bt_address_t*)device_address, PRESS_STATE);
+               break;
+       case RC_PASS_CMD_RELEASE_REWIND:
+               status = avrcp_ct_rewind((bt_address_t*)device_address, RELEASE_STATE);
+               break;
+       case RC_PASS_CMD_VOLUME_UP:
+               status = avrcp_ct_volume_up((bt_address_t*)device_address);
+               break;
+       case RC_PASS_CMD_VOLUME_DOWN:
+               status = avrcp_ct_volume_down((bt_address_t*)device_address);
+               break;
+       default:
+               break;
+       }
+
+       if (status != OAL_STATUS_SUCCESS) {
+               BT_ERR("Send pass through command err: [%d]", status);
+               result = BLUETOOTH_ERROR_INTERNAL;
+       }
+
        return result;
 }
 
@@ -407,13 +477,13 @@ static void __bt_avrcp_ct_reply_pending_requests(void)
                case BT_AVRCP_GET_TRACK_INFO:
                case BT_AVRCP_CONTROL_GET_PROPERTY: {
                        _bt_service_method_return(req_info->context, out_param, result);
+                       _bt_free_info_from_invocation_list(req_info);
+                       g_array_free(out_param, TRUE);
                        break;
                }
                default:
                        break;
                }
-               _bt_free_info_from_invocation_list(req_info);
-               g_array_free(out_param, TRUE);
        }
        BT_INFO("-");
 }
@@ -490,21 +560,34 @@ static void __bt_handle_avrcp_track_info_changed(event_avrcp_ct_media_info_t* me
        unsigned int total_track = 0;
        unsigned int track_number = 0;
        unsigned int playing_time = 0;
+       GVariant *title;
+       GVariant *artist;
+       GVariant *album;
+       GVariant *genre;
 
        BT_INFO("+");
 
        total_track = (unsigned int)(metadata->total_track);
        track_number = (unsigned int)(metadata->track_number);
        playing_time = (unsigned int)(metadata->playing_time);
+
+       title = g_variant_new_from_data((const GVariantType *)"ay",
+                       metadata->title_info, MEDIA_ATTIRBUTE_STRING_LENGTH,
+                       TRUE, NULL, NULL);
+       artist = g_variant_new_from_data((const GVariantType *)"ay",
+                       metadata->artist_info, MEDIA_ATTIRBUTE_STRING_LENGTH,
+                       TRUE, NULL, NULL);
+       album = g_variant_new_from_data((const GVariantType *)"ay",
+                       metadata->album_info, MEDIA_ATTIRBUTE_STRING_LENGTH,
+                       TRUE, NULL, NULL);
+       genre = g_variant_new_from_data((const GVariantType *)"ay",
+                       metadata->genre_info, MEDIA_ATTIRBUTE_STRING_LENGTH,
+                       TRUE, NULL, NULL);
+
        /* Send AVRCP Target player track info changed event to application*/
-       param = g_variant_new("(ssssuuu)",
-                       metadata->title_info,
-                       metadata->artist_info,
-                       metadata->album_info,
-                       metadata->genre_info,
-                       total_track,
-                       track_number,
-                       playing_time);
+       param = g_variant_new("(@ay@ay@ay@ayuuu)",
+                       title, artist, album, genre,
+                       total_track, track_number, playing_time);
 
        BT_INFO("Total_track: %u, track_number: %u, playing_time: %u",
                        total_track, track_number, playing_time);