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"
29 BT_EXPORT_API int bluetooth_media_player_init(media_cb_func_ptr callback_ptr,
34 /* Register AVRCP events */
35 ret = _bt_register_event(BT_AVRCP_EVENT , (void *)callback_ptr, user_data);
37 if (ret != BLUETOOTH_ERROR_NONE &&
38 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
39 BT_ERR("Fail to init the event handler");
43 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
45 return BLUETOOTH_ERROR_NONE;
48 BT_EXPORT_API int bluetooth_media_player_deinit(void)
52 ret = _bt_unregister_event(BT_AVRCP_EVENT);
54 if (ret != BLUETOOTH_ERROR_NONE) {
55 BT_ERR("Fail to deinit the event handler");
59 _bt_set_user_data(BT_AVRCP, NULL, NULL);
61 return BLUETOOTH_ERROR_NONE;
64 BT_EXPORT_API int bluetooth_media_player_change_property(
65 media_player_property_type type,
70 BT_CHECK_ENABLED(return);
72 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
73 BT_ERR("Not allow to use AVRCP profile");
74 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
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);
99 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
100 BT_ERR("Not allow to use AVRCP profile");
101 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
105 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
107 g_array_append_vals(in_param1, setting, sizeof(media_player_settings_t));
109 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_PROPERTIES,
110 in_param1, in_param2, in_param3, in_param4, &out_param);
112 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
117 BT_EXPORT_API int bluetooth_media_player_change_track(
118 media_metadata_attributes_t *metadata)
121 media_metadata_t meta_data;
123 BT_CHECK_PARAMETER(metadata, return);
124 BT_CHECK_ENABLED(return);
126 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
127 BT_ERR("Not allow to use AVRCP profile");
128 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
132 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
134 memset(&meta_data, 0x00, sizeof(media_metadata_t));
136 if (_bt_copy_utf8_string(meta_data.title, metadata->title, BT_META_DATA_MAX_LEN))
137 BT_ERR("Error in copying Title\n");
138 if (_bt_copy_utf8_string(meta_data.artist, metadata->artist, BT_META_DATA_MAX_LEN))
139 BT_ERR("Error in copying Artist\n");
140 if (_bt_copy_utf8_string(meta_data.album, metadata->album, BT_META_DATA_MAX_LEN))
141 BT_ERR("Error in copying Album\n");
142 if (_bt_copy_utf8_string(meta_data.genre, metadata->genre, BT_META_DATA_MAX_LEN))
143 BT_ERR("Error in copying Genre\n");
145 if (_bt_utf8_validate(meta_data.title) == FALSE)
146 meta_data.title[0] = '\0';
148 if (_bt_utf8_validate(meta_data.artist) == FALSE)
149 meta_data.artist[0] = '\0';
151 if (_bt_utf8_validate(meta_data.album) == FALSE)
152 meta_data.album[0] = '\0';
154 if (_bt_utf8_validate(meta_data.genre) == FALSE)
155 meta_data.genre[0] = '\0';
157 meta_data.total_tracks = metadata->total_tracks;
158 meta_data.number = metadata->number;
159 meta_data.duration = metadata->duration;
161 g_array_append_vals(in_param1, &meta_data, sizeof(media_metadata_t));
163 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_SET_TRACK_INFO,
164 in_param1, in_param2, in_param3, in_param4, &out_param);
166 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
171 BT_EXPORT_API int bluetooth_media_control_init(media_cb_func_ptr callback_ptr,
176 /* Register AVRCP events */
177 ret = _bt_register_event(BT_AVRCP_CONTROL_EVENT,
178 (void *)callback_ptr, user_data);
180 if (ret != BLUETOOTH_ERROR_NONE &&
181 ret != BLUETOOTH_ERROR_ALREADY_INITIALIZED) {
182 BT_ERR("Fail to init the event handler");
186 _bt_set_user_data(BT_AVRCP, (void *)callback_ptr, user_data);
188 return BLUETOOTH_ERROR_NONE;
191 BT_EXPORT_API int bluetooth_media_control_deinit(void)
195 ret = _bt_unregister_event(BT_AVRCP_CONTROL_EVENT);
197 if (ret != BLUETOOTH_ERROR_NONE) {
198 BT_ERR("Fail to deinit the event handler");
202 _bt_set_user_data(BT_AVRCP, NULL, NULL);
204 return BLUETOOTH_ERROR_NONE;
207 BT_EXPORT_API int bluetooth_media_control_connect(
208 bluetooth_device_address_t *remote_address)
211 bt_user_info_t *user_info;
213 BT_CHECK_PARAMETER(remote_address, return);
214 BT_CHECK_ENABLED(return);
216 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_CONNECT)
217 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
218 BT_ERR("Don't have a privilege to use this API");
219 return BLUETOOTH_ERROR_PERMISSION_DEINED;
222 if (_bt_check_dpm(BT_DPM_ADDRESS, remote_address) == BT_DPM_RESTRICTED) {
223 BT_ERR("Blacklist device");
224 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
227 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
228 BT_ERR("Not allow to use AVRCP profile");
229 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
232 user_info = _bt_get_user_data(BT_AVRCP);
233 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
236 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
238 g_array_append_vals(in_param1, remote_address,
239 sizeof(bluetooth_device_address_t));
241 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
242 BT_AVRCP_CONTROL_CONNECT, in_param1,
243 in_param2, in_param3, in_param4,
244 user_info->cb, user_info->user_data);
246 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
251 BT_EXPORT_API int bluetooth_media_control_disconnect(
252 bluetooth_device_address_t *remote_address)
255 bt_user_info_t *user_info;
257 BT_CHECK_PARAMETER(remote_address, return);
258 BT_CHECK_ENABLED(return);
260 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_CONTROL_DISCONNECT)
261 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
262 BT_ERR("Don't have a privilege to use this API");
263 return BLUETOOTH_ERROR_PERMISSION_DEINED;
266 user_info = _bt_get_user_data(BT_AVRCP);
267 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
270 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
272 g_array_append_vals(in_param1, remote_address,
273 sizeof(bluetooth_device_address_t));
275 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
276 BT_AVRCP_CONTROL_DISCONNECT, in_param1,
277 in_param2, in_param3, in_param4,
278 user_info->cb, user_info->user_data);
280 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
285 BT_EXPORT_API int bluetooth_media_target_connect(
286 bluetooth_device_address_t *remote_address)
289 bt_user_info_t *user_info;
291 BT_CHECK_PARAMETER(remote_address, return);
292 BT_CHECK_ENABLED(return);
294 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_TARGET_CONNECT)
295 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
296 BT_ERR("Don't have a privilege to use this API");
297 return BLUETOOTH_ERROR_PERMISSION_DEINED;
300 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
301 BT_ERR("Not allow to use AVRCP profile");
302 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
305 user_info = _bt_get_user_data(BT_AVRCP);
306 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
309 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
311 g_array_append_vals(in_param1, remote_address,
312 sizeof(bluetooth_device_address_t));
314 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
315 BT_AVRCP_TARGET_CONNECT, in_param1,
316 in_param2, in_param3, in_param4,
317 user_info->cb, user_info->user_data);
319 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
324 BT_EXPORT_API int bluetooth_media_target_disconnect(
325 bluetooth_device_address_t *remote_address)
328 bt_user_info_t *user_info;
330 BT_CHECK_PARAMETER(remote_address, return);
331 BT_CHECK_ENABLED(return);
333 if (_bt_check_privilege(BT_CHECK_PRIVILEGE, BT_AVRCP_TARGET_DISCONNECT)
334 == BLUETOOTH_ERROR_PERMISSION_DEINED) {
335 BT_ERR("Don't have a privilege to use this API");
336 return BLUETOOTH_ERROR_PERMISSION_DEINED;
339 user_info = _bt_get_user_data(BT_AVRCP);
340 retv_if(user_info->cb == NULL, BLUETOOTH_ERROR_INTERNAL);
343 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
345 g_array_append_vals(in_param1, remote_address,
346 sizeof(bluetooth_device_address_t));
348 result = _bt_send_request_async(BT_BLUEZ_SERVICE,
349 BT_AVRCP_TARGET_DISCONNECT, in_param1,
350 in_param2, in_param3, in_param4,
351 user_info->cb, user_info->user_data);
353 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
358 BT_EXPORT_API int bluetooth_media_control_command(
359 media_player_control_cmd type)
363 BT_CHECK_ENABLED(return);
365 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
366 BT_ERR("Not allow to use AVRCP profile");
367 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
371 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
373 g_array_append_vals(in_param1, &type, sizeof(int));
375 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_HANDLE_CONTROL,
376 in_param1, in_param2, in_param3, in_param4, &out_param);
378 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
383 BT_EXPORT_API int bluetooth_media_control_command_to_dest(
384 media_player_control_cmd type,
385 bluetooth_device_address_t *remote_address)
389 BT_CHECK_ENABLED(return);
391 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
392 BT_ERR("Not allow to use AVRCP profile");
393 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
397 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
399 g_array_append_vals(in_param1, &type, sizeof(int));
400 g_array_append_vals(in_param2, remote_address,
401 sizeof(bluetooth_device_address_t));
403 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_HANDLE_CONTROL_TO_DEST,
404 in_param1, in_param2, in_param3, in_param4, &out_param);
406 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
411 BT_EXPORT_API int bluetooth_media_control_set_property(
412 media_player_property_type type,
417 BT_CHECK_ENABLED(return);
419 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
420 BT_ERR("Not allow to use AVRCP profile");
421 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
425 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
427 g_array_append_vals(in_param1, &type, sizeof(int));
428 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
430 result = _bt_send_request(BT_BLUEZ_SERVICE,
431 BT_AVRCP_CONTROL_SET_PROPERTY,
432 in_param1, in_param2, in_param3,
433 in_param4, &out_param);
435 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
440 BT_EXPORT_API int bluetooth_media_control_get_property(
441 media_player_property_type type,
446 BT_CHECK_PARAMETER(value, return);
447 BT_CHECK_ENABLED(return);
449 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
450 BT_ERR("Not allow to use AVRCP profile");
451 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
455 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
456 g_array_append_vals(in_param1, &type, sizeof(int));
458 result = _bt_send_request(BT_BLUEZ_SERVICE,
459 BT_AVRCP_CONTROL_GET_PROPERTY,
460 in_param1, in_param2, in_param3,
461 in_param4, &out_param);
463 if (result == BLUETOOTH_ERROR_NONE)
464 *value = g_array_index(out_param, int, 0);
466 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
471 BT_EXPORT_API int bluetooth_media_transport_set_property(
472 media_transport_property_type type,
477 BT_CHECK_ENABLED(return);
479 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
480 BT_ERR("Not allow to use AVRCP profile");
481 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
485 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
487 g_array_append_vals(in_param1, &type, sizeof(int));
488 g_array_append_vals(in_param2, &value, sizeof(unsigned int));
490 result = _bt_send_request(BT_BLUEZ_SERVICE,
491 BT_AVRCP_TRANSPORT_SET_PROPERTY,
492 in_param1, in_param2, in_param3,
493 in_param4, &out_param);
495 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
500 BT_EXPORT_API int bluetooth_media_control_get_track_info(
501 media_metadata_attributes_t *metadata)
504 media_metadata_t *meta_data;
506 BT_CHECK_PARAMETER(metadata, return);
507 BT_CHECK_ENABLED(return);
509 if (_bt_check_dpm(BT_DPM_AVRCP, NULL) == BT_DPM_RESTRICTED) {
510 BT_ERR("Not allow to use AVRCP profile");
511 return BLUETOOTH_ERROR_DEVICE_POLICY_RESTRICTION;
515 BT_ALLOC_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);
517 result = _bt_send_request(BT_BLUEZ_SERVICE, BT_AVRCP_GET_TRACK_INFO,
518 in_param1, in_param2, in_param3, in_param4, &out_param);
520 meta_data = &g_array_index(out_param, media_metadata_t, 0);
522 metadata->title = g_strdup(meta_data->title);
523 metadata->artist = g_strdup(meta_data->artist);
524 metadata->album = g_strdup(meta_data->album);
525 metadata->genre = g_strdup(meta_data->genre);
526 metadata->total_tracks = meta_data->total_tracks;
527 metadata->number = meta_data->number;
528 metadata->duration = (int64_t) meta_data->duration;
530 BT_FREE_PARAMS(in_param1, in_param2, in_param3, in_param4, out_param);