blob: 83e0dd948288d1d6e97ee1dcc4a6219d4b1dac41 [file] [log] [blame]
Tim Yaoe8c0d4a2019-11-27 14:47:35 -08001#include <unistd.h>
2#include <atomic>
3#include <hardware/hardware.h>
4#include <hardware/audio.h>
5
Tim Yaoaaa3bc52020-12-30 17:40:14 -08006#include <IpcBuffer/audio_server_shmem.h>
7#include <IpcBuffer/IpcBuffer.h>
Tim Yaoe8c0d4a2019-11-27 14:47:35 -08008#include "audio_client.h"
9
10#define LOG_TAG "audio_client"
11#include <cutils/log.h>
12
13//#define DEBUG__
14
15#ifdef DEBUG__
16#define TRACE_ENTRY() ALOGI("%s enter\n", __func__)
17#define TRACE_EXIT() ALOGI("%s exit\n", __func__)
18#else
19#define TRACE_ENTRY()
20#define TRACE_EXIT()
21#endif
22
23Volume MakeVolume(float vol)
24{
25 Volume v;
26 v.set_vol(vol);
27 return v;
28}
29
30Mode MakeMode(audio_mode_t mode)
31{
32 Mode m;
33 m.set_mode(mode);
34 return m;
35}
36
37Mute MakeMute(bool state)
38{
39 Mute m;
40 m.set_mute(state);
41 return m;
42}
43
44Kv_pairs MakeKv_pairs(const char *pairs)
45{
46 Kv_pairs p;
47 p.set_params(std::string(pairs));
48 return p;
49}
50
51Keys MakeKeys(const char *keys)
52{
53 Keys k;
54 k.set_keys(std::string(keys));
55 return k;
56}
57
58StreamReadWrite MakeStreamReadWrite(char *name, size_t bytes)
59{
60 StreamReadWrite rw;
61 rw.set_name(std::string(name));
62 rw.set_size(bytes);
63 return rw;
64}
65
66AudioConfig MakeAudioConfig(const struct audio_config *config)
67{
68 AudioConfig c;
69 c.set_sample_rate(config->sample_rate);
70 c.set_channel_mask(config->channel_mask);
71 c.set_format(config->format);
72 c.set_frame_count(config->frame_count);
73 return c;
74}
75
76Handle MakeHandle(int32_t handle)
77{
78 Handle h;
79 h.set_handle(handle);
80 return h;
81}
82
83StreamOutSetVolume MakeStreamOutSetVolume(char *name, float left, float right)
84{
85 StreamOutSetVolume v;
86 v.set_name(std::string(name));
87 v.set_left(left);
88 v.set_right(right);
89 return v;
90}
91
92OpenOutputStream MakeOpenOutputStream(std::string name,
93 uint32_t size,
94 uint32_t handle,
95 uint32_t devices,
96 uint32_t flags,
97 const struct audio_config *config,
98 const char *address)
99{
100 OpenOutputStream opt;
101 opt.set_name(name);
102 opt.set_size(size);
103 opt.set_handle(handle);
104 opt.set_devices(devices);
105 opt.mutable_config()->CopyFrom(MakeAudioConfig(config));
106 opt.set_flags(flags);
107 opt.set_address(address ? std::string(address) : std::string(""));
108 return opt;
109}
110
111OpenInputStream MakeOpenInputStream(std::string name,
112 uint32_t size,
113 uint32_t handle,
114 uint32_t devices,
115 const struct audio_config *config,
116 uint32_t flags,
117 const char *address,
118 uint32_t source)
119{
120 OpenInputStream opt;
121 opt.set_name(name);
122 opt.set_size(size);
123 opt.set_handle(handle);
124 opt.set_devices(devices);
125 opt.mutable_config()->CopyFrom(MakeAudioConfig(config));
126 opt.set_flags(flags);
shu.zhangf2bd59c2021-07-13 04:55:34 -0400127 opt.set_address(address ? std::string(address) : std::string(""));
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800128 opt.set_source(source);
129 return opt;
130}
131
132Stream MakeStream(std::string name)
133{
134 Stream stream;
135 stream.set_name(name);
136 return stream;
137}
138
139AudioPortConfig MakeAudioPortConfig(const struct audio_port_config *config)
140{
141 AudioPortConfig c;
142 c.set_id(config->id);
143 c.set_role(config->role);
144 c.set_type(config->type);
145 c.set_config_mask(config->config_mask);
146 c.set_sample_rate(config->sample_rate);
147 c.set_channel_mask(config->channel_mask);
148 c.set_format(config->format);
149 AudioGainConfig *gain = c.mutable_gain();
150 gain->set_index(config->gain.index);
151 gain->set_mode(config->gain.mode);
152 gain->set_channel_mask(config->gain.channel_mask);
153 for (int i = 0; i < sizeof(config->gain.values) / sizeof(int); i++) {
154 gain->add_values(config->gain.values[i]);
155 }
156 gain->set_ramp_duration_ms(config->gain.ramp_duration_ms);
157 if (config->type == AUDIO_PORT_TYPE_DEVICE) {
158 c.mutable_device()->set_hw_module(config->ext.device.hw_module);
159 c.mutable_device()->set_type(config->ext.device.type);
160 c.mutable_device()->set_address(std::string("null"));
161 } else if (config->type == AUDIO_PORT_TYPE_MIX) {
162 c.mutable_mix()->set_hw_module(config->ext.mix.hw_module);
163 c.mutable_mix()->set_handle(config->ext.mix.handle);
164 c.mutable_mix()->set_stream_source(config->ext.mix.usecase.stream);
165 } else if (config->type == AUDIO_PORT_TYPE_SESSION) {
166 c.mutable_session()->set_session(config->ext.session.session);
167 }
168 return c;
169}
170
171StreamSetParameters MakeStreamSetParameters(char *name, const char *kv_pairs)
172{
173 StreamSetParameters p;
174 p.set_name(std::string(name));
175 p.set_kv_pairs(std::string(kv_pairs));
176 return p;
177}
178
179StreamGetParameters MakeStreamGetParameters(char *name, const char *keys)
180{
181 StreamGetParameters p;
182 p.set_name(std::string(name));
183 p.set_keys(std::string(keys));
184 return p;
185}
186
cheng tong7d907882020-09-04 18:53:04 +0800187EffectParameters MakeEffectSetParameters(int type, effect_param_t *param)
188{
189 EffectParameters p;
190 uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
191
192 p.set_type(type);
193 p.set_cmd_size(sizeof (effect_param_t) + psize);
194 p.set_cmd_data(param, sizeof (effect_param_t) + psize);
195 p.set_reply_size(sizeof(int));
196 return p;
197}
198
199EffectParameters MakeEffectGetParameters(int type, effect_param_t *param)
200{
201 EffectParameters p;
202 uint32_t psize = sizeof(effect_param_t) + ((param->psize - 1) / sizeof(int) + 1) * sizeof(int)
203 + param->vsize;
204
205 p.set_type(type);
206 p.set_cmd_size(sizeof (effect_param_t) + param->psize);
207 p.set_cmd_data(param, sizeof (effect_param_t) + param->psize);
208 p.set_reply_size(psize);
209 return p;
210}
211
212
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800213std::atomic_int AudioClient::stream_seq_;
214
215int AudioClient::Device_common_close(struct hw_device_t* device)
216{
217 TRACE_ENTRY();
218 ClientContext context;
219 StatusReturn r;
220 Status status = stub_->Device_common_close(&context, Empty(), &r);
221 return r.ret();
222}
223
224int AudioClient::Device_init_check(const struct audio_hw_device *dev)
225{
226 TRACE_ENTRY();
227 ClientContext context;
228 StatusReturn r;
229 Status status = stub_->Device_init_check(&context, Empty(), &r);
wei.du850202b2024-06-20 10:56:19 +0800230 if (status.ok()) {
231 return r.ret();
232 } else {
233 return -1;
234 }
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800235}
236
237int AudioClient::Device_set_voice_volume(struct audio_hw_device *dev, float volume)
238{
239 TRACE_ENTRY();
240 ClientContext context;
241 StatusReturn r;
242 Status status = stub_->Device_set_voice_volume(&context, MakeVolume(volume), &r);
243 return r.ret();
244}
245
246int AudioClient::Device_set_master_volume(struct audio_hw_device *dev, float volume)
247{
248 TRACE_ENTRY();
249 ClientContext context;
250 StatusReturn r;
251 Status status = stub_->Device_set_master_volume(&context, MakeVolume(volume), &r);
252 return r.ret();
253}
254
255int AudioClient::Device_get_master_volume(struct audio_hw_device *dev, float *volume)
256{
257 TRACE_ENTRY();
258 ClientContext context;
259 StatusReturn r;
260 Status status = stub_->Device_get_master_volume(&context, Empty(), &r);
261 *volume = r.status_float();
262 return r.ret();
263}
264
265int AudioClient::Device_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
266{
267 TRACE_ENTRY();
268 ClientContext context;
269 StatusReturn r;
270 Status status = stub_->Device_set_mode(&context, MakeMode(mode), &r);
271 return r.ret();
272}
273
274int AudioClient::Device_set_mic_mute(struct audio_hw_device *dev, bool state)
275{
276 TRACE_ENTRY();
277 ClientContext context;
278 StatusReturn r;
279 Status status = stub_->Device_set_mic_mute(&context, MakeMute(state), &r);
280 return r.ret();
281}
282
283int AudioClient::Device_get_mic_mute(const struct audio_hw_device *dev, bool *state)
284{
285 TRACE_ENTRY();
286 ClientContext context;
287 StatusReturn r;
288 Status status = stub_->Device_get_mic_mute(&context, Empty(), &r);
289 *state = r.status_bool();
290 return r.ret();
291}
292
293int AudioClient::Device_set_parameters(struct audio_hw_device *dev, const char *kv_pairs)
294{
295 TRACE_ENTRY();
296 ClientContext context;
297 StatusReturn r;
298 Status status = stub_->Device_set_parameters(&context, MakeKv_pairs(kv_pairs), &r);
299 return r.ret();
300}
301
302char * AudioClient::Device_get_parameters(const struct audio_hw_device *dev, const char *keys)
303{
304 TRACE_ENTRY();
305 ClientContext context;
306 StatusReturn r;
307 Status status = stub_->Device_get_parameters(&context, MakeKeys(keys), &r);
308 char *p = (char *)malloc(r.status_string().size() + 1);
309 if (p) {
310 strcpy(p, r.status_string().c_str());
311 }
312 return p;
313}
314
315size_t AudioClient::Device_get_input_buffer_size(const struct audio_hw_device *dev,
316 const struct audio_config *config)
317{
318 TRACE_ENTRY();
319 ClientContext context;
320 StatusReturn r;
321 Status status = stub_->Device_get_input_buffer_size(&context, MakeAudioConfig(config), &r);
322 return r.ret();
323}
324
325int AudioClient::Device_open_output_stream(struct audio_hw_device *dev,
326 audio_io_handle_t handle,
327 audio_devices_t devices,
328 audio_output_flags_t flags,
329 struct audio_config *config,
330 audio_stream_out_client_t *stream_out,
331 const char *address)
332{
333 TRACE_ENTRY();
334 ClientContext context;
Tim Yao41ac5872022-12-11 13:07:32 -0800335 DeviceOpenStreamReturn r;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800336 Status status = stub_->Device_open_output_stream(&context,
337 MakeOpenOutputStream(new_stream_name(stream_out->name, sizeof(stream_out->name)),
338 kSharedBufferSize,
339 handle,
340 devices,
341 flags,
342 config,
343 address), &r);
Tim Yao41ac5872022-12-11 13:07:32 -0800344 update_stream_name(stream_out->name, sizeof(stream_out->name), r.client_id());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800345 return r.ret();
346}
347
348void AudioClient::Device_close_output_stream(struct audio_hw_device *dev,
349 struct audio_stream_out* stream_out)
350{
351 TRACE_ENTRY();
352 struct audio_stream_out_client *out = audio_stream_out_to_client(stream_out);
353 ClientContext context;
354 StatusReturn r;
355 Status status = stub_->Device_close_output_stream(&context, MakeStream(std::string(out->name)), &r);
356 return;
357}
358
359int AudioClient::Device_open_input_stream(struct audio_hw_device *dev,
360 audio_io_handle_t handle,
361 audio_devices_t devices,
362 struct audio_config *config,
363 struct audio_stream_in_client *stream_in,
364 audio_input_flags_t flags,
365 const char *address,
366 audio_source_t source)
367{
368 TRACE_ENTRY();
369 ClientContext context;
Tim Yao41ac5872022-12-11 13:07:32 -0800370 DeviceOpenStreamReturn r;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800371 Status status = stub_->Device_open_input_stream(&context,
372 MakeOpenInputStream(new_stream_name(stream_in->name, sizeof(stream_in->name)),
373 kSharedBufferSize,
374 handle,
375 devices,
376 config,
377 flags,
378 address,
379 source), &r);
Tim Yao41ac5872022-12-11 13:07:32 -0800380 update_stream_name(stream_in->name, sizeof(stream_in->name), r.client_id());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800381 return r.ret();
382}
383
384void AudioClient::Device_close_input_stream(struct audio_hw_device *dev,
385 struct audio_stream_in *stream_in)
386{
387 TRACE_ENTRY();
388 struct audio_stream_in_client *in = audio_stream_in_to_client(stream_in);
389 ClientContext context;
390 StatusReturn r;
391 Status status = stub_->Device_close_input_stream(&context, MakeStream(std::string(in->name)), &r);
392}
393
Tim Yaoab2a3a62020-10-29 15:33:55 -0700394char *AudioClient::Device_dump(const struct audio_hw_device *dev, int fd)
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800395{
396 TRACE_ENTRY();
397 ClientContext context;
398 StatusReturn r;
399 Status status = stub_->Device_dump(&context, Empty(), &r);
Tim Yaoab2a3a62020-10-29 15:33:55 -0700400 char *p = (char *)malloc(r.status_string().size() + 1);
401 if (p) {
402 strcpy(p, r.status_string().c_str());
403 }
404 return p;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800405}
406
407int AudioClient::Device_set_master_mute(struct audio_hw_device *dev, bool mute)
408{
409 TRACE_ENTRY();
410 ClientContext context;
411 StatusReturn r;
412 Status status = stub_->Device_set_master_mute(&context, MakeMute(mute), &r);
413 return r.ret();
414}
415
416int AudioClient::Device_get_master_mute(struct audio_hw_device *dev, bool *mute)
417{
418 TRACE_ENTRY();
419 ClientContext context;
420 StatusReturn r;
421 Status status = stub_->Device_get_master_mute(&context, Empty(), &r);
422 *mute = r.status_bool();
423 return r.ret();
424}
425
426int AudioClient::Device_create_audio_patch(struct audio_hw_device *dev,
427 unsigned int num_sources,
428 const struct audio_port_config *sources,
429 unsigned int num_sinks,
430 const struct audio_port_config *sinks,
431 audio_patch_handle_t *handle)
432{
433 TRACE_ENTRY();
434 ClientContext context;
435 StatusReturn r;
436 CreateAudioPatch request;
437 const struct audio_port_config *c;
438
439 c = sources;
440 for (int i = 0; i < num_sources; i++, c++) {
441 AudioPortConfig *config = request.add_sources();
442 config->CopyFrom(MakeAudioPortConfig(c));
443 }
444
445 c = sinks;
446 for (int i = 0; i < num_sinks; i++, c++) {
447 AudioPortConfig *config = request.add_sinks();
448 config->CopyFrom(MakeAudioPortConfig(c));
449 }
450
451 Status status = stub_->Device_create_audio_patch(&context, request, &r);
452 *handle = r.status_32();
453 return r.ret();
454}
455
456int AudioClient::Device_release_audio_patch(struct audio_hw_device *dev,
457 audio_patch_handle_t handle)
458{
459 TRACE_ENTRY();
460 ClientContext context;
461 StatusReturn r;
462 Status status = stub_->Device_release_audio_patch(&context, MakeHandle(handle), &r);
463 return r.ret();
464}
465
466int AudioClient::Device_set_audio_port_config(struct audio_hw_device *dev,
467 const struct audio_port_config *config)
468{
469 TRACE_ENTRY();
470 ClientContext context;
471 StatusReturn r;
472 Status status = stub_->Device_set_audio_port_config(&context, MakeAudioPortConfig(config), &r);
473 return r.ret();
474}
475
476int AudioClient::stream_in_set_gain(struct audio_stream_in *stream, float gain)
477{
478 TRACE_ENTRY();
479 ClientContext context;
480 StatusReturn r;
481 StreamGain request;
482 char *name = (audio_stream_in_to_client(stream))->name;
483 request.set_name(std::string(name));
484 request.set_gain(gain);
485 Status status = stub_->StreamIn_set_gain(&context, request, &r);
486 return r.ret();
487}
488
489ssize_t AudioClient::stream_in_read(struct audio_stream_in *stream,
490 void* buffer,
491 size_t bytes)
492{
493 TRACE_ENTRY();
494 ClientContext context;
495 StatusReturn r;
496 char *name = (audio_stream_in_to_client(stream))->name;
497 Status status = stub_->StreamIn_read(&context, MakeStreamReadWrite(name, bytes), &r);
498 if (r.ret() > 0) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800499 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800500 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800501 memcpy(buffer, cb->start_ptr(), r.ret());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800502 }
503 }
504 return r.ret();
505}
506
507uint32_t AudioClient::stream_in_get_input_frames_lost(struct audio_stream_in *stream)
508{
509 TRACE_ENTRY();
510 ClientContext context;
511 StatusReturn r;
512 char *name = (audio_stream_in_to_client(stream))->name;
513 Status status = stub_->StreamIn_get_input_frames_lost(&context, MakeStream(name), &r);
514 return r.ret();
515}
516
517int AudioClient::stream_in_get_capture_position(const struct audio_stream_in *stream,
518 int64_t *frames, int64_t *time)
519{
520 TRACE_ENTRY();
521 ClientContext context;
522 GetCapturePositionReturn r;
523 char *name = (audio_stream_in_to_client(stream))->name;
524 Status status = stub_->StreamIn_get_capture_position(&context, MakeStream(name), &r);
525 *frames = r.frames();
526 *time = r.time();
527 return r.ret();
528}
529
530uint32_t AudioClient::stream_out_get_latency(const struct audio_stream_out *stream)
531{
532 TRACE_ENTRY();
533 ClientContext context;
534 StatusReturn r;
535 char *name = (audio_stream_out_to_client(stream))->name;
536 Status status = stub_->StreamOut_get_latency(&context, MakeStream(name), &r);
537 return r.ret();
538}
539
540int AudioClient::stream_out_set_volume(struct audio_stream_out *stream, float left, float right)
541{
542 TRACE_ENTRY();
543 ClientContext context;
544 StatusReturn r;
545 char *name = (audio_stream_out_to_client(stream))->name;
546 Status status = stub_->StreamOut_set_volume(&context, MakeStreamOutSetVolume(name, left, right), &r);
547 return r.ret();
548}
549
550ssize_t AudioClient::stream_out_write(struct audio_stream_out *stream, const void* buffer,
551 size_t bytes)
552{
553 TRACE_ENTRY();
554 ClientContext context;
555 StatusReturn r;
556 char *name = (audio_stream_out_to_client(stream))->name;
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800557 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800558 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800559 memcpy(cb->start_ptr(), buffer, std::min(bytes, cb->capacity()));
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800560 }
561 Status status = stub_->StreamOut_write(&context, MakeStreamReadWrite(name, bytes), &r);
562 return r.ret();
563}
564
565int AudioClient::stream_out_get_render_position(const struct audio_stream_out *stream,
566 uint32_t *dsp_frames)
567{
568 TRACE_ENTRY();
569 ClientContext context;
570 StatusReturn r;
571 char *name = (audio_stream_out_to_client(stream))->name;
572 Status status = stub_->StreamOut_get_render_position(&context, MakeStream(name), &r);
573 *dsp_frames = r.status_32();
574 return r.ret();
575}
576
577int AudioClient::stream_out_get_next_write_timestamp(const struct audio_stream_out *stream,
578 int64_t *timestamp)
579{
580 TRACE_ENTRY();
581 ClientContext context;
582 StatusReturn r;
583 char *name = (audio_stream_out_to_client(stream))->name;
584 Status status = stub_->StreamOut_get_next_write_timestamp(&context, MakeStream(name), &r);
585 *timestamp = r.status_64();
586 return r.ret();
587}
588
589int AudioClient::stream_out_pause(struct audio_stream_out* stream)
590{
591 TRACE_ENTRY();
592 ClientContext context;
593 StatusReturn r;
594 char *name = (audio_stream_out_to_client(stream))->name;
595 Status status = stub_->StreamOut_pause(&context, MakeStream(name), &r);
596 return r.ret();
597}
598
599int AudioClient::stream_out_resume(struct audio_stream_out* stream)
600{
601 TRACE_ENTRY();
602 ClientContext context;
603 StatusReturn r;
604 char *name = (audio_stream_out_to_client(stream))->name;
605 Status status = stub_->StreamOut_resume(&context, MakeStream(name), &r);
606 return r.ret();
607}
608
609int AudioClient::stream_out_flush(struct audio_stream_out* stream)
610{
611 TRACE_ENTRY();
612 ClientContext context;
613 StatusReturn r;
614 char *name = (audio_stream_out_to_client(stream))->name;
615 Status status = stub_->StreamOut_flush(&context, MakeStream(name), &r);
616 return r.ret();
617}
618
619int AudioClient::stream_out_get_presentation_position(const struct audio_stream_out *stream,
620 uint64_t *frames,
621 struct timespec *timestamp)
622{
623 TRACE_ENTRY();
624 ClientContext context;
625 GetFrameTimestampReturn r;
626 char *name = (audio_stream_out_to_client(stream))->name;
627 Status status = stub_->StreamOut_get_presentation_position(&context, MakeStream(name), &r);
628 *frames = r.frames();
629 timestamp->tv_sec = r.timestamp().seconds();
630 timestamp->tv_nsec = r.timestamp().nanos();
631 return r.ret();
632}
633
634uint32_t AudioClient::stream_get_sample_rate(const struct audio_stream *stream)
635{
636 TRACE_ENTRY();
637 ClientContext context;
638 StatusReturn r;
639 char *name = (audio_stream_to_client(stream))->name;
640 Status status = stub_->Stream_get_sample_rate(&context, MakeStream(name), &r);
641 return r.ret();
642}
643
644size_t AudioClient::stream_get_buffer_size(const struct audio_stream *stream)
645{
646 TRACE_ENTRY();
647 ClientContext context;
648 StatusReturn r;
649 char *name = (audio_stream_to_client(stream))->name;
650 Status status = stub_->Stream_get_buffer_size(&context, MakeStream(name), &r);
651 return r.ret();
652}
653
654audio_channel_mask_t AudioClient::stream_get_channels(const struct audio_stream *stream)
655{
656 TRACE_ENTRY();
657 ClientContext context;
658 StatusReturn r;
659 char *name = (audio_stream_to_client(stream))->name;
660 Status status = stub_->Stream_get_channels(&context, MakeStream(name), &r);
661 return r.ret();
662}
663
664audio_format_t AudioClient::stream_get_format(const struct audio_stream *stream)
665{
666 TRACE_ENTRY();
667 ClientContext context;
668 StatusReturn r;
669 char *name = (audio_stream_to_client(stream))->name;
670 Status status = stub_->Stream_get_format(&context, MakeStream(name), &r);
671 return (audio_format_t)(r.ret());
672}
673
674int AudioClient::stream_standby(struct audio_stream *stream)
675{
676 TRACE_ENTRY();
677 ClientContext context;
678 StatusReturn r;
679 char *name = (audio_stream_to_client(stream))->name;
680 Status status = stub_->Stream_standby(&context, MakeStream(name), &r);
681 return r.ret();
682}
683
684int AudioClient::stream_dump(const struct audio_stream *stream, int fd)
685{
686 TRACE_ENTRY();
687 //TODO
688 return 0;
689}
690
691audio_devices_t AudioClient::stream_get_device(const struct audio_stream *stream)
692{
693 TRACE_ENTRY();
694 ClientContext context;
695 StatusReturn r;
696 char *name = (audio_stream_to_client(stream))->name;
697 Status status = stub_->Stream_get_device(&context, MakeStream(name), &r);
698 return r.ret();
699}
700
701int AudioClient::stream_set_parameters(struct audio_stream *stream, const char *kv_pairs)
702{
703 TRACE_ENTRY();
704 ClientContext context;
705 StatusReturn r;
706 char *name = (audio_stream_to_client(stream))->name;
707 Status status = stub_->Stream_set_parameters(&context, MakeStreamSetParameters(name, kv_pairs), &r);
708 return r.ret();
709}
710
711char * AudioClient::stream_get_parameters(const struct audio_stream *stream,
712 const char *keys)
713{
714 TRACE_ENTRY();
715 ClientContext context;
716 StatusReturn r;
717 char *name = (audio_stream_to_client(stream))->name;
718 Status status = stub_->Stream_get_parameters(&context, MakeStreamGetParameters(name, keys), &r);
719 char *p = (char *)malloc(r.status_string().size() + 1);
720 if (p) {
721 strcpy(p, r.status_string().c_str());
722 }
723 return p;
724}
cheng tong7d907882020-09-04 18:53:04 +0800725
726int AudioClient::Effect_set_parameters(aml_audio_effect_type_e type, effect_param_t *param)
727{
728 TRACE_ENTRY();
729 ClientContext context;
730 StatusReturn r;
731 Status status = stub_->Effect_set_parameters(&context, MakeEffectSetParameters(type, param), &r);
732 param->status = r.status_32();
733 return r.ret();
734}
735
736int AudioClient::Effect_get_parameters(aml_audio_effect_type_e type, effect_param_t *param)
737{
738 TRACE_ENTRY();
739 ClientContext context;
740 StatusReturn r;
741 Status status = stub_->Effect_get_parameters(&context, MakeEffectGetParameters(type, param), &r);
742 memcpy(param, r.status_bytes().data(), r.status_bytes().size());
743 return r.ret();
744}
745