18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci#include "hpi_internal.h" 48c2ecf20Sopenharmony_ci#include "hpimsginit.h" 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include "hpidebug.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_cistruct hpi_handle { 98c2ecf20Sopenharmony_ci unsigned int obj_index:12; 108c2ecf20Sopenharmony_ci unsigned int obj_type:4; 118c2ecf20Sopenharmony_ci unsigned int adapter_index:14; 128c2ecf20Sopenharmony_ci unsigned int spare:1; 138c2ecf20Sopenharmony_ci unsigned int read_only:1; 148c2ecf20Sopenharmony_ci}; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciunion handle_word { 178c2ecf20Sopenharmony_ci struct hpi_handle h; 188c2ecf20Sopenharmony_ci u32 w; 198c2ecf20Sopenharmony_ci}; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciu32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index, 228c2ecf20Sopenharmony_ci const u16 object_index) 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci union handle_word handle; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci handle.h.adapter_index = adapter_index; 278c2ecf20Sopenharmony_ci handle.h.spare = 0; 288c2ecf20Sopenharmony_ci handle.h.read_only = 0; 298c2ecf20Sopenharmony_ci handle.h.obj_type = c_object; 308c2ecf20Sopenharmony_ci handle.h.obj_index = object_index; 318c2ecf20Sopenharmony_ci return handle.w; 328c2ecf20Sopenharmony_ci} 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistatic u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2) 358c2ecf20Sopenharmony_ci{ 368c2ecf20Sopenharmony_ci union handle_word uhandle; 378c2ecf20Sopenharmony_ci if (!h) 388c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci uhandle.w = h; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci *p1 = (u16)uhandle.h.adapter_index; 438c2ecf20Sopenharmony_ci if (p2) 448c2ecf20Sopenharmony_ci *p2 = (u16)uhandle.h.obj_index; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci return 0; 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_civoid hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index, 508c2ecf20Sopenharmony_ci u16 *pw_object_index) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci hpi_handle_indexes(handle, pw_adapter_index, pw_object_index); 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_cichar hpi_handle_object(const u32 handle) 568c2ecf20Sopenharmony_ci{ 578c2ecf20Sopenharmony_ci union handle_word uhandle; 588c2ecf20Sopenharmony_ci uhandle.w = handle; 598c2ecf20Sopenharmony_ci return (char)uhandle.h.obj_type; 608c2ecf20Sopenharmony_ci} 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_civoid hpi_format_to_msg(struct hpi_msg_format *pMF, 638c2ecf20Sopenharmony_ci const struct hpi_format *pF) 648c2ecf20Sopenharmony_ci{ 658c2ecf20Sopenharmony_ci pMF->sample_rate = pF->sample_rate; 668c2ecf20Sopenharmony_ci pMF->bit_rate = pF->bit_rate; 678c2ecf20Sopenharmony_ci pMF->attributes = pF->attributes; 688c2ecf20Sopenharmony_ci pMF->channels = pF->channels; 698c2ecf20Sopenharmony_ci pMF->format = pF->format; 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistatic void hpi_msg_to_format(struct hpi_format *pF, 738c2ecf20Sopenharmony_ci struct hpi_msg_format *pMF) 748c2ecf20Sopenharmony_ci{ 758c2ecf20Sopenharmony_ci pF->sample_rate = pMF->sample_rate; 768c2ecf20Sopenharmony_ci pF->bit_rate = pMF->bit_rate; 778c2ecf20Sopenharmony_ci pF->attributes = pMF->attributes; 788c2ecf20Sopenharmony_ci pF->channels = pMF->channels; 798c2ecf20Sopenharmony_ci pF->format = pMF->format; 808c2ecf20Sopenharmony_ci pF->mode_legacy = 0; 818c2ecf20Sopenharmony_ci pF->unused = 0; 828c2ecf20Sopenharmony_ci} 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_civoid hpi_stream_response_to_legacy(struct hpi_stream_res *pSR) 858c2ecf20Sopenharmony_ci{ 868c2ecf20Sopenharmony_ci pSR->u.legacy_stream_info.auxiliary_data_available = 878c2ecf20Sopenharmony_ci pSR->u.stream_info.auxiliary_data_available; 888c2ecf20Sopenharmony_ci pSR->u.legacy_stream_info.state = pSR->u.stream_info.state; 898c2ecf20Sopenharmony_ci} 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic inline void hpi_send_recvV1(struct hpi_message_header *m, 928c2ecf20Sopenharmony_ci struct hpi_response_header *r) 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r); 958c2ecf20Sopenharmony_ci} 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ciu16 hpi_subsys_get_version_ex(u32 *pversion_ex) 988c2ecf20Sopenharmony_ci{ 998c2ecf20Sopenharmony_ci struct hpi_message hm; 1008c2ecf20Sopenharmony_ci struct hpi_response hr; 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 1038c2ecf20Sopenharmony_ci HPI_SUBSYS_GET_VERSION); 1048c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1058c2ecf20Sopenharmony_ci *pversion_ex = hr.u.s.data; 1068c2ecf20Sopenharmony_ci return hr.error; 1078c2ecf20Sopenharmony_ci} 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ciu16 hpi_subsys_get_num_adapters(int *pn_num_adapters) 1108c2ecf20Sopenharmony_ci{ 1118c2ecf20Sopenharmony_ci struct hpi_message hm; 1128c2ecf20Sopenharmony_ci struct hpi_response hr; 1138c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 1148c2ecf20Sopenharmony_ci HPI_SUBSYS_GET_NUM_ADAPTERS); 1158c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1168c2ecf20Sopenharmony_ci *pn_num_adapters = (int)hr.u.s.num_adapters; 1178c2ecf20Sopenharmony_ci return hr.error; 1188c2ecf20Sopenharmony_ci} 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ciu16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index, 1218c2ecf20Sopenharmony_ci u16 *pw_adapter_type) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci struct hpi_message hm; 1248c2ecf20Sopenharmony_ci struct hpi_response hr; 1258c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 1268c2ecf20Sopenharmony_ci HPI_SUBSYS_GET_ADAPTER); 1278c2ecf20Sopenharmony_ci hm.obj_index = (u16)iterator; 1288c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1298c2ecf20Sopenharmony_ci *padapter_index = (int)hr.u.s.adapter_index; 1308c2ecf20Sopenharmony_ci *pw_adapter_type = hr.u.s.adapter_type; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci return hr.error; 1338c2ecf20Sopenharmony_ci} 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ciu16 hpi_adapter_open(u16 adapter_index) 1368c2ecf20Sopenharmony_ci{ 1378c2ecf20Sopenharmony_ci struct hpi_message hm; 1388c2ecf20Sopenharmony_ci struct hpi_response hr; 1398c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 1408c2ecf20Sopenharmony_ci HPI_ADAPTER_OPEN); 1418c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci return hr.error; 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ci} 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ciu16 hpi_adapter_close(u16 adapter_index) 1508c2ecf20Sopenharmony_ci{ 1518c2ecf20Sopenharmony_ci struct hpi_message hm; 1528c2ecf20Sopenharmony_ci struct hpi_response hr; 1538c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 1548c2ecf20Sopenharmony_ci HPI_ADAPTER_CLOSE); 1558c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci return hr.error; 1608c2ecf20Sopenharmony_ci} 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ciu16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode) 1638c2ecf20Sopenharmony_ci{ 1648c2ecf20Sopenharmony_ci return hpi_adapter_set_mode_ex(adapter_index, adapter_mode, 1658c2ecf20Sopenharmony_ci HPI_ADAPTER_MODE_SET); 1668c2ecf20Sopenharmony_ci} 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_ciu16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode, 1698c2ecf20Sopenharmony_ci u16 query_or_set) 1708c2ecf20Sopenharmony_ci{ 1718c2ecf20Sopenharmony_ci struct hpi_message hm; 1728c2ecf20Sopenharmony_ci struct hpi_response hr; 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 1758c2ecf20Sopenharmony_ci HPI_ADAPTER_SET_MODE); 1768c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 1778c2ecf20Sopenharmony_ci hm.u.ax.mode.adapter_mode = adapter_mode; 1788c2ecf20Sopenharmony_ci hm.u.ax.mode.query_or_set = query_or_set; 1798c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1808c2ecf20Sopenharmony_ci return hr.error; 1818c2ecf20Sopenharmony_ci} 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ciu16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode) 1848c2ecf20Sopenharmony_ci{ 1858c2ecf20Sopenharmony_ci struct hpi_message hm; 1868c2ecf20Sopenharmony_ci struct hpi_response hr; 1878c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 1888c2ecf20Sopenharmony_ci HPI_ADAPTER_GET_MODE); 1898c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 1908c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 1918c2ecf20Sopenharmony_ci if (padapter_mode) 1928c2ecf20Sopenharmony_ci *padapter_mode = hr.u.ax.mode.adapter_mode; 1938c2ecf20Sopenharmony_ci return hr.error; 1948c2ecf20Sopenharmony_ci} 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ciu16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams, 1978c2ecf20Sopenharmony_ci u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number, 1988c2ecf20Sopenharmony_ci u16 *pw_adapter_type) 1998c2ecf20Sopenharmony_ci{ 2008c2ecf20Sopenharmony_ci struct hpi_message hm; 2018c2ecf20Sopenharmony_ci struct hpi_response hr; 2028c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 2038c2ecf20Sopenharmony_ci HPI_ADAPTER_GET_INFO); 2048c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci *pw_adapter_type = hr.u.ax.info.adapter_type; 2098c2ecf20Sopenharmony_ci *pw_num_outstreams = hr.u.ax.info.num_outstreams; 2108c2ecf20Sopenharmony_ci *pw_num_instreams = hr.u.ax.info.num_instreams; 2118c2ecf20Sopenharmony_ci *pw_version = hr.u.ax.info.version; 2128c2ecf20Sopenharmony_ci *pserial_number = hr.u.ax.info.serial_number; 2138c2ecf20Sopenharmony_ci return hr.error; 2148c2ecf20Sopenharmony_ci} 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_ciu16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index, 2178c2ecf20Sopenharmony_ci u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version, 2188c2ecf20Sopenharmony_ci u32 *pserial_number, u16 *pw_module_type, u32 *ph_module) 2198c2ecf20Sopenharmony_ci{ 2208c2ecf20Sopenharmony_ci struct hpi_message hm; 2218c2ecf20Sopenharmony_ci struct hpi_response hr; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 2248c2ecf20Sopenharmony_ci HPI_ADAPTER_MODULE_INFO); 2258c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 2268c2ecf20Sopenharmony_ci hm.u.ax.module_info.index = module_index; 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci *pw_module_type = hr.u.ax.info.adapter_type; 2318c2ecf20Sopenharmony_ci *pw_num_outputs = hr.u.ax.info.num_outstreams; 2328c2ecf20Sopenharmony_ci *pw_num_inputs = hr.u.ax.info.num_instreams; 2338c2ecf20Sopenharmony_ci *pw_version = hr.u.ax.info.version; 2348c2ecf20Sopenharmony_ci *pserial_number = hr.u.ax.info.serial_number; 2358c2ecf20Sopenharmony_ci *ph_module = 0; 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci return hr.error; 2388c2ecf20Sopenharmony_ci} 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ciu16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1, 2418c2ecf20Sopenharmony_ci u16 parameter2) 2428c2ecf20Sopenharmony_ci{ 2438c2ecf20Sopenharmony_ci struct hpi_message hm; 2448c2ecf20Sopenharmony_ci struct hpi_response hr; 2458c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 2468c2ecf20Sopenharmony_ci HPI_ADAPTER_SET_PROPERTY); 2478c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 2488c2ecf20Sopenharmony_ci hm.u.ax.property_set.property = property; 2498c2ecf20Sopenharmony_ci hm.u.ax.property_set.parameter1 = parameter1; 2508c2ecf20Sopenharmony_ci hm.u.ax.property_set.parameter2 = parameter2; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci return hr.error; 2558c2ecf20Sopenharmony_ci} 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ciu16 hpi_adapter_get_property(u16 adapter_index, u16 property, 2588c2ecf20Sopenharmony_ci u16 *pw_parameter1, u16 *pw_parameter2) 2598c2ecf20Sopenharmony_ci{ 2608c2ecf20Sopenharmony_ci struct hpi_message hm; 2618c2ecf20Sopenharmony_ci struct hpi_response hr; 2628c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 2638c2ecf20Sopenharmony_ci HPI_ADAPTER_GET_PROPERTY); 2648c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 2658c2ecf20Sopenharmony_ci hm.u.ax.property_set.property = property; 2668c2ecf20Sopenharmony_ci 2678c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 2688c2ecf20Sopenharmony_ci if (!hr.error) { 2698c2ecf20Sopenharmony_ci if (pw_parameter1) 2708c2ecf20Sopenharmony_ci *pw_parameter1 = hr.u.ax.property_get.parameter1; 2718c2ecf20Sopenharmony_ci if (pw_parameter2) 2728c2ecf20Sopenharmony_ci *pw_parameter2 = hr.u.ax.property_get.parameter2; 2738c2ecf20Sopenharmony_ci } 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci return hr.error; 2768c2ecf20Sopenharmony_ci} 2778c2ecf20Sopenharmony_ci 2788c2ecf20Sopenharmony_ciu16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index, 2798c2ecf20Sopenharmony_ci u16 what_to_enumerate, u16 property_index, u32 *psetting) 2808c2ecf20Sopenharmony_ci{ 2818c2ecf20Sopenharmony_ci return 0; 2828c2ecf20Sopenharmony_ci} 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ciu16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format, 2858c2ecf20Sopenharmony_ci u32 sample_rate, u32 bit_rate, u32 attributes) 2868c2ecf20Sopenharmony_ci{ 2878c2ecf20Sopenharmony_ci u16 err = 0; 2888c2ecf20Sopenharmony_ci struct hpi_msg_format fmt; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci switch (channels) { 2918c2ecf20Sopenharmony_ci case 1: 2928c2ecf20Sopenharmony_ci case 2: 2938c2ecf20Sopenharmony_ci case 4: 2948c2ecf20Sopenharmony_ci case 6: 2958c2ecf20Sopenharmony_ci case 8: 2968c2ecf20Sopenharmony_ci case 16: 2978c2ecf20Sopenharmony_ci break; 2988c2ecf20Sopenharmony_ci default: 2998c2ecf20Sopenharmony_ci err = HPI_ERROR_INVALID_CHANNELS; 3008c2ecf20Sopenharmony_ci return err; 3018c2ecf20Sopenharmony_ci } 3028c2ecf20Sopenharmony_ci fmt.channels = channels; 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ci switch (format) { 3058c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_SIGNED: 3068c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM24_SIGNED: 3078c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_SIGNED: 3088c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_FLOAT: 3098c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_BIGENDIAN: 3108c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM8_UNSIGNED: 3118c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L1: 3128c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L2: 3138c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L3: 3148c2ecf20Sopenharmony_ci case HPI_FORMAT_DOLBY_AC2: 3158c2ecf20Sopenharmony_ci case HPI_FORMAT_AA_TAGIT1_HITS: 3168c2ecf20Sopenharmony_ci case HPI_FORMAT_AA_TAGIT1_INSERTS: 3178c2ecf20Sopenharmony_ci case HPI_FORMAT_RAW_BITSTREAM: 3188c2ecf20Sopenharmony_ci case HPI_FORMAT_AA_TAGIT1_HITS_EX1: 3198c2ecf20Sopenharmony_ci case HPI_FORMAT_OEM1: 3208c2ecf20Sopenharmony_ci case HPI_FORMAT_OEM2: 3218c2ecf20Sopenharmony_ci break; 3228c2ecf20Sopenharmony_ci default: 3238c2ecf20Sopenharmony_ci err = HPI_ERROR_INVALID_FORMAT; 3248c2ecf20Sopenharmony_ci return err; 3258c2ecf20Sopenharmony_ci } 3268c2ecf20Sopenharmony_ci fmt.format = format; 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_ci if (sample_rate < 8000L) { 3298c2ecf20Sopenharmony_ci err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; 3308c2ecf20Sopenharmony_ci sample_rate = 8000L; 3318c2ecf20Sopenharmony_ci } 3328c2ecf20Sopenharmony_ci if (sample_rate > 200000L) { 3338c2ecf20Sopenharmony_ci err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; 3348c2ecf20Sopenharmony_ci sample_rate = 200000L; 3358c2ecf20Sopenharmony_ci } 3368c2ecf20Sopenharmony_ci fmt.sample_rate = sample_rate; 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci switch (format) { 3398c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L1: 3408c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L2: 3418c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L3: 3428c2ecf20Sopenharmony_ci fmt.bit_rate = bit_rate; 3438c2ecf20Sopenharmony_ci break; 3448c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_SIGNED: 3458c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_BIGENDIAN: 3468c2ecf20Sopenharmony_ci fmt.bit_rate = channels * sample_rate * 2; 3478c2ecf20Sopenharmony_ci break; 3488c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_SIGNED: 3498c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_FLOAT: 3508c2ecf20Sopenharmony_ci fmt.bit_rate = channels * sample_rate * 4; 3518c2ecf20Sopenharmony_ci break; 3528c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM8_UNSIGNED: 3538c2ecf20Sopenharmony_ci fmt.bit_rate = channels * sample_rate; 3548c2ecf20Sopenharmony_ci break; 3558c2ecf20Sopenharmony_ci default: 3568c2ecf20Sopenharmony_ci fmt.bit_rate = 0; 3578c2ecf20Sopenharmony_ci } 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci switch (format) { 3608c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L2: 3618c2ecf20Sopenharmony_ci if ((channels == 1) 3628c2ecf20Sopenharmony_ci && (attributes != HPI_MPEG_MODE_DEFAULT)) { 3638c2ecf20Sopenharmony_ci attributes = HPI_MPEG_MODE_DEFAULT; 3648c2ecf20Sopenharmony_ci err = HPI_ERROR_INVALID_FORMAT; 3658c2ecf20Sopenharmony_ci } else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) { 3668c2ecf20Sopenharmony_ci attributes = HPI_MPEG_MODE_DEFAULT; 3678c2ecf20Sopenharmony_ci err = HPI_ERROR_INVALID_FORMAT; 3688c2ecf20Sopenharmony_ci } 3698c2ecf20Sopenharmony_ci fmt.attributes = attributes; 3708c2ecf20Sopenharmony_ci break; 3718c2ecf20Sopenharmony_ci default: 3728c2ecf20Sopenharmony_ci fmt.attributes = attributes; 3738c2ecf20Sopenharmony_ci } 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_ci hpi_msg_to_format(p_format, &fmt); 3768c2ecf20Sopenharmony_ci return err; 3778c2ecf20Sopenharmony_ci} 3788c2ecf20Sopenharmony_ci 3798c2ecf20Sopenharmony_ciu16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format, 3808c2ecf20Sopenharmony_ci u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size) 3818c2ecf20Sopenharmony_ci{ 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci u32 bytes_per_second; 3848c2ecf20Sopenharmony_ci u32 size; 3858c2ecf20Sopenharmony_ci u16 channels; 3868c2ecf20Sopenharmony_ci struct hpi_format *pF = p_format; 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci channels = pF->channels; 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci switch (pF->format) { 3918c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_BIGENDIAN: 3928c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM16_SIGNED: 3938c2ecf20Sopenharmony_ci bytes_per_second = pF->sample_rate * 2L * channels; 3948c2ecf20Sopenharmony_ci break; 3958c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM24_SIGNED: 3968c2ecf20Sopenharmony_ci bytes_per_second = pF->sample_rate * 3L * channels; 3978c2ecf20Sopenharmony_ci break; 3988c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_SIGNED: 3998c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM32_FLOAT: 4008c2ecf20Sopenharmony_ci bytes_per_second = pF->sample_rate * 4L * channels; 4018c2ecf20Sopenharmony_ci break; 4028c2ecf20Sopenharmony_ci case HPI_FORMAT_PCM8_UNSIGNED: 4038c2ecf20Sopenharmony_ci bytes_per_second = pF->sample_rate * 1L * channels; 4048c2ecf20Sopenharmony_ci break; 4058c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L1: 4068c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L2: 4078c2ecf20Sopenharmony_ci case HPI_FORMAT_MPEG_L3: 4088c2ecf20Sopenharmony_ci bytes_per_second = pF->bit_rate / 8L; 4098c2ecf20Sopenharmony_ci break; 4108c2ecf20Sopenharmony_ci case HPI_FORMAT_DOLBY_AC2: 4118c2ecf20Sopenharmony_ci 4128c2ecf20Sopenharmony_ci bytes_per_second = 256000L / 8L; 4138c2ecf20Sopenharmony_ci break; 4148c2ecf20Sopenharmony_ci default: 4158c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_FORMAT; 4168c2ecf20Sopenharmony_ci } 4178c2ecf20Sopenharmony_ci size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) / 4188c2ecf20Sopenharmony_ci 1000L; 4198c2ecf20Sopenharmony_ci 4208c2ecf20Sopenharmony_ci *recommended_buffer_size = 4218c2ecf20Sopenharmony_ci roundup_pow_of_two(((size + 4095L) & ~4095L)); 4228c2ecf20Sopenharmony_ci return 0; 4238c2ecf20Sopenharmony_ci} 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ciu16 hpi_outstream_open(u16 adapter_index, u16 outstream_index, 4268c2ecf20Sopenharmony_ci u32 *ph_outstream) 4278c2ecf20Sopenharmony_ci{ 4288c2ecf20Sopenharmony_ci struct hpi_message hm; 4298c2ecf20Sopenharmony_ci struct hpi_response hr; 4308c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 4318c2ecf20Sopenharmony_ci HPI_OSTREAM_OPEN); 4328c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 4338c2ecf20Sopenharmony_ci hm.obj_index = outstream_index; 4348c2ecf20Sopenharmony_ci 4358c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 4368c2ecf20Sopenharmony_ci 4378c2ecf20Sopenharmony_ci if (hr.error == 0) 4388c2ecf20Sopenharmony_ci *ph_outstream = 4398c2ecf20Sopenharmony_ci hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index, 4408c2ecf20Sopenharmony_ci outstream_index); 4418c2ecf20Sopenharmony_ci else 4428c2ecf20Sopenharmony_ci *ph_outstream = 0; 4438c2ecf20Sopenharmony_ci return hr.error; 4448c2ecf20Sopenharmony_ci} 4458c2ecf20Sopenharmony_ci 4468c2ecf20Sopenharmony_ciu16 hpi_outstream_close(u32 h_outstream) 4478c2ecf20Sopenharmony_ci{ 4488c2ecf20Sopenharmony_ci struct hpi_message hm; 4498c2ecf20Sopenharmony_ci struct hpi_response hr; 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 4528c2ecf20Sopenharmony_ci HPI_OSTREAM_HOSTBUFFER_FREE); 4538c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 4548c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 4558c2ecf20Sopenharmony_ci 4568c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 4578c2ecf20Sopenharmony_ci 4588c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 4598c2ecf20Sopenharmony_ci HPI_OSTREAM_GROUP_RESET); 4608c2ecf20Sopenharmony_ci hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index); 4618c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 4628c2ecf20Sopenharmony_ci 4638c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 4648c2ecf20Sopenharmony_ci HPI_OSTREAM_CLOSE); 4658c2ecf20Sopenharmony_ci hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index); 4668c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 4678c2ecf20Sopenharmony_ci 4688c2ecf20Sopenharmony_ci return hr.error; 4698c2ecf20Sopenharmony_ci} 4708c2ecf20Sopenharmony_ci 4718c2ecf20Sopenharmony_ciu16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state, 4728c2ecf20Sopenharmony_ci u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played, 4738c2ecf20Sopenharmony_ci u32 *pauxiliary_data_to_play) 4748c2ecf20Sopenharmony_ci{ 4758c2ecf20Sopenharmony_ci struct hpi_message hm; 4768c2ecf20Sopenharmony_ci struct hpi_response hr; 4778c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 4788c2ecf20Sopenharmony_ci HPI_OSTREAM_GET_INFO); 4798c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 4808c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 4818c2ecf20Sopenharmony_ci 4828c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 4838c2ecf20Sopenharmony_ci 4848c2ecf20Sopenharmony_ci if (pw_state) 4858c2ecf20Sopenharmony_ci *pw_state = hr.u.d.u.stream_info.state; 4868c2ecf20Sopenharmony_ci if (pbuffer_size) 4878c2ecf20Sopenharmony_ci *pbuffer_size = hr.u.d.u.stream_info.buffer_size; 4888c2ecf20Sopenharmony_ci if (pdata_to_play) 4898c2ecf20Sopenharmony_ci *pdata_to_play = hr.u.d.u.stream_info.data_available; 4908c2ecf20Sopenharmony_ci if (psamples_played) 4918c2ecf20Sopenharmony_ci *psamples_played = hr.u.d.u.stream_info.samples_transferred; 4928c2ecf20Sopenharmony_ci if (pauxiliary_data_to_play) 4938c2ecf20Sopenharmony_ci *pauxiliary_data_to_play = 4948c2ecf20Sopenharmony_ci hr.u.d.u.stream_info.auxiliary_data_available; 4958c2ecf20Sopenharmony_ci return hr.error; 4968c2ecf20Sopenharmony_ci} 4978c2ecf20Sopenharmony_ci 4988c2ecf20Sopenharmony_ciu16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data, 4998c2ecf20Sopenharmony_ci u32 bytes_to_write, const struct hpi_format *p_format) 5008c2ecf20Sopenharmony_ci{ 5018c2ecf20Sopenharmony_ci struct hpi_message hm; 5028c2ecf20Sopenharmony_ci struct hpi_response hr; 5038c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5048c2ecf20Sopenharmony_ci HPI_OSTREAM_WRITE); 5058c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5068c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5078c2ecf20Sopenharmony_ci hm.u.d.u.data.pb_data = (u8 *)pb_data; 5088c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = bytes_to_write; 5098c2ecf20Sopenharmony_ci 5108c2ecf20Sopenharmony_ci hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 5118c2ecf20Sopenharmony_ci 5128c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5138c2ecf20Sopenharmony_ci 5148c2ecf20Sopenharmony_ci return hr.error; 5158c2ecf20Sopenharmony_ci} 5168c2ecf20Sopenharmony_ci 5178c2ecf20Sopenharmony_ciu16 hpi_outstream_start(u32 h_outstream) 5188c2ecf20Sopenharmony_ci{ 5198c2ecf20Sopenharmony_ci struct hpi_message hm; 5208c2ecf20Sopenharmony_ci struct hpi_response hr; 5218c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5228c2ecf20Sopenharmony_ci HPI_OSTREAM_START); 5238c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5248c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5258c2ecf20Sopenharmony_ci 5268c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5278c2ecf20Sopenharmony_ci 5288c2ecf20Sopenharmony_ci return hr.error; 5298c2ecf20Sopenharmony_ci} 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_ciu16 hpi_outstream_wait_start(u32 h_outstream) 5328c2ecf20Sopenharmony_ci{ 5338c2ecf20Sopenharmony_ci struct hpi_message hm; 5348c2ecf20Sopenharmony_ci struct hpi_response hr; 5358c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5368c2ecf20Sopenharmony_ci HPI_OSTREAM_WAIT_START); 5378c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5388c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5398c2ecf20Sopenharmony_ci 5408c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5418c2ecf20Sopenharmony_ci 5428c2ecf20Sopenharmony_ci return hr.error; 5438c2ecf20Sopenharmony_ci} 5448c2ecf20Sopenharmony_ci 5458c2ecf20Sopenharmony_ciu16 hpi_outstream_stop(u32 h_outstream) 5468c2ecf20Sopenharmony_ci{ 5478c2ecf20Sopenharmony_ci struct hpi_message hm; 5488c2ecf20Sopenharmony_ci struct hpi_response hr; 5498c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5508c2ecf20Sopenharmony_ci HPI_OSTREAM_STOP); 5518c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5528c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5558c2ecf20Sopenharmony_ci 5568c2ecf20Sopenharmony_ci return hr.error; 5578c2ecf20Sopenharmony_ci} 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_ciu16 hpi_outstream_sinegen(u32 h_outstream) 5608c2ecf20Sopenharmony_ci{ 5618c2ecf20Sopenharmony_ci struct hpi_message hm; 5628c2ecf20Sopenharmony_ci struct hpi_response hr; 5638c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5648c2ecf20Sopenharmony_ci HPI_OSTREAM_SINEGEN); 5658c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5668c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5678c2ecf20Sopenharmony_ci 5688c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5698c2ecf20Sopenharmony_ci 5708c2ecf20Sopenharmony_ci return hr.error; 5718c2ecf20Sopenharmony_ci} 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ciu16 hpi_outstream_reset(u32 h_outstream) 5748c2ecf20Sopenharmony_ci{ 5758c2ecf20Sopenharmony_ci struct hpi_message hm; 5768c2ecf20Sopenharmony_ci struct hpi_response hr; 5778c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5788c2ecf20Sopenharmony_ci HPI_OSTREAM_RESET); 5798c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5808c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5818c2ecf20Sopenharmony_ci 5828c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 5838c2ecf20Sopenharmony_ci 5848c2ecf20Sopenharmony_ci return hr.error; 5858c2ecf20Sopenharmony_ci} 5868c2ecf20Sopenharmony_ci 5878c2ecf20Sopenharmony_ciu16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format) 5888c2ecf20Sopenharmony_ci{ 5898c2ecf20Sopenharmony_ci struct hpi_message hm; 5908c2ecf20Sopenharmony_ci struct hpi_response hr; 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 5938c2ecf20Sopenharmony_ci HPI_OSTREAM_QUERY_FORMAT); 5948c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 5958c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 5968c2ecf20Sopenharmony_ci 5978c2ecf20Sopenharmony_ci hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 5988c2ecf20Sopenharmony_ci 5998c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci return hr.error; 6028c2ecf20Sopenharmony_ci} 6038c2ecf20Sopenharmony_ci 6048c2ecf20Sopenharmony_ciu16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format) 6058c2ecf20Sopenharmony_ci{ 6068c2ecf20Sopenharmony_ci struct hpi_message hm; 6078c2ecf20Sopenharmony_ci struct hpi_response hr; 6088c2ecf20Sopenharmony_ci 6098c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6108c2ecf20Sopenharmony_ci HPI_OSTREAM_SET_FORMAT); 6118c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 6128c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 6138c2ecf20Sopenharmony_ci 6148c2ecf20Sopenharmony_ci hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 6158c2ecf20Sopenharmony_ci 6168c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6178c2ecf20Sopenharmony_ci 6188c2ecf20Sopenharmony_ci return hr.error; 6198c2ecf20Sopenharmony_ci} 6208c2ecf20Sopenharmony_ci 6218c2ecf20Sopenharmony_ciu16 hpi_outstream_set_velocity(u32 h_outstream, short velocity) 6228c2ecf20Sopenharmony_ci{ 6238c2ecf20Sopenharmony_ci struct hpi_message hm; 6248c2ecf20Sopenharmony_ci struct hpi_response hr; 6258c2ecf20Sopenharmony_ci 6268c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6278c2ecf20Sopenharmony_ci HPI_OSTREAM_SET_VELOCITY); 6288c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 6298c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 6308c2ecf20Sopenharmony_ci hm.u.d.u.velocity = velocity; 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6338c2ecf20Sopenharmony_ci 6348c2ecf20Sopenharmony_ci return hr.error; 6358c2ecf20Sopenharmony_ci} 6368c2ecf20Sopenharmony_ci 6378c2ecf20Sopenharmony_ciu16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample, 6388c2ecf20Sopenharmony_ci u32 punch_out_sample) 6398c2ecf20Sopenharmony_ci{ 6408c2ecf20Sopenharmony_ci struct hpi_message hm; 6418c2ecf20Sopenharmony_ci struct hpi_response hr; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6448c2ecf20Sopenharmony_ci HPI_OSTREAM_SET_PUNCHINOUT); 6458c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 6468c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 6478c2ecf20Sopenharmony_ci 6488c2ecf20Sopenharmony_ci hm.u.d.u.pio.punch_in_sample = punch_in_sample; 6498c2ecf20Sopenharmony_ci hm.u.d.u.pio.punch_out_sample = punch_out_sample; 6508c2ecf20Sopenharmony_ci 6518c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci return hr.error; 6548c2ecf20Sopenharmony_ci} 6558c2ecf20Sopenharmony_ci 6568c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode) 6578c2ecf20Sopenharmony_ci{ 6588c2ecf20Sopenharmony_ci struct hpi_message hm; 6598c2ecf20Sopenharmony_ci struct hpi_response hr; 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6628c2ecf20Sopenharmony_ci HPI_OSTREAM_ANC_RESET); 6638c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 6648c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 6658c2ecf20Sopenharmony_ci hm.u.d.u.data.format.channels = mode; 6668c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6678c2ecf20Sopenharmony_ci return hr.error; 6688c2ecf20Sopenharmony_ci} 6698c2ecf20Sopenharmony_ci 6708c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available) 6718c2ecf20Sopenharmony_ci{ 6728c2ecf20Sopenharmony_ci struct hpi_message hm; 6738c2ecf20Sopenharmony_ci struct hpi_response hr; 6748c2ecf20Sopenharmony_ci 6758c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6768c2ecf20Sopenharmony_ci HPI_OSTREAM_ANC_GET_INFO); 6778c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 6788c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 6798c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 6808c2ecf20Sopenharmony_ci if (hr.error == 0) { 6818c2ecf20Sopenharmony_ci if (pframes_available) 6828c2ecf20Sopenharmony_ci *pframes_available = 6838c2ecf20Sopenharmony_ci hr.u.d.u.stream_info.data_available / 6848c2ecf20Sopenharmony_ci sizeof(struct hpi_anc_frame); 6858c2ecf20Sopenharmony_ci } 6868c2ecf20Sopenharmony_ci return hr.error; 6878c2ecf20Sopenharmony_ci} 6888c2ecf20Sopenharmony_ci 6898c2ecf20Sopenharmony_ciu16 hpi_outstream_ancillary_read(u32 h_outstream, 6908c2ecf20Sopenharmony_ci struct hpi_anc_frame *p_anc_frame_buffer, 6918c2ecf20Sopenharmony_ci u32 anc_frame_buffer_size_in_bytes, 6928c2ecf20Sopenharmony_ci u32 number_of_ancillary_frames_to_read) 6938c2ecf20Sopenharmony_ci{ 6948c2ecf20Sopenharmony_ci struct hpi_message hm; 6958c2ecf20Sopenharmony_ci struct hpi_response hr; 6968c2ecf20Sopenharmony_ci 6978c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 6988c2ecf20Sopenharmony_ci HPI_OSTREAM_ANC_READ); 6998c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7008c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7018c2ecf20Sopenharmony_ci hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; 7028c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = 7038c2ecf20Sopenharmony_ci number_of_ancillary_frames_to_read * 7048c2ecf20Sopenharmony_ci sizeof(struct hpi_anc_frame); 7058c2ecf20Sopenharmony_ci if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) 7068c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 7078c2ecf20Sopenharmony_ci else 7088c2ecf20Sopenharmony_ci hr.error = HPI_ERROR_INVALID_DATASIZE; 7098c2ecf20Sopenharmony_ci return hr.error; 7108c2ecf20Sopenharmony_ci} 7118c2ecf20Sopenharmony_ci 7128c2ecf20Sopenharmony_ciu16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale) 7138c2ecf20Sopenharmony_ci{ 7148c2ecf20Sopenharmony_ci struct hpi_message hm; 7158c2ecf20Sopenharmony_ci struct hpi_response hr; 7168c2ecf20Sopenharmony_ci 7178c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 7188c2ecf20Sopenharmony_ci HPI_OSTREAM_SET_TIMESCALE); 7198c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7208c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7218c2ecf20Sopenharmony_ci 7228c2ecf20Sopenharmony_ci hm.u.d.u.time_scale = time_scale; 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 7258c2ecf20Sopenharmony_ci 7268c2ecf20Sopenharmony_ci return hr.error; 7278c2ecf20Sopenharmony_ci} 7288c2ecf20Sopenharmony_ci 7298c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes) 7308c2ecf20Sopenharmony_ci{ 7318c2ecf20Sopenharmony_ci struct hpi_message hm; 7328c2ecf20Sopenharmony_ci struct hpi_response hr; 7338c2ecf20Sopenharmony_ci 7348c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 7358c2ecf20Sopenharmony_ci HPI_OSTREAM_HOSTBUFFER_ALLOC); 7368c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7378c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7388c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = size_in_bytes; 7398c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 7408c2ecf20Sopenharmony_ci return hr.error; 7418c2ecf20Sopenharmony_ci} 7428c2ecf20Sopenharmony_ci 7438c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer, 7448c2ecf20Sopenharmony_ci struct hpi_hostbuffer_status **pp_status) 7458c2ecf20Sopenharmony_ci{ 7468c2ecf20Sopenharmony_ci struct hpi_message hm; 7478c2ecf20Sopenharmony_ci struct hpi_response hr; 7488c2ecf20Sopenharmony_ci 7498c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 7508c2ecf20Sopenharmony_ci HPI_OSTREAM_HOSTBUFFER_GET_INFO); 7518c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7528c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7538c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 7548c2ecf20Sopenharmony_ci 7558c2ecf20Sopenharmony_ci if (hr.error == 0) { 7568c2ecf20Sopenharmony_ci if (pp_buffer) 7578c2ecf20Sopenharmony_ci *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; 7588c2ecf20Sopenharmony_ci if (pp_status) 7598c2ecf20Sopenharmony_ci *pp_status = hr.u.d.u.hostbuffer_info.p_status; 7608c2ecf20Sopenharmony_ci } 7618c2ecf20Sopenharmony_ci return hr.error; 7628c2ecf20Sopenharmony_ci} 7638c2ecf20Sopenharmony_ci 7648c2ecf20Sopenharmony_ciu16 hpi_outstream_host_buffer_free(u32 h_outstream) 7658c2ecf20Sopenharmony_ci{ 7668c2ecf20Sopenharmony_ci struct hpi_message hm; 7678c2ecf20Sopenharmony_ci struct hpi_response hr; 7688c2ecf20Sopenharmony_ci 7698c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 7708c2ecf20Sopenharmony_ci HPI_OSTREAM_HOSTBUFFER_FREE); 7718c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7728c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7738c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 7748c2ecf20Sopenharmony_ci return hr.error; 7758c2ecf20Sopenharmony_ci} 7768c2ecf20Sopenharmony_ci 7778c2ecf20Sopenharmony_ciu16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream) 7788c2ecf20Sopenharmony_ci{ 7798c2ecf20Sopenharmony_ci struct hpi_message hm; 7808c2ecf20Sopenharmony_ci struct hpi_response hr; 7818c2ecf20Sopenharmony_ci u16 adapter; 7828c2ecf20Sopenharmony_ci char c_obj_type; 7838c2ecf20Sopenharmony_ci 7848c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 7858c2ecf20Sopenharmony_ci HPI_OSTREAM_GROUP_ADD); 7868c2ecf20Sopenharmony_ci 7878c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 7888c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7898c2ecf20Sopenharmony_ci 7908c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_stream, &adapter, 7918c2ecf20Sopenharmony_ci &hm.u.d.u.stream.stream_index)) 7928c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 7938c2ecf20Sopenharmony_ci 7948c2ecf20Sopenharmony_ci c_obj_type = hpi_handle_object(h_stream); 7958c2ecf20Sopenharmony_ci switch (c_obj_type) { 7968c2ecf20Sopenharmony_ci case HPI_OBJ_OSTREAM: 7978c2ecf20Sopenharmony_ci case HPI_OBJ_ISTREAM: 7988c2ecf20Sopenharmony_ci hm.u.d.u.stream.object_type = c_obj_type; 7998c2ecf20Sopenharmony_ci break; 8008c2ecf20Sopenharmony_ci default: 8018c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_OBJ; 8028c2ecf20Sopenharmony_ci } 8038c2ecf20Sopenharmony_ci if (adapter != hm.adapter_index) 8048c2ecf20Sopenharmony_ci return HPI_ERROR_NO_INTERADAPTER_GROUPS; 8058c2ecf20Sopenharmony_ci 8068c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8078c2ecf20Sopenharmony_ci return hr.error; 8088c2ecf20Sopenharmony_ci} 8098c2ecf20Sopenharmony_ci 8108c2ecf20Sopenharmony_ciu16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map, 8118c2ecf20Sopenharmony_ci u32 *pinstream_map) 8128c2ecf20Sopenharmony_ci{ 8138c2ecf20Sopenharmony_ci struct hpi_message hm; 8148c2ecf20Sopenharmony_ci struct hpi_response hr; 8158c2ecf20Sopenharmony_ci 8168c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 8178c2ecf20Sopenharmony_ci HPI_OSTREAM_GROUP_GETMAP); 8188c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 8198c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 8208c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8218c2ecf20Sopenharmony_ci 8228c2ecf20Sopenharmony_ci if (poutstream_map) 8238c2ecf20Sopenharmony_ci *poutstream_map = hr.u.d.u.group_info.outstream_group_map; 8248c2ecf20Sopenharmony_ci if (pinstream_map) 8258c2ecf20Sopenharmony_ci *pinstream_map = hr.u.d.u.group_info.instream_group_map; 8268c2ecf20Sopenharmony_ci 8278c2ecf20Sopenharmony_ci return hr.error; 8288c2ecf20Sopenharmony_ci} 8298c2ecf20Sopenharmony_ci 8308c2ecf20Sopenharmony_ciu16 hpi_outstream_group_reset(u32 h_outstream) 8318c2ecf20Sopenharmony_ci{ 8328c2ecf20Sopenharmony_ci struct hpi_message hm; 8338c2ecf20Sopenharmony_ci struct hpi_response hr; 8348c2ecf20Sopenharmony_ci 8358c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 8368c2ecf20Sopenharmony_ci HPI_OSTREAM_GROUP_RESET); 8378c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 8388c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 8398c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8408c2ecf20Sopenharmony_ci return hr.error; 8418c2ecf20Sopenharmony_ci} 8428c2ecf20Sopenharmony_ci 8438c2ecf20Sopenharmony_ciu16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream) 8448c2ecf20Sopenharmony_ci{ 8458c2ecf20Sopenharmony_ci struct hpi_message hm; 8468c2ecf20Sopenharmony_ci struct hpi_response hr; 8478c2ecf20Sopenharmony_ci 8488c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 8498c2ecf20Sopenharmony_ci HPI_ISTREAM_OPEN); 8508c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 8518c2ecf20Sopenharmony_ci hm.obj_index = instream_index; 8528c2ecf20Sopenharmony_ci 8538c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8548c2ecf20Sopenharmony_ci 8558c2ecf20Sopenharmony_ci if (hr.error == 0) 8568c2ecf20Sopenharmony_ci *ph_instream = 8578c2ecf20Sopenharmony_ci hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index, 8588c2ecf20Sopenharmony_ci instream_index); 8598c2ecf20Sopenharmony_ci else 8608c2ecf20Sopenharmony_ci *ph_instream = 0; 8618c2ecf20Sopenharmony_ci 8628c2ecf20Sopenharmony_ci return hr.error; 8638c2ecf20Sopenharmony_ci} 8648c2ecf20Sopenharmony_ci 8658c2ecf20Sopenharmony_ciu16 hpi_instream_close(u32 h_instream) 8668c2ecf20Sopenharmony_ci{ 8678c2ecf20Sopenharmony_ci struct hpi_message hm; 8688c2ecf20Sopenharmony_ci struct hpi_response hr; 8698c2ecf20Sopenharmony_ci 8708c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 8718c2ecf20Sopenharmony_ci HPI_ISTREAM_HOSTBUFFER_FREE); 8728c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 8738c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 8748c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8758c2ecf20Sopenharmony_ci 8768c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 8778c2ecf20Sopenharmony_ci HPI_ISTREAM_GROUP_RESET); 8788c2ecf20Sopenharmony_ci hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index); 8798c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8808c2ecf20Sopenharmony_ci 8818c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 8828c2ecf20Sopenharmony_ci HPI_ISTREAM_CLOSE); 8838c2ecf20Sopenharmony_ci hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index); 8848c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 8858c2ecf20Sopenharmony_ci 8868c2ecf20Sopenharmony_ci return hr.error; 8878c2ecf20Sopenharmony_ci} 8888c2ecf20Sopenharmony_ci 8898c2ecf20Sopenharmony_ciu16 hpi_instream_query_format(u32 h_instream, 8908c2ecf20Sopenharmony_ci const struct hpi_format *p_format) 8918c2ecf20Sopenharmony_ci{ 8928c2ecf20Sopenharmony_ci struct hpi_message hm; 8938c2ecf20Sopenharmony_ci struct hpi_response hr; 8948c2ecf20Sopenharmony_ci 8958c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 8968c2ecf20Sopenharmony_ci HPI_ISTREAM_QUERY_FORMAT); 8978c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 8988c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 8998c2ecf20Sopenharmony_ci hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 9008c2ecf20Sopenharmony_ci 9018c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9028c2ecf20Sopenharmony_ci 9038c2ecf20Sopenharmony_ci return hr.error; 9048c2ecf20Sopenharmony_ci} 9058c2ecf20Sopenharmony_ci 9068c2ecf20Sopenharmony_ciu16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format) 9078c2ecf20Sopenharmony_ci{ 9088c2ecf20Sopenharmony_ci struct hpi_message hm; 9098c2ecf20Sopenharmony_ci struct hpi_response hr; 9108c2ecf20Sopenharmony_ci 9118c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9128c2ecf20Sopenharmony_ci HPI_ISTREAM_SET_FORMAT); 9138c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9148c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9158c2ecf20Sopenharmony_ci hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 9168c2ecf20Sopenharmony_ci 9178c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9188c2ecf20Sopenharmony_ci 9198c2ecf20Sopenharmony_ci return hr.error; 9208c2ecf20Sopenharmony_ci} 9218c2ecf20Sopenharmony_ci 9228c2ecf20Sopenharmony_ciu16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read) 9238c2ecf20Sopenharmony_ci{ 9248c2ecf20Sopenharmony_ci struct hpi_message hm; 9258c2ecf20Sopenharmony_ci struct hpi_response hr; 9268c2ecf20Sopenharmony_ci 9278c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9288c2ecf20Sopenharmony_ci HPI_ISTREAM_READ); 9298c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9308c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9318c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = bytes_to_read; 9328c2ecf20Sopenharmony_ci hm.u.d.u.data.pb_data = pb_data; 9338c2ecf20Sopenharmony_ci 9348c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9358c2ecf20Sopenharmony_ci 9368c2ecf20Sopenharmony_ci return hr.error; 9378c2ecf20Sopenharmony_ci} 9388c2ecf20Sopenharmony_ci 9398c2ecf20Sopenharmony_ciu16 hpi_instream_start(u32 h_instream) 9408c2ecf20Sopenharmony_ci{ 9418c2ecf20Sopenharmony_ci struct hpi_message hm; 9428c2ecf20Sopenharmony_ci struct hpi_response hr; 9438c2ecf20Sopenharmony_ci 9448c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9458c2ecf20Sopenharmony_ci HPI_ISTREAM_START); 9468c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9478c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9488c2ecf20Sopenharmony_ci 9498c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9508c2ecf20Sopenharmony_ci 9518c2ecf20Sopenharmony_ci return hr.error; 9528c2ecf20Sopenharmony_ci} 9538c2ecf20Sopenharmony_ci 9548c2ecf20Sopenharmony_ciu16 hpi_instream_wait_start(u32 h_instream) 9558c2ecf20Sopenharmony_ci{ 9568c2ecf20Sopenharmony_ci struct hpi_message hm; 9578c2ecf20Sopenharmony_ci struct hpi_response hr; 9588c2ecf20Sopenharmony_ci 9598c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9608c2ecf20Sopenharmony_ci HPI_ISTREAM_WAIT_START); 9618c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9628c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9638c2ecf20Sopenharmony_ci 9648c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9658c2ecf20Sopenharmony_ci 9668c2ecf20Sopenharmony_ci return hr.error; 9678c2ecf20Sopenharmony_ci} 9688c2ecf20Sopenharmony_ci 9698c2ecf20Sopenharmony_ciu16 hpi_instream_stop(u32 h_instream) 9708c2ecf20Sopenharmony_ci{ 9718c2ecf20Sopenharmony_ci struct hpi_message hm; 9728c2ecf20Sopenharmony_ci struct hpi_response hr; 9738c2ecf20Sopenharmony_ci 9748c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9758c2ecf20Sopenharmony_ci HPI_ISTREAM_STOP); 9768c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9778c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9788c2ecf20Sopenharmony_ci 9798c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9808c2ecf20Sopenharmony_ci 9818c2ecf20Sopenharmony_ci return hr.error; 9828c2ecf20Sopenharmony_ci} 9838c2ecf20Sopenharmony_ci 9848c2ecf20Sopenharmony_ciu16 hpi_instream_reset(u32 h_instream) 9858c2ecf20Sopenharmony_ci{ 9868c2ecf20Sopenharmony_ci struct hpi_message hm; 9878c2ecf20Sopenharmony_ci struct hpi_response hr; 9888c2ecf20Sopenharmony_ci 9898c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 9908c2ecf20Sopenharmony_ci HPI_ISTREAM_RESET); 9918c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 9928c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 9938c2ecf20Sopenharmony_ci 9948c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 9958c2ecf20Sopenharmony_ci 9968c2ecf20Sopenharmony_ci return hr.error; 9978c2ecf20Sopenharmony_ci} 9988c2ecf20Sopenharmony_ci 9998c2ecf20Sopenharmony_ciu16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size, 10008c2ecf20Sopenharmony_ci u32 *pdata_recorded, u32 *psamples_recorded, 10018c2ecf20Sopenharmony_ci u32 *pauxiliary_data_recorded) 10028c2ecf20Sopenharmony_ci{ 10038c2ecf20Sopenharmony_ci struct hpi_message hm; 10048c2ecf20Sopenharmony_ci struct hpi_response hr; 10058c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 10068c2ecf20Sopenharmony_ci HPI_ISTREAM_GET_INFO); 10078c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 10088c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 10098c2ecf20Sopenharmony_ci 10108c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 10118c2ecf20Sopenharmony_ci 10128c2ecf20Sopenharmony_ci if (pw_state) 10138c2ecf20Sopenharmony_ci *pw_state = hr.u.d.u.stream_info.state; 10148c2ecf20Sopenharmony_ci if (pbuffer_size) 10158c2ecf20Sopenharmony_ci *pbuffer_size = hr.u.d.u.stream_info.buffer_size; 10168c2ecf20Sopenharmony_ci if (pdata_recorded) 10178c2ecf20Sopenharmony_ci *pdata_recorded = hr.u.d.u.stream_info.data_available; 10188c2ecf20Sopenharmony_ci if (psamples_recorded) 10198c2ecf20Sopenharmony_ci *psamples_recorded = hr.u.d.u.stream_info.samples_transferred; 10208c2ecf20Sopenharmony_ci if (pauxiliary_data_recorded) 10218c2ecf20Sopenharmony_ci *pauxiliary_data_recorded = 10228c2ecf20Sopenharmony_ci hr.u.d.u.stream_info.auxiliary_data_available; 10238c2ecf20Sopenharmony_ci return hr.error; 10248c2ecf20Sopenharmony_ci} 10258c2ecf20Sopenharmony_ci 10268c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame, 10278c2ecf20Sopenharmony_ci u16 mode, u16 alignment, u16 idle_bit) 10288c2ecf20Sopenharmony_ci{ 10298c2ecf20Sopenharmony_ci struct hpi_message hm; 10308c2ecf20Sopenharmony_ci struct hpi_response hr; 10318c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 10328c2ecf20Sopenharmony_ci HPI_ISTREAM_ANC_RESET); 10338c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 10348c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 10358c2ecf20Sopenharmony_ci hm.u.d.u.data.format.attributes = bytes_per_frame; 10368c2ecf20Sopenharmony_ci hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff); 10378c2ecf20Sopenharmony_ci hm.u.d.u.data.format.channels = idle_bit; 10388c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 10398c2ecf20Sopenharmony_ci return hr.error; 10408c2ecf20Sopenharmony_ci} 10418c2ecf20Sopenharmony_ci 10428c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space) 10438c2ecf20Sopenharmony_ci{ 10448c2ecf20Sopenharmony_ci struct hpi_message hm; 10458c2ecf20Sopenharmony_ci struct hpi_response hr; 10468c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 10478c2ecf20Sopenharmony_ci HPI_ISTREAM_ANC_GET_INFO); 10488c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 10498c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 10508c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 10518c2ecf20Sopenharmony_ci if (pframe_space) 10528c2ecf20Sopenharmony_ci *pframe_space = 10538c2ecf20Sopenharmony_ci (hr.u.d.u.stream_info.buffer_size - 10548c2ecf20Sopenharmony_ci hr.u.d.u.stream_info.data_available) / 10558c2ecf20Sopenharmony_ci sizeof(struct hpi_anc_frame); 10568c2ecf20Sopenharmony_ci return hr.error; 10578c2ecf20Sopenharmony_ci} 10588c2ecf20Sopenharmony_ci 10598c2ecf20Sopenharmony_ciu16 hpi_instream_ancillary_write(u32 h_instream, 10608c2ecf20Sopenharmony_ci const struct hpi_anc_frame *p_anc_frame_buffer, 10618c2ecf20Sopenharmony_ci u32 anc_frame_buffer_size_in_bytes, 10628c2ecf20Sopenharmony_ci u32 number_of_ancillary_frames_to_write) 10638c2ecf20Sopenharmony_ci{ 10648c2ecf20Sopenharmony_ci struct hpi_message hm; 10658c2ecf20Sopenharmony_ci struct hpi_response hr; 10668c2ecf20Sopenharmony_ci 10678c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 10688c2ecf20Sopenharmony_ci HPI_ISTREAM_ANC_WRITE); 10698c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 10708c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 10718c2ecf20Sopenharmony_ci hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; 10728c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = 10738c2ecf20Sopenharmony_ci number_of_ancillary_frames_to_write * 10748c2ecf20Sopenharmony_ci sizeof(struct hpi_anc_frame); 10758c2ecf20Sopenharmony_ci if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) 10768c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 10778c2ecf20Sopenharmony_ci else 10788c2ecf20Sopenharmony_ci hr.error = HPI_ERROR_INVALID_DATASIZE; 10798c2ecf20Sopenharmony_ci return hr.error; 10808c2ecf20Sopenharmony_ci} 10818c2ecf20Sopenharmony_ci 10828c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes) 10838c2ecf20Sopenharmony_ci{ 10848c2ecf20Sopenharmony_ci 10858c2ecf20Sopenharmony_ci struct hpi_message hm; 10868c2ecf20Sopenharmony_ci struct hpi_response hr; 10878c2ecf20Sopenharmony_ci 10888c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 10898c2ecf20Sopenharmony_ci HPI_ISTREAM_HOSTBUFFER_ALLOC); 10908c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 10918c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 10928c2ecf20Sopenharmony_ci hm.u.d.u.data.data_size = size_in_bytes; 10938c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 10948c2ecf20Sopenharmony_ci return hr.error; 10958c2ecf20Sopenharmony_ci} 10968c2ecf20Sopenharmony_ci 10978c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer, 10988c2ecf20Sopenharmony_ci struct hpi_hostbuffer_status **pp_status) 10998c2ecf20Sopenharmony_ci{ 11008c2ecf20Sopenharmony_ci struct hpi_message hm; 11018c2ecf20Sopenharmony_ci struct hpi_response hr; 11028c2ecf20Sopenharmony_ci 11038c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 11048c2ecf20Sopenharmony_ci HPI_ISTREAM_HOSTBUFFER_GET_INFO); 11058c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 11068c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11078c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 11088c2ecf20Sopenharmony_ci 11098c2ecf20Sopenharmony_ci if (hr.error == 0) { 11108c2ecf20Sopenharmony_ci if (pp_buffer) 11118c2ecf20Sopenharmony_ci *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; 11128c2ecf20Sopenharmony_ci if (pp_status) 11138c2ecf20Sopenharmony_ci *pp_status = hr.u.d.u.hostbuffer_info.p_status; 11148c2ecf20Sopenharmony_ci } 11158c2ecf20Sopenharmony_ci return hr.error; 11168c2ecf20Sopenharmony_ci} 11178c2ecf20Sopenharmony_ci 11188c2ecf20Sopenharmony_ciu16 hpi_instream_host_buffer_free(u32 h_instream) 11198c2ecf20Sopenharmony_ci{ 11208c2ecf20Sopenharmony_ci 11218c2ecf20Sopenharmony_ci struct hpi_message hm; 11228c2ecf20Sopenharmony_ci struct hpi_response hr; 11238c2ecf20Sopenharmony_ci 11248c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 11258c2ecf20Sopenharmony_ci HPI_ISTREAM_HOSTBUFFER_FREE); 11268c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 11278c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11288c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 11298c2ecf20Sopenharmony_ci return hr.error; 11308c2ecf20Sopenharmony_ci} 11318c2ecf20Sopenharmony_ci 11328c2ecf20Sopenharmony_ciu16 hpi_instream_group_add(u32 h_instream, u32 h_stream) 11338c2ecf20Sopenharmony_ci{ 11348c2ecf20Sopenharmony_ci struct hpi_message hm; 11358c2ecf20Sopenharmony_ci struct hpi_response hr; 11368c2ecf20Sopenharmony_ci u16 adapter; 11378c2ecf20Sopenharmony_ci char c_obj_type; 11388c2ecf20Sopenharmony_ci 11398c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 11408c2ecf20Sopenharmony_ci HPI_ISTREAM_GROUP_ADD); 11418c2ecf20Sopenharmony_ci hr.error = 0; 11428c2ecf20Sopenharmony_ci 11438c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 11448c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11458c2ecf20Sopenharmony_ci 11468c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_stream, &adapter, 11478c2ecf20Sopenharmony_ci &hm.u.d.u.stream.stream_index)) 11488c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11498c2ecf20Sopenharmony_ci 11508c2ecf20Sopenharmony_ci c_obj_type = hpi_handle_object(h_stream); 11518c2ecf20Sopenharmony_ci 11528c2ecf20Sopenharmony_ci switch (c_obj_type) { 11538c2ecf20Sopenharmony_ci case HPI_OBJ_OSTREAM: 11548c2ecf20Sopenharmony_ci case HPI_OBJ_ISTREAM: 11558c2ecf20Sopenharmony_ci hm.u.d.u.stream.object_type = c_obj_type; 11568c2ecf20Sopenharmony_ci break; 11578c2ecf20Sopenharmony_ci default: 11588c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_OBJ; 11598c2ecf20Sopenharmony_ci } 11608c2ecf20Sopenharmony_ci 11618c2ecf20Sopenharmony_ci if (adapter != hm.adapter_index) 11628c2ecf20Sopenharmony_ci return HPI_ERROR_NO_INTERADAPTER_GROUPS; 11638c2ecf20Sopenharmony_ci 11648c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 11658c2ecf20Sopenharmony_ci return hr.error; 11668c2ecf20Sopenharmony_ci} 11678c2ecf20Sopenharmony_ci 11688c2ecf20Sopenharmony_ciu16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map, 11698c2ecf20Sopenharmony_ci u32 *pinstream_map) 11708c2ecf20Sopenharmony_ci{ 11718c2ecf20Sopenharmony_ci struct hpi_message hm; 11728c2ecf20Sopenharmony_ci struct hpi_response hr; 11738c2ecf20Sopenharmony_ci 11748c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 11758c2ecf20Sopenharmony_ci HPI_ISTREAM_HOSTBUFFER_FREE); 11768c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 11778c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11788c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 11798c2ecf20Sopenharmony_ci 11808c2ecf20Sopenharmony_ci if (poutstream_map) 11818c2ecf20Sopenharmony_ci *poutstream_map = hr.u.d.u.group_info.outstream_group_map; 11828c2ecf20Sopenharmony_ci if (pinstream_map) 11838c2ecf20Sopenharmony_ci *pinstream_map = hr.u.d.u.group_info.instream_group_map; 11848c2ecf20Sopenharmony_ci 11858c2ecf20Sopenharmony_ci return hr.error; 11868c2ecf20Sopenharmony_ci} 11878c2ecf20Sopenharmony_ci 11888c2ecf20Sopenharmony_ciu16 hpi_instream_group_reset(u32 h_instream) 11898c2ecf20Sopenharmony_ci{ 11908c2ecf20Sopenharmony_ci struct hpi_message hm; 11918c2ecf20Sopenharmony_ci struct hpi_response hr; 11928c2ecf20Sopenharmony_ci 11938c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 11948c2ecf20Sopenharmony_ci HPI_ISTREAM_GROUP_RESET); 11958c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 11968c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 11978c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 11988c2ecf20Sopenharmony_ci return hr.error; 11998c2ecf20Sopenharmony_ci} 12008c2ecf20Sopenharmony_ci 12018c2ecf20Sopenharmony_ciu16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer) 12028c2ecf20Sopenharmony_ci{ 12038c2ecf20Sopenharmony_ci struct hpi_message hm; 12048c2ecf20Sopenharmony_ci struct hpi_response hr; 12058c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN); 12068c2ecf20Sopenharmony_ci hm.adapter_index = adapter_index; 12078c2ecf20Sopenharmony_ci 12088c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 12098c2ecf20Sopenharmony_ci 12108c2ecf20Sopenharmony_ci if (hr.error == 0) 12118c2ecf20Sopenharmony_ci *ph_mixer = 12128c2ecf20Sopenharmony_ci hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index, 12138c2ecf20Sopenharmony_ci 0); 12148c2ecf20Sopenharmony_ci else 12158c2ecf20Sopenharmony_ci *ph_mixer = 0; 12168c2ecf20Sopenharmony_ci return hr.error; 12178c2ecf20Sopenharmony_ci} 12188c2ecf20Sopenharmony_ci 12198c2ecf20Sopenharmony_ciu16 hpi_mixer_close(u32 h_mixer) 12208c2ecf20Sopenharmony_ci{ 12218c2ecf20Sopenharmony_ci struct hpi_message hm; 12228c2ecf20Sopenharmony_ci struct hpi_response hr; 12238c2ecf20Sopenharmony_ci 12248c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE); 12258c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 12268c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 12278c2ecf20Sopenharmony_ci 12288c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 12298c2ecf20Sopenharmony_ci return hr.error; 12308c2ecf20Sopenharmony_ci} 12318c2ecf20Sopenharmony_ci 12328c2ecf20Sopenharmony_ciu16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type, 12338c2ecf20Sopenharmony_ci u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index, 12348c2ecf20Sopenharmony_ci u16 control_type, u32 *ph_control) 12358c2ecf20Sopenharmony_ci{ 12368c2ecf20Sopenharmony_ci struct hpi_message hm; 12378c2ecf20Sopenharmony_ci struct hpi_response hr; 12388c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, 12398c2ecf20Sopenharmony_ci HPI_MIXER_GET_CONTROL); 12408c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 12418c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 12428c2ecf20Sopenharmony_ci hm.u.m.node_type1 = src_node_type; 12438c2ecf20Sopenharmony_ci hm.u.m.node_index1 = src_node_type_index; 12448c2ecf20Sopenharmony_ci hm.u.m.node_type2 = dst_node_type; 12458c2ecf20Sopenharmony_ci hm.u.m.node_index2 = dst_node_type_index; 12468c2ecf20Sopenharmony_ci hm.u.m.control_type = control_type; 12478c2ecf20Sopenharmony_ci 12488c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 12498c2ecf20Sopenharmony_ci 12508c2ecf20Sopenharmony_ci if (hr.error == 0) 12518c2ecf20Sopenharmony_ci *ph_control = 12528c2ecf20Sopenharmony_ci hpi_indexes_to_handle(HPI_OBJ_CONTROL, 12538c2ecf20Sopenharmony_ci hm.adapter_index, hr.u.m.control_index); 12548c2ecf20Sopenharmony_ci else 12558c2ecf20Sopenharmony_ci *ph_control = 0; 12568c2ecf20Sopenharmony_ci return hr.error; 12578c2ecf20Sopenharmony_ci} 12588c2ecf20Sopenharmony_ci 12598c2ecf20Sopenharmony_ciu16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index, 12608c2ecf20Sopenharmony_ci u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type, 12618c2ecf20Sopenharmony_ci u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control) 12628c2ecf20Sopenharmony_ci{ 12638c2ecf20Sopenharmony_ci struct hpi_message hm; 12648c2ecf20Sopenharmony_ci struct hpi_response hr; 12658c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, 12668c2ecf20Sopenharmony_ci HPI_MIXER_GET_CONTROL_BY_INDEX); 12678c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 12688c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 12698c2ecf20Sopenharmony_ci hm.u.m.control_index = control_index; 12708c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 12718c2ecf20Sopenharmony_ci 12728c2ecf20Sopenharmony_ci if (pw_src_node_type) { 12738c2ecf20Sopenharmony_ci *pw_src_node_type = 12748c2ecf20Sopenharmony_ci hr.u.m.src_node_type + HPI_SOURCENODE_NONE; 12758c2ecf20Sopenharmony_ci *pw_src_node_index = hr.u.m.src_node_index; 12768c2ecf20Sopenharmony_ci *pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE; 12778c2ecf20Sopenharmony_ci *pw_dst_node_index = hr.u.m.dst_node_index; 12788c2ecf20Sopenharmony_ci } 12798c2ecf20Sopenharmony_ci if (pw_control_type) 12808c2ecf20Sopenharmony_ci *pw_control_type = hr.u.m.control_index; 12818c2ecf20Sopenharmony_ci 12828c2ecf20Sopenharmony_ci if (ph_control) { 12838c2ecf20Sopenharmony_ci if (hr.error == 0) 12848c2ecf20Sopenharmony_ci *ph_control = 12858c2ecf20Sopenharmony_ci hpi_indexes_to_handle(HPI_OBJ_CONTROL, 12868c2ecf20Sopenharmony_ci hm.adapter_index, control_index); 12878c2ecf20Sopenharmony_ci else 12888c2ecf20Sopenharmony_ci *ph_control = 0; 12898c2ecf20Sopenharmony_ci } 12908c2ecf20Sopenharmony_ci return hr.error; 12918c2ecf20Sopenharmony_ci} 12928c2ecf20Sopenharmony_ci 12938c2ecf20Sopenharmony_ciu16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command, 12948c2ecf20Sopenharmony_ci u16 index) 12958c2ecf20Sopenharmony_ci{ 12968c2ecf20Sopenharmony_ci struct hpi_message hm; 12978c2ecf20Sopenharmony_ci struct hpi_response hr; 12988c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE); 12998c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 13008c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13018c2ecf20Sopenharmony_ci hm.u.mx.store.command = command; 13028c2ecf20Sopenharmony_ci hm.u.mx.store.index = index; 13038c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 13048c2ecf20Sopenharmony_ci return hr.error; 13058c2ecf20Sopenharmony_ci} 13068c2ecf20Sopenharmony_ci 13078c2ecf20Sopenharmony_cistatic 13088c2ecf20Sopenharmony_ciu16 hpi_control_param_set(const u32 h_control, const u16 attrib, 13098c2ecf20Sopenharmony_ci const u32 param1, const u32 param2) 13108c2ecf20Sopenharmony_ci{ 13118c2ecf20Sopenharmony_ci struct hpi_message hm; 13128c2ecf20Sopenharmony_ci struct hpi_response hr; 13138c2ecf20Sopenharmony_ci 13148c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 13158c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 13168c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 13178c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13188c2ecf20Sopenharmony_ci hm.u.c.attribute = attrib; 13198c2ecf20Sopenharmony_ci hm.u.c.param1 = param1; 13208c2ecf20Sopenharmony_ci hm.u.c.param2 = param2; 13218c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 13228c2ecf20Sopenharmony_ci return hr.error; 13238c2ecf20Sopenharmony_ci} 13248c2ecf20Sopenharmony_ci 13258c2ecf20Sopenharmony_cistatic u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0, 13268c2ecf20Sopenharmony_ci short sv1) 13278c2ecf20Sopenharmony_ci{ 13288c2ecf20Sopenharmony_ci struct hpi_message hm; 13298c2ecf20Sopenharmony_ci struct hpi_response hr; 13308c2ecf20Sopenharmony_ci 13318c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 13328c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 13338c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 13348c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13358c2ecf20Sopenharmony_ci hm.u.c.attribute = attrib; 13368c2ecf20Sopenharmony_ci hm.u.c.an_log_value[0] = sv0; 13378c2ecf20Sopenharmony_ci hm.u.c.an_log_value[1] = sv1; 13388c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 13398c2ecf20Sopenharmony_ci return hr.error; 13408c2ecf20Sopenharmony_ci} 13418c2ecf20Sopenharmony_ci 13428c2ecf20Sopenharmony_cistatic 13438c2ecf20Sopenharmony_ciu16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1, 13448c2ecf20Sopenharmony_ci u32 param2, u32 *pparam1, u32 *pparam2) 13458c2ecf20Sopenharmony_ci{ 13468c2ecf20Sopenharmony_ci struct hpi_message hm; 13478c2ecf20Sopenharmony_ci struct hpi_response hr; 13488c2ecf20Sopenharmony_ci 13498c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 13508c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 13518c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 13528c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13538c2ecf20Sopenharmony_ci hm.u.c.attribute = attrib; 13548c2ecf20Sopenharmony_ci hm.u.c.param1 = param1; 13558c2ecf20Sopenharmony_ci hm.u.c.param2 = param2; 13568c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 13578c2ecf20Sopenharmony_ci 13588c2ecf20Sopenharmony_ci *pparam1 = hr.u.c.param1; 13598c2ecf20Sopenharmony_ci if (pparam2) 13608c2ecf20Sopenharmony_ci *pparam2 = hr.u.c.param2; 13618c2ecf20Sopenharmony_ci 13628c2ecf20Sopenharmony_ci return hr.error; 13638c2ecf20Sopenharmony_ci} 13648c2ecf20Sopenharmony_ci 13658c2ecf20Sopenharmony_ci#define hpi_control_param1_get(h, a, p1) \ 13668c2ecf20Sopenharmony_ci hpi_control_param_get(h, a, 0, 0, p1, NULL) 13678c2ecf20Sopenharmony_ci#define hpi_control_param2_get(h, a, p1, p2) \ 13688c2ecf20Sopenharmony_ci hpi_control_param_get(h, a, 0, 0, p1, p2) 13698c2ecf20Sopenharmony_ci 13708c2ecf20Sopenharmony_cistatic u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0, 13718c2ecf20Sopenharmony_ci short *sv1) 13728c2ecf20Sopenharmony_ci{ 13738c2ecf20Sopenharmony_ci struct hpi_message hm; 13748c2ecf20Sopenharmony_ci struct hpi_response hr; 13758c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 13768c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 13778c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 13788c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13798c2ecf20Sopenharmony_ci hm.u.c.attribute = attrib; 13808c2ecf20Sopenharmony_ci 13818c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 13828c2ecf20Sopenharmony_ci *sv0 = hr.u.c.an_log_value[0]; 13838c2ecf20Sopenharmony_ci if (sv1) 13848c2ecf20Sopenharmony_ci *sv1 = hr.u.c.an_log_value[1]; 13858c2ecf20Sopenharmony_ci return hr.error; 13868c2ecf20Sopenharmony_ci} 13878c2ecf20Sopenharmony_ci 13888c2ecf20Sopenharmony_cistatic 13898c2ecf20Sopenharmony_ciu16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index, 13908c2ecf20Sopenharmony_ci const u32 param, u32 *psetting) 13918c2ecf20Sopenharmony_ci{ 13928c2ecf20Sopenharmony_ci struct hpi_message hm; 13938c2ecf20Sopenharmony_ci struct hpi_response hr; 13948c2ecf20Sopenharmony_ci 13958c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 13968c2ecf20Sopenharmony_ci HPI_CONTROL_GET_INFO); 13978c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 13988c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 13998c2ecf20Sopenharmony_ci 14008c2ecf20Sopenharmony_ci hm.u.c.attribute = attrib; 14018c2ecf20Sopenharmony_ci hm.u.c.param1 = index; 14028c2ecf20Sopenharmony_ci hm.u.c.param2 = param; 14038c2ecf20Sopenharmony_ci 14048c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 14058c2ecf20Sopenharmony_ci *psetting = hr.u.c.param1; 14068c2ecf20Sopenharmony_ci 14078c2ecf20Sopenharmony_ci return hr.error; 14088c2ecf20Sopenharmony_ci} 14098c2ecf20Sopenharmony_ci 14108c2ecf20Sopenharmony_cistatic u16 hpi_control_get_string(const u32 h_control, const u16 attribute, 14118c2ecf20Sopenharmony_ci char *psz_string, const u32 string_length) 14128c2ecf20Sopenharmony_ci{ 14138c2ecf20Sopenharmony_ci unsigned int sub_string_index = 0, j = 0; 14148c2ecf20Sopenharmony_ci char c = 0; 14158c2ecf20Sopenharmony_ci unsigned int n = 0; 14168c2ecf20Sopenharmony_ci u16 err = 0; 14178c2ecf20Sopenharmony_ci 14188c2ecf20Sopenharmony_ci if ((string_length < 1) || (string_length > 256)) 14198c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_CONTROL_VALUE; 14208c2ecf20Sopenharmony_ci for (sub_string_index = 0; sub_string_index < string_length; 14218c2ecf20Sopenharmony_ci sub_string_index += 8) { 14228c2ecf20Sopenharmony_ci struct hpi_message hm; 14238c2ecf20Sopenharmony_ci struct hpi_response hr; 14248c2ecf20Sopenharmony_ci 14258c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 14268c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 14278c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, 14288c2ecf20Sopenharmony_ci &hm.obj_index)) 14298c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 14308c2ecf20Sopenharmony_ci hm.u.c.attribute = attribute; 14318c2ecf20Sopenharmony_ci hm.u.c.param1 = sub_string_index; 14328c2ecf20Sopenharmony_ci hm.u.c.param2 = 0; 14338c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 14348c2ecf20Sopenharmony_ci 14358c2ecf20Sopenharmony_ci if (sub_string_index == 0 14368c2ecf20Sopenharmony_ci && (hr.u.cu.chars8.remaining_chars + 8) > 14378c2ecf20Sopenharmony_ci string_length) 14388c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_CONTROL_VALUE; 14398c2ecf20Sopenharmony_ci 14408c2ecf20Sopenharmony_ci if (hr.error) { 14418c2ecf20Sopenharmony_ci err = hr.error; 14428c2ecf20Sopenharmony_ci break; 14438c2ecf20Sopenharmony_ci } 14448c2ecf20Sopenharmony_ci for (j = 0; j < 8; j++) { 14458c2ecf20Sopenharmony_ci c = hr.u.cu.chars8.sz_data[j]; 14468c2ecf20Sopenharmony_ci psz_string[sub_string_index + j] = c; 14478c2ecf20Sopenharmony_ci n++; 14488c2ecf20Sopenharmony_ci if (n >= string_length) { 14498c2ecf20Sopenharmony_ci psz_string[string_length - 1] = 0; 14508c2ecf20Sopenharmony_ci err = HPI_ERROR_INVALID_CONTROL_VALUE; 14518c2ecf20Sopenharmony_ci break; 14528c2ecf20Sopenharmony_ci } 14538c2ecf20Sopenharmony_ci if (c == 0) 14548c2ecf20Sopenharmony_ci break; 14558c2ecf20Sopenharmony_ci } 14568c2ecf20Sopenharmony_ci 14578c2ecf20Sopenharmony_ci if ((hr.u.cu.chars8.remaining_chars == 0) 14588c2ecf20Sopenharmony_ci && ((sub_string_index + j) < string_length) 14598c2ecf20Sopenharmony_ci && (c != 0)) { 14608c2ecf20Sopenharmony_ci c = 0; 14618c2ecf20Sopenharmony_ci psz_string[sub_string_index + j] = c; 14628c2ecf20Sopenharmony_ci } 14638c2ecf20Sopenharmony_ci if (c == 0) 14648c2ecf20Sopenharmony_ci break; 14658c2ecf20Sopenharmony_ci } 14668c2ecf20Sopenharmony_ci return err; 14678c2ecf20Sopenharmony_ci} 14688c2ecf20Sopenharmony_ci 14698c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index, 14708c2ecf20Sopenharmony_ci u16 *pw_format) 14718c2ecf20Sopenharmony_ci{ 14728c2ecf20Sopenharmony_ci u32 qr; 14738c2ecf20Sopenharmony_ci u16 err; 14748c2ecf20Sopenharmony_ci 14758c2ecf20Sopenharmony_ci err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr); 14768c2ecf20Sopenharmony_ci *pw_format = (u16)qr; 14778c2ecf20Sopenharmony_ci return err; 14788c2ecf20Sopenharmony_ci} 14798c2ecf20Sopenharmony_ci 14808c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format) 14818c2ecf20Sopenharmony_ci{ 14828c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format, 14838c2ecf20Sopenharmony_ci 0); 14848c2ecf20Sopenharmony_ci} 14858c2ecf20Sopenharmony_ci 14868c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format) 14878c2ecf20Sopenharmony_ci{ 14888c2ecf20Sopenharmony_ci u16 err; 14898c2ecf20Sopenharmony_ci u32 param; 14908c2ecf20Sopenharmony_ci 14918c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, ¶m); 14928c2ecf20Sopenharmony_ci if (!err && pw_format) 14938c2ecf20Sopenharmony_ci *pw_format = (u16)param; 14948c2ecf20Sopenharmony_ci 14958c2ecf20Sopenharmony_ci return err; 14968c2ecf20Sopenharmony_ci} 14978c2ecf20Sopenharmony_ci 14988c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate) 14998c2ecf20Sopenharmony_ci{ 15008c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE, 15018c2ecf20Sopenharmony_ci psample_rate); 15028c2ecf20Sopenharmony_ci} 15038c2ecf20Sopenharmony_ci 15048c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data) 15058c2ecf20Sopenharmony_ci{ 15068c2ecf20Sopenharmony_ci struct hpi_message hm; 15078c2ecf20Sopenharmony_ci struct hpi_response hr; 15088c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 15098c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 15108c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 15118c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 15128c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_AESEBURX_USERDATA; 15138c2ecf20Sopenharmony_ci hm.u.c.param1 = index; 15148c2ecf20Sopenharmony_ci 15158c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 15168c2ecf20Sopenharmony_ci 15178c2ecf20Sopenharmony_ci if (pw_data) 15188c2ecf20Sopenharmony_ci *pw_data = (u16)hr.u.c.param2; 15198c2ecf20Sopenharmony_ci return hr.error; 15208c2ecf20Sopenharmony_ci} 15218c2ecf20Sopenharmony_ci 15228c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index, 15238c2ecf20Sopenharmony_ci u16 *pw_data) 15248c2ecf20Sopenharmony_ci{ 15258c2ecf20Sopenharmony_ci struct hpi_message hm; 15268c2ecf20Sopenharmony_ci struct hpi_response hr; 15278c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 15288c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 15298c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 15308c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 15318c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS; 15328c2ecf20Sopenharmony_ci hm.u.c.param1 = index; 15338c2ecf20Sopenharmony_ci 15348c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 15358c2ecf20Sopenharmony_ci 15368c2ecf20Sopenharmony_ci if (pw_data) 15378c2ecf20Sopenharmony_ci *pw_data = (u16)hr.u.c.param2; 15388c2ecf20Sopenharmony_ci return hr.error; 15398c2ecf20Sopenharmony_ci} 15408c2ecf20Sopenharmony_ci 15418c2ecf20Sopenharmony_ciu16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data) 15428c2ecf20Sopenharmony_ci{ 15438c2ecf20Sopenharmony_ci u32 error_data = 0; 15448c2ecf20Sopenharmony_ci u16 err = 0; 15458c2ecf20Sopenharmony_ci 15468c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS, 15478c2ecf20Sopenharmony_ci &error_data); 15488c2ecf20Sopenharmony_ci if (pw_error_data) 15498c2ecf20Sopenharmony_ci *pw_error_data = (u16)error_data; 15508c2ecf20Sopenharmony_ci return err; 15518c2ecf20Sopenharmony_ci} 15528c2ecf20Sopenharmony_ci 15538c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate) 15548c2ecf20Sopenharmony_ci{ 15558c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE, 15568c2ecf20Sopenharmony_ci sample_rate, 0); 15578c2ecf20Sopenharmony_ci} 15588c2ecf20Sopenharmony_ci 15598c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data) 15608c2ecf20Sopenharmony_ci{ 15618c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index, 15628c2ecf20Sopenharmony_ci data); 15638c2ecf20Sopenharmony_ci} 15648c2ecf20Sopenharmony_ci 15658c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index, 15668c2ecf20Sopenharmony_ci u16 data) 15678c2ecf20Sopenharmony_ci{ 15688c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS, 15698c2ecf20Sopenharmony_ci index, data); 15708c2ecf20Sopenharmony_ci} 15718c2ecf20Sopenharmony_ci 15728c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index, 15738c2ecf20Sopenharmony_ci u16 *pw_data) 15748c2ecf20Sopenharmony_ci{ 15758c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_OPERATION; 15768c2ecf20Sopenharmony_ci} 15778c2ecf20Sopenharmony_ci 15788c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index, 15798c2ecf20Sopenharmony_ci u16 *pw_format) 15808c2ecf20Sopenharmony_ci{ 15818c2ecf20Sopenharmony_ci u32 qr; 15828c2ecf20Sopenharmony_ci u16 err; 15838c2ecf20Sopenharmony_ci 15848c2ecf20Sopenharmony_ci err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr); 15858c2ecf20Sopenharmony_ci *pw_format = (u16)qr; 15868c2ecf20Sopenharmony_ci return err; 15878c2ecf20Sopenharmony_ci} 15888c2ecf20Sopenharmony_ci 15898c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format) 15908c2ecf20Sopenharmony_ci{ 15918c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT, 15928c2ecf20Sopenharmony_ci output_format, 0); 15938c2ecf20Sopenharmony_ci} 15948c2ecf20Sopenharmony_ci 15958c2ecf20Sopenharmony_ciu16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format) 15968c2ecf20Sopenharmony_ci{ 15978c2ecf20Sopenharmony_ci u16 err; 15988c2ecf20Sopenharmony_ci u32 param; 15998c2ecf20Sopenharmony_ci 16008c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, ¶m); 16018c2ecf20Sopenharmony_ci if (!err && pw_output_format) 16028c2ecf20Sopenharmony_ci *pw_output_format = (u16)param; 16038c2ecf20Sopenharmony_ci 16048c2ecf20Sopenharmony_ci return err; 16058c2ecf20Sopenharmony_ci} 16068c2ecf20Sopenharmony_ci 16078c2ecf20Sopenharmony_ciu16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type) 16088c2ecf20Sopenharmony_ci{ 16098c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE, 16108c2ecf20Sopenharmony_ci edge_type, 0); 16118c2ecf20Sopenharmony_ci} 16128c2ecf20Sopenharmony_ci 16138c2ecf20Sopenharmony_ciu16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity) 16148c2ecf20Sopenharmony_ci{ 16158c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY, 16168c2ecf20Sopenharmony_ci polarity, 0); 16178c2ecf20Sopenharmony_ci} 16188c2ecf20Sopenharmony_ci 16198c2ecf20Sopenharmony_ciu16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity, 16208c2ecf20Sopenharmony_ci u16 *pw_data_activity) 16218c2ecf20Sopenharmony_ci{ 16228c2ecf20Sopenharmony_ci struct hpi_message hm; 16238c2ecf20Sopenharmony_ci struct hpi_response hr; 16248c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 16258c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 16268c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 16278c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 16288c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY; 16298c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 16308c2ecf20Sopenharmony_ci if (pw_clk_activity) 16318c2ecf20Sopenharmony_ci *pw_clk_activity = (u16)hr.u.c.param1; 16328c2ecf20Sopenharmony_ci if (pw_data_activity) 16338c2ecf20Sopenharmony_ci *pw_data_activity = (u16)hr.u.c.param2; 16348c2ecf20Sopenharmony_ci return hr.error; 16358c2ecf20Sopenharmony_ci} 16368c2ecf20Sopenharmony_ci 16378c2ecf20Sopenharmony_ciu16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index, 16388c2ecf20Sopenharmony_ci u16 *pw_mode) 16398c2ecf20Sopenharmony_ci{ 16408c2ecf20Sopenharmony_ci u32 qr; 16418c2ecf20Sopenharmony_ci u16 err; 16428c2ecf20Sopenharmony_ci 16438c2ecf20Sopenharmony_ci err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr); 16448c2ecf20Sopenharmony_ci *pw_mode = (u16)qr; 16458c2ecf20Sopenharmony_ci return err; 16468c2ecf20Sopenharmony_ci} 16478c2ecf20Sopenharmony_ci 16488c2ecf20Sopenharmony_ciu16 hpi_channel_mode_set(u32 h_control, u16 mode) 16498c2ecf20Sopenharmony_ci{ 16508c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode, 16518c2ecf20Sopenharmony_ci 0); 16528c2ecf20Sopenharmony_ci} 16538c2ecf20Sopenharmony_ci 16548c2ecf20Sopenharmony_ciu16 hpi_channel_mode_get(u32 h_control, u16 *mode) 16558c2ecf20Sopenharmony_ci{ 16568c2ecf20Sopenharmony_ci u32 mode32 = 0; 16578c2ecf20Sopenharmony_ci u16 err = hpi_control_param1_get(h_control, 16588c2ecf20Sopenharmony_ci HPI_CHANNEL_MODE_MODE, &mode32); 16598c2ecf20Sopenharmony_ci if (mode) 16608c2ecf20Sopenharmony_ci *mode = (u16)mode32; 16618c2ecf20Sopenharmony_ci return err; 16628c2ecf20Sopenharmony_ci} 16638c2ecf20Sopenharmony_ci 16648c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count, 16658c2ecf20Sopenharmony_ci u8 *pb_data) 16668c2ecf20Sopenharmony_ci{ 16678c2ecf20Sopenharmony_ci struct hpi_msg_cobranet_hmiwrite hm; 16688c2ecf20Sopenharmony_ci struct hpi_response_header hr; 16698c2ecf20Sopenharmony_ci 16708c2ecf20Sopenharmony_ci hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr, sizeof(hr), 16718c2ecf20Sopenharmony_ci HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); 16728c2ecf20Sopenharmony_ci 16738c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.h.adapter_index, 16748c2ecf20Sopenharmony_ci &hm.h.obj_index)) 16758c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 16768c2ecf20Sopenharmony_ci 16778c2ecf20Sopenharmony_ci if (byte_count > sizeof(hm.bytes)) 16788c2ecf20Sopenharmony_ci return HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL; 16798c2ecf20Sopenharmony_ci 16808c2ecf20Sopenharmony_ci hm.p.attribute = HPI_COBRANET_SET; 16818c2ecf20Sopenharmony_ci hm.p.byte_count = byte_count; 16828c2ecf20Sopenharmony_ci hm.p.hmi_address = hmi_address; 16838c2ecf20Sopenharmony_ci memcpy(hm.bytes, pb_data, byte_count); 16848c2ecf20Sopenharmony_ci hm.h.size = (u16)(sizeof(hm.h) + sizeof(hm.p) + byte_count); 16858c2ecf20Sopenharmony_ci 16868c2ecf20Sopenharmony_ci hpi_send_recvV1(&hm.h, &hr); 16878c2ecf20Sopenharmony_ci return hr.error; 16888c2ecf20Sopenharmony_ci} 16898c2ecf20Sopenharmony_ci 16908c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count, 16918c2ecf20Sopenharmony_ci u32 *pbyte_count, u8 *pb_data) 16928c2ecf20Sopenharmony_ci{ 16938c2ecf20Sopenharmony_ci struct hpi_msg_cobranet_hmiread hm; 16948c2ecf20Sopenharmony_ci struct hpi_res_cobranet_hmiread hr; 16958c2ecf20Sopenharmony_ci 16968c2ecf20Sopenharmony_ci hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr.h, sizeof(hr), 16978c2ecf20Sopenharmony_ci HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); 16988c2ecf20Sopenharmony_ci 16998c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.h.adapter_index, 17008c2ecf20Sopenharmony_ci &hm.h.obj_index)) 17018c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 17028c2ecf20Sopenharmony_ci 17038c2ecf20Sopenharmony_ci if (max_byte_count > sizeof(hr.bytes)) 17048c2ecf20Sopenharmony_ci return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL; 17058c2ecf20Sopenharmony_ci 17068c2ecf20Sopenharmony_ci hm.p.attribute = HPI_COBRANET_GET; 17078c2ecf20Sopenharmony_ci hm.p.byte_count = max_byte_count; 17088c2ecf20Sopenharmony_ci hm.p.hmi_address = hmi_address; 17098c2ecf20Sopenharmony_ci 17108c2ecf20Sopenharmony_ci hpi_send_recvV1(&hm.h, &hr.h); 17118c2ecf20Sopenharmony_ci 17128c2ecf20Sopenharmony_ci if (!hr.h.error && pb_data) { 17138c2ecf20Sopenharmony_ci if (hr.byte_count > sizeof(hr.bytes)) 17148c2ecf20Sopenharmony_ci 17158c2ecf20Sopenharmony_ci return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL; 17168c2ecf20Sopenharmony_ci 17178c2ecf20Sopenharmony_ci *pbyte_count = hr.byte_count; 17188c2ecf20Sopenharmony_ci 17198c2ecf20Sopenharmony_ci if (hr.byte_count < max_byte_count) 17208c2ecf20Sopenharmony_ci max_byte_count = *pbyte_count; 17218c2ecf20Sopenharmony_ci 17228c2ecf20Sopenharmony_ci memcpy(pb_data, hr.bytes, max_byte_count); 17238c2ecf20Sopenharmony_ci } 17248c2ecf20Sopenharmony_ci return hr.h.error; 17258c2ecf20Sopenharmony_ci} 17268c2ecf20Sopenharmony_ci 17278c2ecf20Sopenharmony_ciu16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus, 17288c2ecf20Sopenharmony_ci u32 *preadable_size, u32 *pwriteable_size) 17298c2ecf20Sopenharmony_ci{ 17308c2ecf20Sopenharmony_ci struct hpi_message hm; 17318c2ecf20Sopenharmony_ci struct hpi_response hr; 17328c2ecf20Sopenharmony_ci 17338c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 17348c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 17358c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 17368c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 17378c2ecf20Sopenharmony_ci 17388c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_COBRANET_GET_STATUS; 17398c2ecf20Sopenharmony_ci 17408c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 17418c2ecf20Sopenharmony_ci if (!hr.error) { 17428c2ecf20Sopenharmony_ci if (pstatus) 17438c2ecf20Sopenharmony_ci *pstatus = hr.u.cu.cobranet.status.status; 17448c2ecf20Sopenharmony_ci if (preadable_size) 17458c2ecf20Sopenharmony_ci *preadable_size = 17468c2ecf20Sopenharmony_ci hr.u.cu.cobranet.status.readable_size; 17478c2ecf20Sopenharmony_ci if (pwriteable_size) 17488c2ecf20Sopenharmony_ci *pwriteable_size = 17498c2ecf20Sopenharmony_ci hr.u.cu.cobranet.status.writeable_size; 17508c2ecf20Sopenharmony_ci } 17518c2ecf20Sopenharmony_ci return hr.error; 17528c2ecf20Sopenharmony_ci} 17538c2ecf20Sopenharmony_ci 17548c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address) 17558c2ecf20Sopenharmony_ci{ 17568c2ecf20Sopenharmony_ci u32 byte_count; 17578c2ecf20Sopenharmony_ci u32 iP; 17588c2ecf20Sopenharmony_ci u16 err; 17598c2ecf20Sopenharmony_ci 17608c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_read(h_control, 17618c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count, 17628c2ecf20Sopenharmony_ci (u8 *)&iP); 17638c2ecf20Sopenharmony_ci 17648c2ecf20Sopenharmony_ci *pdw_ip_address = 17658c2ecf20Sopenharmony_ci ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & 17668c2ecf20Sopenharmony_ci 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); 17678c2ecf20Sopenharmony_ci 17688c2ecf20Sopenharmony_ci if (err) 17698c2ecf20Sopenharmony_ci *pdw_ip_address = 0; 17708c2ecf20Sopenharmony_ci 17718c2ecf20Sopenharmony_ci return err; 17728c2ecf20Sopenharmony_ci 17738c2ecf20Sopenharmony_ci} 17748c2ecf20Sopenharmony_ci 17758c2ecf20Sopenharmony_ciu16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address) 17768c2ecf20Sopenharmony_ci{ 17778c2ecf20Sopenharmony_ci u32 iP; 17788c2ecf20Sopenharmony_ci u16 err; 17798c2ecf20Sopenharmony_ci 17808c2ecf20Sopenharmony_ci iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address & 17818c2ecf20Sopenharmony_ci 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >> 17828c2ecf20Sopenharmony_ci 8) | ((dw_ip_address & 0x000000ff) << 8); 17838c2ecf20Sopenharmony_ci 17848c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_write(h_control, 17858c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP); 17868c2ecf20Sopenharmony_ci 17878c2ecf20Sopenharmony_ci return err; 17888c2ecf20Sopenharmony_ci 17898c2ecf20Sopenharmony_ci} 17908c2ecf20Sopenharmony_ci 17918c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address) 17928c2ecf20Sopenharmony_ci{ 17938c2ecf20Sopenharmony_ci u32 byte_count; 17948c2ecf20Sopenharmony_ci u32 iP; 17958c2ecf20Sopenharmony_ci u16 err; 17968c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_read(h_control, 17978c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count, 17988c2ecf20Sopenharmony_ci (u8 *)&iP); 17998c2ecf20Sopenharmony_ci 18008c2ecf20Sopenharmony_ci *pdw_ip_address = 18018c2ecf20Sopenharmony_ci ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & 18028c2ecf20Sopenharmony_ci 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); 18038c2ecf20Sopenharmony_ci 18048c2ecf20Sopenharmony_ci if (err) 18058c2ecf20Sopenharmony_ci *pdw_ip_address = 0; 18068c2ecf20Sopenharmony_ci 18078c2ecf20Sopenharmony_ci return err; 18088c2ecf20Sopenharmony_ci 18098c2ecf20Sopenharmony_ci} 18108c2ecf20Sopenharmony_ci 18118c2ecf20Sopenharmony_ciu16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address) 18128c2ecf20Sopenharmony_ci{ 18138c2ecf20Sopenharmony_ci u32 iP; 18148c2ecf20Sopenharmony_ci u16 err; 18158c2ecf20Sopenharmony_ci 18168c2ecf20Sopenharmony_ci iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address & 18178c2ecf20Sopenharmony_ci 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >> 18188c2ecf20Sopenharmony_ci 8) | ((dw_ip_address & 0x000000ff) << 8); 18198c2ecf20Sopenharmony_ci 18208c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_write(h_control, 18218c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP); 18228c2ecf20Sopenharmony_ci 18238c2ecf20Sopenharmony_ci return err; 18248c2ecf20Sopenharmony_ci 18258c2ecf20Sopenharmony_ci} 18268c2ecf20Sopenharmony_ci 18278c2ecf20Sopenharmony_ciu16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs, 18288c2ecf20Sopenharmony_ci u32 *p_mac_lsbs) 18298c2ecf20Sopenharmony_ci{ 18308c2ecf20Sopenharmony_ci u32 byte_count; 18318c2ecf20Sopenharmony_ci u16 err; 18328c2ecf20Sopenharmony_ci u32 mac; 18338c2ecf20Sopenharmony_ci 18348c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_read(h_control, 18358c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count, 18368c2ecf20Sopenharmony_ci (u8 *)&mac); 18378c2ecf20Sopenharmony_ci 18388c2ecf20Sopenharmony_ci if (!err) { 18398c2ecf20Sopenharmony_ci *p_mac_msbs = 18408c2ecf20Sopenharmony_ci ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8) 18418c2ecf20Sopenharmony_ci | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) << 18428c2ecf20Sopenharmony_ci 8); 18438c2ecf20Sopenharmony_ci 18448c2ecf20Sopenharmony_ci err = hpi_cobranet_hmi_read(h_control, 18458c2ecf20Sopenharmony_ci HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4, 18468c2ecf20Sopenharmony_ci &byte_count, (u8 *)&mac); 18478c2ecf20Sopenharmony_ci } 18488c2ecf20Sopenharmony_ci 18498c2ecf20Sopenharmony_ci if (!err) { 18508c2ecf20Sopenharmony_ci *p_mac_lsbs = 18518c2ecf20Sopenharmony_ci ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8) 18528c2ecf20Sopenharmony_ci | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) << 18538c2ecf20Sopenharmony_ci 8); 18548c2ecf20Sopenharmony_ci } else { 18558c2ecf20Sopenharmony_ci *p_mac_msbs = 0; 18568c2ecf20Sopenharmony_ci *p_mac_lsbs = 0; 18578c2ecf20Sopenharmony_ci } 18588c2ecf20Sopenharmony_ci 18598c2ecf20Sopenharmony_ci return err; 18608c2ecf20Sopenharmony_ci} 18618c2ecf20Sopenharmony_ci 18628c2ecf20Sopenharmony_ciu16 hpi_compander_set_enable(u32 h_control, u32 enable) 18638c2ecf20Sopenharmony_ci{ 18648c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 18658c2ecf20Sopenharmony_ci 0); 18668c2ecf20Sopenharmony_ci} 18678c2ecf20Sopenharmony_ci 18688c2ecf20Sopenharmony_ciu16 hpi_compander_get_enable(u32 h_control, u32 *enable) 18698c2ecf20Sopenharmony_ci{ 18708c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 18718c2ecf20Sopenharmony_ci} 18728c2ecf20Sopenharmony_ci 18738c2ecf20Sopenharmony_ciu16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB) 18748c2ecf20Sopenharmony_ci{ 18758c2ecf20Sopenharmony_ci return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN, 18768c2ecf20Sopenharmony_ci makeup_gain0_01dB, 0); 18778c2ecf20Sopenharmony_ci} 18788c2ecf20Sopenharmony_ci 18798c2ecf20Sopenharmony_ciu16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB) 18808c2ecf20Sopenharmony_ci{ 18818c2ecf20Sopenharmony_ci return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN, 18828c2ecf20Sopenharmony_ci makeup_gain0_01dB, NULL); 18838c2ecf20Sopenharmony_ci} 18848c2ecf20Sopenharmony_ci 18858c2ecf20Sopenharmony_ciu16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index, 18868c2ecf20Sopenharmony_ci u32 attack) 18878c2ecf20Sopenharmony_ci{ 18888c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack, 18898c2ecf20Sopenharmony_ci index); 18908c2ecf20Sopenharmony_ci} 18918c2ecf20Sopenharmony_ci 18928c2ecf20Sopenharmony_ciu16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index, 18938c2ecf20Sopenharmony_ci u32 *attack) 18948c2ecf20Sopenharmony_ci{ 18958c2ecf20Sopenharmony_ci return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0, 18968c2ecf20Sopenharmony_ci index, attack, NULL); 18978c2ecf20Sopenharmony_ci} 18988c2ecf20Sopenharmony_ci 18998c2ecf20Sopenharmony_ciu16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index, 19008c2ecf20Sopenharmony_ci u32 decay) 19018c2ecf20Sopenharmony_ci{ 19028c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay, 19038c2ecf20Sopenharmony_ci index); 19048c2ecf20Sopenharmony_ci} 19058c2ecf20Sopenharmony_ci 19068c2ecf20Sopenharmony_ciu16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index, 19078c2ecf20Sopenharmony_ci u32 *decay) 19088c2ecf20Sopenharmony_ci{ 19098c2ecf20Sopenharmony_ci return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index, 19108c2ecf20Sopenharmony_ci decay, NULL); 19118c2ecf20Sopenharmony_ci 19128c2ecf20Sopenharmony_ci} 19138c2ecf20Sopenharmony_ci 19148c2ecf20Sopenharmony_ciu16 hpi_compander_set_threshold(u32 h_control, unsigned int index, 19158c2ecf20Sopenharmony_ci short threshold0_01dB) 19168c2ecf20Sopenharmony_ci{ 19178c2ecf20Sopenharmony_ci struct hpi_message hm; 19188c2ecf20Sopenharmony_ci struct hpi_response hr; 19198c2ecf20Sopenharmony_ci 19208c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 19218c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 19228c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 19238c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 19248c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; 19258c2ecf20Sopenharmony_ci hm.u.c.param2 = index; 19268c2ecf20Sopenharmony_ci hm.u.c.an_log_value[0] = threshold0_01dB; 19278c2ecf20Sopenharmony_ci 19288c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 19298c2ecf20Sopenharmony_ci 19308c2ecf20Sopenharmony_ci return hr.error; 19318c2ecf20Sopenharmony_ci} 19328c2ecf20Sopenharmony_ci 19338c2ecf20Sopenharmony_ciu16 hpi_compander_get_threshold(u32 h_control, unsigned int index, 19348c2ecf20Sopenharmony_ci short *threshold0_01dB) 19358c2ecf20Sopenharmony_ci{ 19368c2ecf20Sopenharmony_ci struct hpi_message hm; 19378c2ecf20Sopenharmony_ci struct hpi_response hr; 19388c2ecf20Sopenharmony_ci 19398c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 19408c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 19418c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 19428c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 19438c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; 19448c2ecf20Sopenharmony_ci hm.u.c.param2 = index; 19458c2ecf20Sopenharmony_ci 19468c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 19478c2ecf20Sopenharmony_ci *threshold0_01dB = hr.u.c.an_log_value[0]; 19488c2ecf20Sopenharmony_ci 19498c2ecf20Sopenharmony_ci return hr.error; 19508c2ecf20Sopenharmony_ci} 19518c2ecf20Sopenharmony_ci 19528c2ecf20Sopenharmony_ciu16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100) 19538c2ecf20Sopenharmony_ci{ 19548c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100, 19558c2ecf20Sopenharmony_ci index); 19568c2ecf20Sopenharmony_ci} 19578c2ecf20Sopenharmony_ci 19588c2ecf20Sopenharmony_ciu16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100) 19598c2ecf20Sopenharmony_ci{ 19608c2ecf20Sopenharmony_ci return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index, 19618c2ecf20Sopenharmony_ci ratio100, NULL); 19628c2ecf20Sopenharmony_ci} 19638c2ecf20Sopenharmony_ci 19648c2ecf20Sopenharmony_ciu16 hpi_level_query_range(u32 h_control, short *min_gain_01dB, 19658c2ecf20Sopenharmony_ci short *max_gain_01dB, short *step_gain_01dB) 19668c2ecf20Sopenharmony_ci{ 19678c2ecf20Sopenharmony_ci struct hpi_message hm; 19688c2ecf20Sopenharmony_ci struct hpi_response hr; 19698c2ecf20Sopenharmony_ci 19708c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 19718c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 19728c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 19738c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 19748c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_LEVEL_RANGE; 19758c2ecf20Sopenharmony_ci 19768c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 19778c2ecf20Sopenharmony_ci if (hr.error) { 19788c2ecf20Sopenharmony_ci hr.u.c.an_log_value[0] = 0; 19798c2ecf20Sopenharmony_ci hr.u.c.an_log_value[1] = 0; 19808c2ecf20Sopenharmony_ci hr.u.c.param1 = 0; 19818c2ecf20Sopenharmony_ci } 19828c2ecf20Sopenharmony_ci if (min_gain_01dB) 19838c2ecf20Sopenharmony_ci *min_gain_01dB = hr.u.c.an_log_value[0]; 19848c2ecf20Sopenharmony_ci if (max_gain_01dB) 19858c2ecf20Sopenharmony_ci *max_gain_01dB = hr.u.c.an_log_value[1]; 19868c2ecf20Sopenharmony_ci if (step_gain_01dB) 19878c2ecf20Sopenharmony_ci *step_gain_01dB = (short)hr.u.c.param1; 19888c2ecf20Sopenharmony_ci return hr.error; 19898c2ecf20Sopenharmony_ci} 19908c2ecf20Sopenharmony_ci 19918c2ecf20Sopenharmony_ciu16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] 19928c2ecf20Sopenharmony_ci ) 19938c2ecf20Sopenharmony_ci{ 19948c2ecf20Sopenharmony_ci return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN, 19958c2ecf20Sopenharmony_ci an_gain0_01dB[0], an_gain0_01dB[1]); 19968c2ecf20Sopenharmony_ci} 19978c2ecf20Sopenharmony_ci 19988c2ecf20Sopenharmony_ciu16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] 19998c2ecf20Sopenharmony_ci ) 20008c2ecf20Sopenharmony_ci{ 20018c2ecf20Sopenharmony_ci return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN, 20028c2ecf20Sopenharmony_ci &an_gain0_01dB[0], &an_gain0_01dB[1]); 20038c2ecf20Sopenharmony_ci} 20048c2ecf20Sopenharmony_ci 20058c2ecf20Sopenharmony_ciu16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels) 20068c2ecf20Sopenharmony_ci{ 20078c2ecf20Sopenharmony_ci return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0, 20088c2ecf20Sopenharmony_ci p_channels); 20098c2ecf20Sopenharmony_ci} 20108c2ecf20Sopenharmony_ci 20118c2ecf20Sopenharmony_ciu16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS] 20128c2ecf20Sopenharmony_ci ) 20138c2ecf20Sopenharmony_ci{ 20148c2ecf20Sopenharmony_ci short i = 0; 20158c2ecf20Sopenharmony_ci 20168c2ecf20Sopenharmony_ci struct hpi_message hm; 20178c2ecf20Sopenharmony_ci struct hpi_response hr; 20188c2ecf20Sopenharmony_ci 20198c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 20208c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 20218c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 20228c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 20238c2ecf20Sopenharmony_ci hm.obj_index = hm.obj_index; 20248c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_METER_PEAK; 20258c2ecf20Sopenharmony_ci 20268c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 20278c2ecf20Sopenharmony_ci 20288c2ecf20Sopenharmony_ci if (!hr.error) 20298c2ecf20Sopenharmony_ci memcpy(an_peakdB, hr.u.c.an_log_value, 20308c2ecf20Sopenharmony_ci sizeof(short) * HPI_MAX_CHANNELS); 20318c2ecf20Sopenharmony_ci else 20328c2ecf20Sopenharmony_ci for (i = 0; i < HPI_MAX_CHANNELS; i++) 20338c2ecf20Sopenharmony_ci an_peakdB[i] = HPI_METER_MINIMUM; 20348c2ecf20Sopenharmony_ci return hr.error; 20358c2ecf20Sopenharmony_ci} 20368c2ecf20Sopenharmony_ci 20378c2ecf20Sopenharmony_ciu16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS] 20388c2ecf20Sopenharmony_ci ) 20398c2ecf20Sopenharmony_ci{ 20408c2ecf20Sopenharmony_ci short i = 0; 20418c2ecf20Sopenharmony_ci 20428c2ecf20Sopenharmony_ci struct hpi_message hm; 20438c2ecf20Sopenharmony_ci struct hpi_response hr; 20448c2ecf20Sopenharmony_ci 20458c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 20468c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 20478c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 20488c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 20498c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_METER_RMS; 20508c2ecf20Sopenharmony_ci 20518c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 20528c2ecf20Sopenharmony_ci 20538c2ecf20Sopenharmony_ci if (!hr.error) 20548c2ecf20Sopenharmony_ci memcpy(an_rmsdB, hr.u.c.an_log_value, 20558c2ecf20Sopenharmony_ci sizeof(short) * HPI_MAX_CHANNELS); 20568c2ecf20Sopenharmony_ci else 20578c2ecf20Sopenharmony_ci for (i = 0; i < HPI_MAX_CHANNELS; i++) 20588c2ecf20Sopenharmony_ci an_rmsdB[i] = HPI_METER_MINIMUM; 20598c2ecf20Sopenharmony_ci 20608c2ecf20Sopenharmony_ci return hr.error; 20618c2ecf20Sopenharmony_ci} 20628c2ecf20Sopenharmony_ci 20638c2ecf20Sopenharmony_ciu16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay) 20648c2ecf20Sopenharmony_ci{ 20658c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS, 20668c2ecf20Sopenharmony_ci attack, decay); 20678c2ecf20Sopenharmony_ci} 20688c2ecf20Sopenharmony_ci 20698c2ecf20Sopenharmony_ciu16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay) 20708c2ecf20Sopenharmony_ci{ 20718c2ecf20Sopenharmony_ci u32 attack; 20728c2ecf20Sopenharmony_ci u32 decay; 20738c2ecf20Sopenharmony_ci u16 error; 20748c2ecf20Sopenharmony_ci 20758c2ecf20Sopenharmony_ci error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS, 20768c2ecf20Sopenharmony_ci &attack, &decay); 20778c2ecf20Sopenharmony_ci 20788c2ecf20Sopenharmony_ci if (pn_attack) 20798c2ecf20Sopenharmony_ci *pn_attack = (unsigned short)attack; 20808c2ecf20Sopenharmony_ci if (pn_decay) 20818c2ecf20Sopenharmony_ci *pn_decay = (unsigned short)decay; 20828c2ecf20Sopenharmony_ci 20838c2ecf20Sopenharmony_ci return error; 20848c2ecf20Sopenharmony_ci} 20858c2ecf20Sopenharmony_ci 20868c2ecf20Sopenharmony_ciu16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay) 20878c2ecf20Sopenharmony_ci{ 20888c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS, 20898c2ecf20Sopenharmony_ci attack, decay); 20908c2ecf20Sopenharmony_ci} 20918c2ecf20Sopenharmony_ci 20928c2ecf20Sopenharmony_ciu16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack, 20938c2ecf20Sopenharmony_ci u16 *pn_decay) 20948c2ecf20Sopenharmony_ci{ 20958c2ecf20Sopenharmony_ci u32 attack; 20968c2ecf20Sopenharmony_ci u32 decay; 20978c2ecf20Sopenharmony_ci u16 error; 20988c2ecf20Sopenharmony_ci 20998c2ecf20Sopenharmony_ci error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS, 21008c2ecf20Sopenharmony_ci &attack, &decay); 21018c2ecf20Sopenharmony_ci 21028c2ecf20Sopenharmony_ci if (pn_attack) 21038c2ecf20Sopenharmony_ci *pn_attack = (short)attack; 21048c2ecf20Sopenharmony_ci if (pn_decay) 21058c2ecf20Sopenharmony_ci *pn_decay = (short)decay; 21068c2ecf20Sopenharmony_ci 21078c2ecf20Sopenharmony_ci return error; 21088c2ecf20Sopenharmony_ci} 21098c2ecf20Sopenharmony_ci 21108c2ecf20Sopenharmony_ciu16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off) 21118c2ecf20Sopenharmony_ci{ 21128c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER, 21138c2ecf20Sopenharmony_ci (u32)on_off, 0); 21148c2ecf20Sopenharmony_ci} 21158c2ecf20Sopenharmony_ci 21168c2ecf20Sopenharmony_ciu16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off) 21178c2ecf20Sopenharmony_ci{ 21188c2ecf20Sopenharmony_ci u16 error = 0; 21198c2ecf20Sopenharmony_ci u32 on_off = 0; 21208c2ecf20Sopenharmony_ci error = hpi_control_param1_get(h_control, 21218c2ecf20Sopenharmony_ci HPI_MICROPHONE_PHANTOM_POWER, &on_off); 21228c2ecf20Sopenharmony_ci if (pw_on_off) 21238c2ecf20Sopenharmony_ci *pw_on_off = (u16)on_off; 21248c2ecf20Sopenharmony_ci return error; 21258c2ecf20Sopenharmony_ci} 21268c2ecf20Sopenharmony_ci 21278c2ecf20Sopenharmony_ciu16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type, 21288c2ecf20Sopenharmony_ci u16 source_node_index) 21298c2ecf20Sopenharmony_ci{ 21308c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE, 21318c2ecf20Sopenharmony_ci source_node_type, source_node_index); 21328c2ecf20Sopenharmony_ci} 21338c2ecf20Sopenharmony_ci 21348c2ecf20Sopenharmony_ciu16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type, 21358c2ecf20Sopenharmony_ci u16 *source_node_index) 21368c2ecf20Sopenharmony_ci{ 21378c2ecf20Sopenharmony_ci u32 node, index; 21388c2ecf20Sopenharmony_ci u16 err = hpi_control_param2_get(h_control, 21398c2ecf20Sopenharmony_ci HPI_MULTIPLEXER_SOURCE, &node, 21408c2ecf20Sopenharmony_ci &index); 21418c2ecf20Sopenharmony_ci if (source_node_type) 21428c2ecf20Sopenharmony_ci *source_node_type = (u16)node; 21438c2ecf20Sopenharmony_ci if (source_node_index) 21448c2ecf20Sopenharmony_ci *source_node_index = (u16)index; 21458c2ecf20Sopenharmony_ci return err; 21468c2ecf20Sopenharmony_ci} 21478c2ecf20Sopenharmony_ci 21488c2ecf20Sopenharmony_ciu16 hpi_multiplexer_query_source(u32 h_control, u16 index, 21498c2ecf20Sopenharmony_ci u16 *source_node_type, u16 *source_node_index) 21508c2ecf20Sopenharmony_ci{ 21518c2ecf20Sopenharmony_ci struct hpi_message hm; 21528c2ecf20Sopenharmony_ci struct hpi_response hr; 21538c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 21548c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 21558c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 21568c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 21578c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE; 21588c2ecf20Sopenharmony_ci hm.u.c.param1 = index; 21598c2ecf20Sopenharmony_ci 21608c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 21618c2ecf20Sopenharmony_ci 21628c2ecf20Sopenharmony_ci if (source_node_type) 21638c2ecf20Sopenharmony_ci *source_node_type = (u16)hr.u.c.param1; 21648c2ecf20Sopenharmony_ci if (source_node_index) 21658c2ecf20Sopenharmony_ci *source_node_index = (u16)hr.u.c.param2; 21668c2ecf20Sopenharmony_ci return hr.error; 21678c2ecf20Sopenharmony_ci} 21688c2ecf20Sopenharmony_ci 21698c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands, 21708c2ecf20Sopenharmony_ci u16 *pw_on_off) 21718c2ecf20Sopenharmony_ci{ 21728c2ecf20Sopenharmony_ci u32 oB = 0; 21738c2ecf20Sopenharmony_ci u32 oO = 0; 21748c2ecf20Sopenharmony_ci u16 error = 0; 21758c2ecf20Sopenharmony_ci 21768c2ecf20Sopenharmony_ci error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS, 21778c2ecf20Sopenharmony_ci &oO, &oB); 21788c2ecf20Sopenharmony_ci if (pw_number_of_bands) 21798c2ecf20Sopenharmony_ci *pw_number_of_bands = (u16)oB; 21808c2ecf20Sopenharmony_ci if (pw_on_off) 21818c2ecf20Sopenharmony_ci *pw_on_off = (u16)oO; 21828c2ecf20Sopenharmony_ci return error; 21838c2ecf20Sopenharmony_ci} 21848c2ecf20Sopenharmony_ci 21858c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off) 21868c2ecf20Sopenharmony_ci{ 21878c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS, 21888c2ecf20Sopenharmony_ci on_off, 0); 21898c2ecf20Sopenharmony_ci} 21908c2ecf20Sopenharmony_ci 21918c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type, 21928c2ecf20Sopenharmony_ci u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB) 21938c2ecf20Sopenharmony_ci{ 21948c2ecf20Sopenharmony_ci struct hpi_message hm; 21958c2ecf20Sopenharmony_ci struct hpi_response hr; 21968c2ecf20Sopenharmony_ci 21978c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 21988c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 21998c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 22008c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 22018c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_EQUALIZER_FILTER; 22028c2ecf20Sopenharmony_ci hm.u.c.param2 = index; 22038c2ecf20Sopenharmony_ci 22048c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 22058c2ecf20Sopenharmony_ci 22068c2ecf20Sopenharmony_ci if (pfrequency_hz) 22078c2ecf20Sopenharmony_ci *pfrequency_hz = hr.u.c.param1; 22088c2ecf20Sopenharmony_ci if (pn_type) 22098c2ecf20Sopenharmony_ci *pn_type = (u16)(hr.u.c.param2 >> 16); 22108c2ecf20Sopenharmony_ci if (pnQ100) 22118c2ecf20Sopenharmony_ci *pnQ100 = hr.u.c.an_log_value[1]; 22128c2ecf20Sopenharmony_ci if (pn_gain0_01dB) 22138c2ecf20Sopenharmony_ci *pn_gain0_01dB = hr.u.c.an_log_value[0]; 22148c2ecf20Sopenharmony_ci 22158c2ecf20Sopenharmony_ci return hr.error; 22168c2ecf20Sopenharmony_ci} 22178c2ecf20Sopenharmony_ci 22188c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type, 22198c2ecf20Sopenharmony_ci u32 frequency_hz, short q100, short gain0_01dB) 22208c2ecf20Sopenharmony_ci{ 22218c2ecf20Sopenharmony_ci struct hpi_message hm; 22228c2ecf20Sopenharmony_ci struct hpi_response hr; 22238c2ecf20Sopenharmony_ci 22248c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 22258c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 22268c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 22278c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 22288c2ecf20Sopenharmony_ci 22298c2ecf20Sopenharmony_ci hm.u.c.param1 = frequency_hz; 22308c2ecf20Sopenharmony_ci hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16); 22318c2ecf20Sopenharmony_ci hm.u.c.an_log_value[0] = gain0_01dB; 22328c2ecf20Sopenharmony_ci hm.u.c.an_log_value[1] = q100; 22338c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_EQUALIZER_FILTER; 22348c2ecf20Sopenharmony_ci 22358c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 22368c2ecf20Sopenharmony_ci 22378c2ecf20Sopenharmony_ci return hr.error; 22388c2ecf20Sopenharmony_ci} 22398c2ecf20Sopenharmony_ci 22408c2ecf20Sopenharmony_ciu16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5] 22418c2ecf20Sopenharmony_ci ) 22428c2ecf20Sopenharmony_ci{ 22438c2ecf20Sopenharmony_ci struct hpi_message hm; 22448c2ecf20Sopenharmony_ci struct hpi_response hr; 22458c2ecf20Sopenharmony_ci 22468c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 22478c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 22488c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 22498c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 22508c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS; 22518c2ecf20Sopenharmony_ci hm.u.c.param2 = index; 22528c2ecf20Sopenharmony_ci 22538c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 22548c2ecf20Sopenharmony_ci 22558c2ecf20Sopenharmony_ci coeffs[0] = (short)hr.u.c.an_log_value[0]; 22568c2ecf20Sopenharmony_ci coeffs[1] = (short)hr.u.c.an_log_value[1]; 22578c2ecf20Sopenharmony_ci coeffs[2] = (short)hr.u.c.param1; 22588c2ecf20Sopenharmony_ci coeffs[3] = (short)(hr.u.c.param1 >> 16); 22598c2ecf20Sopenharmony_ci coeffs[4] = (short)hr.u.c.param2; 22608c2ecf20Sopenharmony_ci 22618c2ecf20Sopenharmony_ci return hr.error; 22628c2ecf20Sopenharmony_ci} 22638c2ecf20Sopenharmony_ci 22648c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index, 22658c2ecf20Sopenharmony_ci u16 *pw_source) 22668c2ecf20Sopenharmony_ci{ 22678c2ecf20Sopenharmony_ci u32 qr; 22688c2ecf20Sopenharmony_ci u16 err; 22698c2ecf20Sopenharmony_ci 22708c2ecf20Sopenharmony_ci err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0, 22718c2ecf20Sopenharmony_ci &qr); 22728c2ecf20Sopenharmony_ci *pw_source = (u16)qr; 22738c2ecf20Sopenharmony_ci return err; 22748c2ecf20Sopenharmony_ci} 22758c2ecf20Sopenharmony_ci 22768c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_source(u32 h_control, u16 source) 22778c2ecf20Sopenharmony_ci{ 22788c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE, 22798c2ecf20Sopenharmony_ci source, 0); 22808c2ecf20Sopenharmony_ci} 22818c2ecf20Sopenharmony_ci 22828c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source) 22838c2ecf20Sopenharmony_ci{ 22848c2ecf20Sopenharmony_ci u16 err = 0; 22858c2ecf20Sopenharmony_ci u32 source = 0; 22868c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE, 22878c2ecf20Sopenharmony_ci &source); 22888c2ecf20Sopenharmony_ci if (!err) 22898c2ecf20Sopenharmony_ci if (pw_source) 22908c2ecf20Sopenharmony_ci *pw_source = (u16)source; 22918c2ecf20Sopenharmony_ci return err; 22928c2ecf20Sopenharmony_ci} 22938c2ecf20Sopenharmony_ci 22948c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index, 22958c2ecf20Sopenharmony_ci const u32 source, u16 *pw_source_index) 22968c2ecf20Sopenharmony_ci{ 22978c2ecf20Sopenharmony_ci u32 qr; 22988c2ecf20Sopenharmony_ci u16 err; 22998c2ecf20Sopenharmony_ci 23008c2ecf20Sopenharmony_ci err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index, 23018c2ecf20Sopenharmony_ci source, &qr); 23028c2ecf20Sopenharmony_ci *pw_source_index = (u16)qr; 23038c2ecf20Sopenharmony_ci return err; 23048c2ecf20Sopenharmony_ci} 23058c2ecf20Sopenharmony_ci 23068c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index) 23078c2ecf20Sopenharmony_ci{ 23088c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX, 23098c2ecf20Sopenharmony_ci source_index, 0); 23108c2ecf20Sopenharmony_ci} 23118c2ecf20Sopenharmony_ci 23128c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index) 23138c2ecf20Sopenharmony_ci{ 23148c2ecf20Sopenharmony_ci u16 err = 0; 23158c2ecf20Sopenharmony_ci u32 source_index = 0; 23168c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX, 23178c2ecf20Sopenharmony_ci &source_index); 23188c2ecf20Sopenharmony_ci if (!err) 23198c2ecf20Sopenharmony_ci if (pw_source_index) 23208c2ecf20Sopenharmony_ci *pw_source_index = (u16)source_index; 23218c2ecf20Sopenharmony_ci return err; 23228c2ecf20Sopenharmony_ci} 23238c2ecf20Sopenharmony_ci 23248c2ecf20Sopenharmony_ciu16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index, 23258c2ecf20Sopenharmony_ci u32 *prate) 23268c2ecf20Sopenharmony_ci{ 23278c2ecf20Sopenharmony_ci return hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, 23288c2ecf20Sopenharmony_ci index, 0, prate); 23298c2ecf20Sopenharmony_ci} 23308c2ecf20Sopenharmony_ci 23318c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate) 23328c2ecf20Sopenharmony_ci{ 23338c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, 23348c2ecf20Sopenharmony_ci HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0); 23358c2ecf20Sopenharmony_ci} 23368c2ecf20Sopenharmony_ci 23378c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate) 23388c2ecf20Sopenharmony_ci{ 23398c2ecf20Sopenharmony_ci u16 err = 0; 23408c2ecf20Sopenharmony_ci u32 sample_rate = 0; 23418c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, 23428c2ecf20Sopenharmony_ci HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate); 23438c2ecf20Sopenharmony_ci if (!err) 23448c2ecf20Sopenharmony_ci if (psample_rate) 23458c2ecf20Sopenharmony_ci *psample_rate = sample_rate; 23468c2ecf20Sopenharmony_ci return err; 23478c2ecf20Sopenharmony_ci} 23488c2ecf20Sopenharmony_ci 23498c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate) 23508c2ecf20Sopenharmony_ci{ 23518c2ecf20Sopenharmony_ci u16 err = 0; 23528c2ecf20Sopenharmony_ci u32 sample_rate = 0; 23538c2ecf20Sopenharmony_ci err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE, 23548c2ecf20Sopenharmony_ci &sample_rate); 23558c2ecf20Sopenharmony_ci if (!err) 23568c2ecf20Sopenharmony_ci if (psample_rate) 23578c2ecf20Sopenharmony_ci *psample_rate = sample_rate; 23588c2ecf20Sopenharmony_ci return err; 23598c2ecf20Sopenharmony_ci} 23608c2ecf20Sopenharmony_ci 23618c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_auto(u32 h_control, u32 enable) 23628c2ecf20Sopenharmony_ci{ 23638c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable, 23648c2ecf20Sopenharmony_ci 0); 23658c2ecf20Sopenharmony_ci} 23668c2ecf20Sopenharmony_ci 23678c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable) 23688c2ecf20Sopenharmony_ci{ 23698c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO, 23708c2ecf20Sopenharmony_ci penable); 23718c2ecf20Sopenharmony_ci} 23728c2ecf20Sopenharmony_ci 23738c2ecf20Sopenharmony_ciu16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock) 23748c2ecf20Sopenharmony_ci{ 23758c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK, 23768c2ecf20Sopenharmony_ci lock, 0); 23778c2ecf20Sopenharmony_ci} 23788c2ecf20Sopenharmony_ci 23798c2ecf20Sopenharmony_ciu16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock) 23808c2ecf20Sopenharmony_ci{ 23818c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK, 23828c2ecf20Sopenharmony_ci plock); 23838c2ecf20Sopenharmony_ci} 23848c2ecf20Sopenharmony_ci 23858c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency) 23868c2ecf20Sopenharmony_ci{ 23878c2ecf20Sopenharmony_ci return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY, 23888c2ecf20Sopenharmony_ci index, 0, frequency, NULL); 23898c2ecf20Sopenharmony_ci} 23908c2ecf20Sopenharmony_ci 23918c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_state(u32 h_control, u32 *state) 23928c2ecf20Sopenharmony_ci{ 23938c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE, 23948c2ecf20Sopenharmony_ci state); 23958c2ecf20Sopenharmony_ci} 23968c2ecf20Sopenharmony_ci 23978c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_enable(u32 h_control, u32 enable) 23988c2ecf20Sopenharmony_ci{ 23998c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 24008c2ecf20Sopenharmony_ci 0); 24018c2ecf20Sopenharmony_ci} 24028c2ecf20Sopenharmony_ci 24038c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable) 24048c2ecf20Sopenharmony_ci{ 24058c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 24068c2ecf20Sopenharmony_ci} 24078c2ecf20Sopenharmony_ci 24088c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable) 24098c2ecf20Sopenharmony_ci{ 24108c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE, 24118c2ecf20Sopenharmony_ci (u32)event_enable, 0); 24128c2ecf20Sopenharmony_ci} 24138c2ecf20Sopenharmony_ci 24148c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable) 24158c2ecf20Sopenharmony_ci{ 24168c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE, 24178c2ecf20Sopenharmony_ci event_enable); 24188c2ecf20Sopenharmony_ci} 24198c2ecf20Sopenharmony_ci 24208c2ecf20Sopenharmony_ciu16 hpi_tone_detector_set_threshold(u32 h_control, int threshold) 24218c2ecf20Sopenharmony_ci{ 24228c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD, 24238c2ecf20Sopenharmony_ci (u32)threshold, 0); 24248c2ecf20Sopenharmony_ci} 24258c2ecf20Sopenharmony_ci 24268c2ecf20Sopenharmony_ciu16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold) 24278c2ecf20Sopenharmony_ci{ 24288c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD, 24298c2ecf20Sopenharmony_ci (u32 *)threshold); 24308c2ecf20Sopenharmony_ci} 24318c2ecf20Sopenharmony_ci 24328c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_state(u32 h_control, u32 *state) 24338c2ecf20Sopenharmony_ci{ 24348c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE, 24358c2ecf20Sopenharmony_ci state); 24368c2ecf20Sopenharmony_ci} 24378c2ecf20Sopenharmony_ci 24388c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_enable(u32 h_control, u32 enable) 24398c2ecf20Sopenharmony_ci{ 24408c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 24418c2ecf20Sopenharmony_ci 0); 24428c2ecf20Sopenharmony_ci} 24438c2ecf20Sopenharmony_ci 24448c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable) 24458c2ecf20Sopenharmony_ci{ 24468c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 24478c2ecf20Sopenharmony_ci} 24488c2ecf20Sopenharmony_ci 24498c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable) 24508c2ecf20Sopenharmony_ci{ 24518c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE, 24528c2ecf20Sopenharmony_ci event_enable, 0); 24538c2ecf20Sopenharmony_ci} 24548c2ecf20Sopenharmony_ci 24558c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable) 24568c2ecf20Sopenharmony_ci{ 24578c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE, 24588c2ecf20Sopenharmony_ci event_enable); 24598c2ecf20Sopenharmony_ci} 24608c2ecf20Sopenharmony_ci 24618c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_delay(u32 h_control, u32 delay) 24628c2ecf20Sopenharmony_ci{ 24638c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY, 24648c2ecf20Sopenharmony_ci delay, 0); 24658c2ecf20Sopenharmony_ci} 24668c2ecf20Sopenharmony_ci 24678c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay) 24688c2ecf20Sopenharmony_ci{ 24698c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY, 24708c2ecf20Sopenharmony_ci delay); 24718c2ecf20Sopenharmony_ci} 24728c2ecf20Sopenharmony_ci 24738c2ecf20Sopenharmony_ciu16 hpi_silence_detector_set_threshold(u32 h_control, int threshold) 24748c2ecf20Sopenharmony_ci{ 24758c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD, 24768c2ecf20Sopenharmony_ci threshold, 0); 24778c2ecf20Sopenharmony_ci} 24788c2ecf20Sopenharmony_ci 24798c2ecf20Sopenharmony_ciu16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold) 24808c2ecf20Sopenharmony_ci{ 24818c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, 24828c2ecf20Sopenharmony_ci HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold); 24838c2ecf20Sopenharmony_ci} 24848c2ecf20Sopenharmony_ci 24858c2ecf20Sopenharmony_ciu16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band) 24868c2ecf20Sopenharmony_ci{ 24878c2ecf20Sopenharmony_ci u32 qr; 24888c2ecf20Sopenharmony_ci u16 err; 24898c2ecf20Sopenharmony_ci 24908c2ecf20Sopenharmony_ci err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr); 24918c2ecf20Sopenharmony_ci *pw_band = (u16)qr; 24928c2ecf20Sopenharmony_ci return err; 24938c2ecf20Sopenharmony_ci} 24948c2ecf20Sopenharmony_ci 24958c2ecf20Sopenharmony_ciu16 hpi_tuner_set_band(u32 h_control, u16 band) 24968c2ecf20Sopenharmony_ci{ 24978c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0); 24988c2ecf20Sopenharmony_ci} 24998c2ecf20Sopenharmony_ci 25008c2ecf20Sopenharmony_ciu16 hpi_tuner_get_band(u32 h_control, u16 *pw_band) 25018c2ecf20Sopenharmony_ci{ 25028c2ecf20Sopenharmony_ci u32 band = 0; 25038c2ecf20Sopenharmony_ci u16 error = 0; 25048c2ecf20Sopenharmony_ci 25058c2ecf20Sopenharmony_ci error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band); 25068c2ecf20Sopenharmony_ci if (pw_band) 25078c2ecf20Sopenharmony_ci *pw_band = (u16)band; 25088c2ecf20Sopenharmony_ci return error; 25098c2ecf20Sopenharmony_ci} 25108c2ecf20Sopenharmony_ci 25118c2ecf20Sopenharmony_ciu16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index, 25128c2ecf20Sopenharmony_ci const u16 band, u32 *pfreq) 25138c2ecf20Sopenharmony_ci{ 25148c2ecf20Sopenharmony_ci return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq); 25158c2ecf20Sopenharmony_ci} 25168c2ecf20Sopenharmony_ci 25178c2ecf20Sopenharmony_ciu16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz) 25188c2ecf20Sopenharmony_ci{ 25198c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz, 25208c2ecf20Sopenharmony_ci 0); 25218c2ecf20Sopenharmony_ci} 25228c2ecf20Sopenharmony_ci 25238c2ecf20Sopenharmony_ciu16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz) 25248c2ecf20Sopenharmony_ci{ 25258c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TUNER_FREQ, 25268c2ecf20Sopenharmony_ci pw_freq_ink_hz); 25278c2ecf20Sopenharmony_ci} 25288c2ecf20Sopenharmony_ci 25298c2ecf20Sopenharmony_ciu16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain) 25308c2ecf20Sopenharmony_ci{ 25318c2ecf20Sopenharmony_ci u32 qr; 25328c2ecf20Sopenharmony_ci u16 err; 25338c2ecf20Sopenharmony_ci 25348c2ecf20Sopenharmony_ci err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr); 25358c2ecf20Sopenharmony_ci *pw_gain = (u16)qr; 25368c2ecf20Sopenharmony_ci return err; 25378c2ecf20Sopenharmony_ci} 25388c2ecf20Sopenharmony_ci 25398c2ecf20Sopenharmony_ciu16 hpi_tuner_set_gain(u32 h_control, short gain) 25408c2ecf20Sopenharmony_ci{ 25418c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0); 25428c2ecf20Sopenharmony_ci} 25438c2ecf20Sopenharmony_ci 25448c2ecf20Sopenharmony_ciu16 hpi_tuner_get_gain(u32 h_control, short *pn_gain) 25458c2ecf20Sopenharmony_ci{ 25468c2ecf20Sopenharmony_ci u32 gain = 0; 25478c2ecf20Sopenharmony_ci u16 error = 0; 25488c2ecf20Sopenharmony_ci 25498c2ecf20Sopenharmony_ci error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain); 25508c2ecf20Sopenharmony_ci if (pn_gain) 25518c2ecf20Sopenharmony_ci *pn_gain = (u16)gain; 25528c2ecf20Sopenharmony_ci return error; 25538c2ecf20Sopenharmony_ci} 25548c2ecf20Sopenharmony_ci 25558c2ecf20Sopenharmony_ciu16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level) 25568c2ecf20Sopenharmony_ci{ 25578c2ecf20Sopenharmony_ci struct hpi_message hm; 25588c2ecf20Sopenharmony_ci struct hpi_response hr; 25598c2ecf20Sopenharmony_ci 25608c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 25618c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 25628c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 25638c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 25648c2ecf20Sopenharmony_ci hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG; 25658c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 25668c2ecf20Sopenharmony_ci if (pw_level) 25678c2ecf20Sopenharmony_ci *pw_level = hr.u.cu.tuner.s_level; 25688c2ecf20Sopenharmony_ci return hr.error; 25698c2ecf20Sopenharmony_ci} 25708c2ecf20Sopenharmony_ci 25718c2ecf20Sopenharmony_ciu16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level) 25728c2ecf20Sopenharmony_ci{ 25738c2ecf20Sopenharmony_ci struct hpi_message hm; 25748c2ecf20Sopenharmony_ci struct hpi_response hr; 25758c2ecf20Sopenharmony_ci 25768c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 25778c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 25788c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 25798c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 25808c2ecf20Sopenharmony_ci hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW; 25818c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 25828c2ecf20Sopenharmony_ci if (pw_level) 25838c2ecf20Sopenharmony_ci *pw_level = hr.u.cu.tuner.s_level; 25848c2ecf20Sopenharmony_ci return hr.error; 25858c2ecf20Sopenharmony_ci} 25868c2ecf20Sopenharmony_ci 25878c2ecf20Sopenharmony_ciu16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index, 25888c2ecf20Sopenharmony_ci const u16 band, u32 *pdeemphasis) 25898c2ecf20Sopenharmony_ci{ 25908c2ecf20Sopenharmony_ci return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band, 25918c2ecf20Sopenharmony_ci pdeemphasis); 25928c2ecf20Sopenharmony_ci} 25938c2ecf20Sopenharmony_ci 25948c2ecf20Sopenharmony_ciu16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis) 25958c2ecf20Sopenharmony_ci{ 25968c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS, 25978c2ecf20Sopenharmony_ci deemphasis, 0); 25988c2ecf20Sopenharmony_ci} 25998c2ecf20Sopenharmony_ci 26008c2ecf20Sopenharmony_ciu16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis) 26018c2ecf20Sopenharmony_ci{ 26028c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS, 26038c2ecf20Sopenharmony_ci pdeemphasis); 26048c2ecf20Sopenharmony_ci} 26058c2ecf20Sopenharmony_ci 26068c2ecf20Sopenharmony_ciu16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program) 26078c2ecf20Sopenharmony_ci{ 26088c2ecf20Sopenharmony_ci return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0, 26098c2ecf20Sopenharmony_ci pbitmap_program); 26108c2ecf20Sopenharmony_ci} 26118c2ecf20Sopenharmony_ci 26128c2ecf20Sopenharmony_ciu16 hpi_tuner_set_program(u32 h_control, u32 program) 26138c2ecf20Sopenharmony_ci{ 26148c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program, 26158c2ecf20Sopenharmony_ci 0); 26168c2ecf20Sopenharmony_ci} 26178c2ecf20Sopenharmony_ci 26188c2ecf20Sopenharmony_ciu16 hpi_tuner_get_program(u32 h_control, u32 *pprogram) 26198c2ecf20Sopenharmony_ci{ 26208c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram); 26218c2ecf20Sopenharmony_ci} 26228c2ecf20Sopenharmony_ci 26238c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version, 26248c2ecf20Sopenharmony_ci const u32 string_size) 26258c2ecf20Sopenharmony_ci{ 26268c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, 26278c2ecf20Sopenharmony_ci HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size); 26288c2ecf20Sopenharmony_ci} 26298c2ecf20Sopenharmony_ci 26308c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version, 26318c2ecf20Sopenharmony_ci const u32 string_size) 26328c2ecf20Sopenharmony_ci{ 26338c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, 26348c2ecf20Sopenharmony_ci HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size); 26358c2ecf20Sopenharmony_ci} 26368c2ecf20Sopenharmony_ci 26378c2ecf20Sopenharmony_ciu16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status) 26388c2ecf20Sopenharmony_ci{ 26398c2ecf20Sopenharmony_ci u32 status = 0; 26408c2ecf20Sopenharmony_ci u16 error = 0; 26418c2ecf20Sopenharmony_ci 26428c2ecf20Sopenharmony_ci error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status); 26438c2ecf20Sopenharmony_ci if (pw_status) { 26448c2ecf20Sopenharmony_ci if (!error) { 26458c2ecf20Sopenharmony_ci *pw_status_mask = (u16)(status >> 16); 26468c2ecf20Sopenharmony_ci *pw_status = (u16)(status & 0xFFFF); 26478c2ecf20Sopenharmony_ci } else { 26488c2ecf20Sopenharmony_ci *pw_status_mask = 0; 26498c2ecf20Sopenharmony_ci *pw_status = 0; 26508c2ecf20Sopenharmony_ci } 26518c2ecf20Sopenharmony_ci } 26528c2ecf20Sopenharmony_ci return error; 26538c2ecf20Sopenharmony_ci} 26548c2ecf20Sopenharmony_ci 26558c2ecf20Sopenharmony_ciu16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value) 26568c2ecf20Sopenharmony_ci{ 26578c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value); 26588c2ecf20Sopenharmony_ci} 26598c2ecf20Sopenharmony_ci 26608c2ecf20Sopenharmony_ciu16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value) 26618c2ecf20Sopenharmony_ci{ 26628c2ecf20Sopenharmony_ci return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0, 26638c2ecf20Sopenharmony_ci pn_value, NULL); 26648c2ecf20Sopenharmony_ci} 26658c2ecf20Sopenharmony_ci 26668c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality) 26678c2ecf20Sopenharmony_ci{ 26688c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, 26698c2ecf20Sopenharmony_ci HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality); 26708c2ecf20Sopenharmony_ci} 26718c2ecf20Sopenharmony_ci 26728c2ecf20Sopenharmony_ciu16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend) 26738c2ecf20Sopenharmony_ci{ 26748c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND, 26758c2ecf20Sopenharmony_ci pblend); 26768c2ecf20Sopenharmony_ci} 26778c2ecf20Sopenharmony_ci 26788c2ecf20Sopenharmony_ciu16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend) 26798c2ecf20Sopenharmony_ci{ 26808c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND, 26818c2ecf20Sopenharmony_ci blend, 0); 26828c2ecf20Sopenharmony_ci} 26838c2ecf20Sopenharmony_ci 26848c2ecf20Sopenharmony_ciu16 hpi_tuner_get_rds(u32 h_control, char *p_data) 26858c2ecf20Sopenharmony_ci{ 26868c2ecf20Sopenharmony_ci struct hpi_message hm; 26878c2ecf20Sopenharmony_ci struct hpi_response hr; 26888c2ecf20Sopenharmony_ci 26898c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 26908c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 26918c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 26928c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 26938c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_TUNER_RDS; 26948c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 26958c2ecf20Sopenharmony_ci if (p_data) { 26968c2ecf20Sopenharmony_ci *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0]; 26978c2ecf20Sopenharmony_ci *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1]; 26988c2ecf20Sopenharmony_ci *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER; 26998c2ecf20Sopenharmony_ci } 27008c2ecf20Sopenharmony_ci return hr.error; 27018c2ecf20Sopenharmony_ci} 27028c2ecf20Sopenharmony_ci 27038c2ecf20Sopenharmony_ciu16 hpi_pad_get_channel_name(u32 h_control, char *psz_string, 27048c2ecf20Sopenharmony_ci const u32 data_length) 27058c2ecf20Sopenharmony_ci{ 27068c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME, 27078c2ecf20Sopenharmony_ci psz_string, data_length); 27088c2ecf20Sopenharmony_ci} 27098c2ecf20Sopenharmony_ci 27108c2ecf20Sopenharmony_ciu16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length) 27118c2ecf20Sopenharmony_ci{ 27128c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string, 27138c2ecf20Sopenharmony_ci data_length); 27148c2ecf20Sopenharmony_ci} 27158c2ecf20Sopenharmony_ci 27168c2ecf20Sopenharmony_ciu16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length) 27178c2ecf20Sopenharmony_ci{ 27188c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string, 27198c2ecf20Sopenharmony_ci data_length); 27208c2ecf20Sopenharmony_ci} 27218c2ecf20Sopenharmony_ci 27228c2ecf20Sopenharmony_ciu16 hpi_pad_get_comment(u32 h_control, char *psz_string, 27238c2ecf20Sopenharmony_ci const u32 data_length) 27248c2ecf20Sopenharmony_ci{ 27258c2ecf20Sopenharmony_ci return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string, 27268c2ecf20Sopenharmony_ci data_length); 27278c2ecf20Sopenharmony_ci} 27288c2ecf20Sopenharmony_ci 27298c2ecf20Sopenharmony_ciu16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY) 27308c2ecf20Sopenharmony_ci{ 27318c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY); 27328c2ecf20Sopenharmony_ci} 27338c2ecf20Sopenharmony_ci 27348c2ecf20Sopenharmony_ciu16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI) 27358c2ecf20Sopenharmony_ci{ 27368c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI); 27378c2ecf20Sopenharmony_ci} 27388c2ecf20Sopenharmony_ci 27398c2ecf20Sopenharmony_ciu16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels) 27408c2ecf20Sopenharmony_ci{ 27418c2ecf20Sopenharmony_ci return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0, 27428c2ecf20Sopenharmony_ci p_channels); 27438c2ecf20Sopenharmony_ci} 27448c2ecf20Sopenharmony_ci 27458c2ecf20Sopenharmony_ciu16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] 27468c2ecf20Sopenharmony_ci ) 27478c2ecf20Sopenharmony_ci{ 27488c2ecf20Sopenharmony_ci return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN, 27498c2ecf20Sopenharmony_ci an_log_gain[0], an_log_gain[1]); 27508c2ecf20Sopenharmony_ci} 27518c2ecf20Sopenharmony_ci 27528c2ecf20Sopenharmony_ciu16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] 27538c2ecf20Sopenharmony_ci ) 27548c2ecf20Sopenharmony_ci{ 27558c2ecf20Sopenharmony_ci return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN, 27568c2ecf20Sopenharmony_ci &an_log_gain[0], &an_log_gain[1]); 27578c2ecf20Sopenharmony_ci} 27588c2ecf20Sopenharmony_ci 27598c2ecf20Sopenharmony_ciu16 hpi_volume_set_mute(u32 h_control, u32 mute) 27608c2ecf20Sopenharmony_ci{ 27618c2ecf20Sopenharmony_ci return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0); 27628c2ecf20Sopenharmony_ci} 27638c2ecf20Sopenharmony_ci 27648c2ecf20Sopenharmony_ciu16 hpi_volume_get_mute(u32 h_control, u32 *mute) 27658c2ecf20Sopenharmony_ci{ 27668c2ecf20Sopenharmony_ci return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute); 27678c2ecf20Sopenharmony_ci} 27688c2ecf20Sopenharmony_ci 27698c2ecf20Sopenharmony_ciu16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, 27708c2ecf20Sopenharmony_ci short *max_gain_01dB, short *step_gain_01dB) 27718c2ecf20Sopenharmony_ci{ 27728c2ecf20Sopenharmony_ci struct hpi_message hm; 27738c2ecf20Sopenharmony_ci struct hpi_response hr; 27748c2ecf20Sopenharmony_ci 27758c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 27768c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 27778c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 27788c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 27798c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_VOLUME_RANGE; 27808c2ecf20Sopenharmony_ci 27818c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 27828c2ecf20Sopenharmony_ci if (hr.error) { 27838c2ecf20Sopenharmony_ci hr.u.c.an_log_value[0] = 0; 27848c2ecf20Sopenharmony_ci hr.u.c.an_log_value[1] = 0; 27858c2ecf20Sopenharmony_ci hr.u.c.param1 = 0; 27868c2ecf20Sopenharmony_ci } 27878c2ecf20Sopenharmony_ci if (min_gain_01dB) 27888c2ecf20Sopenharmony_ci *min_gain_01dB = hr.u.c.an_log_value[0]; 27898c2ecf20Sopenharmony_ci if (max_gain_01dB) 27908c2ecf20Sopenharmony_ci *max_gain_01dB = hr.u.c.an_log_value[1]; 27918c2ecf20Sopenharmony_ci if (step_gain_01dB) 27928c2ecf20Sopenharmony_ci *step_gain_01dB = (short)hr.u.c.param1; 27938c2ecf20Sopenharmony_ci return hr.error; 27948c2ecf20Sopenharmony_ci} 27958c2ecf20Sopenharmony_ci 27968c2ecf20Sopenharmony_ciu16 hpi_volume_auto_fade_profile(u32 h_control, 27978c2ecf20Sopenharmony_ci short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms, 27988c2ecf20Sopenharmony_ci u16 profile) 27998c2ecf20Sopenharmony_ci{ 28008c2ecf20Sopenharmony_ci struct hpi_message hm; 28018c2ecf20Sopenharmony_ci struct hpi_response hr; 28028c2ecf20Sopenharmony_ci 28038c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 28048c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 28058c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 28068c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 28078c2ecf20Sopenharmony_ci 28088c2ecf20Sopenharmony_ci memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB, 28098c2ecf20Sopenharmony_ci sizeof(short) * HPI_MAX_CHANNELS); 28108c2ecf20Sopenharmony_ci 28118c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_VOLUME_AUTOFADE; 28128c2ecf20Sopenharmony_ci hm.u.c.param1 = duration_ms; 28138c2ecf20Sopenharmony_ci hm.u.c.param2 = profile; 28148c2ecf20Sopenharmony_ci 28158c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 28168c2ecf20Sopenharmony_ci 28178c2ecf20Sopenharmony_ci return hr.error; 28188c2ecf20Sopenharmony_ci} 28198c2ecf20Sopenharmony_ci 28208c2ecf20Sopenharmony_ciu16 hpi_volume_auto_fade(u32 h_control, 28218c2ecf20Sopenharmony_ci short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms) 28228c2ecf20Sopenharmony_ci{ 28238c2ecf20Sopenharmony_ci return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB, 28248c2ecf20Sopenharmony_ci duration_ms, HPI_VOLUME_AUTOFADE_LOG); 28258c2ecf20Sopenharmony_ci} 28268c2ecf20Sopenharmony_ci 28278c2ecf20Sopenharmony_ciu16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i, 28288c2ecf20Sopenharmony_ci u16 *profile) 28298c2ecf20Sopenharmony_ci{ 28308c2ecf20Sopenharmony_ci u16 e; 28318c2ecf20Sopenharmony_ci u32 u; 28328c2ecf20Sopenharmony_ci e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u); 28338c2ecf20Sopenharmony_ci *profile = (u16)u; 28348c2ecf20Sopenharmony_ci return e; 28358c2ecf20Sopenharmony_ci} 28368c2ecf20Sopenharmony_ci 28378c2ecf20Sopenharmony_ciu16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB) 28388c2ecf20Sopenharmony_ci{ 28398c2ecf20Sopenharmony_ci struct hpi_message hm; 28408c2ecf20Sopenharmony_ci struct hpi_response hr; 28418c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 28428c2ecf20Sopenharmony_ci HPI_CONTROL_SET_STATE); 28438c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 28448c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 28458c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_VOX_THRESHOLD; 28468c2ecf20Sopenharmony_ci 28478c2ecf20Sopenharmony_ci hm.u.c.an_log_value[0] = an_gain0_01dB; 28488c2ecf20Sopenharmony_ci 28498c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 28508c2ecf20Sopenharmony_ci 28518c2ecf20Sopenharmony_ci return hr.error; 28528c2ecf20Sopenharmony_ci} 28538c2ecf20Sopenharmony_ci 28548c2ecf20Sopenharmony_ciu16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB) 28558c2ecf20Sopenharmony_ci{ 28568c2ecf20Sopenharmony_ci struct hpi_message hm; 28578c2ecf20Sopenharmony_ci struct hpi_response hr; 28588c2ecf20Sopenharmony_ci hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 28598c2ecf20Sopenharmony_ci HPI_CONTROL_GET_STATE); 28608c2ecf20Sopenharmony_ci if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 28618c2ecf20Sopenharmony_ci return HPI_ERROR_INVALID_HANDLE; 28628c2ecf20Sopenharmony_ci hm.u.c.attribute = HPI_VOX_THRESHOLD; 28638c2ecf20Sopenharmony_ci 28648c2ecf20Sopenharmony_ci hpi_send_recv(&hm, &hr); 28658c2ecf20Sopenharmony_ci 28668c2ecf20Sopenharmony_ci *an_gain0_01dB = hr.u.c.an_log_value[0]; 28678c2ecf20Sopenharmony_ci 28688c2ecf20Sopenharmony_ci return hr.error; 28698c2ecf20Sopenharmony_ci} 2870