blob: e4980ad97d70f509563e4312e4b11277602b2ffa [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);
127 opt.set_address(std::string(address));
128 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);
230 return r.ret();
231}
232
233int AudioClient::Device_set_voice_volume(struct audio_hw_device *dev, float volume)
234{
235 TRACE_ENTRY();
236 ClientContext context;
237 StatusReturn r;
238 Status status = stub_->Device_set_voice_volume(&context, MakeVolume(volume), &r);
239 return r.ret();
240}
241
242int AudioClient::Device_set_master_volume(struct audio_hw_device *dev, float volume)
243{
244 TRACE_ENTRY();
245 ClientContext context;
246 StatusReturn r;
247 Status status = stub_->Device_set_master_volume(&context, MakeVolume(volume), &r);
248 return r.ret();
249}
250
251int AudioClient::Device_get_master_volume(struct audio_hw_device *dev, float *volume)
252{
253 TRACE_ENTRY();
254 ClientContext context;
255 StatusReturn r;
256 Status status = stub_->Device_get_master_volume(&context, Empty(), &r);
257 *volume = r.status_float();
258 return r.ret();
259}
260
261int AudioClient::Device_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
262{
263 TRACE_ENTRY();
264 ClientContext context;
265 StatusReturn r;
266 Status status = stub_->Device_set_mode(&context, MakeMode(mode), &r);
267 return r.ret();
268}
269
270int AudioClient::Device_set_mic_mute(struct audio_hw_device *dev, bool state)
271{
272 TRACE_ENTRY();
273 ClientContext context;
274 StatusReturn r;
275 Status status = stub_->Device_set_mic_mute(&context, MakeMute(state), &r);
276 return r.ret();
277}
278
279int AudioClient::Device_get_mic_mute(const struct audio_hw_device *dev, bool *state)
280{
281 TRACE_ENTRY();
282 ClientContext context;
283 StatusReturn r;
284 Status status = stub_->Device_get_mic_mute(&context, Empty(), &r);
285 *state = r.status_bool();
286 return r.ret();
287}
288
289int AudioClient::Device_set_parameters(struct audio_hw_device *dev, const char *kv_pairs)
290{
291 TRACE_ENTRY();
292 ClientContext context;
293 StatusReturn r;
294 Status status = stub_->Device_set_parameters(&context, MakeKv_pairs(kv_pairs), &r);
295 return r.ret();
296}
297
298char * AudioClient::Device_get_parameters(const struct audio_hw_device *dev, const char *keys)
299{
300 TRACE_ENTRY();
301 ClientContext context;
302 StatusReturn r;
303 Status status = stub_->Device_get_parameters(&context, MakeKeys(keys), &r);
304 char *p = (char *)malloc(r.status_string().size() + 1);
305 if (p) {
306 strcpy(p, r.status_string().c_str());
307 }
308 return p;
309}
310
311size_t AudioClient::Device_get_input_buffer_size(const struct audio_hw_device *dev,
312 const struct audio_config *config)
313{
314 TRACE_ENTRY();
315 ClientContext context;
316 StatusReturn r;
317 Status status = stub_->Device_get_input_buffer_size(&context, MakeAudioConfig(config), &r);
318 return r.ret();
319}
320
321int AudioClient::Device_open_output_stream(struct audio_hw_device *dev,
322 audio_io_handle_t handle,
323 audio_devices_t devices,
324 audio_output_flags_t flags,
325 struct audio_config *config,
326 audio_stream_out_client_t *stream_out,
327 const char *address)
328{
329 TRACE_ENTRY();
330 ClientContext context;
331 StatusReturn r;
332 Status status = stub_->Device_open_output_stream(&context,
333 MakeOpenOutputStream(new_stream_name(stream_out->name, sizeof(stream_out->name)),
334 kSharedBufferSize,
335 handle,
336 devices,
337 flags,
338 config,
339 address), &r);
340 return r.ret();
341}
342
343void AudioClient::Device_close_output_stream(struct audio_hw_device *dev,
344 struct audio_stream_out* stream_out)
345{
346 TRACE_ENTRY();
347 struct audio_stream_out_client *out = audio_stream_out_to_client(stream_out);
348 ClientContext context;
349 StatusReturn r;
350 Status status = stub_->Device_close_output_stream(&context, MakeStream(std::string(out->name)), &r);
351 return;
352}
353
354int AudioClient::Device_open_input_stream(struct audio_hw_device *dev,
355 audio_io_handle_t handle,
356 audio_devices_t devices,
357 struct audio_config *config,
358 struct audio_stream_in_client *stream_in,
359 audio_input_flags_t flags,
360 const char *address,
361 audio_source_t source)
362{
363 TRACE_ENTRY();
364 ClientContext context;
365 StatusReturn r;
366 Status status = stub_->Device_open_input_stream(&context,
367 MakeOpenInputStream(new_stream_name(stream_in->name, sizeof(stream_in->name)),
368 kSharedBufferSize,
369 handle,
370 devices,
371 config,
372 flags,
373 address,
374 source), &r);
375 return r.ret();
376}
377
378void AudioClient::Device_close_input_stream(struct audio_hw_device *dev,
379 struct audio_stream_in *stream_in)
380{
381 TRACE_ENTRY();
382 struct audio_stream_in_client *in = audio_stream_in_to_client(stream_in);
383 ClientContext context;
384 StatusReturn r;
385 Status status = stub_->Device_close_input_stream(&context, MakeStream(std::string(in->name)), &r);
386}
387
Tim Yaoab2a3a62020-10-29 15:33:55 -0700388char *AudioClient::Device_dump(const struct audio_hw_device *dev, int fd)
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800389{
390 TRACE_ENTRY();
391 ClientContext context;
392 StatusReturn r;
393 Status status = stub_->Device_dump(&context, Empty(), &r);
Tim Yaoab2a3a62020-10-29 15:33:55 -0700394 char *p = (char *)malloc(r.status_string().size() + 1);
395 if (p) {
396 strcpy(p, r.status_string().c_str());
397 }
398 return p;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800399}
400
401int AudioClient::Device_set_master_mute(struct audio_hw_device *dev, bool mute)
402{
403 TRACE_ENTRY();
404 ClientContext context;
405 StatusReturn r;
406 Status status = stub_->Device_set_master_mute(&context, MakeMute(mute), &r);
407 return r.ret();
408}
409
410int AudioClient::Device_get_master_mute(struct audio_hw_device *dev, bool *mute)
411{
412 TRACE_ENTRY();
413 ClientContext context;
414 StatusReturn r;
415 Status status = stub_->Device_get_master_mute(&context, Empty(), &r);
416 *mute = r.status_bool();
417 return r.ret();
418}
419
420int AudioClient::Device_create_audio_patch(struct audio_hw_device *dev,
421 unsigned int num_sources,
422 const struct audio_port_config *sources,
423 unsigned int num_sinks,
424 const struct audio_port_config *sinks,
425 audio_patch_handle_t *handle)
426{
427 TRACE_ENTRY();
428 ClientContext context;
429 StatusReturn r;
430 CreateAudioPatch request;
431 const struct audio_port_config *c;
432
433 c = sources;
434 for (int i = 0; i < num_sources; i++, c++) {
435 AudioPortConfig *config = request.add_sources();
436 config->CopyFrom(MakeAudioPortConfig(c));
437 }
438
439 c = sinks;
440 for (int i = 0; i < num_sinks; i++, c++) {
441 AudioPortConfig *config = request.add_sinks();
442 config->CopyFrom(MakeAudioPortConfig(c));
443 }
444
445 Status status = stub_->Device_create_audio_patch(&context, request, &r);
446 *handle = r.status_32();
447 return r.ret();
448}
449
450int AudioClient::Device_release_audio_patch(struct audio_hw_device *dev,
451 audio_patch_handle_t handle)
452{
453 TRACE_ENTRY();
454 ClientContext context;
455 StatusReturn r;
456 Status status = stub_->Device_release_audio_patch(&context, MakeHandle(handle), &r);
457 return r.ret();
458}
459
460int AudioClient::Device_set_audio_port_config(struct audio_hw_device *dev,
461 const struct audio_port_config *config)
462{
463 TRACE_ENTRY();
464 ClientContext context;
465 StatusReturn r;
466 Status status = stub_->Device_set_audio_port_config(&context, MakeAudioPortConfig(config), &r);
467 return r.ret();
468}
469
470int AudioClient::stream_in_set_gain(struct audio_stream_in *stream, float gain)
471{
472 TRACE_ENTRY();
473 ClientContext context;
474 StatusReturn r;
475 StreamGain request;
476 char *name = (audio_stream_in_to_client(stream))->name;
477 request.set_name(std::string(name));
478 request.set_gain(gain);
479 Status status = stub_->StreamIn_set_gain(&context, request, &r);
480 return r.ret();
481}
482
483ssize_t AudioClient::stream_in_read(struct audio_stream_in *stream,
484 void* buffer,
485 size_t bytes)
486{
487 TRACE_ENTRY();
488 ClientContext context;
489 StatusReturn r;
490 char *name = (audio_stream_in_to_client(stream))->name;
491 Status status = stub_->StreamIn_read(&context, MakeStreamReadWrite(name, bytes), &r);
492 if (r.ret() > 0) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800493 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800494 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800495 memcpy(buffer, cb->start_ptr(), r.ret());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800496 }
497 }
498 return r.ret();
499}
500
501uint32_t AudioClient::stream_in_get_input_frames_lost(struct audio_stream_in *stream)
502{
503 TRACE_ENTRY();
504 ClientContext context;
505 StatusReturn r;
506 char *name = (audio_stream_in_to_client(stream))->name;
507 Status status = stub_->StreamIn_get_input_frames_lost(&context, MakeStream(name), &r);
508 return r.ret();
509}
510
511int AudioClient::stream_in_get_capture_position(const struct audio_stream_in *stream,
512 int64_t *frames, int64_t *time)
513{
514 TRACE_ENTRY();
515 ClientContext context;
516 GetCapturePositionReturn r;
517 char *name = (audio_stream_in_to_client(stream))->name;
518 Status status = stub_->StreamIn_get_capture_position(&context, MakeStream(name), &r);
519 *frames = r.frames();
520 *time = r.time();
521 return r.ret();
522}
523
524uint32_t AudioClient::stream_out_get_latency(const struct audio_stream_out *stream)
525{
526 TRACE_ENTRY();
527 ClientContext context;
528 StatusReturn r;
529 char *name = (audio_stream_out_to_client(stream))->name;
530 Status status = stub_->StreamOut_get_latency(&context, MakeStream(name), &r);
531 return r.ret();
532}
533
534int AudioClient::stream_out_set_volume(struct audio_stream_out *stream, float left, float right)
535{
536 TRACE_ENTRY();
537 ClientContext context;
538 StatusReturn r;
539 char *name = (audio_stream_out_to_client(stream))->name;
540 Status status = stub_->StreamOut_set_volume(&context, MakeStreamOutSetVolume(name, left, right), &r);
541 return r.ret();
542}
543
544ssize_t AudioClient::stream_out_write(struct audio_stream_out *stream, const void* buffer,
545 size_t bytes)
546{
547 TRACE_ENTRY();
548 ClientContext context;
549 StatusReturn r;
550 char *name = (audio_stream_out_to_client(stream))->name;
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800551 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800552 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800553 memcpy(cb->start_ptr(), buffer, std::min(bytes, cb->capacity()));
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800554 }
555 Status status = stub_->StreamOut_write(&context, MakeStreamReadWrite(name, bytes), &r);
556 return r.ret();
557}
558
559int AudioClient::stream_out_get_render_position(const struct audio_stream_out *stream,
560 uint32_t *dsp_frames)
561{
562 TRACE_ENTRY();
563 ClientContext context;
564 StatusReturn r;
565 char *name = (audio_stream_out_to_client(stream))->name;
566 Status status = stub_->StreamOut_get_render_position(&context, MakeStream(name), &r);
567 *dsp_frames = r.status_32();
568 return r.ret();
569}
570
571int AudioClient::stream_out_get_next_write_timestamp(const struct audio_stream_out *stream,
572 int64_t *timestamp)
573{
574 TRACE_ENTRY();
575 ClientContext context;
576 StatusReturn r;
577 char *name = (audio_stream_out_to_client(stream))->name;
578 Status status = stub_->StreamOut_get_next_write_timestamp(&context, MakeStream(name), &r);
579 *timestamp = r.status_64();
580 return r.ret();
581}
582
583int AudioClient::stream_out_pause(struct audio_stream_out* stream)
584{
585 TRACE_ENTRY();
586 ClientContext context;
587 StatusReturn r;
588 char *name = (audio_stream_out_to_client(stream))->name;
589 Status status = stub_->StreamOut_pause(&context, MakeStream(name), &r);
590 return r.ret();
591}
592
593int AudioClient::stream_out_resume(struct audio_stream_out* stream)
594{
595 TRACE_ENTRY();
596 ClientContext context;
597 StatusReturn r;
598 char *name = (audio_stream_out_to_client(stream))->name;
599 Status status = stub_->StreamOut_resume(&context, MakeStream(name), &r);
600 return r.ret();
601}
602
603int AudioClient::stream_out_flush(struct audio_stream_out* stream)
604{
605 TRACE_ENTRY();
606 ClientContext context;
607 StatusReturn r;
608 char *name = (audio_stream_out_to_client(stream))->name;
609 Status status = stub_->StreamOut_flush(&context, MakeStream(name), &r);
610 return r.ret();
611}
612
613int AudioClient::stream_out_get_presentation_position(const struct audio_stream_out *stream,
614 uint64_t *frames,
615 struct timespec *timestamp)
616{
617 TRACE_ENTRY();
618 ClientContext context;
619 GetFrameTimestampReturn r;
620 char *name = (audio_stream_out_to_client(stream))->name;
621 Status status = stub_->StreamOut_get_presentation_position(&context, MakeStream(name), &r);
622 *frames = r.frames();
623 timestamp->tv_sec = r.timestamp().seconds();
624 timestamp->tv_nsec = r.timestamp().nanos();
625 return r.ret();
626}
627
628uint32_t AudioClient::stream_get_sample_rate(const struct audio_stream *stream)
629{
630 TRACE_ENTRY();
631 ClientContext context;
632 StatusReturn r;
633 char *name = (audio_stream_to_client(stream))->name;
634 Status status = stub_->Stream_get_sample_rate(&context, MakeStream(name), &r);
635 return r.ret();
636}
637
638size_t AudioClient::stream_get_buffer_size(const struct audio_stream *stream)
639{
640 TRACE_ENTRY();
641 ClientContext context;
642 StatusReturn r;
643 char *name = (audio_stream_to_client(stream))->name;
644 Status status = stub_->Stream_get_buffer_size(&context, MakeStream(name), &r);
645 return r.ret();
646}
647
648audio_channel_mask_t AudioClient::stream_get_channels(const struct audio_stream *stream)
649{
650 TRACE_ENTRY();
651 ClientContext context;
652 StatusReturn r;
653 char *name = (audio_stream_to_client(stream))->name;
654 Status status = stub_->Stream_get_channels(&context, MakeStream(name), &r);
655 return r.ret();
656}
657
658audio_format_t AudioClient::stream_get_format(const struct audio_stream *stream)
659{
660 TRACE_ENTRY();
661 ClientContext context;
662 StatusReturn r;
663 char *name = (audio_stream_to_client(stream))->name;
664 Status status = stub_->Stream_get_format(&context, MakeStream(name), &r);
665 return (audio_format_t)(r.ret());
666}
667
668int AudioClient::stream_standby(struct audio_stream *stream)
669{
670 TRACE_ENTRY();
671 ClientContext context;
672 StatusReturn r;
673 char *name = (audio_stream_to_client(stream))->name;
674 Status status = stub_->Stream_standby(&context, MakeStream(name), &r);
675 return r.ret();
676}
677
678int AudioClient::stream_dump(const struct audio_stream *stream, int fd)
679{
680 TRACE_ENTRY();
681 //TODO
682 return 0;
683}
684
685audio_devices_t AudioClient::stream_get_device(const struct audio_stream *stream)
686{
687 TRACE_ENTRY();
688 ClientContext context;
689 StatusReturn r;
690 char *name = (audio_stream_to_client(stream))->name;
691 Status status = stub_->Stream_get_device(&context, MakeStream(name), &r);
692 return r.ret();
693}
694
695int AudioClient::stream_set_parameters(struct audio_stream *stream, const char *kv_pairs)
696{
697 TRACE_ENTRY();
698 ClientContext context;
699 StatusReturn r;
700 char *name = (audio_stream_to_client(stream))->name;
701 Status status = stub_->Stream_set_parameters(&context, MakeStreamSetParameters(name, kv_pairs), &r);
702 return r.ret();
703}
704
705char * AudioClient::stream_get_parameters(const struct audio_stream *stream,
706 const char *keys)
707{
708 TRACE_ENTRY();
709 ClientContext context;
710 StatusReturn r;
711 char *name = (audio_stream_to_client(stream))->name;
712 Status status = stub_->Stream_get_parameters(&context, MakeStreamGetParameters(name, keys), &r);
713 char *p = (char *)malloc(r.status_string().size() + 1);
714 if (p) {
715 strcpy(p, r.status_string().c_str());
716 }
717 return p;
718}
cheng tong7d907882020-09-04 18:53:04 +0800719
720int AudioClient::Effect_set_parameters(aml_audio_effect_type_e type, effect_param_t *param)
721{
722 TRACE_ENTRY();
723 ClientContext context;
724 StatusReturn r;
725 Status status = stub_->Effect_set_parameters(&context, MakeEffectSetParameters(type, param), &r);
726 param->status = r.status_32();
727 return r.ret();
728}
729
730int AudioClient::Effect_get_parameters(aml_audio_effect_type_e type, effect_param_t *param)
731{
732 TRACE_ENTRY();
733 ClientContext context;
734 StatusReturn r;
735 Status status = stub_->Effect_get_parameters(&context, MakeEffectGetParameters(type, param), &r);
736 memcpy(param, r.status_bytes().data(), r.status_bytes().size());
737 return r.ret();
738}
739