2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "bluetooth-api.h"
21 #include "bluetooth-media-control.h"
22 #include "bt-internal-types.h"
24 #include "bt-common.h"
25 #include "bt-request-sender.h"
26 #include "bt-event-handler.h"
28 BT_EXPORT_API int bluetooth_media_player_init(media_cb_func_ptr callback_ptr,
33 /* Register AVRCP events */
34 ret = _bt_register_event(BT_AVRCP_EVENT , (void *)callback_ptr, user_data);
36 if (ret != BLUETOOTH_ERROR_NONE &&
37 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
38 BT_ERR("Fail to init the event handler");
42 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
44 return BLUETOOTH_ERROR_NONE;
47 BT_EXPORT_API int bluetooth_media_player_deinit(void)
51 ret = _bt_unregister_event(BT_AVRCP_EVENT);
53 if (ret != BLUETOOTH_ERROR_NONE) {
54 BT_ERR("Fail to deinit the event handler");
58 _bt_set_user_data(BT_AVRCP, NULL, NULL);
60 return BLUETOOTH_ERROR_NONE;
63 BT_EXPORT_API int bluetooth_media_player_change_property(
64 media_player_property_type type,
69 BT_CHECK_ENABLED(return);
72 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
74 g_array_append_vals(in_param1, &type, sizeof(int));
75 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
77 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTY,
78 in_param1, in_param2, in_param3, in_param4, &out_param);
80 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
85 BT_EXPORT_API int bluetooth_media_player_set_properties(
86 media_player_settings_t *setting)
90 BT_CHECK_PARAMETER(setting, return);
91 BT_CHECK_ENABLED(return);
94 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
96 g_array_append_vals(in_param1, setting, sizeof(media_player_settings_t));
98 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTIES,
99 in_param1, in_param2, in_param3, in_param4, &out_param);
101 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
106 BT_EXPORT_API int bluetooth_media_player_change_track(
107 media_metadata_attributes_t *metadata)
110 media_metadata_t meta_data;
112 BT_CHECK_PARAMETER(metadata, return);
113 BT_CHECK_ENABLED(return);
116 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
118 memset(&meta_data, 0x00, sizeof(media_metadata_t));
120 if (_bt_copy_utf8_string(meta_data.title, metadata->title, BT_META_DATA_MAX_LEN))
121 BT_ERR("Error in copying Title\n");
122 if (_bt_copy_utf8_string(meta_data.artist, metadata->artist, BT_META_DATA_MAX_LEN))
123 BT_ERR("Error in copying Artist\n");
124 if (_bt_copy_utf8_string(meta_data.album, metadata->album, BT_META_DATA_MAX_LEN))
125 BT_ERR("Error in copying Album\n");
126 if (_bt_copy_utf8_string(meta_data.genre, metadata->genre, BT_META_DATA_MAX_LEN))
127 BT_ERR("Error in copying Genre\n");
129 if (_bt_utf8_validate(meta_data.title) == FALSE)
130 meta_data.title[0] = '\0';
132 if (_bt_utf8_validate(meta_data.artist) == FALSE)
133 meta_data.artist[0] = '\0';
135 if (_bt_utf8_validate(meta_data.album) == FALSE)
136 meta_data.album[0] = '\0';
138 if (_bt_utf8_validate(meta_data.genre) == FALSE)
139 meta_data.genre[0] = '\0';
141 meta_data.total_tracks = metadata->total_tracks;
142 meta_data.number = metadata->number;
143 meta_data.duration = metadata->duration;
145 g_array_append_vals(in_param1, &meta_data, sizeof(media_metadata_t));
147 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_TRACK_INFO,
148 in_param1, in_param2, in_param3, in_param4, &out_param);
150 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
155 BT_EXPORT_API int bluetooth_media_control_init(media_cb_func_ptr callback_ptr,
160 /* Register AVRCP events */
161 ret = _bt_register_event(BT_AVRCP_CONTROL_EVENT,
162 (void *)callback_ptr, user_data);
164 if (ret != BLUETOOTH_ERROR_NONE &&
165 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
166 BT_ERR("Fail to init the event handler");
170 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
172 return BLUETOOTH_ERROR_NONE;
175 BT_EXPORT_API int bluetooth_media_control_deinit(void)
179 ret = _bt_unregister_event(BT_AVRCP_CONTROL_EVENT);
181 if (ret != BLUETOOTH_ERROR_NONE) {
182 BT_ERR("Fail to deinit the event handler");
186 _bt_set_user_data(BT_AVRCP, NULL, NULL);
188 return BLUETOOTH_ERROR_NONE;
191 BT_EXPORT_API int bluetooth_media_control_connect(
192 bluetooth_device_address_t *remote_address)
195 bt_user_info_t *user_info;
197 BT_CHECK_PARAMETER(remote_address, return);
198 BT_CHECK_ENABLED(return);
200 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_CONNECT)
201 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
202 BT_ERR("Don't have a privilege to use this API");
203 return BLUETOOTH_ERROR_PERMISSION_DEINED;
206 user_info = _bt_get_user_data(BT_AVRCP);
207 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
210 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
212 g_array_append_vals(in_param1, remote_address,
213 sizeof(bluetooth_device_address_t));
215 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
216 BT_AVRCP_CONTROL_CONNECT, in_param1,
217 in_param2, in_param3, in_param4,
218 user_info->cb, user_info->user_data);
220 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
225 BT_EXPORT_API int bluetooth_media_control_disconnect(
226 bluetooth_device_address_t *remote_address)
229 bt_user_info_t *user_info;
231 BT_CHECK_PARAMETER(remote_address, return);
232 BT_CHECK_ENABLED(return);
234 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_DISCONNECT)
235 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
236 BT_ERR("Don't have a privilege to use this API");
237 return BLUETOOTH_ERROR_PERMISSION_DEINED;
240 user_info = _bt_get_user_data(BT_AVRCP);
241 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
244 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
246 g_array_append_vals(in_param1, remote_address,
247 sizeof(bluetooth_device_address_t));
249 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
250 BT_AVRCP_CONTROL_DISCONNECT, in_param1,
251 in_param2, in_param3, in_param4,
252 user_info->cb, user_info->user_data);
254 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
259 BT_EXPORT_API int bluetooth_media_control_command(
260 media_player_control_cmd type)
264 BT_CHECK_ENABLED(return);
267 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
269 g_array_append_vals(in_param1, &type, sizeof(int));
271 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_HANDLE_CONTROL,
272 in_param1, in_param2, in_param3, in_param4, &out_param);
274 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
279 BT_EXPORT_API int bluetooth_media_control_set_property(
280 media_player_property_type type,
285 BT_CHECK_ENABLED(return);
288 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
290 g_array_append_vals(in_param1, &type, sizeof(int));
291 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
293 result = _bt_send_request(BT_BLUEZ_SERVICE,
294 BT_AVRCP_CONTROL_SET_PROPERTY,
295 in_param1, in_param2, in_param3,
296 in_param4, &out_param);
298 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
303 BT_EXPORT_API int bluetooth_media_control_get_property(
304 media_player_property_type type,
309 BT_CHECK_PARAMETER(value, return);
310 BT_CHECK_ENABLED(return);
313 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
314 g_array_append_vals(in_param1, &type, sizeof(int));
316 result = _bt_send_request(BT_BLUEZ_SERVICE,
317 BT_AVRCP_CONTROL_GET_PROPERTY,
318 in_param1, in_param2, in_param3,
319 in_param4, &out_param);
321 if (result == BLUETOOTH_ERROR_NONE)
322 *value = g_array_index(out_param, int, 0);
324 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
329 BT_EXPORT_API int bluetooth_media_control_get_track_info(
330 media_metadata_attributes_t *metadata)
333 media_metadata_t meta_data;
335 BT_CHECK_PARAMETER(metadata, return);
336 BT_CHECK_ENABLED(return);
339 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
341 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_GET_TRACK_INFO,
342 in_param1, in_param2, in_param3, in_param4, &out_param);
344 memset(&meta_data, 0x00, sizeof(media_metadata_t));
346 meta_data = g_array_index(out_param, media_metadata_t, 0);
348 metadata->title = g_strdup(meta_data.title);
349 metadata->artist = g_strdup(meta_data.artist);
350 metadata->album = g_strdup(meta_data.album);
351 metadata->genre = g_strdup(meta_data.genre);
352 metadata->total_tracks = meta_data.total_tracks;
353 metadata->number = meta_data.number;
354 metadata->duration = (int64_t) meta_data.duration;
356 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);