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;
426 if (OAL_EVENT_END != event)
427 send_event(event, event_data, sizeof(avrcp_ct_property_value_t));
431 static avrcp_ct_track_info_t *__get_track_info(bt_address_t *address)
433 avrcp_ct_player_info_t *player_info;
436 player_info = __get_player_info_from_list(address);
440 return &player_info->track_info;
443 static void cb_avrcp_ct_btrc_play_position_changed(
444 bt_bdaddr_t *bd_addr, uint32_t song_len, uint32_t song_pos)
446 event_notif_avrcp_ct_notif_info_t *event_data = NULL;
447 avrcp_ct_track_info_t *track_info;
449 track_info = __get_track_info((bt_address_t *)bd_addr);
451 BT_INFO("track_info is NULL");
452 /* Player info not yet added to player_list, first add it to list */
453 __add_device_to_avrcp_list((bt_address_t *)bd_addr);
454 track_info = __get_track_info((bt_address_t *)bd_addr);
456 track_info->song_pos = song_pos;
458 event_data = g_new0(event_notif_avrcp_ct_notif_info_t, 1);
459 event_data->song_pos = song_pos;
460 send_event(OAL_EVENT_AVRCP_CT_NOTIF_PLAY_POS_CHANGED,
461 event_data, sizeof(event_notif_avrcp_ct_notif_info_t));
464 static void cb_avrcp_ct_btrc_play_status_changed(
465 bt_bdaddr_t *bd_addr, btrc_play_status_t play_status)
467 event_notif_avrcp_ct_notif_info_t *event_data = NULL;
468 avrcp_ct_player_settings_t *player_setting;
470 player_setting = __get_player_setting((bt_address_t *)bd_addr);
471 if (!player_setting) {
472 BT_INFO("player_setting is NULL");
473 /* Player info not yet added to player_list, first add it to list */
474 __add_device_to_avrcp_list((bt_address_t *)bd_addr);
475 player_setting = __get_player_setting((bt_address_t *)bd_addr);
478 player_setting->status = play_status;
480 event_data = g_new0(event_notif_avrcp_ct_notif_info_t, 1);
481 event_data->play_status = __hal_to_oal_play_status(play_status);
482 send_event(OAL_EVENT_AVRCP_CT_NOTIF_PLAY_STATUS_CHANGED,
483 event_data, sizeof(event_notif_avrcp_ct_notif_info_t));
486 static void cb_avrcp_ct_btrc_passthrough_rsp(bt_bdaddr_t *bd_addr, int id, int state)
488 avrcp_ct_pass_cmd_key_code_t key_code;
489 avrcp_ct_pass_state_t key_state;
490 avrcp_ct_pass_cmd_t *event_data;
492 event_data = g_new0(avrcp_ct_pass_cmd_t, 1);
497 event_data->key_code = key_code;
498 event_data->key_state = key_state;
499 send_event(OAL_EVENT_AVRCP_CT_PASS_CMD_RES,
500 event_data, sizeof(avrcp_ct_pass_cmd_t));
502 BT_ERR("Invalid pass through command key code");
506 static void cb_avrcp_ct_btrc_setplayerapplicationsetting_rsp(
507 bt_bdaddr_t *bd_addr, uint8_t accepted)
509 avrcp_ct_playersetting_t *event_data;
511 event_data = g_new0(avrcp_ct_playersetting_t, 1);
513 event_data->accepted = accepted;
514 send_event(OAL_EVENT_AVRCP_CT_PLAYER_SETTING_RES,
515 event_data, sizeof(avrcp_ct_playersetting_t));
518 static void cb_avrcp_ct_trak_info_chnaged(bt_bdaddr_t *device_address,
519 uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
522 avrcp_ct_track_info_t *track_info;
523 event_avrcp_ct_media_info_t *event_data = NULL;
525 track_info = __get_track_info((bt_address_t *)device_address);
527 BT_INFO("track_info is NULL");
528 /* Player info not yet added to player_list, first add it to list */
529 __add_device_to_avrcp_list((bt_address_t *)device_address);
530 track_info = __get_track_info((bt_address_t *)device_address);
533 event_data = g_new0(event_avrcp_ct_media_info_t, 1);
534 for (idx = 0; idx < num_attr; idx++) {
535 BT_INFO("idx [%d]", p_attrs[idx].attr_id);
537 switch (p_attrs[idx].attr_id) {
538 case BTRC_MEDIA_ATTR_ID_TITLE:
539 g_strlcpy((char *)track_info->title_info, (const char *)&p_attrs[idx].text,
540 MEDIA_ATTIRBUTE_STRING_LENGTH);
541 g_strlcpy((char *)event_data->title_info, (const char *)&p_attrs[idx].text,
542 MEDIA_ATTIRBUTE_STRING_LENGTH);
544 case BTRC_MEDIA_ATTR_ID_ARTIST:
545 g_strlcpy((char *)track_info->artist_info, (const char *)&p_attrs[idx].text,
546 MEDIA_ATTIRBUTE_STRING_LENGTH);
547 g_strlcpy((char *)event_data->artist_info, (const char *)&p_attrs[idx].text,
548 MEDIA_ATTIRBUTE_STRING_LENGTH);
550 case BTRC_MEDIA_ATTR_ID_ALBUM:
551 g_strlcpy((char *)track_info->album_info, (const char *)&p_attrs[idx].text,
552 MEDIA_ATTIRBUTE_STRING_LENGTH);
553 g_strlcpy((char *)event_data->album_info, (const char *)&p_attrs[idx].text,
554 MEDIA_ATTIRBUTE_STRING_LENGTH);
556 case BTRC_MEDIA_ATTR_ID_GENRE:
557 g_strlcpy((char *)track_info->genre_info, (const char *)&p_attrs[idx].text,
558 MEDIA_ATTIRBUTE_STRING_LENGTH);
559 g_strlcpy((char *)event_data->genre_info, (const char *)&p_attrs[idx].text,
560 MEDIA_ATTIRBUTE_STRING_LENGTH);
562 case BTRC_MEDIA_ATTR_ID_NUM_TRACKS:
563 if (p_attrs[idx].text != NULL) {
564 track_info->total_track = g_ascii_strtoll(
565 (const gchar *)p_attrs[idx].text, NULL, 10);
566 event_data->total_track = track_info->total_track;
568 BT_WARN("string is null!!!!!!!");
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;
577 BT_WARN("string is null!!!!!!!");
580 case BTRC_MEDIA_ATTR_ID_PLAYING_TIME:
581 if (p_attrs[idx].text != NULL) {
582 track_info->playing_time = g_ascii_strtoll(
583 (const gchar *)p_attrs[idx].text, NULL, 10);
584 event_data->playing_time = track_info->playing_time;
586 BT_WARN("string is null!!!!!!!");
594 send_event(OAL_EVENT_AVRCP_CT_NOTIF_TRACK_CHANGE,
595 event_data, sizeof(event_avrcp_ct_media_info_t));
599 oal_status_t __avrcp_ct_send_pass_through_cmd(bt_address_t *device_address,
600 avrcp_ct_pass_cmd_key_code_t key_code, avrcp_ct_pass_state_t key_state)
602 int result = OAL_STATUS_SUCCESS;
608 CHECK_OAL_AVRCP_CTRL_ENABLED();
610 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
612 status = avrcp_ct_interface->send_pass_through_cmd((bt_bdaddr_t *)device_address,
613 key_code, key_state);
614 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
615 BT_ERR("OAL, send pass through cmd failed err: %s", status2string(status));
616 result = convert_to_oal_status(status);
621 oal_status_t avrcp_ct_play(bt_address_t *device_address)
623 oal_status_t result = OAL_STATUS_SUCCESS;
627 result = __avrcp_ct_send_pass_through_cmd(device_address,
628 OAL_RC_PASS_CMD_PLAY, PRESS_STATE);
633 oal_status_t avrcp_ct_pause(bt_address_t *device_address)
635 oal_status_t result = OAL_STATUS_SUCCESS;
639 result = __avrcp_ct_send_pass_through_cmd(device_address,
640 OAL_RC_PASS_CMD_PAUSE, PRESS_STATE);
645 oal_status_t avrcp_ct_stop(bt_address_t *device_address)
647 oal_status_t result = OAL_STATUS_SUCCESS;
651 result = __avrcp_ct_send_pass_through_cmd(device_address,
652 OAL_RC_PASS_CMD_STOP, PRESS_STATE);
657 oal_status_t avrcp_ct_next_track(bt_address_t *device_address)
659 oal_status_t result = OAL_STATUS_SUCCESS;
663 result = __avrcp_ct_send_pass_through_cmd(device_address,
664 OAL_RC_PASS_CMD_NEXT, PRESS_STATE);
669 oal_status_t avrcp_ct_prev_track(bt_address_t *device_address)
671 oal_status_t result = OAL_STATUS_SUCCESS;
675 result = __avrcp_ct_send_pass_through_cmd(device_address,
676 OAL_RC_PASS_CMD_PREVIOUS, PRESS_STATE);
681 oal_status_t avrcp_ct_fforward(bt_address_t *device_address, avrcp_ct_pass_state_t press_state)
683 oal_status_t result = OAL_STATUS_SUCCESS;
686 switch (press_state) {
688 result = __avrcp_ct_send_pass_through_cmd(device_address,
689 OAL_RC_PASS_CMD_PRESS_FAST_FORWARD, press_state);
692 result = __avrcp_ct_send_pass_through_cmd(device_address,
693 OAL_RC_PASS_CMD_RELEASE_FAST_FORWARD, press_state);
696 result = OAL_STATUS_INVALID_PARAM;
703 oal_status_t avrcp_ct_rewind(bt_address_t *device_address, avrcp_ct_pass_state_t press_state)
705 oal_status_t result = OAL_STATUS_SUCCESS;
708 switch (press_state) {
710 result = __avrcp_ct_send_pass_through_cmd(device_address,
711 OAL_RC_PASS_CMD_PRESS_REWIND, press_state);
714 result = __avrcp_ct_send_pass_through_cmd(device_address,
715 OAL_RC_PASS_CMD_RELEASE_REWIND, press_state);
718 result = OAL_STATUS_INVALID_PARAM;
725 uint8_t __oal_to_hal_property_type(avrcp_ct_player_property_type_t type)
727 uint8_t property_type = 0;
731 property_type = BTRC_PLAYER_ATTR_EQUALIZER;
734 property_type = BTRC_PLAYER_ATTR_REPEAT;
737 property_type = BTRC_PLAYER_ATTR_SHUFFLE;
740 property_type = BTRC_PLAYER_ATTR_SCAN;
743 BT_ERR(" Invalid Property type[%d]", type);
747 return property_type;
750 oal_status_t avrcp_ct_set_property(bt_address_t *device_address, avrcp_ct_player_property_type_t type, uint32_t value)
752 int result = OAL_STATUS_SUCCESS;
753 uint8_t property_type;
759 CHECK_OAL_AVRCP_CTRL_ENABLED();
760 BT_INFO("BT Audio Address: %s", bdt_bd2str(device_address, &bdstr));
762 property_type = __oal_to_hal_property_type(type);
764 status = avrcp_ct_interface->set_player_app_setting_cmd((bt_bdaddr_t *)device_address, NO_OF_ATTRIBUTE,
765 (uint8_t*)&property_type, (uint8_t*)&value);
766 if ((status != BT_STATUS_SUCCESS) && (status != BT_STATUS_DONE)) {
767 BT_ERR("OAL, Set property failed err: %s", status2string(status));
768 result = convert_to_oal_status(status);
771 result = OAL_STATUS_INTERNAL_ERROR;
776 static gboolean __send_avrcp_property_event(gpointer data)
778 avrcp_ct_property_value_t *event_data = (avrcp_ct_property_value_t *)data;
780 send_event(OAL_EVENT_AVRCP_CT_GET_PROPERTY_RES,
781 event_data, sizeof(avrcp_ct_property_value_t));
785 oal_status_t avrcp_ct_get_property(bt_address_t *device_address, avrcp_ct_player_property_type_t type)
787 avrcp_ct_player_info_t *player_info;
788 avrcp_ct_player_settings_t *player_setting;
789 avrcp_ct_track_info_t *track_info;
790 avrcp_ct_property_value_t *event_data;
793 CHECK_OAL_AVRCP_CTRL_ENABLED();
795 player_info = __get_player_info_from_list(device_address);
797 BT_ERR("Player info not found");
798 return OAL_STATUS_INVALID_PARAM;
801 player_setting = &player_info->player_setting;
802 track_info = &player_info->track_info;
804 event_data = g_new0(avrcp_ct_property_value_t, 1);
805 event_data->type = type;
809 event_data->value = player_setting->equalizer;
812 event_data->value = player_setting->repeat;
815 event_data->value = player_setting->shuffle;
818 event_data->value = player_setting->scan;
820 case OAL_PLAY_POSITION:
821 event_data->value = track_info->song_pos;
824 BT_ERR("Invalid Type [%d]", type);
825 return OAL_STATUS_INVALID_PARAM;
828 g_idle_add(__send_avrcp_property_event, (gpointer)event_data);
829 return OAL_STATUS_SUCCESS;
832 static gboolean __send_avrcp_play_status_event(gpointer data)
834 event_avrcp_ct_play_status_t *event_data = (event_avrcp_ct_play_status_t *)data;
836 send_event(OAL_EVENT_AVRCP_CT_PLAY_STATUS,
837 event_data, sizeof(event_avrcp_ct_play_status_t));
842 oal_status_t avrcp_ct_get_play_status(bt_address_t *device_address)
844 avrcp_ct_player_info_t *player_info;
845 avrcp_ct_player_settings_t *player_setting;
846 avrcp_ct_track_info_t *track_info;
847 event_avrcp_ct_play_status_t *event_data = NULL;
850 CHECK_OAL_AVRCP_CTRL_ENABLED();
852 player_info = __get_player_info_from_list(device_address);
854 BT_ERR("Player info not found");
855 return OAL_STATUS_INVALID_PARAM;
858 player_setting = &player_info->player_setting;
859 track_info = &player_info->track_info;
861 event_data = g_new0(event_avrcp_ct_play_status_t, 1);
862 event_data->song_len = track_info->playing_time;
863 event_data->song_pos = track_info->song_pos;
865 switch (player_setting->status) {
866 case BTRC_PLAYSTATE_STOPPED:
867 event_data->play_status = OAL_PLAY_STATUS_STOPPED;
869 case BTRC_PLAYSTATE_PLAYING:
870 event_data->play_status = OAL_PLAY_STATUS_PLAYING;
872 case BTRC_PLAYSTATE_PAUSED:
873 event_data->play_status = OAL_PLAY_STATUS_PAUSED;
875 case BTRC_PLAYSTATE_FWD_SEEK:
876 event_data->play_status = OAL_PLAY_STATUS_FWD_SEEK;
878 case BTRC_PLAYSTATE_REV_SEEK:
879 event_data->play_status = OAL_PLAY_STATUS_REV_SEEK;
882 event_data->play_status = OAL_PLAY_STATUS_ERROR;
886 g_idle_add(__send_avrcp_play_status_event, (gpointer)event_data);
887 return OAL_STATUS_SUCCESS;
890 static gboolean __send_media_attribute_event(gpointer data)
892 event_avrcp_ct_media_info_t *event_data = (event_avrcp_ct_media_info_t *)data;
894 send_event(OAL_EVENT_AVRCP_CT_MEDIA_INFO,
895 event_data, sizeof(event_avrcp_ct_media_info_t));
900 oal_status_t avrcp_ct_get_media_attribute(bt_address_t *device_address)
902 avrcp_ct_track_info_t *track_info;
903 event_avrcp_ct_media_info_t *event_data;
907 CHECK_OAL_AVRCP_CTRL_ENABLED();
909 OAL_CHECK_PARAMETER(device_address, return);
911 track_info = __get_track_info(device_address);
913 BT_ERR("Player info not found");
914 return OAL_STATUS_INVALID_PARAM;
917 event_data = g_new0(event_avrcp_ct_media_info_t, 1);
918 g_strlcpy((char *)event_data->title_info, (const char *)track_info->title_info,
919 MEDIA_ATTIRBUTE_STRING_LENGTH);
920 g_strlcpy((char *)event_data->album_info, (const char *)track_info->album_info,
921 MEDIA_ATTIRBUTE_STRING_LENGTH);
922 g_strlcpy((char *)event_data->genre_info, (const char *)track_info->genre_info,
923 MEDIA_ATTIRBUTE_STRING_LENGTH);
924 g_strlcpy((char *)event_data->artist_info, (const char *)track_info->artist_info,
925 MEDIA_ATTIRBUTE_STRING_LENGTH);
926 event_data->playing_time = track_info->playing_time;
927 event_data->total_track = track_info->total_track;
928 event_data->track_number = track_info->track_number;
930 g_idle_add(__send_media_attribute_event, (gpointer)event_data);
932 return OAL_STATUS_SUCCESS;