Home | History | Annotate | Download | only in avrc
      1 /******************************************************************************
      2  *
      3  *  Copyright 2003-2016 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 #include <string.h>
     19 
     20 #include "avrc_api.h"
     21 #include "avrc_int.h"
     22 #include "bt_common.h"
     23 
     24 /**************************************************************************
     25  *
     26  * Function         AVRC_IsValidAvcType
     27  *
     28  * Description      Check if correct AVC type is specified
     29  *
     30  * Returns          returns true if it is valid
     31  *
     32  *
     33  ******************************************************************************/
     34 bool AVRC_IsValidAvcType(uint8_t pdu_id, uint8_t avc_type) {
     35   bool result = false;
     36 
     37   if (avc_type < AVRC_RSP_NOT_IMPL) /* command msg */
     38   {
     39     switch (pdu_id) {
     40       case AVRC_PDU_GET_CAPABILITIES:          /* 0x10 */
     41       case AVRC_PDU_LIST_PLAYER_APP_ATTR:      /* 0x11 */
     42       case AVRC_PDU_LIST_PLAYER_APP_VALUES:    /* 0x12 */
     43       case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:  /* 0x13 */
     44       case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:  /* 0x15 */
     45       case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT: /* 0x16 */
     46       case AVRC_PDU_GET_ELEMENT_ATTR:          /* 0x20 */
     47       case AVRC_PDU_GET_PLAY_STATUS:           /* 0x30 */
     48         if (avc_type == AVRC_CMD_STATUS) result = true;
     49         break;
     50 
     51       case AVRC_PDU_SET_PLAYER_APP_VALUE:      /* 0x14 */
     52       case AVRC_PDU_INFORM_DISPLAY_CHARSET:    /* 0x17 */
     53       case AVRC_PDU_INFORM_BATTERY_STAT_OF_CT: /* 0x18 */
     54       case AVRC_PDU_REQUEST_CONTINUATION_RSP:  /* 0x40 */
     55       case AVRC_PDU_ABORT_CONTINUATION_RSP:    /* 0x41 */
     56         if (avc_type == AVRC_CMD_CTRL) result = true;
     57         break;
     58 
     59       case AVRC_PDU_GET_FOLDER_ITEMS: /* 0x71 */
     60         result = true;
     61         break;
     62 
     63       case AVRC_PDU_SET_ABSOLUTE_VOLUME:  /* 0x50 */
     64       case AVRC_PDU_SET_ADDRESSED_PLAYER: /* 0x60 */
     65       case AVRC_PDU_PLAY_ITEM:            /* 0x74 */
     66       case AVRC_PDU_ADD_TO_NOW_PLAYING:   /* 0x90 */
     67         if (avc_type == AVRC_CMD_CTRL) result = true;
     68         break;
     69 
     70       case AVRC_PDU_REGISTER_NOTIFICATION: /* 0x31 */
     71         if (avc_type == AVRC_CMD_NOTIF) result = true;
     72         break;
     73     }
     74   } else /* response msg */
     75   {
     76     if (avc_type >= AVRC_RSP_NOT_IMPL && avc_type <= AVRC_RSP_INTERIM)
     77       result = true;
     78   }
     79 
     80   return result;
     81 }
     82 
     83 /*******************************************************************************
     84  *
     85  * Function         avrc_is_valid_player_attrib_value
     86  *
     87  * Description      Check if the given attrib value is valid for its attribute
     88  *
     89  * Returns          returns true if it is valid
     90  *
     91  ******************************************************************************/
     92 bool avrc_is_valid_player_attrib_value(uint8_t attrib, uint8_t value) {
     93   bool result = false;
     94 
     95   switch (attrib) {
     96     case AVRC_PLAYER_SETTING_EQUALIZER:
     97       if ((value > 0) && (value <= AVRC_PLAYER_VAL_ON)) result = true;
     98       break;
     99 
    100     case AVRC_PLAYER_SETTING_REPEAT:
    101       if ((value > 0) && (value <= AVRC_PLAYER_VAL_GROUP_REPEAT)) result = true;
    102       break;
    103 
    104     case AVRC_PLAYER_SETTING_SHUFFLE:
    105     case AVRC_PLAYER_SETTING_SCAN:
    106       if ((value > 0) && (value <= AVRC_PLAYER_VAL_GROUP_SHUFFLE))
    107         result = true;
    108       break;
    109   }
    110 
    111   if (attrib >= AVRC_PLAYER_SETTING_LOW_MENU_EXT) result = true;
    112 
    113   if (!result) {
    114     AVRC_TRACE_ERROR(" %s found not matching attrib(x%x)-value(x%x) pair!",
    115                      __func__, attrib, value);
    116   }
    117   return result;
    118 }
    119 
    120 /*******************************************************************************
    121  *
    122  * Function         AVRC_IsValidPlayerAttr
    123  *
    124  * Description      Check if the given attrib value is a valid one
    125  *
    126  * Returns          returns true if it is valid
    127  *
    128  ******************************************************************************/
    129 bool AVRC_IsValidPlayerAttr(uint8_t attr) {
    130   bool result = false;
    131 
    132   if ((attr >= AVRC_PLAYER_SETTING_EQUALIZER &&
    133        attr <= AVRC_PLAYER_SETTING_SCAN) ||
    134       (attr >= AVRC_PLAYER_SETTING_LOW_MENU_EXT)) {
    135     result = true;
    136   }
    137 
    138   return result;
    139 }
    140 
    141 /*******************************************************************************
    142  *
    143  * Function         avrc_pars_pass_thru
    144  *
    145  * Description      This function parses the pass thru commands defined by
    146  *                  Bluetooth SIG
    147  *
    148  * Returns          AVRC_STS_NO_ERROR, if the message in p_data is parsed
    149  *                                     successfully.
    150  *                  Otherwise, the error code defined by AVRCP 1.4
    151  *
    152  ******************************************************************************/
    153 tAVRC_STS avrc_pars_pass_thru(tAVRC_MSG_PASS* p_msg,
    154                               uint16_t* p_vendor_unique_id) {
    155   uint8_t* p_data;
    156   uint32_t co_id;
    157   uint16_t id;
    158   tAVRC_STS status = AVRC_STS_BAD_CMD;
    159 
    160   if (p_msg->op_id == AVRC_ID_VENDOR &&
    161       p_msg->pass_len == AVRC_PASS_THRU_GROUP_LEN) {
    162     p_data = p_msg->p_pass_data;
    163     AVRC_BE_STREAM_TO_CO_ID(co_id, p_data);
    164     if (co_id == AVRC_CO_METADATA) {
    165       BE_STREAM_TO_UINT16(id, p_data);
    166       if (AVRC_IS_VALID_GROUP(id)) {
    167         *p_vendor_unique_id = id;
    168         status = AVRC_STS_NO_ERROR;
    169       }
    170     }
    171   }
    172   return status;
    173 }
    174 
    175 /*******************************************************************************
    176  *
    177  * Function         avrc_opcode_from_pdu
    178  *
    179  * Description      This function returns the opcode of the given pdu
    180  *
    181  * Returns          AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
    182  *
    183  ******************************************************************************/
    184 uint8_t avrc_opcode_from_pdu(uint8_t pdu) {
    185   uint8_t opcode = 0;
    186 
    187   switch (pdu) {
    188     case AVRC_PDU_SET_BROWSED_PLAYER:
    189     case AVRC_PDU_GET_FOLDER_ITEMS:
    190     case AVRC_PDU_CHANGE_PATH:
    191     case AVRC_PDU_GET_ITEM_ATTRIBUTES:
    192     case AVRC_PDU_SEARCH:
    193     case AVRC_PDU_GENERAL_REJECT:
    194     case AVRC_PDU_GET_TOTAL_NUM_OF_ITEMS:
    195       opcode = AVRC_OP_BROWSE;
    196       break;
    197 
    198     case AVRC_PDU_NEXT_GROUP:
    199     case AVRC_PDU_PREV_GROUP: /* pass thru */
    200       opcode = AVRC_OP_PASS_THRU;
    201       break;
    202 
    203     default: /* vendor */
    204       opcode = AVRC_OP_VENDOR;
    205       break;
    206   }
    207 
    208   return opcode;
    209 }
    210 
    211 /*******************************************************************************
    212  *
    213  * Function         avrc_is_valid_opcode
    214  *
    215  * Description      This function returns the opcode of the given pdu
    216  *
    217  * Returns          AVRC_OP_VENDOR, AVRC_OP_PASS_THRU or AVRC_OP_BROWSE
    218  *
    219  ******************************************************************************/
    220 bool avrc_is_valid_opcode(uint8_t opcode) {
    221   bool is_valid = false;
    222   switch (opcode) {
    223     case AVRC_OP_BROWSE:
    224     case AVRC_OP_PASS_THRU:
    225     case AVRC_OP_VENDOR:
    226       is_valid = true;
    227       break;
    228   }
    229   return is_valid;
    230 }
    231