1 2#include "hpi_internal.h" 3#include "hpimsginit.h" 4 5#include "hpidebug.h" 6 7struct hpi_handle { 8 unsigned int obj_index:12; 9 unsigned int obj_type:4; 10 unsigned int adapter_index:14; 11 unsigned int spare:1; 12 unsigned int read_only:1; 13}; 14 15union handle_word { 16 struct hpi_handle h; 17 u32 w; 18}; 19 20u32 hpi_indexes_to_handle(const char c_object, const u16 adapter_index, 21 const u16 object_index) 22{ 23 union handle_word handle; 24 25 handle.h.adapter_index = adapter_index; 26 handle.h.spare = 0; 27 handle.h.read_only = 0; 28 handle.h.obj_type = c_object; 29 handle.h.obj_index = object_index; 30 return handle.w; 31} 32 33static u16 hpi_handle_indexes(const u32 h, u16 *p1, u16 *p2) 34{ 35 union handle_word uhandle; 36 if (!h) 37 return HPI_ERROR_INVALID_HANDLE; 38 39 uhandle.w = h; 40 41 *p1 = (u16)uhandle.h.adapter_index; 42 if (p2) 43 *p2 = (u16)uhandle.h.obj_index; 44 45 return 0; 46} 47 48void hpi_handle_to_indexes(const u32 handle, u16 *pw_adapter_index, 49 u16 *pw_object_index) 50{ 51 hpi_handle_indexes(handle, pw_adapter_index, pw_object_index); 52} 53 54char hpi_handle_object(const u32 handle) 55{ 56 union handle_word uhandle; 57 uhandle.w = handle; 58 return (char)uhandle.h.obj_type; 59} 60 61void hpi_format_to_msg(struct hpi_msg_format *pMF, 62 const struct hpi_format *pF) 63{ 64 pMF->sample_rate = pF->sample_rate; 65 pMF->bit_rate = pF->bit_rate; 66 pMF->attributes = pF->attributes; 67 pMF->channels = pF->channels; 68 pMF->format = pF->format; 69} 70 71static void hpi_msg_to_format(struct hpi_format *pF, 72 struct hpi_msg_format *pMF) 73{ 74 pF->sample_rate = pMF->sample_rate; 75 pF->bit_rate = pMF->bit_rate; 76 pF->attributes = pMF->attributes; 77 pF->channels = pMF->channels; 78 pF->format = pMF->format; 79 pF->mode_legacy = 0; 80 pF->unused = 0; 81} 82 83void hpi_stream_response_to_legacy(struct hpi_stream_res *pSR) 84{ 85 pSR->u.legacy_stream_info.auxiliary_data_available = 86 pSR->u.stream_info.auxiliary_data_available; 87 pSR->u.legacy_stream_info.state = pSR->u.stream_info.state; 88} 89 90static inline void hpi_send_recvV1(struct hpi_message_header *m, 91 struct hpi_response_header *r) 92{ 93 hpi_send_recv((struct hpi_message *)m, (struct hpi_response *)r); 94} 95 96u16 hpi_subsys_get_version_ex(u32 *pversion_ex) 97{ 98 struct hpi_message hm; 99 struct hpi_response hr; 100 101 hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 102 HPI_SUBSYS_GET_VERSION); 103 hpi_send_recv(&hm, &hr); 104 *pversion_ex = hr.u.s.data; 105 return hr.error; 106} 107 108u16 hpi_subsys_get_num_adapters(int *pn_num_adapters) 109{ 110 struct hpi_message hm; 111 struct hpi_response hr; 112 hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 113 HPI_SUBSYS_GET_NUM_ADAPTERS); 114 hpi_send_recv(&hm, &hr); 115 *pn_num_adapters = (int)hr.u.s.num_adapters; 116 return hr.error; 117} 118 119u16 hpi_subsys_get_adapter(int iterator, u32 *padapter_index, 120 u16 *pw_adapter_type) 121{ 122 struct hpi_message hm; 123 struct hpi_response hr; 124 hpi_init_message_response(&hm, &hr, HPI_OBJ_SUBSYSTEM, 125 HPI_SUBSYS_GET_ADAPTER); 126 hm.obj_index = (u16)iterator; 127 hpi_send_recv(&hm, &hr); 128 *padapter_index = (int)hr.u.s.adapter_index; 129 *pw_adapter_type = hr.u.s.adapter_type; 130 131 return hr.error; 132} 133 134u16 hpi_adapter_open(u16 adapter_index) 135{ 136 struct hpi_message hm; 137 struct hpi_response hr; 138 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 139 HPI_ADAPTER_OPEN); 140 hm.adapter_index = adapter_index; 141 142 hpi_send_recv(&hm, &hr); 143 144 return hr.error; 145 146} 147 148u16 hpi_adapter_close(u16 adapter_index) 149{ 150 struct hpi_message hm; 151 struct hpi_response hr; 152 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 153 HPI_ADAPTER_CLOSE); 154 hm.adapter_index = adapter_index; 155 156 hpi_send_recv(&hm, &hr); 157 158 return hr.error; 159} 160 161u16 hpi_adapter_set_mode(u16 adapter_index, u32 adapter_mode) 162{ 163 return hpi_adapter_set_mode_ex(adapter_index, adapter_mode, 164 HPI_ADAPTER_MODE_SET); 165} 166 167u16 hpi_adapter_set_mode_ex(u16 adapter_index, u32 adapter_mode, 168 u16 query_or_set) 169{ 170 struct hpi_message hm; 171 struct hpi_response hr; 172 173 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 174 HPI_ADAPTER_SET_MODE); 175 hm.adapter_index = adapter_index; 176 hm.u.ax.mode.adapter_mode = adapter_mode; 177 hm.u.ax.mode.query_or_set = query_or_set; 178 hpi_send_recv(&hm, &hr); 179 return hr.error; 180} 181 182u16 hpi_adapter_get_mode(u16 adapter_index, u32 *padapter_mode) 183{ 184 struct hpi_message hm; 185 struct hpi_response hr; 186 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 187 HPI_ADAPTER_GET_MODE); 188 hm.adapter_index = adapter_index; 189 hpi_send_recv(&hm, &hr); 190 if (padapter_mode) 191 *padapter_mode = hr.u.ax.mode.adapter_mode; 192 return hr.error; 193} 194 195u16 hpi_adapter_get_info(u16 adapter_index, u16 *pw_num_outstreams, 196 u16 *pw_num_instreams, u16 *pw_version, u32 *pserial_number, 197 u16 *pw_adapter_type) 198{ 199 struct hpi_message hm; 200 struct hpi_response hr; 201 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 202 HPI_ADAPTER_GET_INFO); 203 hm.adapter_index = adapter_index; 204 205 hpi_send_recv(&hm, &hr); 206 207 *pw_adapter_type = hr.u.ax.info.adapter_type; 208 *pw_num_outstreams = hr.u.ax.info.num_outstreams; 209 *pw_num_instreams = hr.u.ax.info.num_instreams; 210 *pw_version = hr.u.ax.info.version; 211 *pserial_number = hr.u.ax.info.serial_number; 212 return hr.error; 213} 214 215u16 hpi_adapter_get_module_by_index(u16 adapter_index, u16 module_index, 216 u16 *pw_num_outputs, u16 *pw_num_inputs, u16 *pw_version, 217 u32 *pserial_number, u16 *pw_module_type, u32 *ph_module) 218{ 219 struct hpi_message hm; 220 struct hpi_response hr; 221 222 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 223 HPI_ADAPTER_MODULE_INFO); 224 hm.adapter_index = adapter_index; 225 hm.u.ax.module_info.index = module_index; 226 227 hpi_send_recv(&hm, &hr); 228 229 *pw_module_type = hr.u.ax.info.adapter_type; 230 *pw_num_outputs = hr.u.ax.info.num_outstreams; 231 *pw_num_inputs = hr.u.ax.info.num_instreams; 232 *pw_version = hr.u.ax.info.version; 233 *pserial_number = hr.u.ax.info.serial_number; 234 *ph_module = 0; 235 236 return hr.error; 237} 238 239u16 hpi_adapter_set_property(u16 adapter_index, u16 property, u16 parameter1, 240 u16 parameter2) 241{ 242 struct hpi_message hm; 243 struct hpi_response hr; 244 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 245 HPI_ADAPTER_SET_PROPERTY); 246 hm.adapter_index = adapter_index; 247 hm.u.ax.property_set.property = property; 248 hm.u.ax.property_set.parameter1 = parameter1; 249 hm.u.ax.property_set.parameter2 = parameter2; 250 251 hpi_send_recv(&hm, &hr); 252 253 return hr.error; 254} 255 256u16 hpi_adapter_get_property(u16 adapter_index, u16 property, 257 u16 *pw_parameter1, u16 *pw_parameter2) 258{ 259 struct hpi_message hm; 260 struct hpi_response hr; 261 hpi_init_message_response(&hm, &hr, HPI_OBJ_ADAPTER, 262 HPI_ADAPTER_GET_PROPERTY); 263 hm.adapter_index = adapter_index; 264 hm.u.ax.property_set.property = property; 265 266 hpi_send_recv(&hm, &hr); 267 if (!hr.error) { 268 if (pw_parameter1) 269 *pw_parameter1 = hr.u.ax.property_get.parameter1; 270 if (pw_parameter2) 271 *pw_parameter2 = hr.u.ax.property_get.parameter2; 272 } 273 274 return hr.error; 275} 276 277u16 hpi_adapter_enumerate_property(u16 adapter_index, u16 index, 278 u16 what_to_enumerate, u16 property_index, u32 *psetting) 279{ 280 return 0; 281} 282 283u16 hpi_format_create(struct hpi_format *p_format, u16 channels, u16 format, 284 u32 sample_rate, u32 bit_rate, u32 attributes) 285{ 286 u16 err = 0; 287 struct hpi_msg_format fmt; 288 289 switch (channels) { 290 case 1: 291 case 2: 292 case 4: 293 case 6: 294 case 8: 295 case 16: 296 break; 297 default: 298 err = HPI_ERROR_INVALID_CHANNELS; 299 return err; 300 } 301 fmt.channels = channels; 302 303 switch (format) { 304 case HPI_FORMAT_PCM16_SIGNED: 305 case HPI_FORMAT_PCM24_SIGNED: 306 case HPI_FORMAT_PCM32_SIGNED: 307 case HPI_FORMAT_PCM32_FLOAT: 308 case HPI_FORMAT_PCM16_BIGENDIAN: 309 case HPI_FORMAT_PCM8_UNSIGNED: 310 case HPI_FORMAT_MPEG_L1: 311 case HPI_FORMAT_MPEG_L2: 312 case HPI_FORMAT_MPEG_L3: 313 case HPI_FORMAT_DOLBY_AC2: 314 case HPI_FORMAT_AA_TAGIT1_HITS: 315 case HPI_FORMAT_AA_TAGIT1_INSERTS: 316 case HPI_FORMAT_RAW_BITSTREAM: 317 case HPI_FORMAT_AA_TAGIT1_HITS_EX1: 318 case HPI_FORMAT_OEM1: 319 case HPI_FORMAT_OEM2: 320 break; 321 default: 322 err = HPI_ERROR_INVALID_FORMAT; 323 return err; 324 } 325 fmt.format = format; 326 327 if (sample_rate < 8000L) { 328 err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; 329 sample_rate = 8000L; 330 } 331 if (sample_rate > 200000L) { 332 err = HPI_ERROR_INCOMPATIBLE_SAMPLERATE; 333 sample_rate = 200000L; 334 } 335 fmt.sample_rate = sample_rate; 336 337 switch (format) { 338 case HPI_FORMAT_MPEG_L1: 339 case HPI_FORMAT_MPEG_L2: 340 case HPI_FORMAT_MPEG_L3: 341 fmt.bit_rate = bit_rate; 342 break; 343 case HPI_FORMAT_PCM16_SIGNED: 344 case HPI_FORMAT_PCM16_BIGENDIAN: 345 fmt.bit_rate = channels * sample_rate * 2; 346 break; 347 case HPI_FORMAT_PCM32_SIGNED: 348 case HPI_FORMAT_PCM32_FLOAT: 349 fmt.bit_rate = channels * sample_rate * 4; 350 break; 351 case HPI_FORMAT_PCM8_UNSIGNED: 352 fmt.bit_rate = channels * sample_rate; 353 break; 354 default: 355 fmt.bit_rate = 0; 356 } 357 358 switch (format) { 359 case HPI_FORMAT_MPEG_L2: 360 if ((channels == 1) 361 && (attributes != HPI_MPEG_MODE_DEFAULT)) { 362 attributes = HPI_MPEG_MODE_DEFAULT; 363 err = HPI_ERROR_INVALID_FORMAT; 364 } else if (attributes > HPI_MPEG_MODE_DUALCHANNEL) { 365 attributes = HPI_MPEG_MODE_DEFAULT; 366 err = HPI_ERROR_INVALID_FORMAT; 367 } 368 fmt.attributes = attributes; 369 break; 370 default: 371 fmt.attributes = attributes; 372 } 373 374 hpi_msg_to_format(p_format, &fmt); 375 return err; 376} 377 378u16 hpi_stream_estimate_buffer_size(struct hpi_format *p_format, 379 u32 host_polling_rate_in_milli_seconds, u32 *recommended_buffer_size) 380{ 381 382 u32 bytes_per_second; 383 u32 size; 384 u16 channels; 385 struct hpi_format *pF = p_format; 386 387 channels = pF->channels; 388 389 switch (pF->format) { 390 case HPI_FORMAT_PCM16_BIGENDIAN: 391 case HPI_FORMAT_PCM16_SIGNED: 392 bytes_per_second = pF->sample_rate * 2L * channels; 393 break; 394 case HPI_FORMAT_PCM24_SIGNED: 395 bytes_per_second = pF->sample_rate * 3L * channels; 396 break; 397 case HPI_FORMAT_PCM32_SIGNED: 398 case HPI_FORMAT_PCM32_FLOAT: 399 bytes_per_second = pF->sample_rate * 4L * channels; 400 break; 401 case HPI_FORMAT_PCM8_UNSIGNED: 402 bytes_per_second = pF->sample_rate * 1L * channels; 403 break; 404 case HPI_FORMAT_MPEG_L1: 405 case HPI_FORMAT_MPEG_L2: 406 case HPI_FORMAT_MPEG_L3: 407 bytes_per_second = pF->bit_rate / 8L; 408 break; 409 case HPI_FORMAT_DOLBY_AC2: 410 411 bytes_per_second = 256000L / 8L; 412 break; 413 default: 414 return HPI_ERROR_INVALID_FORMAT; 415 } 416 size = (bytes_per_second * host_polling_rate_in_milli_seconds * 2) / 417 1000L; 418 419 *recommended_buffer_size = 420 roundup_pow_of_two(((size + 4095L) & ~4095L)); 421 return 0; 422} 423 424u16 hpi_outstream_open(u16 adapter_index, u16 outstream_index, 425 u32 *ph_outstream) 426{ 427 struct hpi_message hm; 428 struct hpi_response hr; 429 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 430 HPI_OSTREAM_OPEN); 431 hm.adapter_index = adapter_index; 432 hm.obj_index = outstream_index; 433 434 hpi_send_recv(&hm, &hr); 435 436 if (hr.error == 0) 437 *ph_outstream = 438 hpi_indexes_to_handle(HPI_OBJ_OSTREAM, adapter_index, 439 outstream_index); 440 else 441 *ph_outstream = 0; 442 return hr.error; 443} 444 445u16 hpi_outstream_close(u32 h_outstream) 446{ 447 struct hpi_message hm; 448 struct hpi_response hr; 449 450 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 451 HPI_OSTREAM_HOSTBUFFER_FREE); 452 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 453 return HPI_ERROR_INVALID_HANDLE; 454 455 hpi_send_recv(&hm, &hr); 456 457 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 458 HPI_OSTREAM_GROUP_RESET); 459 hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index); 460 hpi_send_recv(&hm, &hr); 461 462 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 463 HPI_OSTREAM_CLOSE); 464 hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index); 465 hpi_send_recv(&hm, &hr); 466 467 return hr.error; 468} 469 470u16 hpi_outstream_get_info_ex(u32 h_outstream, u16 *pw_state, 471 u32 *pbuffer_size, u32 *pdata_to_play, u32 *psamples_played, 472 u32 *pauxiliary_data_to_play) 473{ 474 struct hpi_message hm; 475 struct hpi_response hr; 476 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 477 HPI_OSTREAM_GET_INFO); 478 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 479 return HPI_ERROR_INVALID_HANDLE; 480 481 hpi_send_recv(&hm, &hr); 482 483 if (pw_state) 484 *pw_state = hr.u.d.u.stream_info.state; 485 if (pbuffer_size) 486 *pbuffer_size = hr.u.d.u.stream_info.buffer_size; 487 if (pdata_to_play) 488 *pdata_to_play = hr.u.d.u.stream_info.data_available; 489 if (psamples_played) 490 *psamples_played = hr.u.d.u.stream_info.samples_transferred; 491 if (pauxiliary_data_to_play) 492 *pauxiliary_data_to_play = 493 hr.u.d.u.stream_info.auxiliary_data_available; 494 return hr.error; 495} 496 497u16 hpi_outstream_write_buf(u32 h_outstream, const u8 *pb_data, 498 u32 bytes_to_write, const struct hpi_format *p_format) 499{ 500 struct hpi_message hm; 501 struct hpi_response hr; 502 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 503 HPI_OSTREAM_WRITE); 504 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 505 return HPI_ERROR_INVALID_HANDLE; 506 hm.u.d.u.data.pb_data = (u8 *)pb_data; 507 hm.u.d.u.data.data_size = bytes_to_write; 508 509 hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 510 511 hpi_send_recv(&hm, &hr); 512 513 return hr.error; 514} 515 516u16 hpi_outstream_start(u32 h_outstream) 517{ 518 struct hpi_message hm; 519 struct hpi_response hr; 520 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 521 HPI_OSTREAM_START); 522 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 523 return HPI_ERROR_INVALID_HANDLE; 524 525 hpi_send_recv(&hm, &hr); 526 527 return hr.error; 528} 529 530u16 hpi_outstream_wait_start(u32 h_outstream) 531{ 532 struct hpi_message hm; 533 struct hpi_response hr; 534 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 535 HPI_OSTREAM_WAIT_START); 536 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 537 return HPI_ERROR_INVALID_HANDLE; 538 539 hpi_send_recv(&hm, &hr); 540 541 return hr.error; 542} 543 544u16 hpi_outstream_stop(u32 h_outstream) 545{ 546 struct hpi_message hm; 547 struct hpi_response hr; 548 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 549 HPI_OSTREAM_STOP); 550 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 551 return HPI_ERROR_INVALID_HANDLE; 552 553 hpi_send_recv(&hm, &hr); 554 555 return hr.error; 556} 557 558u16 hpi_outstream_sinegen(u32 h_outstream) 559{ 560 struct hpi_message hm; 561 struct hpi_response hr; 562 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 563 HPI_OSTREAM_SINEGEN); 564 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 565 return HPI_ERROR_INVALID_HANDLE; 566 567 hpi_send_recv(&hm, &hr); 568 569 return hr.error; 570} 571 572u16 hpi_outstream_reset(u32 h_outstream) 573{ 574 struct hpi_message hm; 575 struct hpi_response hr; 576 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 577 HPI_OSTREAM_RESET); 578 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 579 return HPI_ERROR_INVALID_HANDLE; 580 581 hpi_send_recv(&hm, &hr); 582 583 return hr.error; 584} 585 586u16 hpi_outstream_query_format(u32 h_outstream, struct hpi_format *p_format) 587{ 588 struct hpi_message hm; 589 struct hpi_response hr; 590 591 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 592 HPI_OSTREAM_QUERY_FORMAT); 593 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 594 return HPI_ERROR_INVALID_HANDLE; 595 596 hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 597 598 hpi_send_recv(&hm, &hr); 599 600 return hr.error; 601} 602 603u16 hpi_outstream_set_format(u32 h_outstream, struct hpi_format *p_format) 604{ 605 struct hpi_message hm; 606 struct hpi_response hr; 607 608 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 609 HPI_OSTREAM_SET_FORMAT); 610 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 611 return HPI_ERROR_INVALID_HANDLE; 612 613 hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 614 615 hpi_send_recv(&hm, &hr); 616 617 return hr.error; 618} 619 620u16 hpi_outstream_set_velocity(u32 h_outstream, short velocity) 621{ 622 struct hpi_message hm; 623 struct hpi_response hr; 624 625 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 626 HPI_OSTREAM_SET_VELOCITY); 627 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 628 return HPI_ERROR_INVALID_HANDLE; 629 hm.u.d.u.velocity = velocity; 630 631 hpi_send_recv(&hm, &hr); 632 633 return hr.error; 634} 635 636u16 hpi_outstream_set_punch_in_out(u32 h_outstream, u32 punch_in_sample, 637 u32 punch_out_sample) 638{ 639 struct hpi_message hm; 640 struct hpi_response hr; 641 642 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 643 HPI_OSTREAM_SET_PUNCHINOUT); 644 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 645 return HPI_ERROR_INVALID_HANDLE; 646 647 hm.u.d.u.pio.punch_in_sample = punch_in_sample; 648 hm.u.d.u.pio.punch_out_sample = punch_out_sample; 649 650 hpi_send_recv(&hm, &hr); 651 652 return hr.error; 653} 654 655u16 hpi_outstream_ancillary_reset(u32 h_outstream, u16 mode) 656{ 657 struct hpi_message hm; 658 struct hpi_response hr; 659 660 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 661 HPI_OSTREAM_ANC_RESET); 662 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 663 return HPI_ERROR_INVALID_HANDLE; 664 hm.u.d.u.data.format.channels = mode; 665 hpi_send_recv(&hm, &hr); 666 return hr.error; 667} 668 669u16 hpi_outstream_ancillary_get_info(u32 h_outstream, u32 *pframes_available) 670{ 671 struct hpi_message hm; 672 struct hpi_response hr; 673 674 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 675 HPI_OSTREAM_ANC_GET_INFO); 676 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 677 return HPI_ERROR_INVALID_HANDLE; 678 hpi_send_recv(&hm, &hr); 679 if (hr.error == 0) { 680 if (pframes_available) 681 *pframes_available = 682 hr.u.d.u.stream_info.data_available / 683 sizeof(struct hpi_anc_frame); 684 } 685 return hr.error; 686} 687 688u16 hpi_outstream_ancillary_read(u32 h_outstream, 689 struct hpi_anc_frame *p_anc_frame_buffer, 690 u32 anc_frame_buffer_size_in_bytes, 691 u32 number_of_ancillary_frames_to_read) 692{ 693 struct hpi_message hm; 694 struct hpi_response hr; 695 696 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 697 HPI_OSTREAM_ANC_READ); 698 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 699 return HPI_ERROR_INVALID_HANDLE; 700 hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; 701 hm.u.d.u.data.data_size = 702 number_of_ancillary_frames_to_read * 703 sizeof(struct hpi_anc_frame); 704 if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) 705 hpi_send_recv(&hm, &hr); 706 else 707 hr.error = HPI_ERROR_INVALID_DATASIZE; 708 return hr.error; 709} 710 711u16 hpi_outstream_set_time_scale(u32 h_outstream, u32 time_scale) 712{ 713 struct hpi_message hm; 714 struct hpi_response hr; 715 716 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 717 HPI_OSTREAM_SET_TIMESCALE); 718 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 719 return HPI_ERROR_INVALID_HANDLE; 720 721 hm.u.d.u.time_scale = time_scale; 722 723 hpi_send_recv(&hm, &hr); 724 725 return hr.error; 726} 727 728u16 hpi_outstream_host_buffer_allocate(u32 h_outstream, u32 size_in_bytes) 729{ 730 struct hpi_message hm; 731 struct hpi_response hr; 732 733 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 734 HPI_OSTREAM_HOSTBUFFER_ALLOC); 735 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 736 return HPI_ERROR_INVALID_HANDLE; 737 hm.u.d.u.data.data_size = size_in_bytes; 738 hpi_send_recv(&hm, &hr); 739 return hr.error; 740} 741 742u16 hpi_outstream_host_buffer_get_info(u32 h_outstream, u8 **pp_buffer, 743 struct hpi_hostbuffer_status **pp_status) 744{ 745 struct hpi_message hm; 746 struct hpi_response hr; 747 748 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 749 HPI_OSTREAM_HOSTBUFFER_GET_INFO); 750 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 751 return HPI_ERROR_INVALID_HANDLE; 752 hpi_send_recv(&hm, &hr); 753 754 if (hr.error == 0) { 755 if (pp_buffer) 756 *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; 757 if (pp_status) 758 *pp_status = hr.u.d.u.hostbuffer_info.p_status; 759 } 760 return hr.error; 761} 762 763u16 hpi_outstream_host_buffer_free(u32 h_outstream) 764{ 765 struct hpi_message hm; 766 struct hpi_response hr; 767 768 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 769 HPI_OSTREAM_HOSTBUFFER_FREE); 770 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 771 return HPI_ERROR_INVALID_HANDLE; 772 hpi_send_recv(&hm, &hr); 773 return hr.error; 774} 775 776u16 hpi_outstream_group_add(u32 h_outstream, u32 h_stream) 777{ 778 struct hpi_message hm; 779 struct hpi_response hr; 780 u16 adapter; 781 char c_obj_type; 782 783 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 784 HPI_OSTREAM_GROUP_ADD); 785 786 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 787 return HPI_ERROR_INVALID_HANDLE; 788 789 if (hpi_handle_indexes(h_stream, &adapter, 790 &hm.u.d.u.stream.stream_index)) 791 return HPI_ERROR_INVALID_HANDLE; 792 793 c_obj_type = hpi_handle_object(h_stream); 794 switch (c_obj_type) { 795 case HPI_OBJ_OSTREAM: 796 case HPI_OBJ_ISTREAM: 797 hm.u.d.u.stream.object_type = c_obj_type; 798 break; 799 default: 800 return HPI_ERROR_INVALID_OBJ; 801 } 802 if (adapter != hm.adapter_index) 803 return HPI_ERROR_NO_INTERADAPTER_GROUPS; 804 805 hpi_send_recv(&hm, &hr); 806 return hr.error; 807} 808 809u16 hpi_outstream_group_get_map(u32 h_outstream, u32 *poutstream_map, 810 u32 *pinstream_map) 811{ 812 struct hpi_message hm; 813 struct hpi_response hr; 814 815 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 816 HPI_OSTREAM_GROUP_GETMAP); 817 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 818 return HPI_ERROR_INVALID_HANDLE; 819 hpi_send_recv(&hm, &hr); 820 821 if (poutstream_map) 822 *poutstream_map = hr.u.d.u.group_info.outstream_group_map; 823 if (pinstream_map) 824 *pinstream_map = hr.u.d.u.group_info.instream_group_map; 825 826 return hr.error; 827} 828 829u16 hpi_outstream_group_reset(u32 h_outstream) 830{ 831 struct hpi_message hm; 832 struct hpi_response hr; 833 834 hpi_init_message_response(&hm, &hr, HPI_OBJ_OSTREAM, 835 HPI_OSTREAM_GROUP_RESET); 836 if (hpi_handle_indexes(h_outstream, &hm.adapter_index, &hm.obj_index)) 837 return HPI_ERROR_INVALID_HANDLE; 838 hpi_send_recv(&hm, &hr); 839 return hr.error; 840} 841 842u16 hpi_instream_open(u16 adapter_index, u16 instream_index, u32 *ph_instream) 843{ 844 struct hpi_message hm; 845 struct hpi_response hr; 846 847 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 848 HPI_ISTREAM_OPEN); 849 hm.adapter_index = adapter_index; 850 hm.obj_index = instream_index; 851 852 hpi_send_recv(&hm, &hr); 853 854 if (hr.error == 0) 855 *ph_instream = 856 hpi_indexes_to_handle(HPI_OBJ_ISTREAM, adapter_index, 857 instream_index); 858 else 859 *ph_instream = 0; 860 861 return hr.error; 862} 863 864u16 hpi_instream_close(u32 h_instream) 865{ 866 struct hpi_message hm; 867 struct hpi_response hr; 868 869 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 870 HPI_ISTREAM_HOSTBUFFER_FREE); 871 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 872 return HPI_ERROR_INVALID_HANDLE; 873 hpi_send_recv(&hm, &hr); 874 875 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 876 HPI_ISTREAM_GROUP_RESET); 877 hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index); 878 hpi_send_recv(&hm, &hr); 879 880 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 881 HPI_ISTREAM_CLOSE); 882 hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index); 883 hpi_send_recv(&hm, &hr); 884 885 return hr.error; 886} 887 888u16 hpi_instream_query_format(u32 h_instream, 889 const struct hpi_format *p_format) 890{ 891 struct hpi_message hm; 892 struct hpi_response hr; 893 894 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 895 HPI_ISTREAM_QUERY_FORMAT); 896 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 897 return HPI_ERROR_INVALID_HANDLE; 898 hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 899 900 hpi_send_recv(&hm, &hr); 901 902 return hr.error; 903} 904 905u16 hpi_instream_set_format(u32 h_instream, const struct hpi_format *p_format) 906{ 907 struct hpi_message hm; 908 struct hpi_response hr; 909 910 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 911 HPI_ISTREAM_SET_FORMAT); 912 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 913 return HPI_ERROR_INVALID_HANDLE; 914 hpi_format_to_msg(&hm.u.d.u.data.format, p_format); 915 916 hpi_send_recv(&hm, &hr); 917 918 return hr.error; 919} 920 921u16 hpi_instream_read_buf(u32 h_instream, u8 *pb_data, u32 bytes_to_read) 922{ 923 struct hpi_message hm; 924 struct hpi_response hr; 925 926 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 927 HPI_ISTREAM_READ); 928 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 929 return HPI_ERROR_INVALID_HANDLE; 930 hm.u.d.u.data.data_size = bytes_to_read; 931 hm.u.d.u.data.pb_data = pb_data; 932 933 hpi_send_recv(&hm, &hr); 934 935 return hr.error; 936} 937 938u16 hpi_instream_start(u32 h_instream) 939{ 940 struct hpi_message hm; 941 struct hpi_response hr; 942 943 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 944 HPI_ISTREAM_START); 945 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 946 return HPI_ERROR_INVALID_HANDLE; 947 948 hpi_send_recv(&hm, &hr); 949 950 return hr.error; 951} 952 953u16 hpi_instream_wait_start(u32 h_instream) 954{ 955 struct hpi_message hm; 956 struct hpi_response hr; 957 958 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 959 HPI_ISTREAM_WAIT_START); 960 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 961 return HPI_ERROR_INVALID_HANDLE; 962 963 hpi_send_recv(&hm, &hr); 964 965 return hr.error; 966} 967 968u16 hpi_instream_stop(u32 h_instream) 969{ 970 struct hpi_message hm; 971 struct hpi_response hr; 972 973 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 974 HPI_ISTREAM_STOP); 975 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 976 return HPI_ERROR_INVALID_HANDLE; 977 978 hpi_send_recv(&hm, &hr); 979 980 return hr.error; 981} 982 983u16 hpi_instream_reset(u32 h_instream) 984{ 985 struct hpi_message hm; 986 struct hpi_response hr; 987 988 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 989 HPI_ISTREAM_RESET); 990 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 991 return HPI_ERROR_INVALID_HANDLE; 992 993 hpi_send_recv(&hm, &hr); 994 995 return hr.error; 996} 997 998u16 hpi_instream_get_info_ex(u32 h_instream, u16 *pw_state, u32 *pbuffer_size, 999 u32 *pdata_recorded, u32 *psamples_recorded, 1000 u32 *pauxiliary_data_recorded)
1001{ 1002 struct hpi_message hm; 1003 struct hpi_response hr; 1004 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1005 HPI_ISTREAM_GET_INFO); 1006 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1007 return HPI_ERROR_INVALID_HANDLE; 1008 1009 hpi_send_recv(&hm, &hr); 1010 1011 if (pw_state) 1012 *pw_state = hr.u.d.u.stream_info.state; 1013 if (pbuffer_size) 1014 *pbuffer_size = hr.u.d.u.stream_info.buffer_size; 1015 if (pdata_recorded) 1016 *pdata_recorded = hr.u.d.u.stream_info.data_available; 1017 if (psamples_recorded) 1018 *psamples_recorded = hr.u.d.u.stream_info.samples_transferred; 1019 if (pauxiliary_data_recorded) 1020 *pauxiliary_data_recorded = 1021 hr.u.d.u.stream_info.auxiliary_data_available; 1022 return hr.error; 1023} 1024 1025u16 hpi_instream_ancillary_reset(u32 h_instream, u16 bytes_per_frame, 1026 u16 mode, u16 alignment, u16 idle_bit) 1027{ 1028 struct hpi_message hm; 1029 struct hpi_response hr; 1030 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1031 HPI_ISTREAM_ANC_RESET); 1032 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1033 return HPI_ERROR_INVALID_HANDLE; 1034 hm.u.d.u.data.format.attributes = bytes_per_frame; 1035 hm.u.d.u.data.format.format = (mode << 8) | (alignment & 0xff); 1036 hm.u.d.u.data.format.channels = idle_bit; 1037 hpi_send_recv(&hm, &hr); 1038 return hr.error; 1039} 1040 1041u16 hpi_instream_ancillary_get_info(u32 h_instream, u32 *pframe_space) 1042{ 1043 struct hpi_message hm; 1044 struct hpi_response hr; 1045 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1046 HPI_ISTREAM_ANC_GET_INFO); 1047 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1048 return HPI_ERROR_INVALID_HANDLE; 1049 hpi_send_recv(&hm, &hr); 1050 if (pframe_space) 1051 *pframe_space = 1052 (hr.u.d.u.stream_info.buffer_size - 1053 hr.u.d.u.stream_info.data_available) / 1054 sizeof(struct hpi_anc_frame); 1055 return hr.error; 1056} 1057 1058u16 hpi_instream_ancillary_write(u32 h_instream, 1059 const struct hpi_anc_frame *p_anc_frame_buffer, 1060 u32 anc_frame_buffer_size_in_bytes, 1061 u32 number_of_ancillary_frames_to_write) 1062{ 1063 struct hpi_message hm; 1064 struct hpi_response hr; 1065 1066 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1067 HPI_ISTREAM_ANC_WRITE); 1068 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1069 return HPI_ERROR_INVALID_HANDLE; 1070 hm.u.d.u.data.pb_data = (u8 *)p_anc_frame_buffer; 1071 hm.u.d.u.data.data_size = 1072 number_of_ancillary_frames_to_write * 1073 sizeof(struct hpi_anc_frame); 1074 if (hm.u.d.u.data.data_size <= anc_frame_buffer_size_in_bytes) 1075 hpi_send_recv(&hm, &hr); 1076 else 1077 hr.error = HPI_ERROR_INVALID_DATASIZE; 1078 return hr.error; 1079} 1080 1081u16 hpi_instream_host_buffer_allocate(u32 h_instream, u32 size_in_bytes) 1082{ 1083 1084 struct hpi_message hm; 1085 struct hpi_response hr; 1086 1087 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1088 HPI_ISTREAM_HOSTBUFFER_ALLOC); 1089 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1090 return HPI_ERROR_INVALID_HANDLE; 1091 hm.u.d.u.data.data_size = size_in_bytes; 1092 hpi_send_recv(&hm, &hr); 1093 return hr.error; 1094} 1095 1096u16 hpi_instream_host_buffer_get_info(u32 h_instream, u8 **pp_buffer, 1097 struct hpi_hostbuffer_status **pp_status) 1098{ 1099 struct hpi_message hm; 1100 struct hpi_response hr; 1101 1102 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1103 HPI_ISTREAM_HOSTBUFFER_GET_INFO); 1104 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1105 return HPI_ERROR_INVALID_HANDLE; 1106 hpi_send_recv(&hm, &hr); 1107 1108 if (hr.error == 0) { 1109 if (pp_buffer) 1110 *pp_buffer = hr.u.d.u.hostbuffer_info.p_buffer; 1111 if (pp_status) 1112 *pp_status = hr.u.d.u.hostbuffer_info.p_status; 1113 } 1114 return hr.error; 1115} 1116 1117u16 hpi_instream_host_buffer_free(u32 h_instream) 1118{ 1119 1120 struct hpi_message hm; 1121 struct hpi_response hr; 1122 1123 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1124 HPI_ISTREAM_HOSTBUFFER_FREE); 1125 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1126 return HPI_ERROR_INVALID_HANDLE; 1127 hpi_send_recv(&hm, &hr); 1128 return hr.error; 1129} 1130 1131u16 hpi_instream_group_add(u32 h_instream, u32 h_stream) 1132{ 1133 struct hpi_message hm; 1134 struct hpi_response hr; 1135 u16 adapter; 1136 char c_obj_type; 1137 1138 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1139 HPI_ISTREAM_GROUP_ADD); 1140 hr.error = 0; 1141 1142 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1143 return HPI_ERROR_INVALID_HANDLE; 1144 1145 if (hpi_handle_indexes(h_stream, &adapter, 1146 &hm.u.d.u.stream.stream_index)) 1147 return HPI_ERROR_INVALID_HANDLE; 1148 1149 c_obj_type = hpi_handle_object(h_stream); 1150 1151 switch (c_obj_type) { 1152 case HPI_OBJ_OSTREAM: 1153 case HPI_OBJ_ISTREAM: 1154 hm.u.d.u.stream.object_type = c_obj_type; 1155 break; 1156 default: 1157 return HPI_ERROR_INVALID_OBJ; 1158 } 1159 1160 if (adapter != hm.adapter_index) 1161 return HPI_ERROR_NO_INTERADAPTER_GROUPS; 1162 1163 hpi_send_recv(&hm, &hr); 1164 return hr.error; 1165} 1166 1167u16 hpi_instream_group_get_map(u32 h_instream, u32 *poutstream_map, 1168 u32 *pinstream_map) 1169{ 1170 struct hpi_message hm; 1171 struct hpi_response hr; 1172 1173 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1174 HPI_ISTREAM_HOSTBUFFER_FREE); 1175 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1176 return HPI_ERROR_INVALID_HANDLE; 1177 hpi_send_recv(&hm, &hr); 1178 1179 if (poutstream_map) 1180 *poutstream_map = hr.u.d.u.group_info.outstream_group_map; 1181 if (pinstream_map) 1182 *pinstream_map = hr.u.d.u.group_info.instream_group_map; 1183 1184 return hr.error; 1185} 1186 1187u16 hpi_instream_group_reset(u32 h_instream) 1188{ 1189 struct hpi_message hm; 1190 struct hpi_response hr; 1191 1192 hpi_init_message_response(&hm, &hr, HPI_OBJ_ISTREAM, 1193 HPI_ISTREAM_GROUP_RESET); 1194 if (hpi_handle_indexes(h_instream, &hm.adapter_index, &hm.obj_index)) 1195 return HPI_ERROR_INVALID_HANDLE; 1196 hpi_send_recv(&hm, &hr); 1197 return hr.error; 1198} 1199 1200u16 hpi_mixer_open(u16 adapter_index, u32 *ph_mixer) 1201{ 1202 struct hpi_message hm; 1203 struct hpi_response hr; 1204 hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_OPEN); 1205 hm.adapter_index = adapter_index; 1206 1207 hpi_send_recv(&hm, &hr); 1208 1209 if (hr.error == 0) 1210 *ph_mixer = 1211 hpi_indexes_to_handle(HPI_OBJ_MIXER, adapter_index, 1212 0); 1213 else 1214 *ph_mixer = 0; 1215 return hr.error; 1216} 1217 1218u16 hpi_mixer_close(u32 h_mixer) 1219{ 1220 struct hpi_message hm; 1221 struct hpi_response hr; 1222 1223 hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_CLOSE); 1224 if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 1225 return HPI_ERROR_INVALID_HANDLE; 1226 1227 hpi_send_recv(&hm, &hr); 1228 return hr.error; 1229} 1230 1231u16 hpi_mixer_get_control(u32 h_mixer, u16 src_node_type, 1232 u16 src_node_type_index, u16 dst_node_type, u16 dst_node_type_index, 1233 u16 control_type, u32 *ph_control) 1234{ 1235 struct hpi_message hm; 1236 struct hpi_response hr; 1237 hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, 1238 HPI_MIXER_GET_CONTROL); 1239 if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 1240 return HPI_ERROR_INVALID_HANDLE; 1241 hm.u.m.node_type1 = src_node_type; 1242 hm.u.m.node_index1 = src_node_type_index; 1243 hm.u.m.node_type2 = dst_node_type; 1244 hm.u.m.node_index2 = dst_node_type_index; 1245 hm.u.m.control_type = control_type; 1246 1247 hpi_send_recv(&hm, &hr); 1248 1249 if (hr.error == 0) 1250 *ph_control = 1251 hpi_indexes_to_handle(HPI_OBJ_CONTROL, 1252 hm.adapter_index, hr.u.m.control_index); 1253 else 1254 *ph_control = 0; 1255 return hr.error; 1256} 1257 1258u16 hpi_mixer_get_control_by_index(u32 h_mixer, u16 control_index, 1259 u16 *pw_src_node_type, u16 *pw_src_node_index, u16 *pw_dst_node_type, 1260 u16 *pw_dst_node_index, u16 *pw_control_type, u32 *ph_control) 1261{ 1262 struct hpi_message hm; 1263 struct hpi_response hr; 1264 hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, 1265 HPI_MIXER_GET_CONTROL_BY_INDEX); 1266 if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 1267 return HPI_ERROR_INVALID_HANDLE; 1268 hm.u.m.control_index = control_index; 1269 hpi_send_recv(&hm, &hr); 1270 1271 if (pw_src_node_type) { 1272 *pw_src_node_type = 1273 hr.u.m.src_node_type + HPI_SOURCENODE_NONE; 1274 *pw_src_node_index = hr.u.m.src_node_index; 1275 *pw_dst_node_type = hr.u.m.dst_node_type + HPI_DESTNODE_NONE; 1276 *pw_dst_node_index = hr.u.m.dst_node_index; 1277 } 1278 if (pw_control_type) 1279 *pw_control_type = hr.u.m.control_index; 1280 1281 if (ph_control) { 1282 if (hr.error == 0) 1283 *ph_control = 1284 hpi_indexes_to_handle(HPI_OBJ_CONTROL, 1285 hm.adapter_index, control_index); 1286 else 1287 *ph_control = 0; 1288 } 1289 return hr.error; 1290} 1291 1292u16 hpi_mixer_store(u32 h_mixer, enum HPI_MIXER_STORE_COMMAND command, 1293 u16 index) 1294{ 1295 struct hpi_message hm; 1296 struct hpi_response hr; 1297 hpi_init_message_response(&hm, &hr, HPI_OBJ_MIXER, HPI_MIXER_STORE); 1298 if (hpi_handle_indexes(h_mixer, &hm.adapter_index, NULL)) 1299 return HPI_ERROR_INVALID_HANDLE; 1300 hm.u.mx.store.command = command; 1301 hm.u.mx.store.index = index; 1302 hpi_send_recv(&hm, &hr); 1303 return hr.error; 1304} 1305 1306static 1307u16 hpi_control_param_set(const u32 h_control, const u16 attrib, 1308 const u32 param1, const u32 param2) 1309{ 1310 struct hpi_message hm; 1311 struct hpi_response hr; 1312 1313 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1314 HPI_CONTROL_SET_STATE); 1315 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1316 return HPI_ERROR_INVALID_HANDLE; 1317 hm.u.c.attribute = attrib; 1318 hm.u.c.param1 = param1; 1319 hm.u.c.param2 = param2; 1320 hpi_send_recv(&hm, &hr); 1321 return hr.error; 1322} 1323 1324static u16 hpi_control_log_set2(u32 h_control, u16 attrib, short sv0, 1325 short sv1) 1326{ 1327 struct hpi_message hm; 1328 struct hpi_response hr; 1329 1330 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1331 HPI_CONTROL_SET_STATE); 1332 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1333 return HPI_ERROR_INVALID_HANDLE; 1334 hm.u.c.attribute = attrib; 1335 hm.u.c.an_log_value[0] = sv0; 1336 hm.u.c.an_log_value[1] = sv1; 1337 hpi_send_recv(&hm, &hr); 1338 return hr.error; 1339} 1340 1341static 1342u16 hpi_control_param_get(const u32 h_control, const u16 attrib, u32 param1, 1343 u32 param2, u32 *pparam1, u32 *pparam2) 1344{ 1345 struct hpi_message hm; 1346 struct hpi_response hr; 1347 1348 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1349 HPI_CONTROL_GET_STATE); 1350 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1351 return HPI_ERROR_INVALID_HANDLE; 1352 hm.u.c.attribute = attrib; 1353 hm.u.c.param1 = param1; 1354 hm.u.c.param2 = param2; 1355 hpi_send_recv(&hm, &hr); 1356 1357 *pparam1 = hr.u.c.param1; 1358 if (pparam2) 1359 *pparam2 = hr.u.c.param2; 1360 1361 return hr.error; 1362} 1363 1364#define hpi_control_param1_get(h, a, p1) \ 1365 hpi_control_param_get(h, a, 0, 0, p1, NULL) 1366#define hpi_control_param2_get(h, a, p1, p2) \ 1367 hpi_control_param_get(h, a, 0, 0, p1, p2) 1368 1369static u16 hpi_control_log_get2(u32 h_control, u16 attrib, short *sv0, 1370 short *sv1) 1371{ 1372 struct hpi_message hm; 1373 struct hpi_response hr; 1374 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1375 HPI_CONTROL_GET_STATE); 1376 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1377 return HPI_ERROR_INVALID_HANDLE; 1378 hm.u.c.attribute = attrib; 1379 1380 hpi_send_recv(&hm, &hr); 1381 *sv0 = hr.u.c.an_log_value[0]; 1382 if (sv1) 1383 *sv1 = hr.u.c.an_log_value[1]; 1384 return hr.error; 1385} 1386 1387static 1388u16 hpi_control_query(const u32 h_control, const u16 attrib, const u32 index, 1389 const u32 param, u32 *psetting) 1390{ 1391 struct hpi_message hm; 1392 struct hpi_response hr; 1393 1394 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1395 HPI_CONTROL_GET_INFO); 1396 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1397 return HPI_ERROR_INVALID_HANDLE; 1398 1399 hm.u.c.attribute = attrib; 1400 hm.u.c.param1 = index; 1401 hm.u.c.param2 = param; 1402 1403 hpi_send_recv(&hm, &hr); 1404 *psetting = hr.u.c.param1; 1405 1406 return hr.error; 1407} 1408 1409static u16 hpi_control_get_string(const u32 h_control, const u16 attribute, 1410 char *psz_string, const u32 string_length) 1411{ 1412 unsigned int sub_string_index = 0, j = 0; 1413 char c = 0; 1414 unsigned int n = 0; 1415 u16 err = 0; 1416 1417 if ((string_length < 1) || (string_length > 256)) 1418 return HPI_ERROR_INVALID_CONTROL_VALUE; 1419 for (sub_string_index = 0; sub_string_index < string_length; 1420 sub_string_index += 8) { 1421 struct hpi_message hm; 1422 struct hpi_response hr; 1423 1424 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1425 HPI_CONTROL_GET_STATE); 1426 if (hpi_handle_indexes(h_control, &hm.adapter_index, 1427 &hm.obj_index)) 1428 return HPI_ERROR_INVALID_HANDLE; 1429 hm.u.c.attribute = attribute; 1430 hm.u.c.param1 = sub_string_index; 1431 hm.u.c.param2 = 0; 1432 hpi_send_recv(&hm, &hr); 1433 1434 if (sub_string_index == 0 1435 && (hr.u.cu.chars8.remaining_chars + 8) > 1436 string_length) 1437 return HPI_ERROR_INVALID_CONTROL_VALUE; 1438 1439 if (hr.error) { 1440 err = hr.error; 1441 break; 1442 } 1443 for (j = 0; j < 8; j++) { 1444 c = hr.u.cu.chars8.sz_data[j]; 1445 psz_string[sub_string_index + j] = c; 1446 n++; 1447 if (n >= string_length) { 1448 psz_string[string_length - 1] = 0; 1449 err = HPI_ERROR_INVALID_CONTROL_VALUE; 1450 break; 1451 } 1452 if (c == 0) 1453 break; 1454 } 1455 1456 if ((hr.u.cu.chars8.remaining_chars == 0) 1457 && ((sub_string_index + j) < string_length) 1458 && (c != 0)) { 1459 c = 0; 1460 psz_string[sub_string_index + j] = c; 1461 } 1462 if (c == 0) 1463 break; 1464 } 1465 return err; 1466} 1467 1468u16 hpi_aesebu_receiver_query_format(const u32 h_aes_rx, const u32 index, 1469 u16 *pw_format) 1470{ 1471 u32 qr; 1472 u16 err; 1473 1474 err = hpi_control_query(h_aes_rx, HPI_AESEBURX_FORMAT, index, 0, &qr); 1475 *pw_format = (u16)qr; 1476 return err; 1477} 1478 1479u16 hpi_aesebu_receiver_set_format(u32 h_control, u16 format) 1480{ 1481 return hpi_control_param_set(h_control, HPI_AESEBURX_FORMAT, format, 1482 0); 1483} 1484 1485u16 hpi_aesebu_receiver_get_format(u32 h_control, u16 *pw_format) 1486{ 1487 u16 err; 1488 u32 param; 1489 1490 err = hpi_control_param1_get(h_control, HPI_AESEBURX_FORMAT, ¶m); 1491 if (!err && pw_format) 1492 *pw_format = (u16)param; 1493 1494 return err; 1495} 1496 1497u16 hpi_aesebu_receiver_get_sample_rate(u32 h_control, u32 *psample_rate) 1498{ 1499 return hpi_control_param1_get(h_control, HPI_AESEBURX_SAMPLERATE, 1500 psample_rate); 1501} 1502 1503u16 hpi_aesebu_receiver_get_user_data(u32 h_control, u16 index, u16 *pw_data) 1504{ 1505 struct hpi_message hm; 1506 struct hpi_response hr; 1507 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1508 HPI_CONTROL_GET_STATE); 1509 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1510 return HPI_ERROR_INVALID_HANDLE; 1511 hm.u.c.attribute = HPI_AESEBURX_USERDATA; 1512 hm.u.c.param1 = index; 1513 1514 hpi_send_recv(&hm, &hr); 1515 1516 if (pw_data) 1517 *pw_data = (u16)hr.u.c.param2; 1518 return hr.error; 1519} 1520 1521u16 hpi_aesebu_receiver_get_channel_status(u32 h_control, u16 index, 1522 u16 *pw_data) 1523{ 1524 struct hpi_message hm; 1525 struct hpi_response hr; 1526 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1527 HPI_CONTROL_GET_STATE); 1528 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1529 return HPI_ERROR_INVALID_HANDLE; 1530 hm.u.c.attribute = HPI_AESEBURX_CHANNELSTATUS; 1531 hm.u.c.param1 = index; 1532 1533 hpi_send_recv(&hm, &hr); 1534 1535 if (pw_data) 1536 *pw_data = (u16)hr.u.c.param2; 1537 return hr.error; 1538} 1539 1540u16 hpi_aesebu_receiver_get_error_status(u32 h_control, u16 *pw_error_data) 1541{ 1542 u32 error_data = 0; 1543 u16 err = 0; 1544 1545 err = hpi_control_param1_get(h_control, HPI_AESEBURX_ERRORSTATUS, 1546 &error_data); 1547 if (pw_error_data) 1548 *pw_error_data = (u16)error_data; 1549 return err; 1550} 1551 1552u16 hpi_aesebu_transmitter_set_sample_rate(u32 h_control, u32 sample_rate) 1553{ 1554 return hpi_control_param_set(h_control, HPI_AESEBUTX_SAMPLERATE, 1555 sample_rate, 0); 1556} 1557 1558u16 hpi_aesebu_transmitter_set_user_data(u32 h_control, u16 index, u16 data) 1559{ 1560 return hpi_control_param_set(h_control, HPI_AESEBUTX_USERDATA, index, 1561 data); 1562} 1563 1564u16 hpi_aesebu_transmitter_set_channel_status(u32 h_control, u16 index, 1565 u16 data) 1566{ 1567 return hpi_control_param_set(h_control, HPI_AESEBUTX_CHANNELSTATUS, 1568 index, data); 1569} 1570 1571u16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index, 1572 u16 *pw_data) 1573{ 1574 return HPI_ERROR_INVALID_OPERATION; 1575} 1576 1577u16 hpi_aesebu_transmitter_query_format(const u32 h_aes_tx, const u32 index, 1578 u16 *pw_format) 1579{ 1580 u32 qr; 1581 u16 err; 1582 1583 err = hpi_control_query(h_aes_tx, HPI_AESEBUTX_FORMAT, index, 0, &qr); 1584 *pw_format = (u16)qr; 1585 return err; 1586} 1587 1588u16 hpi_aesebu_transmitter_set_format(u32 h_control, u16 output_format) 1589{ 1590 return hpi_control_param_set(h_control, HPI_AESEBUTX_FORMAT, 1591 output_format, 0); 1592} 1593 1594u16 hpi_aesebu_transmitter_get_format(u32 h_control, u16 *pw_output_format) 1595{ 1596 u16 err; 1597 u32 param; 1598 1599 err = hpi_control_param1_get(h_control, HPI_AESEBUTX_FORMAT, ¶m); 1600 if (!err && pw_output_format) 1601 *pw_output_format = (u16)param; 1602 1603 return err; 1604} 1605 1606u16 hpi_bitstream_set_clock_edge(u32 h_control, u16 edge_type) 1607{ 1608 return hpi_control_param_set(h_control, HPI_BITSTREAM_CLOCK_EDGE, 1609 edge_type, 0); 1610} 1611 1612u16 hpi_bitstream_set_data_polarity(u32 h_control, u16 polarity) 1613{ 1614 return hpi_control_param_set(h_control, HPI_BITSTREAM_DATA_POLARITY, 1615 polarity, 0); 1616} 1617 1618u16 hpi_bitstream_get_activity(u32 h_control, u16 *pw_clk_activity, 1619 u16 *pw_data_activity) 1620{ 1621 struct hpi_message hm; 1622 struct hpi_response hr; 1623 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1624 HPI_CONTROL_GET_STATE); 1625 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1626 return HPI_ERROR_INVALID_HANDLE; 1627 hm.u.c.attribute = HPI_BITSTREAM_ACTIVITY; 1628 hpi_send_recv(&hm, &hr); 1629 if (pw_clk_activity) 1630 *pw_clk_activity = (u16)hr.u.c.param1; 1631 if (pw_data_activity) 1632 *pw_data_activity = (u16)hr.u.c.param2; 1633 return hr.error; 1634} 1635 1636u16 hpi_channel_mode_query_mode(const u32 h_mode, const u32 index, 1637 u16 *pw_mode) 1638{ 1639 u32 qr; 1640 u16 err; 1641 1642 err = hpi_control_query(h_mode, HPI_CHANNEL_MODE_MODE, index, 0, &qr); 1643 *pw_mode = (u16)qr; 1644 return err; 1645} 1646 1647u16 hpi_channel_mode_set(u32 h_control, u16 mode) 1648{ 1649 return hpi_control_param_set(h_control, HPI_CHANNEL_MODE_MODE, mode, 1650 0); 1651} 1652 1653u16 hpi_channel_mode_get(u32 h_control, u16 *mode) 1654{ 1655 u32 mode32 = 0; 1656 u16 err = hpi_control_param1_get(h_control, 1657 HPI_CHANNEL_MODE_MODE, &mode32); 1658 if (mode) 1659 *mode = (u16)mode32; 1660 return err; 1661} 1662 1663u16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count, 1664 u8 *pb_data) 1665{ 1666 struct hpi_msg_cobranet_hmiwrite hm; 1667 struct hpi_response_header hr; 1668 1669 hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr, sizeof(hr), 1670 HPI_OBJ_CONTROL, HPI_CONTROL_SET_STATE); 1671 1672 if (hpi_handle_indexes(h_control, &hm.h.adapter_index, 1673 &hm.h.obj_index)) 1674 return HPI_ERROR_INVALID_HANDLE; 1675 1676 if (byte_count > sizeof(hm.bytes)) 1677 return HPI_ERROR_MESSAGE_BUFFER_TOO_SMALL; 1678 1679 hm.p.attribute = HPI_COBRANET_SET; 1680 hm.p.byte_count = byte_count; 1681 hm.p.hmi_address = hmi_address; 1682 memcpy(hm.bytes, pb_data, byte_count); 1683 hm.h.size = (u16)(sizeof(hm.h) + sizeof(hm.p) + byte_count); 1684 1685 hpi_send_recvV1(&hm.h, &hr); 1686 return hr.error; 1687} 1688 1689u16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count, 1690 u32 *pbyte_count, u8 *pb_data) 1691{ 1692 struct hpi_msg_cobranet_hmiread hm; 1693 struct hpi_res_cobranet_hmiread hr; 1694 1695 hpi_init_message_responseV1(&hm.h, sizeof(hm), &hr.h, sizeof(hr), 1696 HPI_OBJ_CONTROL, HPI_CONTROL_GET_STATE); 1697 1698 if (hpi_handle_indexes(h_control, &hm.h.adapter_index, 1699 &hm.h.obj_index)) 1700 return HPI_ERROR_INVALID_HANDLE; 1701 1702 if (max_byte_count > sizeof(hr.bytes)) 1703 return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL; 1704 1705 hm.p.attribute = HPI_COBRANET_GET; 1706 hm.p.byte_count = max_byte_count; 1707 hm.p.hmi_address = hmi_address; 1708 1709 hpi_send_recvV1(&hm.h, &hr.h); 1710 1711 if (!hr.h.error && pb_data) { 1712 if (hr.byte_count > sizeof(hr.bytes)) 1713 1714 return HPI_ERROR_RESPONSE_BUFFER_TOO_SMALL; 1715 1716 *pbyte_count = hr.byte_count; 1717 1718 if (hr.byte_count < max_byte_count) 1719 max_byte_count = *pbyte_count; 1720 1721 memcpy(pb_data, hr.bytes, max_byte_count); 1722 } 1723 return hr.h.error; 1724} 1725 1726u16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus, 1727 u32 *preadable_size, u32 *pwriteable_size) 1728{ 1729 struct hpi_message hm; 1730 struct hpi_response hr; 1731 1732 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1733 HPI_CONTROL_GET_STATE); 1734 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1735 return HPI_ERROR_INVALID_HANDLE; 1736 1737 hm.u.c.attribute = HPI_COBRANET_GET_STATUS; 1738 1739 hpi_send_recv(&hm, &hr); 1740 if (!hr.error) { 1741 if (pstatus) 1742 *pstatus = hr.u.cu.cobranet.status.status; 1743 if (preadable_size) 1744 *preadable_size = 1745 hr.u.cu.cobranet.status.readable_size; 1746 if (pwriteable_size) 1747 *pwriteable_size = 1748 hr.u.cu.cobranet.status.writeable_size; 1749 } 1750 return hr.error; 1751} 1752 1753u16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address) 1754{ 1755 u32 byte_count; 1756 u32 iP; 1757 u16 err; 1758 1759 err = hpi_cobranet_hmi_read(h_control, 1760 HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count, 1761 (u8 *)&iP); 1762 1763 *pdw_ip_address = 1764 ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & 1765 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); 1766 1767 if (err) 1768 *pdw_ip_address = 0; 1769 1770 return err; 1771 1772} 1773 1774u16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address) 1775{ 1776 u32 iP; 1777 u16 err; 1778 1779 iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address & 1780 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >> 1781 8) | ((dw_ip_address & 0x000000ff) << 8); 1782 1783 err = hpi_cobranet_hmi_write(h_control, 1784 HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP); 1785 1786 return err; 1787 1788} 1789 1790u16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address) 1791{ 1792 u32 byte_count; 1793 u32 iP; 1794 u16 err; 1795 err = hpi_cobranet_hmi_read(h_control, 1796 HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count, 1797 (u8 *)&iP); 1798 1799 *pdw_ip_address = 1800 ((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP & 1801 0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8); 1802 1803 if (err) 1804 *pdw_ip_address = 0; 1805 1806 return err; 1807 1808} 1809 1810u16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address) 1811{ 1812 u32 iP; 1813 u16 err; 1814 1815 iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address & 1816 0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >> 1817 8) | ((dw_ip_address & 0x000000ff) << 8); 1818 1819 err = hpi_cobranet_hmi_write(h_control, 1820 HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP); 1821 1822 return err; 1823 1824} 1825 1826u16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs, 1827 u32 *p_mac_lsbs) 1828{ 1829 u32 byte_count; 1830 u16 err; 1831 u32 mac; 1832 1833 err = hpi_cobranet_hmi_read(h_control, 1834 HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count, 1835 (u8 *)&mac); 1836 1837 if (!err) { 1838 *p_mac_msbs = 1839 ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8) 1840 | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) << 1841 8); 1842 1843 err = hpi_cobranet_hmi_read(h_control, 1844 HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4, 1845 &byte_count, (u8 *)&mac); 1846 } 1847 1848 if (!err) { 1849 *p_mac_lsbs = 1850 ((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8) 1851 | ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) << 1852 8); 1853 } else { 1854 *p_mac_msbs = 0; 1855 *p_mac_lsbs = 0; 1856 } 1857 1858 return err; 1859} 1860 1861u16 hpi_compander_set_enable(u32 h_control, u32 enable) 1862{ 1863 return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 1864 0); 1865} 1866 1867u16 hpi_compander_get_enable(u32 h_control, u32 *enable) 1868{ 1869 return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 1870} 1871 1872u16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB) 1873{ 1874 return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN, 1875 makeup_gain0_01dB, 0); 1876} 1877 1878u16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB) 1879{ 1880 return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN, 1881 makeup_gain0_01dB, NULL); 1882} 1883 1884u16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index, 1885 u32 attack) 1886{ 1887 return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack, 1888 index); 1889} 1890 1891u16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index, 1892 u32 *attack) 1893{ 1894 return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0, 1895 index, attack, NULL); 1896} 1897 1898u16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index, 1899 u32 decay) 1900{ 1901 return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay, 1902 index); 1903} 1904 1905u16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index, 1906 u32 *decay) 1907{ 1908 return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index, 1909 decay, NULL); 1910 1911} 1912 1913u16 hpi_compander_set_threshold(u32 h_control, unsigned int index, 1914 short threshold0_01dB) 1915{ 1916 struct hpi_message hm; 1917 struct hpi_response hr; 1918 1919 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1920 HPI_CONTROL_SET_STATE); 1921 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1922 return HPI_ERROR_INVALID_HANDLE; 1923 hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; 1924 hm.u.c.param2 = index; 1925 hm.u.c.an_log_value[0] = threshold0_01dB; 1926 1927 hpi_send_recv(&hm, &hr); 1928 1929 return hr.error; 1930} 1931 1932u16 hpi_compander_get_threshold(u32 h_control, unsigned int index, 1933 short *threshold0_01dB) 1934{ 1935 struct hpi_message hm; 1936 struct hpi_response hr; 1937 1938 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1939 HPI_CONTROL_GET_STATE); 1940 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1941 return HPI_ERROR_INVALID_HANDLE; 1942 hm.u.c.attribute = HPI_COMPANDER_THRESHOLD; 1943 hm.u.c.param2 = index; 1944 1945 hpi_send_recv(&hm, &hr); 1946 *threshold0_01dB = hr.u.c.an_log_value[0]; 1947 1948 return hr.error; 1949} 1950 1951u16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100) 1952{ 1953 return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100, 1954 index); 1955} 1956 1957u16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100) 1958{ 1959 return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index, 1960 ratio100, NULL); 1961} 1962 1963u16 hpi_level_query_range(u32 h_control, short *min_gain_01dB, 1964 short *max_gain_01dB, short *step_gain_01dB) 1965{ 1966 struct hpi_message hm; 1967 struct hpi_response hr; 1968 1969 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 1970 HPI_CONTROL_GET_STATE); 1971 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 1972 return HPI_ERROR_INVALID_HANDLE; 1973 hm.u.c.attribute = HPI_LEVEL_RANGE; 1974 1975 hpi_send_recv(&hm, &hr); 1976 if (hr.error) { 1977 hr.u.c.an_log_value[0] = 0; 1978 hr.u.c.an_log_value[1] = 0; 1979 hr.u.c.param1 = 0; 1980 } 1981 if (min_gain_01dB) 1982 *min_gain_01dB = hr.u.c.an_log_value[0]; 1983 if (max_gain_01dB) 1984 *max_gain_01dB = hr.u.c.an_log_value[1]; 1985 if (step_gain_01dB) 1986 *step_gain_01dB = (short)hr.u.c.param1; 1987 return hr.error; 1988} 1989 1990u16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] 1991 ) 1992{ 1993 return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN, 1994 an_gain0_01dB[0], an_gain0_01dB[1]); 1995} 1996 1997u16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS] 1998 ) 1999{ 2000 return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
2001 &an_gain0_01dB[0], &an_gain0_01dB[1]); 2002} 2003 2004u16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels) 2005{ 2006 return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0, 2007 p_channels); 2008} 2009 2010u16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS] 2011 ) 2012{ 2013 short i = 0; 2014 2015 struct hpi_message hm; 2016 struct hpi_response hr; 2017 2018 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2019 HPI_CONTROL_GET_STATE); 2020 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2021 return HPI_ERROR_INVALID_HANDLE; 2022 hm.obj_index = hm.obj_index; 2023 hm.u.c.attribute = HPI_METER_PEAK; 2024 2025 hpi_send_recv(&hm, &hr); 2026 2027 if (!hr.error) 2028 memcpy(an_peakdB, hr.u.c.an_log_value, 2029 sizeof(short) * HPI_MAX_CHANNELS); 2030 else 2031 for (i = 0; i < HPI_MAX_CHANNELS; i++) 2032 an_peakdB[i] = HPI_METER_MINIMUM; 2033 return hr.error; 2034} 2035 2036u16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS] 2037 ) 2038{ 2039 short i = 0; 2040 2041 struct hpi_message hm; 2042 struct hpi_response hr; 2043 2044 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2045 HPI_CONTROL_GET_STATE); 2046 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2047 return HPI_ERROR_INVALID_HANDLE; 2048 hm.u.c.attribute = HPI_METER_RMS; 2049 2050 hpi_send_recv(&hm, &hr); 2051 2052 if (!hr.error) 2053 memcpy(an_rmsdB, hr.u.c.an_log_value, 2054 sizeof(short) * HPI_MAX_CHANNELS); 2055 else 2056 for (i = 0; i < HPI_MAX_CHANNELS; i++) 2057 an_rmsdB[i] = HPI_METER_MINIMUM; 2058 2059 return hr.error; 2060} 2061 2062u16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay) 2063{ 2064 return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS, 2065 attack, decay); 2066} 2067 2068u16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay) 2069{ 2070 u32 attack; 2071 u32 decay; 2072 u16 error; 2073 2074 error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS, 2075 &attack, &decay); 2076 2077 if (pn_attack) 2078 *pn_attack = (unsigned short)attack; 2079 if (pn_decay) 2080 *pn_decay = (unsigned short)decay; 2081 2082 return error; 2083} 2084 2085u16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay) 2086{ 2087 return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS, 2088 attack, decay); 2089} 2090 2091u16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack, 2092 u16 *pn_decay) 2093{ 2094 u32 attack; 2095 u32 decay; 2096 u16 error; 2097 2098 error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS, 2099 &attack, &decay); 2100 2101 if (pn_attack) 2102 *pn_attack = (short)attack; 2103 if (pn_decay) 2104 *pn_decay = (short)decay; 2105 2106 return error; 2107} 2108 2109u16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off) 2110{ 2111 return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER, 2112 (u32)on_off, 0); 2113} 2114 2115u16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off) 2116{ 2117 u16 error = 0; 2118 u32 on_off = 0; 2119 error = hpi_control_param1_get(h_control, 2120 HPI_MICROPHONE_PHANTOM_POWER, &on_off); 2121 if (pw_on_off) 2122 *pw_on_off = (u16)on_off; 2123 return error; 2124} 2125 2126u16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type, 2127 u16 source_node_index) 2128{ 2129 return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE, 2130 source_node_type, source_node_index); 2131} 2132 2133u16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type, 2134 u16 *source_node_index) 2135{ 2136 u32 node, index; 2137 u16 err = hpi_control_param2_get(h_control, 2138 HPI_MULTIPLEXER_SOURCE, &node, 2139 &index); 2140 if (source_node_type) 2141 *source_node_type = (u16)node; 2142 if (source_node_index) 2143 *source_node_index = (u16)index; 2144 return err; 2145} 2146 2147u16 hpi_multiplexer_query_source(u32 h_control, u16 index, 2148 u16 *source_node_type, u16 *source_node_index) 2149{ 2150 struct hpi_message hm; 2151 struct hpi_response hr; 2152 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2153 HPI_CONTROL_GET_STATE); 2154 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2155 return HPI_ERROR_INVALID_HANDLE; 2156 hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE; 2157 hm.u.c.param1 = index; 2158 2159 hpi_send_recv(&hm, &hr); 2160 2161 if (source_node_type) 2162 *source_node_type = (u16)hr.u.c.param1; 2163 if (source_node_index) 2164 *source_node_index = (u16)hr.u.c.param2; 2165 return hr.error; 2166} 2167 2168u16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands, 2169 u16 *pw_on_off) 2170{ 2171 u32 oB = 0; 2172 u32 oO = 0; 2173 u16 error = 0; 2174 2175 error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS, 2176 &oO, &oB); 2177 if (pw_number_of_bands) 2178 *pw_number_of_bands = (u16)oB; 2179 if (pw_on_off) 2180 *pw_on_off = (u16)oO; 2181 return error; 2182} 2183 2184u16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off) 2185{ 2186 return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS, 2187 on_off, 0); 2188} 2189 2190u16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type, 2191 u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB) 2192{ 2193 struct hpi_message hm; 2194 struct hpi_response hr; 2195 2196 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2197 HPI_CONTROL_GET_STATE); 2198 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2199 return HPI_ERROR_INVALID_HANDLE; 2200 hm.u.c.attribute = HPI_EQUALIZER_FILTER; 2201 hm.u.c.param2 = index; 2202 2203 hpi_send_recv(&hm, &hr); 2204 2205 if (pfrequency_hz) 2206 *pfrequency_hz = hr.u.c.param1; 2207 if (pn_type) 2208 *pn_type = (u16)(hr.u.c.param2 >> 16); 2209 if (pnQ100) 2210 *pnQ100 = hr.u.c.an_log_value[1]; 2211 if (pn_gain0_01dB) 2212 *pn_gain0_01dB = hr.u.c.an_log_value[0]; 2213 2214 return hr.error; 2215} 2216 2217u16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type, 2218 u32 frequency_hz, short q100, short gain0_01dB) 2219{ 2220 struct hpi_message hm; 2221 struct hpi_response hr; 2222 2223 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2224 HPI_CONTROL_SET_STATE); 2225 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2226 return HPI_ERROR_INVALID_HANDLE; 2227 2228 hm.u.c.param1 = frequency_hz; 2229 hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16); 2230 hm.u.c.an_log_value[0] = gain0_01dB; 2231 hm.u.c.an_log_value[1] = q100; 2232 hm.u.c.attribute = HPI_EQUALIZER_FILTER; 2233 2234 hpi_send_recv(&hm, &hr); 2235 2236 return hr.error; 2237} 2238 2239u16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5] 2240 ) 2241{ 2242 struct hpi_message hm; 2243 struct hpi_response hr; 2244 2245 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2246 HPI_CONTROL_GET_STATE); 2247 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2248 return HPI_ERROR_INVALID_HANDLE; 2249 hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS; 2250 hm.u.c.param2 = index; 2251 2252 hpi_send_recv(&hm, &hr); 2253 2254 coeffs[0] = (short)hr.u.c.an_log_value[0]; 2255 coeffs[1] = (short)hr.u.c.an_log_value[1]; 2256 coeffs[2] = (short)hr.u.c.param1; 2257 coeffs[3] = (short)(hr.u.c.param1 >> 16); 2258 coeffs[4] = (short)hr.u.c.param2; 2259 2260 return hr.error; 2261} 2262 2263u16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index, 2264 u16 *pw_source) 2265{ 2266 u32 qr; 2267 u16 err; 2268 2269 err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0, 2270 &qr); 2271 *pw_source = (u16)qr; 2272 return err; 2273} 2274 2275u16 hpi_sample_clock_set_source(u32 h_control, u16 source) 2276{ 2277 return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE, 2278 source, 0); 2279} 2280 2281u16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source) 2282{ 2283 u16 err = 0; 2284 u32 source = 0; 2285 err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE, 2286 &source); 2287 if (!err) 2288 if (pw_source) 2289 *pw_source = (u16)source; 2290 return err; 2291} 2292 2293u16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index, 2294 const u32 source, u16 *pw_source_index) 2295{ 2296 u32 qr; 2297 u16 err; 2298 2299 err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index, 2300 source, &qr); 2301 *pw_source_index = (u16)qr; 2302 return err; 2303} 2304 2305u16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index) 2306{ 2307 return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX, 2308 source_index, 0); 2309} 2310 2311u16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index) 2312{ 2313 u16 err = 0; 2314 u32 source_index = 0; 2315 err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX, 2316 &source_index); 2317 if (!err) 2318 if (pw_source_index) 2319 *pw_source_index = (u16)source_index; 2320 return err; 2321} 2322 2323u16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index, 2324 u32 *prate) 2325{ 2326 return hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, 2327 index, 0, prate); 2328} 2329 2330u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate) 2331{ 2332 return hpi_control_param_set(h_control, 2333 HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0); 2334} 2335 2336u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate) 2337{ 2338 u16 err = 0; 2339 u32 sample_rate = 0; 2340 err = hpi_control_param1_get(h_control, 2341 HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate); 2342 if (!err) 2343 if (psample_rate) 2344 *psample_rate = sample_rate; 2345 return err; 2346} 2347 2348u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate) 2349{ 2350 u16 err = 0; 2351 u32 sample_rate = 0; 2352 err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE, 2353 &sample_rate); 2354 if (!err) 2355 if (psample_rate) 2356 *psample_rate = sample_rate; 2357 return err; 2358} 2359 2360u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable) 2361{ 2362 return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable, 2363 0); 2364} 2365 2366u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable) 2367{ 2368 return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO, 2369 penable); 2370} 2371 2372u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock) 2373{ 2374 return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK, 2375 lock, 0); 2376} 2377 2378u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock) 2379{ 2380 return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK, 2381 plock); 2382} 2383 2384u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency) 2385{ 2386 return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY, 2387 index, 0, frequency, NULL); 2388} 2389 2390u16 hpi_tone_detector_get_state(u32 h_control, u32 *state) 2391{ 2392 return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE, 2393 state); 2394} 2395 2396u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable) 2397{ 2398 return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 2399 0); 2400} 2401 2402u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable) 2403{ 2404 return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 2405} 2406 2407u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable) 2408{ 2409 return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE, 2410 (u32)event_enable, 0); 2411} 2412 2413u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable) 2414{ 2415 return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE, 2416 event_enable); 2417} 2418 2419u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold) 2420{ 2421 return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD, 2422 (u32)threshold, 0); 2423} 2424 2425u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold) 2426{ 2427 return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD, 2428 (u32 *)threshold); 2429} 2430 2431u16 hpi_silence_detector_get_state(u32 h_control, u32 *state) 2432{ 2433 return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE, 2434 state); 2435} 2436 2437u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable) 2438{ 2439 return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable, 2440 0); 2441} 2442 2443u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable) 2444{ 2445 return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable); 2446} 2447 2448u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable) 2449{ 2450 return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE, 2451 event_enable, 0); 2452} 2453 2454u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable) 2455{ 2456 return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE, 2457 event_enable); 2458} 2459 2460u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay) 2461{ 2462 return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY, 2463 delay, 0); 2464} 2465 2466u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay) 2467{ 2468 return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY, 2469 delay); 2470} 2471 2472u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold) 2473{ 2474 return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD, 2475 threshold, 0); 2476} 2477 2478u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold) 2479{ 2480 return hpi_control_param1_get(h_control, 2481 HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold); 2482} 2483 2484u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band) 2485{ 2486 u32 qr; 2487 u16 err; 2488 2489 err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr); 2490 *pw_band = (u16)qr; 2491 return err; 2492} 2493 2494u16 hpi_tuner_set_band(u32 h_control, u16 band) 2495{ 2496 return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0); 2497} 2498 2499u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band) 2500{ 2501 u32 band = 0; 2502 u16 error = 0; 2503 2504 error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band); 2505 if (pw_band) 2506 *pw_band = (u16)band; 2507 return error; 2508} 2509 2510u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index, 2511 const u16 band, u32 *pfreq) 2512{ 2513 return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq); 2514} 2515 2516u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz) 2517{ 2518 return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz, 2519 0); 2520} 2521 2522u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz) 2523{ 2524 return hpi_control_param1_get(h_control, HPI_TUNER_FREQ, 2525 pw_freq_ink_hz); 2526} 2527 2528u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain) 2529{ 2530 u32 qr; 2531 u16 err; 2532 2533 err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr); 2534 *pw_gain = (u16)qr; 2535 return err; 2536} 2537 2538u16 hpi_tuner_set_gain(u32 h_control, short gain) 2539{ 2540 return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0); 2541} 2542 2543u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain) 2544{ 2545 u32 gain = 0; 2546 u16 error = 0; 2547 2548 error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain); 2549 if (pn_gain) 2550 *pn_gain = (u16)gain; 2551 return error; 2552} 2553 2554u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level) 2555{ 2556 struct hpi_message hm; 2557 struct hpi_response hr; 2558 2559 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2560 HPI_CONTROL_GET_STATE); 2561 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2562 return HPI_ERROR_INVALID_HANDLE; 2563 hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG; 2564 hpi_send_recv(&hm, &hr); 2565 if (pw_level) 2566 *pw_level = hr.u.cu.tuner.s_level; 2567 return hr.error; 2568} 2569 2570u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level) 2571{ 2572 struct hpi_message hm; 2573 struct hpi_response hr; 2574 2575 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2576 HPI_CONTROL_GET_STATE); 2577 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2578 return HPI_ERROR_INVALID_HANDLE; 2579 hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW; 2580 hpi_send_recv(&hm, &hr); 2581 if (pw_level) 2582 *pw_level = hr.u.cu.tuner.s_level; 2583 return hr.error; 2584} 2585 2586u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index, 2587 const u16 band, u32 *pdeemphasis) 2588{ 2589 return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band, 2590 pdeemphasis); 2591} 2592 2593u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis) 2594{ 2595 return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS, 2596 deemphasis, 0); 2597} 2598 2599u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis) 2600{ 2601 return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS, 2602 pdeemphasis); 2603} 2604 2605u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program) 2606{ 2607 return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0, 2608 pbitmap_program); 2609} 2610 2611u16 hpi_tuner_set_program(u32 h_control, u32 program) 2612{ 2613 return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program, 2614 0); 2615} 2616 2617u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram) 2618{ 2619 return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram); 2620} 2621 2622u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version, 2623 const u32 string_size) 2624{ 2625 return hpi_control_get_string(h_control, 2626 HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size); 2627} 2628 2629u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version, 2630 const u32 string_size) 2631{ 2632 return hpi_control_get_string(h_control, 2633 HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size); 2634} 2635 2636u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status) 2637{ 2638 u32 status = 0; 2639 u16 error = 0; 2640 2641 error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status); 2642 if (pw_status) { 2643 if (!error) { 2644 *pw_status_mask = (u16)(status >> 16); 2645 *pw_status = (u16)(status & 0xFFFF); 2646 } else { 2647 *pw_status_mask = 0; 2648 *pw_status = 0; 2649 } 2650 } 2651 return error; 2652} 2653 2654u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value) 2655{ 2656 return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value); 2657} 2658 2659u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value) 2660{ 2661 return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0, 2662 pn_value, NULL); 2663} 2664 2665u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality) 2666{ 2667 return hpi_control_param1_get(h_control, 2668 HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality); 2669} 2670 2671u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend) 2672{ 2673 return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND, 2674 pblend); 2675} 2676 2677u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend) 2678{ 2679 return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND, 2680 blend, 0); 2681} 2682 2683u16 hpi_tuner_get_rds(u32 h_control, char *p_data) 2684{ 2685 struct hpi_message hm; 2686 struct hpi_response hr; 2687 2688 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2689 HPI_CONTROL_GET_STATE); 2690 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2691 return HPI_ERROR_INVALID_HANDLE; 2692 hm.u.c.attribute = HPI_TUNER_RDS; 2693 hpi_send_recv(&hm, &hr); 2694 if (p_data) { 2695 *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0]; 2696 *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1]; 2697 *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER; 2698 } 2699 return hr.error; 2700} 2701 2702u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string, 2703 const u32 data_length) 2704{ 2705 return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME, 2706 psz_string, data_length); 2707} 2708 2709u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length) 2710{ 2711 return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string, 2712 data_length); 2713} 2714 2715u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length) 2716{ 2717 return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string, 2718 data_length); 2719} 2720 2721u16 hpi_pad_get_comment(u32 h_control, char *psz_string, 2722 const u32 data_length) 2723{ 2724 return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string, 2725 data_length); 2726} 2727 2728u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY) 2729{ 2730 return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY); 2731} 2732 2733u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI) 2734{ 2735 return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI); 2736} 2737 2738u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels) 2739{ 2740 return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0, 2741 p_channels); 2742} 2743 2744u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] 2745 ) 2746{ 2747 return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN, 2748 an_log_gain[0], an_log_gain[1]); 2749} 2750 2751u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS] 2752 ) 2753{ 2754 return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN, 2755 &an_log_gain[0], &an_log_gain[1]); 2756} 2757 2758u16 hpi_volume_set_mute(u32 h_control, u32 mute) 2759{ 2760 return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0); 2761} 2762 2763u16 hpi_volume_get_mute(u32 h_control, u32 *mute) 2764{ 2765 return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute); 2766} 2767 2768u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB, 2769 short *max_gain_01dB, short *step_gain_01dB) 2770{ 2771 struct hpi_message hm; 2772 struct hpi_response hr; 2773 2774 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2775 HPI_CONTROL_GET_STATE); 2776 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2777 return HPI_ERROR_INVALID_HANDLE; 2778 hm.u.c.attribute = HPI_VOLUME_RANGE; 2779 2780 hpi_send_recv(&hm, &hr); 2781 if (hr.error) { 2782 hr.u.c.an_log_value[0] = 0; 2783 hr.u.c.an_log_value[1] = 0; 2784 hr.u.c.param1 = 0; 2785 } 2786 if (min_gain_01dB) 2787 *min_gain_01dB = hr.u.c.an_log_value[0]; 2788 if (max_gain_01dB) 2789 *max_gain_01dB = hr.u.c.an_log_value[1]; 2790 if (step_gain_01dB) 2791 *step_gain_01dB = (short)hr.u.c.param1; 2792 return hr.error; 2793} 2794 2795u16 hpi_volume_auto_fade_profile(u32 h_control, 2796 short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms, 2797 u16 profile) 2798{ 2799 struct hpi_message hm; 2800 struct hpi_response hr; 2801 2802 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2803 HPI_CONTROL_SET_STATE); 2804 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2805 return HPI_ERROR_INVALID_HANDLE; 2806 2807 memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB, 2808 sizeof(short) * HPI_MAX_CHANNELS); 2809 2810 hm.u.c.attribute = HPI_VOLUME_AUTOFADE; 2811 hm.u.c.param1 = duration_ms; 2812 hm.u.c.param2 = profile; 2813 2814 hpi_send_recv(&hm, &hr); 2815 2816 return hr.error; 2817} 2818 2819u16 hpi_volume_auto_fade(u32 h_control, 2820 short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms) 2821{ 2822 return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB, 2823 duration_ms, HPI_VOLUME_AUTOFADE_LOG); 2824} 2825 2826u16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i, 2827 u16 *profile) 2828{ 2829 u16 e; 2830 u32 u; 2831 e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u); 2832 *profile = (u16)u; 2833 return e; 2834} 2835 2836u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB) 2837{ 2838 struct hpi_message hm; 2839 struct hpi_response hr; 2840 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2841 HPI_CONTROL_SET_STATE); 2842 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2843 return HPI_ERROR_INVALID_HANDLE; 2844 hm.u.c.attribute = HPI_VOX_THRESHOLD; 2845 2846 hm.u.c.an_log_value[0] = an_gain0_01dB; 2847 2848 hpi_send_recv(&hm, &hr); 2849 2850 return hr.error; 2851} 2852 2853u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB) 2854{ 2855 struct hpi_message hm; 2856 struct hpi_response hr; 2857 hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL, 2858 HPI_CONTROL_GET_STATE); 2859 if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index)) 2860 return HPI_ERROR_INVALID_HANDLE; 2861 hm.u.c.attribute = HPI_VOX_THRESHOLD; 2862 2863 hpi_send_recv(&hm, &hr); 2864 2865 *an_gain0_01dB = hr.u.c.an_log_value[0]; 2866 2867 return hr.error; 2868} 2869