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"
27 #ifdef TIZEN_DPM_ENABLE
32 BT_EXPORT_API int bluetooth_media_player_init(media_cb_func_ptr callback_ptr,
37 /* Register AVRCP events */
38 ret = _bt_register_event(BT_AVRCP_EVENT , (void *)callback_ptr, user_data);
40 if (ret != BLUETOOTH_ERROR_NONE &&
41 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
42 BT_ERR("Fail to init the event handler");
46 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
48 return BLUETOOTH_ERROR_NONE;
51 BT_EXPORT_API int bluetooth_media_player_deinit(void)
55 ret = _bt_unregister_event(BT_AVRCP_EVENT);
57 if (ret != BLUETOOTH_ERROR_NONE) {
58 BT_ERR("Fail to deinit the event handler");
62 _bt_set_user_data(BT_AVRCP, NULL, NULL);
64 return BLUETOOTH_ERROR_NONE;
67 BT_EXPORT_API int bluetooth_media_player_change_property(
68 media_player_property_type type,
73 BT_CHECK_ENABLED(return);
75 #ifdef TIZEN_DPM_ENABLE
76 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
77 BT_ERR("Not allow to use AVRCP profile");
78 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
83 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
85 g_array_append_vals(in_param1, &type, sizeof(int));
86 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
88 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTY,
89 in_param1, in_param2, in_param3, in_param4, &out_param);
91 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
96 BT_EXPORT_API int bluetooth_media_player_set_properties(
97 media_player_settings_t *setting)
101 BT_CHECK_PARAMETER(setting, return);
102 BT_CHECK_ENABLED(return);
104 #ifdef TIZEN_DPM_ENABLE
105 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
106 BT_ERR("Not allow to use AVRCP profile");
107 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
112 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
114 g_array_append_vals(in_param1, setting, sizeof(media_player_settings_t));
116 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTIES,
117 in_param1, in_param2, in_param3, in_param4, &out_param);
119 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
124 BT_EXPORT_API int bluetooth_media_player_change_track(
125 media_metadata_attributes_t *metadata)
128 media_metadata_t meta_data;
130 BT_CHECK_PARAMETER(metadata, return);
131 BT_CHECK_ENABLED(return);
133 #ifdef TIZEN_DPM_ENABLE
134 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
135 BT_ERR("Not allow to use AVRCP profile");
136 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
141 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
143 memset(&meta_data, 0x00, sizeof(media_metadata_t));
145 if (_bt_copy_utf8_string(meta_data.title, metadata->title, BT_META_DATA_MAX_LEN))
146 BT_ERR("Error in copying Title\n");
147 if (_bt_copy_utf8_string(meta_data.artist, metadata->artist, BT_META_DATA_MAX_LEN))
148 BT_ERR("Error in copying Artist\n");
149 if (_bt_copy_utf8_string(meta_data.album, metadata->album, BT_META_DATA_MAX_LEN))
150 BT_ERR("Error in copying Album\n");
151 if (_bt_copy_utf8_string(meta_data.genre, metadata->genre, BT_META_DATA_MAX_LEN))
152 BT_ERR("Error in copying Genre\n");
154 if (_bt_utf8_validate(meta_data.title) == FALSE)
155 meta_data.title[0] = '\0';
157 if (_bt_utf8_validate(meta_data.artist) == FALSE)
158 meta_data.artist[0] = '\0';
160 if (_bt_utf8_validate(meta_data.album) == FALSE)
161 meta_data.album[0] = '\0';
163 if (_bt_utf8_validate(meta_data.genre) == FALSE)
164 meta_data.genre[0] = '\0';
166 meta_data.total_tracks = metadata->total_tracks;
167 meta_data.number = metadata->number;
168 meta_data.duration = metadata->duration;
170 g_array_append_vals(in_param1, &meta_data, sizeof(media_metadata_t));
172 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_TRACK_INFO,
173 in_param1, in_param2, in_param3, in_param4, &out_param);
175 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
180 BT_EXPORT_API int bluetooth_media_control_init(media_cb_func_ptr callback_ptr,
185 /* Register AVRCP events */
186 ret = _bt_register_event(BT_AVRCP_CONTROL_EVENT,
187 (void *)callback_ptr, user_data);
189 if (ret != BLUETOOTH_ERROR_NONE &&
190 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
191 BT_ERR("Fail to init the event handler");
195 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
197 return BLUETOOTH_ERROR_NONE;
200 BT_EXPORT_API int bluetooth_media_control_deinit(void)
204 ret = _bt_unregister_event(BT_AVRCP_CONTROL_EVENT);
206 if (ret != BLUETOOTH_ERROR_NONE) {
207 BT_ERR("Fail to deinit the event handler");
211 _bt_set_user_data(BT_AVRCP, NULL, NULL);
213 return BLUETOOTH_ERROR_NONE;
216 BT_EXPORT_API int bluetooth_media_control_connect(
217 bluetooth_device_address_t *remote_address)
220 bt_user_info_t *user_info;
222 BT_CHECK_PARAMETER(remote_address, return);
223 BT_CHECK_ENABLED(return);
225 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_CONNECT)
226 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
227 BT_ERR("Don't have a privilege to use this API");
228 return BLUETOOTH_ERROR_PERMISSION_DEINED;
231 #ifdef TIZEN_DPM_ENABLE
232 if (_bt_check_dpm(BT_DPM_ADDRESS, remote_address) == BT_DPM_RESTRICTED) {
233 BT_ERR("Blacklist device");
234 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
237 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
238 BT_ERR("Not allow to use AVRCP profile");
239 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
243 user_info = _bt_get_user_data(BT_AVRCP);
244 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
247 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
249 g_array_append_vals(in_param1, remote_address,
250 sizeof(bluetooth_device_address_t));
252 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
253 BT_AVRCP_CONTROL_CONNECT, in_param1,
254 in_param2, in_param3, in_param4,
255 user_info->cb, user_info->user_data);
257 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
262 BT_EXPORT_API int bluetooth_media_control_disconnect(
263 bluetooth_device_address_t *remote_address)
266 bt_user_info_t *user_info;
268 BT_CHECK_PARAMETER(remote_address, return);
269 BT_CHECK_ENABLED(return);
271 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_DISCONNECT)
272 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
273 BT_ERR("Don't have a privilege to use this API");
274 return BLUETOOTH_ERROR_PERMISSION_DEINED;
277 user_info = _bt_get_user_data(BT_AVRCP);
278 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
281 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
283 g_array_append_vals(in_param1, remote_address,
284 sizeof(bluetooth_device_address_t));
286 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
287 BT_AVRCP_CONTROL_DISCONNECT, in_param1,
288 in_param2, in_param3, in_param4,
289 user_info->cb, user_info->user_data);
291 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
296 BT_EXPORT_API int bluetooth_media_control_command(
297 media_player_control_cmd type)
301 BT_CHECK_ENABLED(return);
303 #ifdef TIZEN_DPM_ENABLE
304 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
305 BT_ERR("Not allow to use AVRCP profile");
306 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
311 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
313 g_array_append_vals(in_param1, &type, sizeof(int));
315 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_HANDLE_CONTROL,
316 in_param1, in_param2, in_param3, in_param4, &out_param);
318 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
323 BT_EXPORT_API int bluetooth_media_control_set_property(
324 media_player_property_type type,
329 BT_CHECK_ENABLED(return);
331 #ifdef TIZEN_DPM_ENABLE
332 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
333 BT_ERR("Not allow to use AVRCP profile");
334 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
339 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
341 g_array_append_vals(in_param1, &type, sizeof(int));
342 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
344 result = _bt_send_request(BT_BLUEZ_SERVICE,
345 BT_AVRCP_CONTROL_SET_PROPERTY,
346 in_param1, in_param2, in_param3,
347 in_param4, &out_param);
349 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
354 BT_EXPORT_API int bluetooth_media_control_get_property(
355 media_player_property_type type,
360 BT_CHECK_PARAMETER(value, return);
361 BT_CHECK_ENABLED(return);
363 #ifdef TIZEN_DPM_ENABLE
364 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
365 BT_ERR("Not allow to use AVRCP profile");
366 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
371 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
372 g_array_append_vals(in_param1, &type, sizeof(int));
374 result = _bt_send_request(BT_BLUEZ_SERVICE,
375 BT_AVRCP_CONTROL_GET_PROPERTY,
376 in_param1, in_param2, in_param3,
377 in_param4, &out_param);
379 if (result == BLUETOOTH_ERROR_NONE)
380 *value = g_array_index(out_param, int, 0);
382 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
387 BT_EXPORT_API int bluetooth_media_control_get_track_info(
388 media_metadata_attributes_t *metadata)
391 media_metadata_t meta_data;
393 BT_CHECK_PARAMETER(metadata, return);
394 BT_CHECK_ENABLED(return);
396 #ifdef TIZEN_DPM_ENABLE
397 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
398 BT_ERR("Not allow to use AVRCP profile");
399 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
404 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
406 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_GET_TRACK_INFO,
407 in_param1, in_param2, in_param3, in_param4, &out_param);
409 memset(&meta_data, 0x00, sizeof(media_metadata_t));
411 meta_data = g_array_index(out_param, media_metadata_t, 0);
413 metadata->title = g_strdup(meta_data.title);
414 metadata->artist = g_strdup(meta_data.artist);
415 metadata->album = g_strdup(meta_data.album);
416 metadata->genre = g_strdup(meta_data.genre);
417 metadata->total_tracks = meta_data.total_tracks;
418 metadata->number = meta_data.number;
419 metadata->duration = (int64_t) meta_data.duration;
421 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);