1/******************************************************************************
2 *
3 *  Copyright (C) 2015 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
19#include "base/logging.h"
20
21#include "device/include/esco_parameters.h"
22
23static const enh_esco_params_t default_esco_parameters[ESCO_NUM_CODECS] = {
24    // CVSD
25    {.transmit_bandwidth = TXRX_64KBITS_RATE,
26     .receive_bandwidth = TXRX_64KBITS_RATE,
27     .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_CVSD,
28                                .company_id = 0x0000,
29                                .vendor_specific_codec_id = 0x0000},
30     .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_CVSD,
31                               .company_id = 0x0000,
32                               .vendor_specific_codec_id = 0x0000},
33     .transmit_codec_frame_size = 60,
34     .receive_codec_frame_size = 60,
35     .input_bandwidth = INPUT_OUTPUT_64K_RATE,
36     .output_bandwidth = INPUT_OUTPUT_64K_RATE,
37     .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
38                             .company_id = 0x0000,
39                             .vendor_specific_codec_id = 0x0000},
40     .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
41                              .company_id = 0x0000,
42                              .vendor_specific_codec_id = 0x0000},
43     .input_coded_data_size = 16,
44     .output_coded_data_size = 16,
45     .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
46     .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
47     .input_pcm_payload_msb_position = 0,
48     .output_pcm_payload_msb_position = 0,
49     .input_data_path = ESCO_DATA_PATH_PCM,
50     .output_data_path = ESCO_DATA_PATH_PCM,
51     .input_transport_unit_size = 0x00,
52     .output_transport_unit_size = 0x00,
53#if (BTA_HFP_VERSION >= HFP_VERSION_1_7)
54     .max_latency_ms = 12,
55#else
56     .max_latency_ms = 10,
57#endif
58
59     .packet_types =
60         (ESCO_PKT_TYPES_MASK_HV1 | ESCO_PKT_TYPES_MASK_HV2 |
61          ESCO_PKT_TYPES_MASK_HV3 | ESCO_PKT_TYPES_MASK_EV3 |
62          ESCO_PKT_TYPES_MASK_EV4 | ESCO_PKT_TYPES_MASK_EV5 |
63          ESCO_PKT_TYPES_MASK_NO_3_EV3 | ESCO_PKT_TYPES_MASK_NO_2_EV5 |
64          ESCO_PKT_TYPES_MASK_NO_3_EV5),
65#if (BTA_HFP_VERSION >= HFP_VERSION_1_7)
66     .retransmission_effort = ESCO_RETRANSMISSION_QUALITY
67#else
68     .retransmission_effort = ESCO_RETRANSMISSION_POWER
69#endif
70
71    },
72    // mSBC T1
73    {.transmit_bandwidth = TXRX_64KBITS_RATE,
74     .receive_bandwidth = TXRX_64KBITS_RATE,
75     .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC,
76                                .company_id = 0x0000,
77                                .vendor_specific_codec_id = 0x0000},
78     .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC,
79                               .company_id = 0x0000,
80                               .vendor_specific_codec_id = 0x0000},
81     .transmit_codec_frame_size = 60,
82     .receive_codec_frame_size = 60,
83     .input_bandwidth = INPUT_OUTPUT_128K_RATE,
84     .output_bandwidth = INPUT_OUTPUT_128K_RATE,
85     .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
86                             .company_id = 0x0000,
87                             .vendor_specific_codec_id = 0x0000},
88     .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
89                              .company_id = 0x0000,
90                              .vendor_specific_codec_id = 0x0000},
91     .input_coded_data_size = 16,
92     .output_coded_data_size = 16,
93     .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
94     .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
95     .input_pcm_payload_msb_position = 0,
96     .output_pcm_payload_msb_position = 0,
97     .input_data_path = ESCO_DATA_PATH_PCM,
98     .output_data_path = ESCO_DATA_PATH_PCM,
99     .input_transport_unit_size = 0x00,
100     .output_transport_unit_size = 0x00,
101     .max_latency_ms = 8,
102     .packet_types =
103         (ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 |
104          ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5 |
105          ESCO_PKT_TYPES_MASK_NO_2_EV3),
106     .retransmission_effort = ESCO_RETRANSMISSION_QUALITY},
107    // mSBC T2
108    {.transmit_bandwidth = TXRX_64KBITS_RATE,
109     .receive_bandwidth = TXRX_64KBITS_RATE,
110     .transmit_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC,
111                                .company_id = 0x0000,
112                                .vendor_specific_codec_id = 0x0000},
113     .receive_coding_format = {.coding_format = ESCO_CODING_FORMAT_MSBC,
114                               .company_id = 0x0000,
115                               .vendor_specific_codec_id = 0x0000},
116     .transmit_codec_frame_size = 60,
117     .receive_codec_frame_size = 60,
118     .input_bandwidth = INPUT_OUTPUT_128K_RATE,
119     .output_bandwidth = INPUT_OUTPUT_128K_RATE,
120     .input_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
121                             .company_id = 0x0000,
122                             .vendor_specific_codec_id = 0x0000},
123     .output_coding_format = {.coding_format = ESCO_CODING_FORMAT_LINEAR,
124                              .company_id = 0x0000,
125                              .vendor_specific_codec_id = 0x0000},
126     .input_coded_data_size = 16,
127     .output_coded_data_size = 16,
128     .input_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
129     .output_pcm_data_format = ESCO_PCM_DATA_FORMAT_2_COMP,
130     .input_pcm_payload_msb_position = 0,
131     .output_pcm_payload_msb_position = 0,
132     .input_data_path = ESCO_DATA_PATH_PCM,
133     .output_data_path = ESCO_DATA_PATH_PCM,
134     .input_transport_unit_size = 0x00,
135     .output_transport_unit_size = 0x00,
136     .max_latency_ms = 13,
137     .packet_types =
138         (ESCO_PKT_TYPES_MASK_EV3 | ESCO_PKT_TYPES_MASK_NO_3_EV3 |
139          ESCO_PKT_TYPES_MASK_NO_2_EV5 | ESCO_PKT_TYPES_MASK_NO_3_EV5),
140     .retransmission_effort = ESCO_RETRANSMISSION_QUALITY}};
141
142enh_esco_params_t esco_parameters_for_codec(esco_codec_t codec) {
143  CHECK(codec >= 0) << "codec index " << (int)codec << "< 0";
144  CHECK(codec < ESCO_NUM_CODECS) << "codec index " << (int)codec << " > "
145                                 << ESCO_NUM_CODECS;
146  return default_esco_parameters[codec];
147}
148