Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/pci/asihpi/hpifunc.c
10817 views
1
2
#include "hpi_internal.h"
3
#include "hpimsginit.h"
4
5
#include "hpidebug.h"
6
7
struct 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
15
union handle_word {
16
struct hpi_handle h;
17
u32 w;
18
};
19
20
u32 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
33
static 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
48
void 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
54
char 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
61
void 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
71
static 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
83
void 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
90
static 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
96
u16 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
108
u16 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
119
u16 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
134
u16 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
148
u16 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
161
u16 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
167
u16 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
182
u16 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
195
u16 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
215
u16 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
239
u16 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
256
u16 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
277
u16 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
283
u16 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
378
u16 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
424
u16 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
445
u16 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
470
u16 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
497
u16 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
516
u16 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
530
u16 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
544
u16 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
558
u16 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
572
u16 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
586
u16 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
603
u16 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
620
u16 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
636
u16 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
655
u16 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
669
u16 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
688
u16 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
711
u16 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
728
u16 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
742
u16 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
763
u16 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
776
u16 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
809
u16 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
829
u16 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
842
u16 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
864
u16 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
888
u16 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
905
u16 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
921
u16 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
938
u16 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
953
u16 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
968
u16 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
983
u16 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
998
u16 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
1025
u16 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
1041
u16 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
1058
u16 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
1081
u16 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
1096
u16 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
1117
u16 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
1131
u16 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
1167
u16 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
1187
u16 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
1200
u16 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
1218
u16 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
1231
u16 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
1258
u16 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
1292
u16 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
1306
static
1307
u16 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
1324
static 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
1341
static
1342
u16 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
1369
static 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
1387
static
1388
u16 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
1409
static 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
1468
u16 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
1479
u16 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
1485
u16 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
1497
u16 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
1503
u16 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
1521
u16 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
1540
u16 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
1552
u16 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
1558
u16 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
1564
u16 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
1571
u16 hpi_aesebu_transmitter_get_channel_status(u32 h_control, u16 index,
1572
u16 *pw_data)
1573
{
1574
return HPI_ERROR_INVALID_OPERATION;
1575
}
1576
1577
u16 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
1588
u16 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
1594
u16 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
1606
u16 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
1612
u16 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
1618
u16 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
1636
u16 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
1647
u16 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
1653
u16 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
1663
u16 hpi_cobranet_hmi_write(u32 h_control, u32 hmi_address, u32 byte_count,
1664
u8 *pb_data)
1665
{
1666
struct hpi_message hm;
1667
struct hpi_response hr;
1668
1669
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1670
HPI_CONTROL_SET_STATE);
1671
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1672
return HPI_ERROR_INVALID_HANDLE;
1673
1674
hm.u.cx.u.cobranet_data.byte_count = byte_count;
1675
hm.u.cx.u.cobranet_data.hmi_address = hmi_address;
1676
1677
if (byte_count <= 8) {
1678
memcpy(hm.u.cx.u.cobranet_data.data, pb_data, byte_count);
1679
hm.u.cx.attribute = HPI_COBRANET_SET;
1680
} else {
1681
hm.u.cx.u.cobranet_bigdata.pb_data = pb_data;
1682
hm.u.cx.attribute = HPI_COBRANET_SET_DATA;
1683
}
1684
1685
hpi_send_recv(&hm, &hr);
1686
1687
return hr.error;
1688
}
1689
1690
u16 hpi_cobranet_hmi_read(u32 h_control, u32 hmi_address, u32 max_byte_count,
1691
u32 *pbyte_count, u8 *pb_data)
1692
{
1693
struct hpi_message hm;
1694
struct hpi_response hr;
1695
1696
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1697
HPI_CONTROL_GET_STATE);
1698
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1699
return HPI_ERROR_INVALID_HANDLE;
1700
1701
hm.u.cx.u.cobranet_data.byte_count = max_byte_count;
1702
hm.u.cx.u.cobranet_data.hmi_address = hmi_address;
1703
1704
if (max_byte_count <= 8) {
1705
hm.u.cx.attribute = HPI_COBRANET_GET;
1706
} else {
1707
hm.u.cx.u.cobranet_bigdata.pb_data = pb_data;
1708
hm.u.cx.attribute = HPI_COBRANET_GET_DATA;
1709
}
1710
1711
hpi_send_recv(&hm, &hr);
1712
if (!hr.error && pb_data) {
1713
1714
*pbyte_count = hr.u.cx.u.cobranet_data.byte_count;
1715
1716
if (*pbyte_count < max_byte_count)
1717
max_byte_count = *pbyte_count;
1718
1719
if (hm.u.cx.attribute == HPI_COBRANET_GET) {
1720
memcpy(pb_data, hr.u.cx.u.cobranet_data.data,
1721
max_byte_count);
1722
} else {
1723
1724
}
1725
1726
}
1727
return hr.error;
1728
}
1729
1730
u16 hpi_cobranet_hmi_get_status(u32 h_control, u32 *pstatus,
1731
u32 *preadable_size, u32 *pwriteable_size)
1732
{
1733
struct hpi_message hm;
1734
struct hpi_response hr;
1735
1736
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROLEX,
1737
HPI_CONTROL_GET_STATE);
1738
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1739
return HPI_ERROR_INVALID_HANDLE;
1740
1741
hm.u.cx.attribute = HPI_COBRANET_GET_STATUS;
1742
1743
hpi_send_recv(&hm, &hr);
1744
if (!hr.error) {
1745
if (pstatus)
1746
*pstatus = hr.u.cx.u.cobranet_status.status;
1747
if (preadable_size)
1748
*preadable_size =
1749
hr.u.cx.u.cobranet_status.readable_size;
1750
if (pwriteable_size)
1751
*pwriteable_size =
1752
hr.u.cx.u.cobranet_status.writeable_size;
1753
}
1754
return hr.error;
1755
}
1756
1757
u16 hpi_cobranet_get_ip_address(u32 h_control, u32 *pdw_ip_address)
1758
{
1759
u32 byte_count;
1760
u32 iP;
1761
u16 err;
1762
1763
err = hpi_cobranet_hmi_read(h_control,
1764
HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, &byte_count,
1765
(u8 *)&iP);
1766
1767
*pdw_ip_address =
1768
((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1769
0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1770
1771
if (err)
1772
*pdw_ip_address = 0;
1773
1774
return err;
1775
1776
}
1777
1778
u16 hpi_cobranet_set_ip_address(u32 h_control, u32 dw_ip_address)
1779
{
1780
u32 iP;
1781
u16 err;
1782
1783
iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1784
0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1785
8) | ((dw_ip_address & 0x000000ff) << 8);
1786
1787
err = hpi_cobranet_hmi_write(h_control,
1788
HPI_COBRANET_HMI_cobra_ip_mon_currentIP, 4, (u8 *)&iP);
1789
1790
return err;
1791
1792
}
1793
1794
u16 hpi_cobranet_get_static_ip_address(u32 h_control, u32 *pdw_ip_address)
1795
{
1796
u32 byte_count;
1797
u32 iP;
1798
u16 err;
1799
err = hpi_cobranet_hmi_read(h_control,
1800
HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, &byte_count,
1801
(u8 *)&iP);
1802
1803
*pdw_ip_address =
1804
((iP & 0xff000000) >> 8) | ((iP & 0x00ff0000) << 8) | ((iP &
1805
0x0000ff00) >> 8) | ((iP & 0x000000ff) << 8);
1806
1807
if (err)
1808
*pdw_ip_address = 0;
1809
1810
return err;
1811
1812
}
1813
1814
u16 hpi_cobranet_set_static_ip_address(u32 h_control, u32 dw_ip_address)
1815
{
1816
u32 iP;
1817
u16 err;
1818
1819
iP = ((dw_ip_address & 0xff000000) >> 8) | ((dw_ip_address &
1820
0x00ff0000) << 8) | ((dw_ip_address & 0x0000ff00) >>
1821
8) | ((dw_ip_address & 0x000000ff) << 8);
1822
1823
err = hpi_cobranet_hmi_write(h_control,
1824
HPI_COBRANET_HMI_cobra_ip_mon_staticIP, 4, (u8 *)&iP);
1825
1826
return err;
1827
1828
}
1829
1830
u16 hpi_cobranet_get_macaddress(u32 h_control, u32 *p_mac_msbs,
1831
u32 *p_mac_lsbs)
1832
{
1833
u32 byte_count;
1834
u16 err;
1835
u32 mac;
1836
1837
err = hpi_cobranet_hmi_read(h_control,
1838
HPI_COBRANET_HMI_cobra_if_phy_address, 4, &byte_count,
1839
(u8 *)&mac);
1840
1841
if (!err) {
1842
*p_mac_msbs =
1843
((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1844
| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1845
8);
1846
1847
err = hpi_cobranet_hmi_read(h_control,
1848
HPI_COBRANET_HMI_cobra_if_phy_address + 1, 4,
1849
&byte_count, (u8 *)&mac);
1850
}
1851
1852
if (!err) {
1853
*p_mac_lsbs =
1854
((mac & 0xff000000) >> 8) | ((mac & 0x00ff0000) << 8)
1855
| ((mac & 0x0000ff00) >> 8) | ((mac & 0x000000ff) <<
1856
8);
1857
} else {
1858
*p_mac_msbs = 0;
1859
*p_mac_lsbs = 0;
1860
}
1861
1862
return err;
1863
}
1864
1865
u16 hpi_compander_set_enable(u32 h_control, u32 enable)
1866
{
1867
return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
1868
0);
1869
}
1870
1871
u16 hpi_compander_get_enable(u32 h_control, u32 *enable)
1872
{
1873
return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
1874
}
1875
1876
u16 hpi_compander_set_makeup_gain(u32 h_control, short makeup_gain0_01dB)
1877
{
1878
return hpi_control_log_set2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1879
makeup_gain0_01dB, 0);
1880
}
1881
1882
u16 hpi_compander_get_makeup_gain(u32 h_control, short *makeup_gain0_01dB)
1883
{
1884
return hpi_control_log_get2(h_control, HPI_COMPANDER_MAKEUPGAIN,
1885
makeup_gain0_01dB, NULL);
1886
}
1887
1888
u16 hpi_compander_set_attack_time_constant(u32 h_control, unsigned int index,
1889
u32 attack)
1890
{
1891
return hpi_control_param_set(h_control, HPI_COMPANDER_ATTACK, attack,
1892
index);
1893
}
1894
1895
u16 hpi_compander_get_attack_time_constant(u32 h_control, unsigned int index,
1896
u32 *attack)
1897
{
1898
return hpi_control_param_get(h_control, HPI_COMPANDER_ATTACK, 0,
1899
index, attack, NULL);
1900
}
1901
1902
u16 hpi_compander_set_decay_time_constant(u32 h_control, unsigned int index,
1903
u32 decay)
1904
{
1905
return hpi_control_param_set(h_control, HPI_COMPANDER_DECAY, decay,
1906
index);
1907
}
1908
1909
u16 hpi_compander_get_decay_time_constant(u32 h_control, unsigned int index,
1910
u32 *decay)
1911
{
1912
return hpi_control_param_get(h_control, HPI_COMPANDER_DECAY, 0, index,
1913
decay, NULL);
1914
1915
}
1916
1917
u16 hpi_compander_set_threshold(u32 h_control, unsigned int index,
1918
short threshold0_01dB)
1919
{
1920
struct hpi_message hm;
1921
struct hpi_response hr;
1922
1923
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1924
HPI_CONTROL_SET_STATE);
1925
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1926
return HPI_ERROR_INVALID_HANDLE;
1927
hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1928
hm.u.c.param2 = index;
1929
hm.u.c.an_log_value[0] = threshold0_01dB;
1930
1931
hpi_send_recv(&hm, &hr);
1932
1933
return hr.error;
1934
}
1935
1936
u16 hpi_compander_get_threshold(u32 h_control, unsigned int index,
1937
short *threshold0_01dB)
1938
{
1939
struct hpi_message hm;
1940
struct hpi_response hr;
1941
1942
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1943
HPI_CONTROL_GET_STATE);
1944
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1945
return HPI_ERROR_INVALID_HANDLE;
1946
hm.u.c.attribute = HPI_COMPANDER_THRESHOLD;
1947
hm.u.c.param2 = index;
1948
1949
hpi_send_recv(&hm, &hr);
1950
*threshold0_01dB = hr.u.c.an_log_value[0];
1951
1952
return hr.error;
1953
}
1954
1955
u16 hpi_compander_set_ratio(u32 h_control, u32 index, u32 ratio100)
1956
{
1957
return hpi_control_param_set(h_control, HPI_COMPANDER_RATIO, ratio100,
1958
index);
1959
}
1960
1961
u16 hpi_compander_get_ratio(u32 h_control, u32 index, u32 *ratio100)
1962
{
1963
return hpi_control_param_get(h_control, HPI_COMPANDER_RATIO, 0, index,
1964
ratio100, NULL);
1965
}
1966
1967
u16 hpi_level_query_range(u32 h_control, short *min_gain_01dB,
1968
short *max_gain_01dB, short *step_gain_01dB)
1969
{
1970
struct hpi_message hm;
1971
struct hpi_response hr;
1972
1973
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
1974
HPI_CONTROL_GET_STATE);
1975
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
1976
return HPI_ERROR_INVALID_HANDLE;
1977
hm.u.c.attribute = HPI_LEVEL_RANGE;
1978
1979
hpi_send_recv(&hm, &hr);
1980
if (hr.error) {
1981
hr.u.c.an_log_value[0] = 0;
1982
hr.u.c.an_log_value[1] = 0;
1983
hr.u.c.param1 = 0;
1984
}
1985
if (min_gain_01dB)
1986
*min_gain_01dB = hr.u.c.an_log_value[0];
1987
if (max_gain_01dB)
1988
*max_gain_01dB = hr.u.c.an_log_value[1];
1989
if (step_gain_01dB)
1990
*step_gain_01dB = (short)hr.u.c.param1;
1991
return hr.error;
1992
}
1993
1994
u16 hpi_level_set_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
1995
)
1996
{
1997
return hpi_control_log_set2(h_control, HPI_LEVEL_GAIN,
1998
an_gain0_01dB[0], an_gain0_01dB[1]);
1999
}
2000
2001
u16 hpi_level_get_gain(u32 h_control, short an_gain0_01dB[HPI_MAX_CHANNELS]
2002
)
2003
{
2004
return hpi_control_log_get2(h_control, HPI_LEVEL_GAIN,
2005
&an_gain0_01dB[0], &an_gain0_01dB[1]);
2006
}
2007
2008
u16 hpi_meter_query_channels(const u32 h_meter, u32 *p_channels)
2009
{
2010
return hpi_control_query(h_meter, HPI_METER_NUM_CHANNELS, 0, 0,
2011
p_channels);
2012
}
2013
2014
u16 hpi_meter_get_peak(u32 h_control, short an_peakdB[HPI_MAX_CHANNELS]
2015
)
2016
{
2017
short i = 0;
2018
2019
struct hpi_message hm;
2020
struct hpi_response hr;
2021
2022
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2023
HPI_CONTROL_GET_STATE);
2024
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2025
return HPI_ERROR_INVALID_HANDLE;
2026
hm.obj_index = hm.obj_index;
2027
hm.u.c.attribute = HPI_METER_PEAK;
2028
2029
hpi_send_recv(&hm, &hr);
2030
2031
if (!hr.error)
2032
memcpy(an_peakdB, hr.u.c.an_log_value,
2033
sizeof(short) * HPI_MAX_CHANNELS);
2034
else
2035
for (i = 0; i < HPI_MAX_CHANNELS; i++)
2036
an_peakdB[i] = HPI_METER_MINIMUM;
2037
return hr.error;
2038
}
2039
2040
u16 hpi_meter_get_rms(u32 h_control, short an_rmsdB[HPI_MAX_CHANNELS]
2041
)
2042
{
2043
short i = 0;
2044
2045
struct hpi_message hm;
2046
struct hpi_response hr;
2047
2048
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2049
HPI_CONTROL_GET_STATE);
2050
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2051
return HPI_ERROR_INVALID_HANDLE;
2052
hm.u.c.attribute = HPI_METER_RMS;
2053
2054
hpi_send_recv(&hm, &hr);
2055
2056
if (!hr.error)
2057
memcpy(an_rmsdB, hr.u.c.an_log_value,
2058
sizeof(short) * HPI_MAX_CHANNELS);
2059
else
2060
for (i = 0; i < HPI_MAX_CHANNELS; i++)
2061
an_rmsdB[i] = HPI_METER_MINIMUM;
2062
2063
return hr.error;
2064
}
2065
2066
u16 hpi_meter_set_rms_ballistics(u32 h_control, u16 attack, u16 decay)
2067
{
2068
return hpi_control_param_set(h_control, HPI_METER_RMS_BALLISTICS,
2069
attack, decay);
2070
}
2071
2072
u16 hpi_meter_get_rms_ballistics(u32 h_control, u16 *pn_attack, u16 *pn_decay)
2073
{
2074
u32 attack;
2075
u32 decay;
2076
u16 error;
2077
2078
error = hpi_control_param2_get(h_control, HPI_METER_RMS_BALLISTICS,
2079
&attack, &decay);
2080
2081
if (pn_attack)
2082
*pn_attack = (unsigned short)attack;
2083
if (pn_decay)
2084
*pn_decay = (unsigned short)decay;
2085
2086
return error;
2087
}
2088
2089
u16 hpi_meter_set_peak_ballistics(u32 h_control, u16 attack, u16 decay)
2090
{
2091
return hpi_control_param_set(h_control, HPI_METER_PEAK_BALLISTICS,
2092
attack, decay);
2093
}
2094
2095
u16 hpi_meter_get_peak_ballistics(u32 h_control, u16 *pn_attack,
2096
u16 *pn_decay)
2097
{
2098
u32 attack;
2099
u32 decay;
2100
u16 error;
2101
2102
error = hpi_control_param2_get(h_control, HPI_METER_PEAK_BALLISTICS,
2103
&attack, &decay);
2104
2105
if (pn_attack)
2106
*pn_attack = (short)attack;
2107
if (pn_decay)
2108
*pn_decay = (short)decay;
2109
2110
return error;
2111
}
2112
2113
u16 hpi_microphone_set_phantom_power(u32 h_control, u16 on_off)
2114
{
2115
return hpi_control_param_set(h_control, HPI_MICROPHONE_PHANTOM_POWER,
2116
(u32)on_off, 0);
2117
}
2118
2119
u16 hpi_microphone_get_phantom_power(u32 h_control, u16 *pw_on_off)
2120
{
2121
u16 error = 0;
2122
u32 on_off = 0;
2123
error = hpi_control_param1_get(h_control,
2124
HPI_MICROPHONE_PHANTOM_POWER, &on_off);
2125
if (pw_on_off)
2126
*pw_on_off = (u16)on_off;
2127
return error;
2128
}
2129
2130
u16 hpi_multiplexer_set_source(u32 h_control, u16 source_node_type,
2131
u16 source_node_index)
2132
{
2133
return hpi_control_param_set(h_control, HPI_MULTIPLEXER_SOURCE,
2134
source_node_type, source_node_index);
2135
}
2136
2137
u16 hpi_multiplexer_get_source(u32 h_control, u16 *source_node_type,
2138
u16 *source_node_index)
2139
{
2140
u32 node, index;
2141
u16 err = hpi_control_param2_get(h_control,
2142
HPI_MULTIPLEXER_SOURCE, &node,
2143
&index);
2144
if (source_node_type)
2145
*source_node_type = (u16)node;
2146
if (source_node_index)
2147
*source_node_index = (u16)index;
2148
return err;
2149
}
2150
2151
u16 hpi_multiplexer_query_source(u32 h_control, u16 index,
2152
u16 *source_node_type, u16 *source_node_index)
2153
{
2154
struct hpi_message hm;
2155
struct hpi_response hr;
2156
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2157
HPI_CONTROL_GET_STATE);
2158
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2159
return HPI_ERROR_INVALID_HANDLE;
2160
hm.u.c.attribute = HPI_MULTIPLEXER_QUERYSOURCE;
2161
hm.u.c.param1 = index;
2162
2163
hpi_send_recv(&hm, &hr);
2164
2165
if (source_node_type)
2166
*source_node_type = (u16)hr.u.c.param1;
2167
if (source_node_index)
2168
*source_node_index = (u16)hr.u.c.param2;
2169
return hr.error;
2170
}
2171
2172
u16 hpi_parametric_eq_get_info(u32 h_control, u16 *pw_number_of_bands,
2173
u16 *pw_on_off)
2174
{
2175
u32 oB = 0;
2176
u32 oO = 0;
2177
u16 error = 0;
2178
2179
error = hpi_control_param2_get(h_control, HPI_EQUALIZER_NUM_FILTERS,
2180
&oO, &oB);
2181
if (pw_number_of_bands)
2182
*pw_number_of_bands = (u16)oB;
2183
if (pw_on_off)
2184
*pw_on_off = (u16)oO;
2185
return error;
2186
}
2187
2188
u16 hpi_parametric_eq_set_state(u32 h_control, u16 on_off)
2189
{
2190
return hpi_control_param_set(h_control, HPI_EQUALIZER_NUM_FILTERS,
2191
on_off, 0);
2192
}
2193
2194
u16 hpi_parametric_eq_get_band(u32 h_control, u16 index, u16 *pn_type,
2195
u32 *pfrequency_hz, short *pnQ100, short *pn_gain0_01dB)
2196
{
2197
struct hpi_message hm;
2198
struct hpi_response hr;
2199
2200
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2201
HPI_CONTROL_GET_STATE);
2202
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2203
return HPI_ERROR_INVALID_HANDLE;
2204
hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2205
hm.u.c.param2 = index;
2206
2207
hpi_send_recv(&hm, &hr);
2208
2209
if (pfrequency_hz)
2210
*pfrequency_hz = hr.u.c.param1;
2211
if (pn_type)
2212
*pn_type = (u16)(hr.u.c.param2 >> 16);
2213
if (pnQ100)
2214
*pnQ100 = hr.u.c.an_log_value[1];
2215
if (pn_gain0_01dB)
2216
*pn_gain0_01dB = hr.u.c.an_log_value[0];
2217
2218
return hr.error;
2219
}
2220
2221
u16 hpi_parametric_eq_set_band(u32 h_control, u16 index, u16 type,
2222
u32 frequency_hz, short q100, short gain0_01dB)
2223
{
2224
struct hpi_message hm;
2225
struct hpi_response hr;
2226
2227
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2228
HPI_CONTROL_SET_STATE);
2229
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2230
return HPI_ERROR_INVALID_HANDLE;
2231
2232
hm.u.c.param1 = frequency_hz;
2233
hm.u.c.param2 = (index & 0xFFFFL) + ((u32)type << 16);
2234
hm.u.c.an_log_value[0] = gain0_01dB;
2235
hm.u.c.an_log_value[1] = q100;
2236
hm.u.c.attribute = HPI_EQUALIZER_FILTER;
2237
2238
hpi_send_recv(&hm, &hr);
2239
2240
return hr.error;
2241
}
2242
2243
u16 hpi_parametric_eq_get_coeffs(u32 h_control, u16 index, short coeffs[5]
2244
)
2245
{
2246
struct hpi_message hm;
2247
struct hpi_response hr;
2248
2249
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2250
HPI_CONTROL_GET_STATE);
2251
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2252
return HPI_ERROR_INVALID_HANDLE;
2253
hm.u.c.attribute = HPI_EQUALIZER_COEFFICIENTS;
2254
hm.u.c.param2 = index;
2255
2256
hpi_send_recv(&hm, &hr);
2257
2258
coeffs[0] = (short)hr.u.c.an_log_value[0];
2259
coeffs[1] = (short)hr.u.c.an_log_value[1];
2260
coeffs[2] = (short)hr.u.c.param1;
2261
coeffs[3] = (short)(hr.u.c.param1 >> 16);
2262
coeffs[4] = (short)hr.u.c.param2;
2263
2264
return hr.error;
2265
}
2266
2267
u16 hpi_sample_clock_query_source(const u32 h_clock, const u32 index,
2268
u16 *pw_source)
2269
{
2270
u32 qr;
2271
u16 err;
2272
2273
err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE, index, 0,
2274
&qr);
2275
*pw_source = (u16)qr;
2276
return err;
2277
}
2278
2279
u16 hpi_sample_clock_set_source(u32 h_control, u16 source)
2280
{
2281
return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE,
2282
source, 0);
2283
}
2284
2285
u16 hpi_sample_clock_get_source(u32 h_control, u16 *pw_source)
2286
{
2287
u16 err = 0;
2288
u32 source = 0;
2289
err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE,
2290
&source);
2291
if (!err)
2292
if (pw_source)
2293
*pw_source = (u16)source;
2294
return err;
2295
}
2296
2297
u16 hpi_sample_clock_query_source_index(const u32 h_clock, const u32 index,
2298
const u32 source, u16 *pw_source_index)
2299
{
2300
u32 qr;
2301
u16 err;
2302
2303
err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_SOURCE_INDEX, index,
2304
source, &qr);
2305
*pw_source_index = (u16)qr;
2306
return err;
2307
}
2308
2309
u16 hpi_sample_clock_set_source_index(u32 h_control, u16 source_index)
2310
{
2311
return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2312
source_index, 0);
2313
}
2314
2315
u16 hpi_sample_clock_get_source_index(u32 h_control, u16 *pw_source_index)
2316
{
2317
u16 err = 0;
2318
u32 source_index = 0;
2319
err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SOURCE_INDEX,
2320
&source_index);
2321
if (!err)
2322
if (pw_source_index)
2323
*pw_source_index = (u16)source_index;
2324
return err;
2325
}
2326
2327
u16 hpi_sample_clock_query_local_rate(const u32 h_clock, const u32 index,
2328
u32 *prate)
2329
{
2330
u16 err;
2331
err = hpi_control_query(h_clock, HPI_SAMPLECLOCK_LOCAL_SAMPLERATE,
2332
index, 0, prate);
2333
2334
return err;
2335
}
2336
2337
u16 hpi_sample_clock_set_local_rate(u32 h_control, u32 sample_rate)
2338
{
2339
return hpi_control_param_set(h_control,
2340
HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, sample_rate, 0);
2341
}
2342
2343
u16 hpi_sample_clock_get_local_rate(u32 h_control, u32 *psample_rate)
2344
{
2345
u16 err = 0;
2346
u32 sample_rate = 0;
2347
err = hpi_control_param1_get(h_control,
2348
HPI_SAMPLECLOCK_LOCAL_SAMPLERATE, &sample_rate);
2349
if (!err)
2350
if (psample_rate)
2351
*psample_rate = sample_rate;
2352
return err;
2353
}
2354
2355
u16 hpi_sample_clock_get_sample_rate(u32 h_control, u32 *psample_rate)
2356
{
2357
u16 err = 0;
2358
u32 sample_rate = 0;
2359
err = hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_SAMPLERATE,
2360
&sample_rate);
2361
if (!err)
2362
if (psample_rate)
2363
*psample_rate = sample_rate;
2364
return err;
2365
}
2366
2367
u16 hpi_sample_clock_set_auto(u32 h_control, u32 enable)
2368
{
2369
return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_AUTO, enable,
2370
0);
2371
}
2372
2373
u16 hpi_sample_clock_get_auto(u32 h_control, u32 *penable)
2374
{
2375
return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_AUTO,
2376
penable);
2377
}
2378
2379
u16 hpi_sample_clock_set_local_rate_lock(u32 h_control, u32 lock)
2380
{
2381
return hpi_control_param_set(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2382
lock, 0);
2383
}
2384
2385
u16 hpi_sample_clock_get_local_rate_lock(u32 h_control, u32 *plock)
2386
{
2387
return hpi_control_param1_get(h_control, HPI_SAMPLECLOCK_LOCAL_LOCK,
2388
plock);
2389
}
2390
2391
u16 hpi_tone_detector_get_frequency(u32 h_control, u32 index, u32 *frequency)
2392
{
2393
return hpi_control_param_get(h_control, HPI_TONEDETECTOR_FREQUENCY,
2394
index, 0, frequency, NULL);
2395
}
2396
2397
u16 hpi_tone_detector_get_state(u32 h_control, u32 *state)
2398
{
2399
return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_STATE,
2400
state);
2401
}
2402
2403
u16 hpi_tone_detector_set_enable(u32 h_control, u32 enable)
2404
{
2405
return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2406
0);
2407
}
2408
2409
u16 hpi_tone_detector_get_enable(u32 h_control, u32 *enable)
2410
{
2411
return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2412
}
2413
2414
u16 hpi_tone_detector_set_event_enable(u32 h_control, u32 event_enable)
2415
{
2416
return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2417
(u32)event_enable, 0);
2418
}
2419
2420
u16 hpi_tone_detector_get_event_enable(u32 h_control, u32 *event_enable)
2421
{
2422
return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2423
event_enable);
2424
}
2425
2426
u16 hpi_tone_detector_set_threshold(u32 h_control, int threshold)
2427
{
2428
return hpi_control_param_set(h_control, HPI_TONEDETECTOR_THRESHOLD,
2429
(u32)threshold, 0);
2430
}
2431
2432
u16 hpi_tone_detector_get_threshold(u32 h_control, int *threshold)
2433
{
2434
return hpi_control_param1_get(h_control, HPI_TONEDETECTOR_THRESHOLD,
2435
(u32 *)threshold);
2436
}
2437
2438
u16 hpi_silence_detector_get_state(u32 h_control, u32 *state)
2439
{
2440
return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_STATE,
2441
state);
2442
}
2443
2444
u16 hpi_silence_detector_set_enable(u32 h_control, u32 enable)
2445
{
2446
return hpi_control_param_set(h_control, HPI_GENERIC_ENABLE, enable,
2447
0);
2448
}
2449
2450
u16 hpi_silence_detector_get_enable(u32 h_control, u32 *enable)
2451
{
2452
return hpi_control_param1_get(h_control, HPI_GENERIC_ENABLE, enable);
2453
}
2454
2455
u16 hpi_silence_detector_set_event_enable(u32 h_control, u32 event_enable)
2456
{
2457
return hpi_control_param_set(h_control, HPI_GENERIC_EVENT_ENABLE,
2458
event_enable, 0);
2459
}
2460
2461
u16 hpi_silence_detector_get_event_enable(u32 h_control, u32 *event_enable)
2462
{
2463
return hpi_control_param1_get(h_control, HPI_GENERIC_EVENT_ENABLE,
2464
event_enable);
2465
}
2466
2467
u16 hpi_silence_detector_set_delay(u32 h_control, u32 delay)
2468
{
2469
return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_DELAY,
2470
delay, 0);
2471
}
2472
2473
u16 hpi_silence_detector_get_delay(u32 h_control, u32 *delay)
2474
{
2475
return hpi_control_param1_get(h_control, HPI_SILENCEDETECTOR_DELAY,
2476
delay);
2477
}
2478
2479
u16 hpi_silence_detector_set_threshold(u32 h_control, int threshold)
2480
{
2481
return hpi_control_param_set(h_control, HPI_SILENCEDETECTOR_THRESHOLD,
2482
threshold, 0);
2483
}
2484
2485
u16 hpi_silence_detector_get_threshold(u32 h_control, int *threshold)
2486
{
2487
return hpi_control_param1_get(h_control,
2488
HPI_SILENCEDETECTOR_THRESHOLD, (u32 *)threshold);
2489
}
2490
2491
u16 hpi_tuner_query_band(const u32 h_tuner, const u32 index, u16 *pw_band)
2492
{
2493
u32 qr;
2494
u16 err;
2495
2496
err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2497
*pw_band = (u16)qr;
2498
return err;
2499
}
2500
2501
u16 hpi_tuner_set_band(u32 h_control, u16 band)
2502
{
2503
return hpi_control_param_set(h_control, HPI_TUNER_BAND, band, 0);
2504
}
2505
2506
u16 hpi_tuner_get_band(u32 h_control, u16 *pw_band)
2507
{
2508
u32 band = 0;
2509
u16 error = 0;
2510
2511
error = hpi_control_param1_get(h_control, HPI_TUNER_BAND, &band);
2512
if (pw_band)
2513
*pw_band = (u16)band;
2514
return error;
2515
}
2516
2517
u16 hpi_tuner_query_frequency(const u32 h_tuner, const u32 index,
2518
const u16 band, u32 *pfreq)
2519
{
2520
return hpi_control_query(h_tuner, HPI_TUNER_FREQ, index, band, pfreq);
2521
}
2522
2523
u16 hpi_tuner_set_frequency(u32 h_control, u32 freq_ink_hz)
2524
{
2525
return hpi_control_param_set(h_control, HPI_TUNER_FREQ, freq_ink_hz,
2526
0);
2527
}
2528
2529
u16 hpi_tuner_get_frequency(u32 h_control, u32 *pw_freq_ink_hz)
2530
{
2531
return hpi_control_param1_get(h_control, HPI_TUNER_FREQ,
2532
pw_freq_ink_hz);
2533
}
2534
2535
u16 hpi_tuner_query_gain(const u32 h_tuner, const u32 index, u16 *pw_gain)
2536
{
2537
u32 qr;
2538
u16 err;
2539
2540
err = hpi_control_query(h_tuner, HPI_TUNER_BAND, index, 0, &qr);
2541
*pw_gain = (u16)qr;
2542
return err;
2543
}
2544
2545
u16 hpi_tuner_set_gain(u32 h_control, short gain)
2546
{
2547
return hpi_control_param_set(h_control, HPI_TUNER_GAIN, gain, 0);
2548
}
2549
2550
u16 hpi_tuner_get_gain(u32 h_control, short *pn_gain)
2551
{
2552
u32 gain = 0;
2553
u16 error = 0;
2554
2555
error = hpi_control_param1_get(h_control, HPI_TUNER_GAIN, &gain);
2556
if (pn_gain)
2557
*pn_gain = (u16)gain;
2558
return error;
2559
}
2560
2561
u16 hpi_tuner_get_rf_level(u32 h_control, short *pw_level)
2562
{
2563
struct hpi_message hm;
2564
struct hpi_response hr;
2565
2566
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2567
HPI_CONTROL_GET_STATE);
2568
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2569
return HPI_ERROR_INVALID_HANDLE;
2570
hm.u.cu.attribute = HPI_TUNER_LEVEL_AVG;
2571
hpi_send_recv(&hm, &hr);
2572
if (pw_level)
2573
*pw_level = hr.u.cu.tuner.s_level;
2574
return hr.error;
2575
}
2576
2577
u16 hpi_tuner_get_raw_rf_level(u32 h_control, short *pw_level)
2578
{
2579
struct hpi_message hm;
2580
struct hpi_response hr;
2581
2582
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2583
HPI_CONTROL_GET_STATE);
2584
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2585
return HPI_ERROR_INVALID_HANDLE;
2586
hm.u.cu.attribute = HPI_TUNER_LEVEL_RAW;
2587
hpi_send_recv(&hm, &hr);
2588
if (pw_level)
2589
*pw_level = hr.u.cu.tuner.s_level;
2590
return hr.error;
2591
}
2592
2593
u16 hpi_tuner_query_deemphasis(const u32 h_tuner, const u32 index,
2594
const u16 band, u32 *pdeemphasis)
2595
{
2596
return hpi_control_query(h_tuner, HPI_TUNER_DEEMPHASIS, index, band,
2597
pdeemphasis);
2598
}
2599
2600
u16 hpi_tuner_set_deemphasis(u32 h_control, u32 deemphasis)
2601
{
2602
return hpi_control_param_set(h_control, HPI_TUNER_DEEMPHASIS,
2603
deemphasis, 0);
2604
}
2605
2606
u16 hpi_tuner_get_deemphasis(u32 h_control, u32 *pdeemphasis)
2607
{
2608
return hpi_control_param1_get(h_control, HPI_TUNER_DEEMPHASIS,
2609
pdeemphasis);
2610
}
2611
2612
u16 hpi_tuner_query_program(const u32 h_tuner, u32 *pbitmap_program)
2613
{
2614
return hpi_control_query(h_tuner, HPI_TUNER_PROGRAM, 0, 0,
2615
pbitmap_program);
2616
}
2617
2618
u16 hpi_tuner_set_program(u32 h_control, u32 program)
2619
{
2620
return hpi_control_param_set(h_control, HPI_TUNER_PROGRAM, program,
2621
0);
2622
}
2623
2624
u16 hpi_tuner_get_program(u32 h_control, u32 *pprogram)
2625
{
2626
return hpi_control_param1_get(h_control, HPI_TUNER_PROGRAM, pprogram);
2627
}
2628
2629
u16 hpi_tuner_get_hd_radio_dsp_version(u32 h_control, char *psz_dsp_version,
2630
const u32 string_size)
2631
{
2632
return hpi_control_get_string(h_control,
2633
HPI_TUNER_HDRADIO_DSP_VERSION, psz_dsp_version, string_size);
2634
}
2635
2636
u16 hpi_tuner_get_hd_radio_sdk_version(u32 h_control, char *psz_sdk_version,
2637
const u32 string_size)
2638
{
2639
return hpi_control_get_string(h_control,
2640
HPI_TUNER_HDRADIO_SDK_VERSION, psz_sdk_version, string_size);
2641
}
2642
2643
u16 hpi_tuner_get_status(u32 h_control, u16 *pw_status_mask, u16 *pw_status)
2644
{
2645
u32 status = 0;
2646
u16 error = 0;
2647
2648
error = hpi_control_param1_get(h_control, HPI_TUNER_STATUS, &status);
2649
if (pw_status) {
2650
if (!error) {
2651
*pw_status_mask = (u16)(status >> 16);
2652
*pw_status = (u16)(status & 0xFFFF);
2653
} else {
2654
*pw_status_mask = 0;
2655
*pw_status = 0;
2656
}
2657
}
2658
return error;
2659
}
2660
2661
u16 hpi_tuner_set_mode(u32 h_control, u32 mode, u32 value)
2662
{
2663
return hpi_control_param_set(h_control, HPI_TUNER_MODE, mode, value);
2664
}
2665
2666
u16 hpi_tuner_get_mode(u32 h_control, u32 mode, u32 *pn_value)
2667
{
2668
return hpi_control_param_get(h_control, HPI_TUNER_MODE, mode, 0,
2669
pn_value, NULL);
2670
}
2671
2672
u16 hpi_tuner_get_hd_radio_signal_quality(u32 h_control, u32 *pquality)
2673
{
2674
return hpi_control_param1_get(h_control,
2675
HPI_TUNER_HDRADIO_SIGNAL_QUALITY, pquality);
2676
}
2677
2678
u16 hpi_tuner_get_hd_radio_signal_blend(u32 h_control, u32 *pblend)
2679
{
2680
return hpi_control_param1_get(h_control, HPI_TUNER_HDRADIO_BLEND,
2681
pblend);
2682
}
2683
2684
u16 hpi_tuner_set_hd_radio_signal_blend(u32 h_control, const u32 blend)
2685
{
2686
return hpi_control_param_set(h_control, HPI_TUNER_HDRADIO_BLEND,
2687
blend, 0);
2688
}
2689
2690
u16 hpi_tuner_get_rds(u32 h_control, char *p_data)
2691
{
2692
struct hpi_message hm;
2693
struct hpi_response hr;
2694
2695
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2696
HPI_CONTROL_GET_STATE);
2697
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2698
return HPI_ERROR_INVALID_HANDLE;
2699
hm.u.c.attribute = HPI_TUNER_RDS;
2700
hpi_send_recv(&hm, &hr);
2701
if (p_data) {
2702
*(u32 *)&p_data[0] = hr.u.cu.tuner.rds.data[0];
2703
*(u32 *)&p_data[4] = hr.u.cu.tuner.rds.data[1];
2704
*(u32 *)&p_data[8] = hr.u.cu.tuner.rds.bLER;
2705
}
2706
return hr.error;
2707
}
2708
2709
u16 hpi_pad_get_channel_name(u32 h_control, char *psz_string,
2710
const u32 data_length)
2711
{
2712
return hpi_control_get_string(h_control, HPI_PAD_CHANNEL_NAME,
2713
psz_string, data_length);
2714
}
2715
2716
u16 hpi_pad_get_artist(u32 h_control, char *psz_string, const u32 data_length)
2717
{
2718
return hpi_control_get_string(h_control, HPI_PAD_ARTIST, psz_string,
2719
data_length);
2720
}
2721
2722
u16 hpi_pad_get_title(u32 h_control, char *psz_string, const u32 data_length)
2723
{
2724
return hpi_control_get_string(h_control, HPI_PAD_TITLE, psz_string,
2725
data_length);
2726
}
2727
2728
u16 hpi_pad_get_comment(u32 h_control, char *psz_string,
2729
const u32 data_length)
2730
{
2731
return hpi_control_get_string(h_control, HPI_PAD_COMMENT, psz_string,
2732
data_length);
2733
}
2734
2735
u16 hpi_pad_get_program_type(u32 h_control, u32 *ppTY)
2736
{
2737
return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_TYPE, ppTY);
2738
}
2739
2740
u16 hpi_pad_get_rdsPI(u32 h_control, u32 *ppI)
2741
{
2742
return hpi_control_param1_get(h_control, HPI_PAD_PROGRAM_ID, ppI);
2743
}
2744
2745
u16 hpi_volume_query_channels(const u32 h_volume, u32 *p_channels)
2746
{
2747
return hpi_control_query(h_volume, HPI_VOLUME_NUM_CHANNELS, 0, 0,
2748
p_channels);
2749
}
2750
2751
u16 hpi_volume_set_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2752
)
2753
{
2754
return hpi_control_log_set2(h_control, HPI_VOLUME_GAIN,
2755
an_log_gain[0], an_log_gain[1]);
2756
}
2757
2758
u16 hpi_volume_get_gain(u32 h_control, short an_log_gain[HPI_MAX_CHANNELS]
2759
)
2760
{
2761
return hpi_control_log_get2(h_control, HPI_VOLUME_GAIN,
2762
&an_log_gain[0], &an_log_gain[1]);
2763
}
2764
2765
u16 hpi_volume_set_mute(u32 h_control, u32 mute)
2766
{
2767
return hpi_control_param_set(h_control, HPI_VOLUME_MUTE, mute, 0);
2768
}
2769
2770
u16 hpi_volume_get_mute(u32 h_control, u32 *mute)
2771
{
2772
return hpi_control_param1_get(h_control, HPI_VOLUME_MUTE, mute);
2773
}
2774
2775
u16 hpi_volume_query_range(u32 h_control, short *min_gain_01dB,
2776
short *max_gain_01dB, short *step_gain_01dB)
2777
{
2778
struct hpi_message hm;
2779
struct hpi_response hr;
2780
2781
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2782
HPI_CONTROL_GET_STATE);
2783
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2784
return HPI_ERROR_INVALID_HANDLE;
2785
hm.u.c.attribute = HPI_VOLUME_RANGE;
2786
2787
hpi_send_recv(&hm, &hr);
2788
if (hr.error) {
2789
hr.u.c.an_log_value[0] = 0;
2790
hr.u.c.an_log_value[1] = 0;
2791
hr.u.c.param1 = 0;
2792
}
2793
if (min_gain_01dB)
2794
*min_gain_01dB = hr.u.c.an_log_value[0];
2795
if (max_gain_01dB)
2796
*max_gain_01dB = hr.u.c.an_log_value[1];
2797
if (step_gain_01dB)
2798
*step_gain_01dB = (short)hr.u.c.param1;
2799
return hr.error;
2800
}
2801
2802
u16 hpi_volume_auto_fade_profile(u32 h_control,
2803
short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms,
2804
u16 profile)
2805
{
2806
struct hpi_message hm;
2807
struct hpi_response hr;
2808
2809
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2810
HPI_CONTROL_SET_STATE);
2811
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2812
return HPI_ERROR_INVALID_HANDLE;
2813
2814
memcpy(hm.u.c.an_log_value, an_stop_gain0_01dB,
2815
sizeof(short) * HPI_MAX_CHANNELS);
2816
2817
hm.u.c.attribute = HPI_VOLUME_AUTOFADE;
2818
hm.u.c.param1 = duration_ms;
2819
hm.u.c.param2 = profile;
2820
2821
hpi_send_recv(&hm, &hr);
2822
2823
return hr.error;
2824
}
2825
2826
u16 hpi_volume_auto_fade(u32 h_control,
2827
short an_stop_gain0_01dB[HPI_MAX_CHANNELS], u32 duration_ms)
2828
{
2829
return hpi_volume_auto_fade_profile(h_control, an_stop_gain0_01dB,
2830
duration_ms, HPI_VOLUME_AUTOFADE_LOG);
2831
}
2832
2833
u16 hpi_vox_set_threshold(u32 h_control, short an_gain0_01dB)
2834
{
2835
struct hpi_message hm;
2836
struct hpi_response hr;
2837
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2838
HPI_CONTROL_SET_STATE);
2839
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2840
return HPI_ERROR_INVALID_HANDLE;
2841
hm.u.c.attribute = HPI_VOX_THRESHOLD;
2842
2843
hm.u.c.an_log_value[0] = an_gain0_01dB;
2844
2845
hpi_send_recv(&hm, &hr);
2846
2847
return hr.error;
2848
}
2849
2850
u16 hpi_vox_get_threshold(u32 h_control, short *an_gain0_01dB)
2851
{
2852
struct hpi_message hm;
2853
struct hpi_response hr;
2854
hpi_init_message_response(&hm, &hr, HPI_OBJ_CONTROL,
2855
HPI_CONTROL_GET_STATE);
2856
if (hpi_handle_indexes(h_control, &hm.adapter_index, &hm.obj_index))
2857
return HPI_ERROR_INVALID_HANDLE;
2858
hm.u.c.attribute = HPI_VOX_THRESHOLD;
2859
2860
hpi_send_recv(&hm, &hr);
2861
2862
*an_gain0_01dB = hr.u.c.an_log_value[0];
2863
2864
return hr.error;
2865
}
2866
2867