linux/sound/pci/asihpi/hpifunc.c
<<
>>
Prefs
   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, &param);
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, &param);
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        u16 err;
2327        err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
2328                index, 0, prate);
2329
2330        return err;
2331}
2332
2333u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
2334{
2335        return hpi_control_param_set(h_control,
2336                HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
2337}
2338
2339u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
2340{
2341        u16 err = 0;
2342        u32 sample_rate = 0;
2343        err = hpi_control_param1_get(h_control,
2344                HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
2345        if (!err)
2346                if (psample_rate)
2347                        *psample_rate = sample_rate;
2348        return err;
2349}
2350
2351u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
2352{
2353        u16 err = 0;
2354        u32 sample_rate = 0;
2355        err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
2356                &sample_rate);
2357        if (!err)
2358                if (psample_rate)
2359                        *psample_rate = sample_rate;
2360        return err;
2361}
2362
2363u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
2364{
2365        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
2366                0);
2367}
2368
2369u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
2370{
2371        return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
2372                penable);
2373}
2374
2375u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
2376{
2377        return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2378                lock, 0);
2379}
2380
2381u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
2382{
2383        return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2384                plock);
2385}
2386
2387u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
2388{
2389        return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
2390                index, 0, frequency, NULL);
2391}
2392
2393u16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
2394{
2395        return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
2396                state);
2397}
2398
2399u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
2400{
2401        return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2402                0);
2403}
2404
2405u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
2406{
2407        return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2408}
2409
2410u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
2411{
2412        return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2413                (u32)event_enable, 0);
2414}
2415
2416u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
2417{
2418        return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2419                event_enable);
2420}
2421
2422u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
2423{
2424        return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
2425                (u32)threshold, 0);
2426}
2427
2428u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
2429{
2430        return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
2431                (u32 *)threshold);
2432}
2433
2434u16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
2435{
2436        return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
2437                state);
2438}
2439
2440u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
2441{
2442        return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2443                0);
2444}
2445
2446u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
2447{
2448        return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2449}
2450
2451u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
2452{
2453        return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2454                event_enable, 0);
2455}
2456
2457u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
2458{
2459        return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2460                event_enable);
2461}
2462
2463u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
2464{
2465        return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
2466                delay, 0);
2467}
2468
2469u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
2470{
2471        return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
2472                delay);
2473}
2474
2475u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
2476{
2477        return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
2478                threshold, 0);
2479}
2480
2481u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
2482{
2483        return hpi_control_param1_get(h_control,
2484                HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
2485}
2486
2487u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
2488{
2489        u32 qr;
2490        u16 err;
2491
2492        err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2493        *pw_band = (u16)qr;
2494        return err;
2495}
2496
2497u16 hpi_tuner_set_band(u32 h_control, u16 band)
2498{
2499        return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
2500}
2501
2502u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
2503{
2504        u32 band = 0;
2505        u16 error = 0;
2506
2507        error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
2508        if (pw_band)
2509                *pw_band = (u16)band;
2510        return error;
2511}
2512
2513u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
2514        const u16 band, u32 *pfreq)
2515{
2516        return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
2517}
2518
2519u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
2520{
2521        return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
2522                0);
2523}
2524
2525u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
2526{
2527        return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
2528                pw_freq_ink_hz);
2529}
2530
2531u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
2532{
2533        u32 qr;
2534        u16 err;
2535
2536        err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2537        *pw_gain = (u16)qr;
2538        return err;
2539}
2540
2541u16 hpi_tuner_set_gain(u32 h_control, short gain)
2542{
2543        return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
2544}
2545
2546u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
2547{
2548        u32 gain = 0;
2549        u16 error = 0;
2550
2551        error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
2552        if (pn_gain)
2553                *pn_gain = (u16)gain;
2554        return error;
2555}
2556
2557u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
2558{
2559        struct hpi_message hm;
2560        struct hpi_response hr;
2561
2562        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2563                HPI_CONTROL_GET_STATE);
2564        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2565                return HPI_ERROR_INVALID_HANDLE;
2566        hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
2567        hpi_send_recv(&hm, &hr);
2568        if (pw_level)
2569                *pw_level = hr.u.cu.tuner.s_level;
2570        return hr.error;
2571}
2572
2573u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
2574{
2575        struct hpi_message hm;
2576        struct hpi_response hr;
2577
2578        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2579                HPI_CONTROL_GET_STATE);
2580        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2581                return HPI_ERROR_INVALID_HANDLE;
2582        hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
2583        hpi_send_recv(&hm, &hr);
2584        if (pw_level)
2585                *pw_level = hr.u.cu.tuner.s_level;
2586        return hr.error;
2587}
2588
2589u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
2590        const u16 band, u32 *pdeemphasis)
2591{
2592        return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
2593                pdeemphasis);
2594}
2595
2596u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
2597{
2598        return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
2599                deemphasis, 0);
2600}
2601
2602u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
2603{
2604        return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
2605                pdeemphasis);
2606}
2607
2608u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
2609{
2610        return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
2611                pbitmap_program);
2612}
2613
2614u16 hpi_tuner_set_program(u32 h_control, u32 program)
2615{
2616        return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
2617                0);
2618}
2619
2620u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
2621{
2622        return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
2623}
2624
2625u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
2626        const u32 string_size)
2627{
2628        return hpi_control_get_string(h_control,
2629                HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
2630}
2631
2632u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
2633        const u32 string_size)
2634{
2635        return hpi_control_get_string(h_control,
2636                HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
2637}
2638
2639u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
2640{
2641        u32 status = 0;
2642        u16 error = 0;
2643
2644        error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
2645        if (pw_status) {
2646                if (!error) {
2647                        *pw_status_mask = (u16)(status >> 16);
2648                        *pw_status = (u16)(status & 0xFFFF);
2649                } else {
2650                        *pw_status_mask = 0;
2651                        *pw_status = 0;
2652                }
2653        }
2654        return error;
2655}
2656
2657u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
2658{
2659        return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
2660}
2661
2662u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
2663{
2664        return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
2665                pn_value, NULL);
2666}
2667
2668u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
2669{
2670        return hpi_control_param1_get(h_control,
2671                HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
2672}
2673
2674u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
2675{
2676        return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
2677                pblend);
2678}
2679
2680u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
2681{
2682        return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
2683                blend, 0);
2684}
2685
2686u16 hpi_tuner_get_rds(u32 h_control, char *p_data)
2687{
2688        struct hpi_message hm;
2689        struct hpi_response hr;
2690
2691        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2692                HPI_CONTROL_GET_STATE);
2693        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2694                return HPI_ERROR_INVALID_HANDLE;
2695        hm.u.c.attribute = HPI_TUNER_RDS;
2696        hpi_send_recv(&hm, &hr);
2697        if (p_data) {
2698                *(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
2699                *(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
2700                *(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
2701        }
2702        return hr.error;
2703}
2704
2705u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
2706        const u32 data_length)
2707{
2708        return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
2709                psz_string, data_length);
2710}
2711
2712u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
2713{
2714        return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
2715                data_length);
2716}
2717
2718u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
2719{
2720        return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
2721                data_length);
2722}
2723
2724u16 hpi_pad_get_comment(u32 h_control, char *psz_string,
2725        const u32 data_length)
2726{
2727        return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
2728                data_length);
2729}
2730
2731u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
2732{
2733        return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
2734}
2735
2736u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
2737{
2738        return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
2739}
2740
2741u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
2742{
2743        return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
2744                p_channels);
2745}
2746
2747u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2748        )
2749{
2750        return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
2751                an_log_gain[0], an_log_gain[1]);
2752}
2753
2754u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2755        )
2756{
2757        return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
2758                &an_log_gain[0], &an_log_gain[1]);
2759}
2760
2761u16 hpi_volume_set_mute(u32 h_control, u32 mute)
2762{
2763        return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
2764}
2765
2766u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2767{
2768        return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2769}
2770
2771u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
2772        short *max_gain_01dB, short *step_gain_01dB)
2773{
2774        struct hpi_message hm;
2775        struct hpi_response hr;
2776
2777        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2778                HPI_CONTROL_GET_STATE);
2779        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2780                return HPI_ERROR_INVALID_HANDLE;
2781        hm.u.c.attribute = HPI_VOLUME_RANGE;
2782
2783        hpi_send_recv(&hm, &hr);
2784        if (hr.error) {
2785                hr.u.c.an_log_value[0] = 0;
2786                hr.u.c.an_log_value[1] = 0;
2787                hr.u.c.param1 = 0;
2788        }
2789        if (min_gain_01dB)
2790                *min_gain_01dB = hr.u.c.an_log_value[0];
2791        if (max_gain_01dB)
2792                *max_gain_01dB = hr.u.c.an_log_value[1];
2793        if (step_gain_01dB)
2794                *step_gain_01dB = (short)hr.u.c.param1;
2795        return hr.error;
2796}
2797
2798u16 hpi_volume_auto_fade_profile(u32 h_control,
2799        short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
2800        u16 profile)
2801{
2802        struct hpi_message hm;
2803        struct hpi_response hr;
2804
2805        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2806                HPI_CONTROL_SET_STATE);
2807        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2808                return HPI_ERROR_INVALID_HANDLE;
2809
2810        memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
2811                sizeof(short) * HPI_MAX_CHANNELS);
2812
2813        hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
2814        hm.u.c.param1 = duration_ms;
2815        hm.u.c.param2 = profile;
2816
2817        hpi_send_recv(&hm, &hr);
2818
2819        return hr.error;
2820}
2821
2822u16 hpi_volume_auto_fade(u32 h_control,
2823        short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
2824{
2825        return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
2826                duration_ms, HPI_VOLUME_AUTOFADE_LOG);
2827}
2828
2829u16 hpi_volume_query_auto_fade_profile(const u32 h_volume, const u32 i,
2830        u16 *profile)
2831{
2832        u16 e;
2833        u32 u;
2834        e = hpi_control_query(h_volume, HPI_VOLUME_AUTOFADE, i, 0, &u);
2835        *profile = (u16)u;
2836        return e;
2837}
2838
2839u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
2840{
2841        struct hpi_message hm;
2842        struct hpi_response hr;
2843        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2844                HPI_CONTROL_SET_STATE);
2845        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2846                return HPI_ERROR_INVALID_HANDLE;
2847        hm.u.c.attribute = HPI_VOX_THRESHOLD;
2848
2849        hm.u.c.an_log_value[0] = an_gain0_01dB;
2850
2851        hpi_send_recv(&hm, &hr);
2852
2853        return hr.error;
2854}
2855
2856u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
2857{
2858        struct hpi_message hm;
2859        struct hpi_response hr;
2860        hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2861                HPI_CONTROL_GET_STATE);
2862        if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2863                return HPI_ERROR_INVALID_HANDLE;
2864        hm.u.c.attribute = HPI_VOX_THRESHOLD;
2865
2866        hpi_send_recv(&hm, &hr);
2867
2868        *an_gain0_01dB = hr.u.c.an_log_value[0];
2869
2870        return hr.error;
2871}
2872