summaryrefslogtreecommitdiffstats
path: root/stack/avrc/avrc_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'stack/avrc/avrc_utils.c')
-rw-r--r--stack/avrc/avrc_utils.c254
1 files changed, 254 insertions, 0 deletions
diff --git a/stack/avrc/avrc_utils.c b/stack/avrc/avrc_utils.c
new file mode 100644
index 0000000..b9eef9b
--- /dev/null
+++ b/stack/avrc/avrc_utils.c
@@ -0,0 +1,254 @@
+/*****************************************************************************
+**
+** Name: avrc_utils.c
+**
+** Description: Utility functions to validate AVRC command/response paramaters
+**
+** Copyright (c) 2003-2008, Broadcom Corp., All Rights Reserved.
+** Broadcom Bluetooth Core. Proprietary and confidential.
+**
+*****************************************************************************/
+#include <string.h>
+
+#include "gki.h"
+#include "avrc_api.h"
+#include "avrc_int.h"
+
+
+#if (AVRC_METADATA_INCLUDED == TRUE)
+
+/**************************************************************************
+**
+** Function AVRC_IsValidAvcType
+**
+** Description Check if correct AVC type is specified
+**
+** Returns returns TRUE if it is valid
+**
+**
+*******************************************************************************/
+BOOLEAN AVRC_IsValidAvcType(UINT8 pdu_id, UINT8 avc_type)
+{
+ BOOLEAN result=FALSE;
+
+ if (avc_type < AVRC_RSP_NOT_IMPL) /* command msg */
+ {
+ switch (pdu_id)
+ {
+ case AVRC_PDU_GET_CAPABILITIES: /* 0x10 */
+ case AVRC_PDU_LIST_PLAYER_APP_ATTR: /* 0x11 */
+ case AVRC_PDU_LIST_PLAYER_APP_VALUES: /* 0x12 */
+ case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE: /* 0x13 */
+ case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT: /* 0x15 */
+ case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT: /* 0x16 */
+ case AVRC_PDU_GET_ELEMENT_ATTR: /* 0x20 */
+ case AVRC_PDU_GET_PLAY_STATUS: /* 0x30 */
+ if (avc_type == AVRC_CMD_STATUS)
+ result=TRUE;
+ break;
+
+ case AVRC_PDU_SET_PLAYER_APP_VALUE: /* 0x14 */
+ case AVRC_PDU_INFORM_DISPLAY_CHARSET: /* 0x17 */
+ case AVRC_PDU_INFORM_BATTERY_STAT_OF_CT: /* 0x18 */
+ case AVRC_PDU_REQUEST_CONTINUATION_RSP: /* 0x40 */
+ case AVRC_PDU_ABORT_CONTINUATION_RSP: /* 0x41 */
+ if (avc_type == AVRC_CMD_CTRL)
+ result=TRUE;
+ break;
+
+ case AVRC_PDU_REGISTER_NOTIFICATION: /* 0x31 */
+ if (avc_type == AVRC_CMD_NOTIF)
+ result=TRUE;
+ break;
+
+#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
+ case AVRC_PDU_SET_ABSOLUTE_VOLUME: /* 0x50 */
+ case AVRC_PDU_SET_ADDRESSED_PLAYER: /* 0x60 */
+ case AVRC_PDU_PLAY_ITEM: /* 0x74 */
+ case AVRC_PDU_ADD_TO_NOW_PLAYING: /* 0x90 */
+ if (avc_type == AVRC_CMD_CTRL)
+ result=TRUE;
+ break;
+#endif
+ }
+ }
+ else /* response msg */
+ {
+ if (avc_type >= AVRC_RSP_NOT_IMPL &&
+ avc_type <= AVRC_RSP_INTERIM )
+ result=TRUE;
+ }
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function avrc_is_valid_player_attrib_value
+**
+** Description Check if the given attrib value is valid for its attribute
+**
+**
+** Returns returns TRUE if it is valid
+**
+*******************************************************************************/
+BOOLEAN avrc_is_valid_player_attrib_value(UINT8 attrib, UINT8 value)
+{
+ BOOLEAN result=FALSE;
+
+ switch(attrib)
+ {
+ case AVRC_PLAYER_SETTING_EQUALIZER:
+ if ((value > 0) &&
+ (value <= AVRC_PLAYER_VAL_ON))
+ result=TRUE;
+ break;
+
+ case AVRC_PLAYER_SETTING_REPEAT:
+ if ((value > 0) &&
+ (value <= AVRC_PLAYER_VAL_GROUP_REPEAT))
+ result=TRUE;
+ break;
+
+ case AVRC_PLAYER_SETTING_SHUFFLE:
+ case AVRC_PLAYER_SETTING_SCAN:
+ if ((value > 0) &&
+ (value <= AVRC_PLAYER_VAL_GROUP_SHUFFLE))
+ result=TRUE;
+ break;
+ }
+
+ if (attrib >= AVRC_PLAYER_SETTING_LOW_MENU_EXT &&
+ attrib <= AVRC_PLAYER_SETTING_HIGH_MENU_EXT)
+ result = TRUE;
+
+ if (!result)
+ AVRC_TRACE_ERROR2("avrc_is_valid_player_attrib_value() found not matching attrib(x%x)-value(x%x) pair!", attrib, value);
+
+ return result;
+}
+
+/*******************************************************************************
+**
+** Function AVRC_IsValidPlayerAttr
+**
+** Description Check if the given attrib value is a valid one
+**
+**
+** Returns returns TRUE if it is valid
+**
+*******************************************************************************/
+BOOLEAN AVRC_IsValidPlayerAttr(UINT8 attr)
+{
+ BOOLEAN result=FALSE;
+
+ if ( (attr >= AVRC_PLAYER_SETTING_EQUALIZER && attr <= AVRC_PLAYER_SETTING_SCAN) ||
+ (attr >= AVRC_PLAYER_SETTING_LOW_MENU_EXT && attr <= AVRC_PLAYER_SETTING_HIGH_MENU_EXT) )
+ {
+ result = TRUE;
+ }
+
+ return result;
+}
+
+
+
+/*******************************************************************************
+**
+** Function avrc_pars_pass_thru
+**
+** Description This function parses the pass thru commands defined by
+** Bluetooth SIG
+**
+** Returns AVRC_STS_NO_ERROR, if the message in p_data is parsed successfully.
+** Otherwise, the error code defined by AVRCP 1.4
+**
+*******************************************************************************/
+tAVRC_STS avrc_pars_pass_thru(tAVRC_MSG_PASS *p_msg, UINT16 *p_vendor_unique_id)
+{
+ UINT8 *p_data;
+ UINT32 co_id;
+ UINT16 id;
+ tAVRC_STS status = AVRC_STS_BAD_CMD;
+
+ if (p_msg->op_id == AVRC_ID_VENDOR && p_msg->pass_len == AVRC_PASS_THRU_GROUP_LEN)
+ {
+ p_data = p_msg->p_pass_data;
+ AVRC_BE_STREAM_TO_CO_ID (co_id, p_data);
+ if (co_id == AVRC_CO_METADATA)
+ {
+ BE_STREAM_TO_UINT16 (id, p_data);
+ if (AVRC_IS_VALID_GROUP(id))
+ {
+ *p_vendor_unique_id = id;
+ status = AVRC_STS_NO_ERROR;
+ }
+ }
+ }
+ return status;
+}
+
+/*******************************************************************************
+**
+** Function avrc_opcode_from_pdu
+**
+** Description This function returns the opcode of the given pdu
+**
+** Returns AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
+**
+*******************************************************************************/
+UINT8 avrc_opcode_from_pdu(UINT8 pdu)
+{
+ UINT8 opcode = 0;
+
+ switch (pdu)
+ {
+#if (AVCT_BROWSE_INCLUDED == TRUE)
+ case AVRC_PDU_SET_BROWSED_PLAYER:
+ case AVRC_PDU_GET_FOLDER_ITEMS:
+ case AVRC_PDU_CHANGE_PATH:
+ case AVRC_PDU_GET_ITEM_ATTRIBUTES:
+ case AVRC_PDU_SEARCH:
+ case AVRC_PDU_GENERAL_REJECT:
+ opcode = AVRC_OP_BROWSE;
+ break;
+#endif /* AVCT_BROWSE_INCLUDED */
+
+ case AVRC_PDU_NEXT_GROUP:
+ case AVRC_PDU_PREV_GROUP: /* pass thru */
+ opcode = AVRC_OP_PASS_THRU;
+ break;
+
+ default: /* vendor */
+ opcode = AVRC_OP_VENDOR;
+ break;
+ }
+
+ return opcode;
+}
+
+/*******************************************************************************
+**
+** Function avrc_is_valid_opcode
+**
+** Description This function returns the opcode of the given pdu
+**
+** Returns AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
+**
+*******************************************************************************/
+BOOLEAN avrc_is_valid_opcode(UINT8 opcode)
+{
+ BOOLEAN is_valid = FALSE;
+ switch (opcode)
+ {
+ case AVRC_OP_BROWSE:
+ case AVRC_OP_PASS_THRU:
+ case AVRC_OP_VENDOR:
+ is_valid = TRUE;
+ break;
+ }
+ return is_valid;
+}
+
+#endif /* (AVRC_METADATA_INCLUDED == TRUE) */
+