2 * Open Adaptation Layer (OAL)
4 * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd.
6 * Contact: Nilesh Trimbake <t.shripati@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <sys/socket.h>
25 #include <sys/errno.h>
31 #include <bluetooth.h>
34 #include "oal-internal.h"
35 #include "oal-avrcp-ct.h"
36 #include "oal-utils.h"
37 #include "oal-common.h"
39 #define CHECK_OAL_AVRCP_CTRL_ENABLED() \
41 if (avrcp_ct_interface == NULL) { \
42 BT_ERR("OAL, Audio Not Enabled"); \
43 return OAL_STATUS_NOT_READY; \
47 #define NO_OF_ATTRIBUTE 1
51 long int playing_time;
52 uint8_t title_info[BTRC_MAX_ATTR_STR_LEN];
53 uint8_t artist_info[BTRC_MAX_ATTR_STR_LEN];
54 uint8_t album_info[BTRC_MAX_ATTR_STR_LEN];
55 uint8_t genre_info[BTRC_MAX_ATTR_STR_LEN];
57 uint32_t track_number;
58 } avrcp_ct_track_info_t;
63 btrc_player_repeat_val_t repeat;
64 btrc_player_shuffle_val_t shuffle;
66 btrc_play_status_t status;
68 } avrcp_ct_player_settings_t;
71 char address[BT_ADDRESS_STR_LEN];
72 avrcp_ct_player_settings_t player_setting;
73 avrcp_ct_track_info_t track_info;
74 } avrcp_ct_player_info_t;
76 static GSList *player_list = NULL;
78 const btrc_ctrl_interface_t * _bt_get_stack_interface(void);
79 static const btrc_ctrl_interface_t *avrcp_ct_interface = NULL;
81 static void cb_avrcp_ct_connection_state(bool rc_connect, bool bt_connect, bt_bdaddr_t* bd_addr);
82 static void cb_avrcp_ct_btrc_playerapplicationsetting_changed(bt_bdaddr_t *bd_addr, btrc_player_settings_t *p_vals);
83 static void cb_avrcp_ct_btrc_play_position_changed(bt_bdaddr_t *bd_addr, uint32_t song_len, uint32_t song_pos);
84 static void cb_avrcp_ct_btrc_play_status_changed(bt_bdaddr_t *bd_addr, btrc_play_status_t play_status);
85 static void cb_avrcp_ct_trak_info_chnaged(bt_bdaddr_t *bd_address, uint8_t num_attr, btrc_element_attr_val_t *p_attrs);
86 static void cb_avrcp_ct_btrc_passthrough_rsp(bt_bdaddr_t *bd_addr, int id, int key_state);
87 static void cb_avrcp_ct_btrc_setplayerapplicationsetting_rsp(bt_bdaddr_t *bd_addr, uint8_t accepted);
89 /** AVRCP Controller callback structure. */
90 static btrc_ctrl_callbacks_t avrcp_ct_cb = {
91 /** set to sizeof(BtRcCallbacks) */
93 cb_avrcp_ct_btrc_passthrough_rsp,
94 NULL, //cb_avrcp_ct_btrc_groupnavigation_rsp,
95 cb_avrcp_ct_connection_state,
96 NULL,/*btrc_ct_getrcfeatures_callback*/
97 cb_avrcp_ct_btrc_setplayerapplicationsetting_rsp,
98 NULL, /*btrc_ct_playerapplicationsetting_callback*/
99 cb_avrcp_ct_btrc_playerapplicationsetting_changed,
100 NULL, /*btrc_ct_setabsvol_cmd_callback*/
101 NULL, /*btrc_ct_registernotification_abs_vol_callback*/
102 cb_avrcp_ct_trak_info_chnaged,
103 cb_avrcp_ct_btrc_play_position_changed,
104 cb_avrcp_ct_btrc_play_status_changed,
105 NULL, /*btrc_ct_get_folder_items_callback*/
106 NULL, /*btrc_ct_change_path_callback*/
107 NULL, /*btrc_ct_set_browsed_player_callback*/
108 NULL /*btrc_ct_set_addressed_player_callback*/
111 static void __add_device_to_avrcp_list(bt_address_t *address)
113 avrcp_ct_player_info_t *player_info;
114 avrcp_ct_player_settings_t *player_setting;
118 bdt_bd2str(address, &bdstr);
119 BT_INFO("Address: %s", bdstr);
120 for (l = player_list; NULL != l; l = g_slist_next(l)) {
121 player_info = (avrcp_ct_player_info_t *)l->data;
126 if (!strncmp(bdstr, player_info->address, BT_ADDRESS_STR_LEN)) {
127 BT_INFO("Already added");
132 player_info = g_new0(avrcp_ct_player_info_t, 1);
134 /* Copy address to player_info->address */
135 g_strlcpy(player_info->address, bdstr, BT_ADDRESS_STR_LEN);
137 /* Init player settings with default values */
138 player_setting = &player_info->player_setting;
139 player_setting->equalizer = 0;
140 player_setting->repeat = BTRC_PLAYER_VAL_OFF_REPEAT;
141 player_setting->shuffle = BTRC_PLAYER_VAL_OFF_SHUFFLE;
142 player_setting->scan = 0;
143 player_setting->status = BTRC_PLAYSTATE_STOPPED;
144 player_setting->volume = 0;
146 /* Nothing to do for track_info as values are already initialized to 0 */
148 /* Add player_info to player_list */
149 player_list = g_slist_append(player_list, player_info);
152 static void __remove_device_from_avrcp_list(bt_address_t *address)
154 avrcp_ct_player_info_t *player_info = NULL;
158 bdt_bd2str(address, &bdstr);
159 BT_INFO("Address: %s", bdstr);
160 for (l = player_list; NULL != l; l = g_slist_next(l)) {
161 player_info = (avrcp_ct_player_info_t *)l->data;
166 if (!strncmp(bdstr, player_info->address, BT_ADDRESS_STR_LEN)) {
177 player_list = g_slist_remove(player_list, player_info);
181 static avrcp_ct_player_info_t *__get_player_info_from_list(bt_address_t *address)
183 avrcp_ct_player_info_t *player_info;
187 bdt_bd2str(address, &bdstr);
188 BT_INFO("Address: %s", bdstr);
189 for (l = player_list; NULL != l; l = g_slist_next(l)) {
190 player_info = (avrcp_ct_player_info_t *)l->data;
195 if (!strncmp(bdstr, player_info->address, BT_ADDRESS_STR_LEN)) {
204 oal_status_t avrcp_ct_enable(void)
206 const bt_interface_t* blued_inf;
209 API_TRACE("AVRCP Controller Enable");
211 if ((blued_inf = adapter_get_stack_interface()) == NULL) {
212 BT_ERR("Bluetooth module is not loaded");
213 return OAL_STATUS_NOT_READY;
216 if (avrcp_ct_interface != NULL) {
217 BT_WARN("AVRCP Controller Interface is already initialized...");
218 return OAL_STATUS_ALREADY_DONE;
221 if ((avrcp_ct_interface = (const btrc_ctrl_interface_t *)blued_inf->get_profile_interface(BT_PROFILE_AV_RC_CTRL_ID)) == NULL) {
222 BT_ERR("OAL, Failed to get Bluetooth AVRCP Controller Interface");
223 return OAL_STATUS_INTERNAL_ERROR;
226 BT_DBG("Got profile interface");
227 if ((ret = avrcp_ct_interface->init(&avrcp_ct_cb)) != BT_STATUS_SUCCESS) {
228 BT_ERR("Failed to initialize Bluetooth AVRCP Controller, status: %s", status2string(ret));
229 avrcp_ct_interface = NULL;
230 return convert_to_oal_status(ret);
232 BT_DBG("OAL, Bluetooth avrcp controller interface initialised");
234 return OAL_STATUS_SUCCESS;
237 /* Audio deinit: Resets all the audio information
238 * Note: Adapter should be disabled before calling deinit
240 oal_status_t avrcp_ct_disable(void)
242 API_TRACE("AVRCP Controller Disable");
244 CHECK_OAL_AVRCP_CTRL_ENABLED();
246 avrcp_ct_interface->cleanup();
247 avrcp_ct_interface = NULL;
249 return OAL_STATUS_SUCCESS;
252 void avrcp_ct_cleanup(void)
255 avrcp_ct_interface = NULL;
259 oal_status_t avrcp_ct_connect(bt_address_t *device_address)
261 int result = OAL_STATUS_SUCCESS;
267 CHECK_OAL_AVRCP_CTRL_ENABLED();
268 OAL_CHECK_PARAMETER(device_address, return);
270 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
273 status = avrcp_ct_interface->connect((bt_bdaddr_t *)device_address);
274 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
275 BT_ERR("Connection could not be established, err: %s", status2string(status));;
276 result = convert_to_oal_status(status);
279 BT_INFO("Not Supported");
280 result = OAL_STATUS_NOT_SUPPORT;
285 oal_status_t avrcp_ct_disconnect(bt_address_t *device_address)
287 int result = OAL_STATUS_SUCCESS;
293 CHECK_OAL_AVRCP_CTRL_ENABLED();
294 OAL_CHECK_PARAMETER(device_address, return);
296 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
299 status = avrcp_ct_interface->disconnect((bt_bdaddr_t *)device_address);
300 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
301 BT_ERR("OAL, Disconnection failed err: %s", status2string(status));
302 result = convert_to_oal_status(status);
305 BT_INFO("Not Supported");
306 result = OAL_STATUS_NOT_SUPPORT;
311 static void cb_avrcp_ct_connection_state(bool rc_connect, bool bt_connect, bt_bdaddr_t* bd_addr)
313 bt_address_t *event_data = NULL;
317 ret_if(bd_addr == NULL);
318 BT_INFO("rc_connect = %d, bt_connect = %d, BT Address = %s",
319 rc_connect, bt_connect, bdt_bd2str((bt_address_t*)bd_addr, &bdstr));
321 event_data = g_new0(bt_address_t, 1);
322 memcpy(event_data->addr, bd_addr->address, BT_ADDRESS_BYTES_NUM);
325 event = OAL_EVENT_AVRCP_CT_CONNECTED;
326 __add_device_to_avrcp_list(event_data);
328 event = OAL_EVENT_AVRCP_CT_DISCONNECTED;
329 __remove_device_from_avrcp_list(event_data);
332 send_event_bda_trace(event, event_data, sizeof(bt_address_t), (bt_address_t*)bd_addr);
335 notif_event_avrcp_ct_play_status_t __hal_to_oal_play_status(btrc_play_status_t play_status)
337 notif_event_avrcp_ct_play_status_t status = OAL_PLAY_STATUS_ERROR;
339 switch (play_status) {
340 case BTRC_PLAYSTATE_STOPPED:
341 status = OAL_PLAY_STATUS_STOPPED;
343 case BTRC_PLAYSTATE_PLAYING:
344 status = OAL_PLAY_STATUS_PLAYING;
346 case BTRC_PLAYSTATE_PAUSED:
347 status = OAL_PLAY_STATUS_PAUSED;
349 case BTRC_PLAYSTATE_FWD_SEEK:
350 status = OAL_PLAY_STATUS_FWD_SEEK;
352 case BTRC_PLAYSTATE_REV_SEEK:
353 status = OAL_PLAY_STATUS_REV_SEEK;
356 BT_INFO("Incorrect Play status");
363 static avrcp_ct_player_settings_t *__get_player_setting(bt_address_t *address)
365 avrcp_ct_player_info_t *player_info;
368 player_info = __get_player_info_from_list(address);
372 return &player_info->player_setting;
375 static void cb_avrcp_ct_btrc_playerapplicationsetting_changed(
376 bt_bdaddr_t *bd_addr, btrc_player_settings_t *p_vals)
378 avrcp_ct_property_value_t *event_data = NULL;
382 avrcp_ct_player_settings_t *player_setting;
384 bdt_bd2str((bt_address_t *)bd_addr, &bdstr);
385 player_setting = __get_player_setting((bt_address_t *)bd_addr);
386 if (!player_setting) {
387 BT_INFO("player_setting is NULL");
388 /* Player info not yet added to player_list, first add it to list */
389 __add_device_to_avrcp_list((bt_address_t *)bd_addr);
390 player_setting = __get_player_setting((bt_address_t *)bd_addr);
393 for (i = 0; i < p_vals->num_attr; i++) {
394 event_data = g_new0(avrcp_ct_property_value_t, 1);
396 switch (p_vals->attr_ids[i]) {
397 case BTRC_PLAYER_ATTR_EQUALIZER:
398 event = OAL_EVENT_AVRCP_CT_EQUALIZER_STATUS;
399 event_data->type = OAL_EQUALIZER;
400 event_data->value = p_vals->attr_values[i];
401 player_setting->equalizer = p_vals->attr_values[i];
403 case BTRC_PLAYER_ATTR_REPEAT:
404 event = OAL_EVENT_AVRCP_CT_REPEAT_STATUS;
405 event_data->type = OAL_REPEAT;
406 event_data->value = p_vals->attr_values[i];
407 player_setting->repeat = p_vals->attr_values[i];
409 case BTRC_PLAYER_ATTR_SHUFFLE:
410 event = OAL_EVENT_AVRCP_CT_SHUFFLE_STATUS;
411 event_data->type = OAL_SHUFFLE;
412 event_data->value = p_vals->attr_values[i];
413 player_setting->shuffle = p_vals->attr_values[i];
415 case BTRC_PLAYER_ATTR_SCAN:
416 event = OAL_EVENT_AVRCP_CT_SCAN_STATUS;
417 event_data->type = OAL_SCAN;
418 event_data->value = p_vals->attr_values[i];
419 player_setting->scan = p_vals->attr_values[i];
422 event = OAL_EVENT_END;
427 if (OAL_EVENT_END != event)
428 send_event(event, event_data, sizeof(avrcp_ct_property_value_t));
432 static avrcp_ct_track_info_t *__get_track_info(bt_address_t *address)
434 avrcp_ct_player_info_t *player_info;
437 player_info = __get_player_info_from_list(address);
441 return &player_info->track_info;
444 static void cb_avrcp_ct_btrc_play_position_changed(
445 bt_bdaddr_t *bd_addr, uint32_t song_len, uint32_t song_pos)
447 event_notif_avrcp_ct_notif_info_t *event_data = NULL;
448 avrcp_ct_track_info_t *track_info;
450 track_info = __get_track_info((bt_address_t *)bd_addr);
452 BT_INFO("track_info is NULL");
453 /* Player info not yet added to player_list, first add it to list */
454 __add_device_to_avrcp_list((bt_address_t *)bd_addr);
455 track_info = __get_track_info((bt_address_t *)bd_addr);
457 track_info->song_pos = song_pos;
459 event_data = g_new0(event_notif_avrcp_ct_notif_info_t, 1);
460 event_data->song_pos = song_pos;
461 send_event(OAL_EVENT_AVRCP_CT_NOTIF_PLAY_POS_CHANGED,
462 event_data, sizeof(event_notif_avrcp_ct_notif_info_t));
465 static void cb_avrcp_ct_btrc_play_status_changed(
466 bt_bdaddr_t *bd_addr, btrc_play_status_t play_status)
468 event_notif_avrcp_ct_notif_info_t *event_data = NULL;
469 avrcp_ct_player_settings_t *player_setting;
471 player_setting = __get_player_setting((bt_address_t *)bd_addr);
472 if (!player_setting) {
473 BT_INFO("player_setting is NULL");
474 /* Player info not yet added to player_list, first add it to list */
475 __add_device_to_avrcp_list((bt_address_t *)bd_addr);
476 player_setting = __get_player_setting((bt_address_t *)bd_addr);
479 player_setting->status = play_status;
481 event_data = g_new0(event_notif_avrcp_ct_notif_info_t, 1);
482 event_data->play_status = __hal_to_oal_play_status(play_status);
483 send_event(OAL_EVENT_AVRCP_CT_NOTIF_PLAY_STATUS_CHANGED,
484 event_data, sizeof(event_notif_avrcp_ct_notif_info_t));
487 static void cb_avrcp_ct_btrc_passthrough_rsp(bt_bdaddr_t *bd_addr, int id, int state)
489 avrcp_ct_pass_cmd_key_code_t key_code;
490 avrcp_ct_pass_state_t key_state;
491 avrcp_ct_pass_cmd_t *event_data;
493 event_data = g_new0(avrcp_ct_pass_cmd_t, 1);
498 event_data->key_code = key_code;
499 event_data->key_state = key_state;
500 send_event(OAL_EVENT_AVRCP_CT_PASS_CMD_RES,
501 event_data, sizeof(avrcp_ct_pass_cmd_t));
503 BT_ERR("Invalid pass through command key code");
508 static void cb_avrcp_ct_btrc_setplayerapplicationsetting_rsp(
509 bt_bdaddr_t *bd_addr, uint8_t accepted)
511 avrcp_ct_playersetting_t *event_data;
513 event_data = g_new0(avrcp_ct_playersetting_t, 1);
515 event_data->accepted = accepted;
516 send_event(OAL_EVENT_AVRCP_CT_PLAYER_SETTING_RES,
517 event_data, sizeof(avrcp_ct_playersetting_t));
520 static void cb_avrcp_ct_trak_info_chnaged(bt_bdaddr_t *device_address,
521 uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
524 avrcp_ct_track_info_t *track_info;
525 event_avrcp_ct_media_info_t *event_data = NULL;
527 track_info = __get_track_info((bt_address_t *)device_address);
529 BT_INFO("track_info is NULL");
530 /* Player info not yet added to player_list, first add it to list */
531 __add_device_to_avrcp_list((bt_address_t *)device_address);
532 track_info = __get_track_info((bt_address_t *)device_address);
535 event_data = g_new0(event_avrcp_ct_media_info_t, 1);
536 for (idx = 0; idx < num_attr; idx++) {
537 BT_INFO("idx [%d]", p_attrs[idx].attr_id);
539 switch (p_attrs[idx].attr_id) {
540 case BTRC_MEDIA_ATTR_ID_TITLE:
541 g_strlcpy((char *)track_info->title_info, (const char *)&p_attrs[idx].text,
542 MEDIA_ATTIRBUTE_STRING_LENGTH);
543 g_strlcpy((char *)event_data->title_info, (const char *)&p_attrs[idx].text,
544 MEDIA_ATTIRBUTE_STRING_LENGTH);
546 case BTRC_MEDIA_ATTR_ID_ARTIST:
547 g_strlcpy((char *)track_info->artist_info, (const char *)&p_attrs[idx].text,
548 MEDIA_ATTIRBUTE_STRING_LENGTH);
549 g_strlcpy((char *)event_data->artist_info, (const char *)&p_attrs[idx].text,
550 MEDIA_ATTIRBUTE_STRING_LENGTH);
552 case BTRC_MEDIA_ATTR_ID_ALBUM:
553 g_strlcpy((char *)track_info->album_info, (const char *)&p_attrs[idx].text,
554 MEDIA_ATTIRBUTE_STRING_LENGTH);
555 g_strlcpy((char *)event_data->album_info, (const char *)&p_attrs[idx].text,
556 MEDIA_ATTIRBUTE_STRING_LENGTH);
558 case BTRC_MEDIA_ATTR_ID_GENRE:
559 g_strlcpy((char *)track_info->genre_info, (const char *)&p_attrs[idx].text,
560 MEDIA_ATTIRBUTE_STRING_LENGTH);
561 g_strlcpy((char *)event_data->genre_info, (const char *)&p_attrs[idx].text,
562 MEDIA_ATTIRBUTE_STRING_LENGTH);
564 case BTRC_MEDIA_ATTR_ID_NUM_TRACKS:
565 if (p_attrs[idx].text != NULL) {
566 track_info->total_track = g_ascii_strtoll(
567 (const gchar *)p_attrs[idx].text, NULL, 10);
568 event_data->total_track = track_info->total_track;
571 case BTRC_MEDIA_ATTR_ID_TRACK_NUM:
572 if (p_attrs[idx].text != NULL) {
573 track_info->track_number = g_ascii_strtoll(
574 (const gchar *)p_attrs[idx].text, NULL, 10);
575 event_data->track_number = track_info->track_number;
578 case BTRC_MEDIA_ATTR_ID_PLAYING_TIME:
579 track_info->playing_time = g_ascii_strtoll(
580 (const gchar *)p_attrs[idx].text, NULL, 10);
581 event_data->playing_time = (uint64_t) track_info->playing_time;
588 send_event(OAL_EVENT_AVRCP_CT_NOTIF_TRACK_CHANGE,
589 event_data, sizeof(event_avrcp_ct_media_info_t));
593 oal_status_t __avrcp_ct_send_pass_through_cmd(bt_address_t *device_address,
594 avrcp_ct_pass_cmd_key_code_t key_code, avrcp_ct_pass_state_t key_state)
596 int result = OAL_STATUS_SUCCESS;
602 CHECK_OAL_AVRCP_CTRL_ENABLED();
604 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
606 status = avrcp_ct_interface->send_pass_through_cmd((bt_bdaddr_t *)device_address,
607 key_code, key_state);
608 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
609 BT_ERR("OAL, send pass through cmd failed err: %s", status2string(status));
610 result = convert_to_oal_status(status);
615 oal_status_t avrcp_ct_play(bt_address_t *device_address)
617 oal_status_t result = OAL_STATUS_SUCCESS;
621 result = __avrcp_ct_send_pass_through_cmd(device_address,
622 OAL_RC_PASS_CMD_PLAY, PRESS_STATE);
627 oal_status_t avrcp_ct_pause(bt_address_t *device_address)
629 oal_status_t result = OAL_STATUS_SUCCESS;
633 result = __avrcp_ct_send_pass_through_cmd(device_address,
634 OAL_RC_PASS_CMD_PAUSE, PRESS_STATE);
639 oal_status_t avrcp_ct_stop(bt_address_t *device_address)
641 oal_status_t result = OAL_STATUS_SUCCESS;
645 result = __avrcp_ct_send_pass_through_cmd(device_address,
646 OAL_RC_PASS_CMD_STOP, PRESS_STATE);
651 oal_status_t avrcp_ct_next_track(bt_address_t *device_address)
653 oal_status_t result = OAL_STATUS_SUCCESS;
657 result = __avrcp_ct_send_pass_through_cmd(device_address,
658 OAL_RC_PASS_CMD_NEXT, PRESS_STATE);
663 oal_status_t avrcp_ct_prev_track(bt_address_t *device_address)
665 oal_status_t result = OAL_STATUS_SUCCESS;
669 result = __avrcp_ct_send_pass_through_cmd(device_address,
670 OAL_RC_PASS_CMD_PREVIOUS, PRESS_STATE);
675 oal_status_t avrcp_ct_volume_up(bt_address_t *device_address)
677 oal_status_t result = OAL_STATUS_SUCCESS;
681 result = __avrcp_ct_send_pass_through_cmd(device_address,
682 OAL_RC_PASS_CMD_VOLUME_UP, PRESS_STATE);
687 oal_status_t avrcp_ct_volume_down(bt_address_t *device_address)
689 oal_status_t result = OAL_STATUS_SUCCESS;
693 result = __avrcp_ct_send_pass_through_cmd(device_address,
694 OAL_RC_PASS_CMD_VOLUME_DOWN, PRESS_STATE);
699 oal_status_t avrcp_ct_fforward(bt_address_t *device_address, avrcp_ct_pass_state_t press_state)
701 oal_status_t result = OAL_STATUS_SUCCESS;
704 switch (press_state) {
706 result = __avrcp_ct_send_pass_through_cmd(device_address,
707 OAL_RC_PASS_CMD_PRESS_FAST_FORWARD, press_state);
710 result = __avrcp_ct_send_pass_through_cmd(device_address,
711 OAL_RC_PASS_CMD_RELEASE_FAST_FORWARD, press_state);
714 result = OAL_STATUS_INVALID_PARAM;
721 oal_status_t avrcp_ct_rewind(bt_address_t *device_address, avrcp_ct_pass_state_t press_state)
723 oal_status_t result = OAL_STATUS_SUCCESS;
726 switch (press_state) {
728 result = __avrcp_ct_send_pass_through_cmd(device_address,
729 OAL_RC_PASS_CMD_PRESS_REWIND, press_state);
732 result = __avrcp_ct_send_pass_through_cmd(device_address,
733 OAL_RC_PASS_CMD_RELEASE_REWIND, press_state);
736 result = OAL_STATUS_INVALID_PARAM;
743 uint8_t __oal_to_hal_property_type(avrcp_ct_player_property_type_t type)
745 uint8_t property_type = 0;
749 property_type = BTRC_PLAYER_ATTR_EQUALIZER;
752 property_type = BTRC_PLAYER_ATTR_REPEAT;
755 property_type = BTRC_PLAYER_ATTR_SHUFFLE;
758 property_type = BTRC_PLAYER_ATTR_SCAN;
761 BT_ERR(" Invalid Property type[%d]", type);
765 return property_type;
768 oal_status_t avrcp_ct_set_property(bt_address_t *device_address, avrcp_ct_player_property_type_t type, uint32_t value)
770 int result = OAL_STATUS_SUCCESS;
771 uint8_t property_type;
777 CHECK_OAL_AVRCP_CTRL_ENABLED();
778 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
780 property_type = __oal_to_hal_property_type(type);
782 status = avrcp_ct_interface->set_player_app_setting_cmd((bt_bdaddr_t *)device_address, NO_OF_ATTRIBUTE,
783 (uint8_t*)&property_type, (uint8_t*)&value);
784 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
785 BT_ERR("OAL, Set property failed err: %s", status2string(status));
786 result = convert_to_oal_status(status);
789 result = OAL_STATUS_INTERNAL_ERROR;
794 oal_status_t avrcp_transport_set_property(bt_address_t *device_address, int type, unsigned int value)
796 int result = OAL_STATUS_SUCCESS;
802 CHECK_OAL_AVRCP_CTRL_ENABLED();
803 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
806 status = avrcp_ct_interface->set_transport_setting_cmd((bt_bdaddr_t *)device_address, NO_OF_ATTRIBUTE,
808 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
809 BT_ERR("OAL, Set property failed err: %s", status2string(status));
810 result = convert_to_oal_status(status);
813 result = OAL_STATUS_INTERNAL_ERROR;
818 static gboolean __send_avrcp_property_event(gpointer data)
820 avrcp_ct_property_value_t *event_data = (avrcp_ct_property_value_t *)data;
822 send_event(OAL_EVENT_AVRCP_CT_GET_PROPERTY_RES,
823 event_data, sizeof(avrcp_ct_property_value_t));
827 oal_status_t avrcp_ct_get_property(bt_address_t *device_address, avrcp_ct_player_property_type_t type)
829 avrcp_ct_player_info_t *player_info;
830 avrcp_ct_player_settings_t *player_setting;
831 avrcp_ct_track_info_t *track_info;
832 avrcp_ct_property_value_t *event_data;
835 CHECK_OAL_AVRCP_CTRL_ENABLED();
837 player_info = __get_player_info_from_list(device_address);
839 BT_ERR("Player info not found");
840 return OAL_STATUS_INVALID_PARAM;
843 player_setting = &player_info->player_setting;
844 track_info = &player_info->track_info;
846 event_data = g_new0(avrcp_ct_property_value_t, 1);
847 event_data->type = type;
851 event_data->value = player_setting->equalizer;
854 event_data->value = player_setting->repeat;
857 event_data->value = player_setting->shuffle;
860 event_data->value = player_setting->scan;
862 case OAL_PLAY_POSITION:
863 event_data->value = track_info->song_pos;
866 BT_ERR("Invalid Type [%d]", type);
868 return OAL_STATUS_INVALID_PARAM;
871 g_idle_add(__send_avrcp_property_event, (gpointer)event_data);
872 return OAL_STATUS_SUCCESS;
875 static gboolean __send_avrcp_play_status_event(gpointer data)
877 event_avrcp_ct_play_status_t *event_data = (event_avrcp_ct_play_status_t *)data;
879 send_event(OAL_EVENT_AVRCP_CT_PLAY_STATUS,
880 event_data, sizeof(event_avrcp_ct_play_status_t));
885 oal_status_t avrcp_ct_get_play_status(bt_address_t *device_address)
887 avrcp_ct_player_info_t *player_info;
888 avrcp_ct_player_settings_t *player_setting;
889 avrcp_ct_track_info_t *track_info;
890 event_avrcp_ct_play_status_t *event_data = NULL;
893 CHECK_OAL_AVRCP_CTRL_ENABLED();
895 player_info = __get_player_info_from_list(device_address);
897 BT_ERR("Player info not found");
898 return OAL_STATUS_INVALID_PARAM;
901 player_setting = &player_info->player_setting;
902 track_info = &player_info->track_info;
904 event_data = g_new0(event_avrcp_ct_play_status_t, 1);
905 event_data->song_len = track_info->playing_time;
906 event_data->song_pos = track_info->song_pos;
908 switch (player_setting->status) {
909 case BTRC_PLAYSTATE_STOPPED:
910 event_data->play_status = OAL_PLAY_STATUS_STOPPED;
912 case BTRC_PLAYSTATE_PLAYING:
913 event_data->play_status = OAL_PLAY_STATUS_PLAYING;
915 case BTRC_PLAYSTATE_PAUSED:
916 event_data->play_status = OAL_PLAY_STATUS_PAUSED;
918 case BTRC_PLAYSTATE_FWD_SEEK:
919 event_data->play_status = OAL_PLAY_STATUS_FWD_SEEK;
921 case BTRC_PLAYSTATE_REV_SEEK:
922 event_data->play_status = OAL_PLAY_STATUS_REV_SEEK;
925 event_data->play_status = OAL_PLAY_STATUS_ERROR;
929 g_idle_add(__send_avrcp_play_status_event, (gpointer)event_data);
930 return OAL_STATUS_SUCCESS;
933 static gboolean __send_media_attribute_event(gpointer data)
935 event_avrcp_ct_media_info_t *event_data = (event_avrcp_ct_media_info_t *)data;
937 send_event(OAL_EVENT_AVRCP_CT_MEDIA_INFO,
938 event_data, sizeof(event_avrcp_ct_media_info_t));
943 oal_status_t avrcp_ct_get_media_attribute(bt_address_t *device_address)
945 avrcp_ct_track_info_t *track_info;
946 event_avrcp_ct_media_info_t *event_data;
950 CHECK_OAL_AVRCP_CTRL_ENABLED();
952 OAL_CHECK_PARAMETER(device_address, return);
954 track_info = __get_track_info(device_address);
956 BT_ERR("Player info not found");
957 return OAL_STATUS_INVALID_PARAM;
960 event_data = g_new0(event_avrcp_ct_media_info_t, 1);
961 g_strlcpy((char *)event_data->title_info, (const char *)track_info->title_info,
962 MEDIA_ATTIRBUTE_STRING_LENGTH);
963 g_strlcpy((char *)event_data->album_info, (const char *)track_info->album_info,
964 MEDIA_ATTIRBUTE_STRING_LENGTH);
965 g_strlcpy((char *)event_data->genre_info, (const char *)track_info->genre_info,
966 MEDIA_ATTIRBUTE_STRING_LENGTH);
967 g_strlcpy((char *)event_data->artist_info, (const char *)track_info->artist_info,
968 MEDIA_ATTIRBUTE_STRING_LENGTH);
969 event_data->playing_time = (uint64_t)track_info->playing_time;
970 event_data->total_track = track_info->total_track;
971 event_data->track_number = track_info->track_number;
973 g_idle_add(__send_media_attribute_event, (gpointer)event_data);
975 return OAL_STATUS_SUCCESS;