4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Hocheol Seo <hocheol.seo@samsung.com>
7 * Girishashok Joshi <girish.joshi@samsung.com>
8 * Chanyeol Park <chanyeol.park@samsung.com>
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
14 * http://www.apache.org/licenses/LICENSE-2.0
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
26 #include "bluetooth-api.h"
27 #include "bluetooth-media-control.h"
28 #include "bt-internal-types.h"
30 #include "bt-common.h"
31 #include "bt-request-sender.h"
32 #include "bt-event-handler.h"
34 BT_EXPORT_API int bluetooth_media_player_init(media_cb_func_ptr callback_ptr,
39 /* Register AVRCP events */
40 ret = _bt_register_event(BT_AVRCP_EVENT , (void *)callback_ptr, user_data);
42 if (ret != BLUETOOTH_ERROR_NONE &&
43 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
44 BT_ERR("Fail to init the event handler");
48 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
50 return BLUETOOTH_ERROR_NONE;
53 BT_EXPORT_API int bluetooth_media_player_deinit(void)
57 ret = _bt_unregister_event(BT_AVRCP_EVENT);
59 if (ret != BLUETOOTH_ERROR_NONE) {
60 BT_ERR("Fail to deinit the event handler");
64 _bt_set_user_data(BT_AVRCP, NULL, NULL);
66 return BLUETOOTH_ERROR_NONE;
69 BT_EXPORT_API int bluetooth_media_player_change_property(
70 media_player_property_type type,
75 BT_CHECK_ENABLED(return);
78 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
80 g_array_append_vals(in_param1, &type, sizeof(int));
81 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
83 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTY,
84 in_param1, in_param2, in_param3, in_param4, &out_param);
86 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
91 BT_EXPORT_API int bluetooth_media_player_set_properties(
92 media_player_settings_t *setting)
96 BT_CHECK_PARAMETER(setting, return);
97 BT_CHECK_ENABLED(return);
100 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
102 g_array_append_vals(in_param1, setting, sizeof(media_player_settings_t));
104 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTIES,
105 in_param1, in_param2, in_param3, in_param4, &out_param);
107 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
112 BT_EXPORT_API int bluetooth_media_player_change_track(
113 media_metadata_attributes_t *metadata)
116 media_metadata_t meta_data;
118 BT_CHECK_PARAMETER(metadata, return);
119 BT_CHECK_ENABLED(return);
122 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
124 memset(&meta_data, 0x00, sizeof(media_metadata_t));
126 if (_bt_copy_utf8_string(meta_data.title, metadata->title, BT_META_DATA_MAX_LEN))
127 BT_ERR("Error in copying Title\n");
128 if (_bt_copy_utf8_string(meta_data.artist, metadata->artist, BT_META_DATA_MAX_LEN))
129 BT_ERR("Error in copying Artist\n");
130 if (_bt_copy_utf8_string(meta_data.album, metadata->album, BT_META_DATA_MAX_LEN))
131 BT_ERR("Error in copying Album\n");
132 if (_bt_copy_utf8_string(meta_data.genre, metadata->genre, BT_META_DATA_MAX_LEN))
133 BT_ERR("Error in copying Genre\n");
135 if (_bt_utf8_validate(meta_data.title) == FALSE)
136 meta_data.title[0] = '\0';
138 if (_bt_utf8_validate(meta_data.artist) == FALSE)
139 meta_data.artist[0] = '\0';
141 if (_bt_utf8_validate(meta_data.album) == FALSE)
142 meta_data.album[0] = '\0';
144 if (_bt_utf8_validate(meta_data.genre) == FALSE)
145 meta_data.genre[0] = '\0';
147 meta_data.total_tracks = metadata->total_tracks;
148 meta_data.number = metadata->number;
149 meta_data.duration = metadata->duration;
151 g_array_append_vals(in_param1, &meta_data, sizeof(media_metadata_t));
153 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_TRACK_INFO,
154 in_param1, in_param2, in_param3, in_param4, &out_param);
156 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
161 BT_EXPORT_API int bluetooth_media_control_init(media_cb_func_ptr callback_ptr,
166 /* Register AVRCP events */
167 ret = _bt_register_event(BT_AVRCP_CONTROL_EVENT,
168 (void *)callback_ptr, user_data);
170 if (ret != BLUETOOTH_ERROR_NONE &&
171 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
172 BT_ERR("Fail to init the event handler");
176 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
178 return BLUETOOTH_ERROR_NONE;
181 BT_EXPORT_API int bluetooth_media_control_deinit(void)
185 ret = _bt_unregister_event(BT_AVRCP_CONTROL_EVENT);
187 if (ret != BLUETOOTH_ERROR_NONE) {
188 BT_ERR("Fail to deinit the event handler");
192 _bt_set_user_data(BT_AVRCP, NULL, NULL);
194 return BLUETOOTH_ERROR_NONE;
197 BT_EXPORT_API int bluetooth_media_control_connect(
198 bluetooth_device_address_t *remote_address)
201 bt_user_info_t *user_info;
203 BT_CHECK_PARAMETER(remote_address, return);
204 BT_CHECK_ENABLED(return);
206 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_CONNECT)
207 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
208 BT_ERR("Don't have a privilege to use this API");
209 return BLUETOOTH_ERROR_PERMISSION_DEINED;
212 user_info = _bt_get_user_data(BT_AVRCP);
213 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
216 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
218 g_array_append_vals(in_param1, remote_address,
219 sizeof(bluetooth_device_address_t));
221 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
222 BT_AVRCP_CONTROL_CONNECT, in_param1,
223 in_param2, in_param3, in_param4,
224 user_info->cb, user_info->user_data);
226 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
231 BT_EXPORT_API int bluetooth_media_control_disconnect(
232 bluetooth_device_address_t *remote_address)
235 bt_user_info_t *user_info;
237 BT_CHECK_PARAMETER(remote_address, return);
238 BT_CHECK_ENABLED(return);
240 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_DISCONNECT)
241 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
242 BT_ERR("Don't have a privilege to use this API");
243 return BLUETOOTH_ERROR_PERMISSION_DEINED;
246 user_info = _bt_get_user_data(BT_AVRCP);
247 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
250 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
252 g_array_append_vals(in_param1, remote_address,
253 sizeof(bluetooth_device_address_t));
255 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
256 BT_AVRCP_CONTROL_DISCONNECT, in_param1,
257 in_param2, in_param3, in_param4,
258 user_info->cb, user_info->user_data);
260 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
265 BT_EXPORT_API int bluetooth_media_control_command(
266 media_player_control_cmd type)
270 BT_CHECK_ENABLED(return);
273 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
275 g_array_append_vals(in_param1, &type, sizeof(int));
277 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_HANDLE_CONTROL,
278 in_param1, in_param2, in_param3, in_param4, &out_param);
280 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
285 BT_EXPORT_API int bluetooth_media_control_set_property(
286 media_player_property_type type,
291 BT_CHECK_ENABLED(return);
294 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
296 g_array_append_vals(in_param1, &type, sizeof(int));
297 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
299 result = _bt_send_request(BT_BLUEZ_SERVICE,
300 BT_AVRCP_CONTROL_SET_PROPERTY,
301 in_param1, in_param2, in_param3,
302 in_param4, &out_param);
304 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
309 BT_EXPORT_API int bluetooth_media_control_get_property(
310 media_player_property_type type,
315 BT_CHECK_PARAMETER(value, return);
316 BT_CHECK_ENABLED(return);
319 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
320 g_array_append_vals(in_param1, &type, sizeof(int));
322 result = _bt_send_request(BT_BLUEZ_SERVICE,
323 BT_AVRCP_CONTROL_GET_PROPERTY,
324 in_param1, in_param2, in_param3,
325 in_param4, &out_param);
327 if (result == BLUETOOTH_ERROR_NONE)
328 *value = g_array_index(out_param, int, 0);
330 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
335 BT_EXPORT_API int bluetooth_media_control_get_track_info(
336 media_metadata_attributes_t *metadata)
339 media_metadata_t meta_data;
341 BT_CHECK_PARAMETER(metadata, return);
342 BT_CHECK_ENABLED(return);
345 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
347 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_GET_TRACK_INFO,
348 in_param1, in_param2, in_param3, in_param4, &out_param);
350 memset(&meta_data, 0x00, sizeof(media_metadata_t));
352 meta_data = g_array_index(out_param, media_metadata_t, 0);
354 metadata->title = g_strdup(meta_data.title);
355 metadata->artist = g_strdup(meta_data.artist);
356 metadata->album = g_strdup(meta_data.album);
357 metadata->genre = g_strdup(meta_data.genre);
358 metadata->total_tracks = meta_data.total_tracks;
359 metadata->number = meta_data.number;
360 metadata->duration = (int64_t) meta_data.duration;
362 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);