blob: 43a12d5e18b57e57ee9928a72e5b5da07514f611 [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 }
yuliang.hu19fdc8d2024-07-29 17:42:10 +0800168 /*coverity[UNINIT]: The definition is not in our code and cannot be changed*/
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800169 return c;
170}
171
172StreamSetParameters MakeStreamSetParameters(char *name, const char *kv_pairs)
173{
174 StreamSetParameters p;
175 p.set_name(std::string(name));
176 p.set_kv_pairs(std::string(kv_pairs));
177 return p;
178}
179
180StreamGetParameters MakeStreamGetParameters(char *name, const char *keys)
181{
182 StreamGetParameters p;
183 p.set_name(std::string(name));
184 p.set_keys(std::string(keys));
185 return p;
186}
187
cheng tong7d907882020-09-04 18:53:04 +0800188EffectParameters MakeEffectSetParameters(int type, effect_param_t *param)
189{
190 EffectParameters p;
191 uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
192
193 p.set_type(type);
194 p.set_cmd_size(sizeof (effect_param_t) + psize);
195 p.set_cmd_data(param, sizeof (effect_param_t) + psize);
196 p.set_reply_size(sizeof(int));
197 return p;
198}
199
200EffectParameters MakeEffectGetParameters(int type, effect_param_t *param)
201{
202 EffectParameters p;
203 uint32_t psize = sizeof(effect_param_t) + ((param->psize - 1) / sizeof(int) + 1) * sizeof(int)
204 + param->vsize;
205
206 p.set_type(type);
207 p.set_cmd_size(sizeof (effect_param_t) + param->psize);
208 p.set_cmd_data(param, sizeof (effect_param_t) + param->psize);
209 p.set_reply_size(psize);
210 return p;
211}
212
213
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800214std::atomic_int AudioClient::stream_seq_;
xingri.gao826841b2024-07-03 19:17:40 +0800215std::atomic_int AudioClient::patch_seq_;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800216
217int AudioClient::Device_common_close(struct hw_device_t* device)
218{
219 TRACE_ENTRY();
220 ClientContext context;
221 StatusReturn r;
222 Status status = stub_->Device_common_close(&context, Empty(), &r);
223 return r.ret();
224}
225
226int AudioClient::Device_init_check(const struct audio_hw_device *dev)
227{
228 TRACE_ENTRY();
229 ClientContext context;
230 StatusReturn r;
231 Status status = stub_->Device_init_check(&context, Empty(), &r);
wei.du850202b2024-06-20 10:56:19 +0800232 if (status.ok()) {
233 return r.ret();
234 } else {
235 return -1;
236 }
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800237}
238
239int AudioClient::Device_set_voice_volume(struct audio_hw_device *dev, float volume)
240{
241 TRACE_ENTRY();
242 ClientContext context;
243 StatusReturn r;
244 Status status = stub_->Device_set_voice_volume(&context, MakeVolume(volume), &r);
245 return r.ret();
246}
247
248int AudioClient::Device_set_master_volume(struct audio_hw_device *dev, float volume)
249{
250 TRACE_ENTRY();
251 ClientContext context;
252 StatusReturn r;
253 Status status = stub_->Device_set_master_volume(&context, MakeVolume(volume), &r);
254 return r.ret();
255}
256
257int AudioClient::Device_get_master_volume(struct audio_hw_device *dev, float *volume)
258{
259 TRACE_ENTRY();
260 ClientContext context;
261 StatusReturn r;
262 Status status = stub_->Device_get_master_volume(&context, Empty(), &r);
263 *volume = r.status_float();
264 return r.ret();
265}
266
267int AudioClient::Device_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
268{
269 TRACE_ENTRY();
270 ClientContext context;
271 StatusReturn r;
272 Status status = stub_->Device_set_mode(&context, MakeMode(mode), &r);
273 return r.ret();
274}
275
276int AudioClient::Device_set_mic_mute(struct audio_hw_device *dev, bool state)
277{
278 TRACE_ENTRY();
279 ClientContext context;
280 StatusReturn r;
281 Status status = stub_->Device_set_mic_mute(&context, MakeMute(state), &r);
282 return r.ret();
283}
284
285int AudioClient::Device_get_mic_mute(const struct audio_hw_device *dev, bool *state)
286{
287 TRACE_ENTRY();
288 ClientContext context;
289 StatusReturn r;
290 Status status = stub_->Device_get_mic_mute(&context, Empty(), &r);
291 *state = r.status_bool();
292 return r.ret();
293}
294
295int AudioClient::Device_set_parameters(struct audio_hw_device *dev, const char *kv_pairs)
296{
297 TRACE_ENTRY();
298 ClientContext context;
299 StatusReturn r;
300 Status status = stub_->Device_set_parameters(&context, MakeKv_pairs(kv_pairs), &r);
301 return r.ret();
302}
303
304char * AudioClient::Device_get_parameters(const struct audio_hw_device *dev, const char *keys)
305{
306 TRACE_ENTRY();
307 ClientContext context;
308 StatusReturn r;
309 Status status = stub_->Device_get_parameters(&context, MakeKeys(keys), &r);
310 char *p = (char *)malloc(r.status_string().size() + 1);
311 if (p) {
312 strcpy(p, r.status_string().c_str());
313 }
314 return p;
315}
316
317size_t AudioClient::Device_get_input_buffer_size(const struct audio_hw_device *dev,
318 const struct audio_config *config)
319{
320 TRACE_ENTRY();
321 ClientContext context;
322 StatusReturn r;
323 Status status = stub_->Device_get_input_buffer_size(&context, MakeAudioConfig(config), &r);
324 return r.ret();
325}
326
327int AudioClient::Device_open_output_stream(struct audio_hw_device *dev,
328 audio_io_handle_t handle,
329 audio_devices_t devices,
330 audio_output_flags_t flags,
331 struct audio_config *config,
332 audio_stream_out_client_t *stream_out,
333 const char *address)
334{
335 TRACE_ENTRY();
336 ClientContext context;
Tim Yao41ac5872022-12-11 13:07:32 -0800337 DeviceOpenStreamReturn r;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800338 Status status = stub_->Device_open_output_stream(&context,
339 MakeOpenOutputStream(new_stream_name(stream_out->name, sizeof(stream_out->name)),
340 kSharedBufferSize,
341 handle,
342 devices,
343 flags,
344 config,
345 address), &r);
Tim Yao41ac5872022-12-11 13:07:32 -0800346 update_stream_name(stream_out->name, sizeof(stream_out->name), r.client_id());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800347 return r.ret();
348}
349
350void AudioClient::Device_close_output_stream(struct audio_hw_device *dev,
351 struct audio_stream_out* stream_out)
352{
353 TRACE_ENTRY();
354 struct audio_stream_out_client *out = audio_stream_out_to_client(stream_out);
355 ClientContext context;
356 StatusReturn r;
357 Status status = stub_->Device_close_output_stream(&context, MakeStream(std::string(out->name)), &r);
358 return;
359}
360
361int AudioClient::Device_open_input_stream(struct audio_hw_device *dev,
362 audio_io_handle_t handle,
363 audio_devices_t devices,
364 struct audio_config *config,
365 struct audio_stream_in_client *stream_in,
366 audio_input_flags_t flags,
367 const char *address,
368 audio_source_t source)
369{
370 TRACE_ENTRY();
371 ClientContext context;
Tim Yao41ac5872022-12-11 13:07:32 -0800372 DeviceOpenStreamReturn r;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800373 Status status = stub_->Device_open_input_stream(&context,
374 MakeOpenInputStream(new_stream_name(stream_in->name, sizeof(stream_in->name)),
375 kSharedBufferSize,
376 handle,
377 devices,
378 config,
379 flags,
380 address,
381 source), &r);
Tim Yao41ac5872022-12-11 13:07:32 -0800382 update_stream_name(stream_in->name, sizeof(stream_in->name), r.client_id());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800383 return r.ret();
384}
385
386void AudioClient::Device_close_input_stream(struct audio_hw_device *dev,
387 struct audio_stream_in *stream_in)
388{
389 TRACE_ENTRY();
390 struct audio_stream_in_client *in = audio_stream_in_to_client(stream_in);
391 ClientContext context;
392 StatusReturn r;
393 Status status = stub_->Device_close_input_stream(&context, MakeStream(std::string(in->name)), &r);
394}
395
Tim Yaoab2a3a62020-10-29 15:33:55 -0700396char *AudioClient::Device_dump(const struct audio_hw_device *dev, int fd)
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800397{
398 TRACE_ENTRY();
399 ClientContext context;
400 StatusReturn r;
401 Status status = stub_->Device_dump(&context, Empty(), &r);
Tim Yaoab2a3a62020-10-29 15:33:55 -0700402 char *p = (char *)malloc(r.status_string().size() + 1);
403 if (p) {
404 strcpy(p, r.status_string().c_str());
405 }
406 return p;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800407}
408
409int AudioClient::Device_set_master_mute(struct audio_hw_device *dev, bool mute)
410{
411 TRACE_ENTRY();
412 ClientContext context;
413 StatusReturn r;
414 Status status = stub_->Device_set_master_mute(&context, MakeMute(mute), &r);
415 return r.ret();
416}
417
418int AudioClient::Device_get_master_mute(struct audio_hw_device *dev, bool *mute)
419{
420 TRACE_ENTRY();
421 ClientContext context;
422 StatusReturn r;
423 Status status = stub_->Device_get_master_mute(&context, Empty(), &r);
424 *mute = r.status_bool();
425 return r.ret();
426}
427
428int AudioClient::Device_create_audio_patch(struct audio_hw_device *dev,
429 unsigned int num_sources,
430 const struct audio_port_config *sources,
431 unsigned int num_sinks,
432 const struct audio_port_config *sinks,
433 audio_patch_handle_t *handle)
434{
435 TRACE_ENTRY();
436 ClientContext context;
xingri.gao826841b2024-07-03 19:17:40 +0800437 DeviceCreatePatchReturn r;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800438 CreateAudioPatch request;
439 const struct audio_port_config *c;
440
441 c = sources;
442 for (int i = 0; i < num_sources; i++, c++) {
443 AudioPortConfig *config = request.add_sources();
444 config->CopyFrom(MakeAudioPortConfig(c));
445 }
446
447 c = sinks;
448 for (int i = 0; i < num_sinks; i++, c++) {
449 AudioPortConfig *config = request.add_sinks();
450 config->CopyFrom(MakeAudioPortConfig(c));
451 }
452
xingri.gao826841b2024-07-03 19:17:40 +0800453 char name[30];
454 request.set_name(new_patch_name(name, sizeof(name)));
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800455 Status status = stub_->Device_create_audio_patch(&context, request, &r);
xingri.gao826841b2024-07-03 19:17:40 +0800456 update_patch_name(name, sizeof(name), r.client_id());
457 //printf("%s:name:%s, status:%d, client_id:%d\n", __func__, name, r.status_32(), r.client_id());
458
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800459 *handle = r.status_32();
460 return r.ret();
461}
462
463int AudioClient::Device_release_audio_patch(struct audio_hw_device *dev,
464 audio_patch_handle_t handle)
465{
466 TRACE_ENTRY();
467 ClientContext context;
468 StatusReturn r;
469 Status status = stub_->Device_release_audio_patch(&context, MakeHandle(handle), &r);
470 return r.ret();
471}
472
473int AudioClient::Device_set_audio_port_config(struct audio_hw_device *dev,
474 const struct audio_port_config *config)
475{
476 TRACE_ENTRY();
477 ClientContext context;
478 StatusReturn r;
479 Status status = stub_->Device_set_audio_port_config(&context, MakeAudioPortConfig(config), &r);
480 return r.ret();
481}
482
483int AudioClient::stream_in_set_gain(struct audio_stream_in *stream, float gain)
484{
485 TRACE_ENTRY();
486 ClientContext context;
487 StatusReturn r;
488 StreamGain request;
489 char *name = (audio_stream_in_to_client(stream))->name;
490 request.set_name(std::string(name));
491 request.set_gain(gain);
492 Status status = stub_->StreamIn_set_gain(&context, request, &r);
493 return r.ret();
494}
495
496ssize_t AudioClient::stream_in_read(struct audio_stream_in *stream,
497 void* buffer,
498 size_t bytes)
499{
500 TRACE_ENTRY();
501 ClientContext context;
502 StatusReturn r;
503 char *name = (audio_stream_in_to_client(stream))->name;
504 Status status = stub_->StreamIn_read(&context, MakeStreamReadWrite(name, bytes), &r);
505 if (r.ret() > 0) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800506 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800507 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800508 memcpy(buffer, cb->start_ptr(), r.ret());
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800509 }
510 }
511 return r.ret();
512}
513
514uint32_t AudioClient::stream_in_get_input_frames_lost(struct audio_stream_in *stream)
515{
516 TRACE_ENTRY();
517 ClientContext context;
518 StatusReturn r;
519 char *name = (audio_stream_in_to_client(stream))->name;
520 Status status = stub_->StreamIn_get_input_frames_lost(&context, MakeStream(name), &r);
521 return r.ret();
522}
523
524int AudioClient::stream_in_get_capture_position(const struct audio_stream_in *stream,
525 int64_t *frames, int64_t *time)
526{
527 TRACE_ENTRY();
528 ClientContext context;
529 GetCapturePositionReturn r;
530 char *name = (audio_stream_in_to_client(stream))->name;
531 Status status = stub_->StreamIn_get_capture_position(&context, MakeStream(name), &r);
532 *frames = r.frames();
533 *time = r.time();
534 return r.ret();
535}
536
537uint32_t AudioClient::stream_out_get_latency(const struct audio_stream_out *stream)
538{
539 TRACE_ENTRY();
540 ClientContext context;
541 StatusReturn r;
542 char *name = (audio_stream_out_to_client(stream))->name;
543 Status status = stub_->StreamOut_get_latency(&context, MakeStream(name), &r);
544 return r.ret();
545}
546
547int AudioClient::stream_out_set_volume(struct audio_stream_out *stream, float left, float right)
548{
549 TRACE_ENTRY();
550 ClientContext context;
551 StatusReturn r;
552 char *name = (audio_stream_out_to_client(stream))->name;
553 Status status = stub_->StreamOut_set_volume(&context, MakeStreamOutSetVolume(name, left, right), &r);
554 return r.ret();
555}
556
557ssize_t AudioClient::stream_out_write(struct audio_stream_out *stream, const void* buffer,
558 size_t bytes)
559{
560 TRACE_ENTRY();
561 ClientContext context;
562 StatusReturn r;
563 char *name = (audio_stream_out_to_client(stream))->name;
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800564 IpcBuffer *cb = audio_server_shmem::getInstance()->find<IpcBuffer>(name).first;
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800565 if (cb) {
Tim Yaoaaa3bc52020-12-30 17:40:14 -0800566 memcpy(cb->start_ptr(), buffer, std::min(bytes, cb->capacity()));
Tim Yaoe8c0d4a2019-11-27 14:47:35 -0800567 }
568 Status status = stub_->StreamOut_write(&context, MakeStreamReadWrite(name, bytes), &r);
569 return r.ret();
570}
571
572int AudioClient::stream_out_get_render_position(const struct audio_stream_out *stream,
573 uint32_t *dsp_frames)
574{
575 TRACE_ENTRY();
576 ClientContext context;
577 StatusReturn r;
578 char *name = (audio_stream_out_to_client(stream))->name;
579 Status status = stub_->StreamOut_get_render_position(&context, MakeStream(name), &r);
580 *dsp_frames = r.status_32();
581 return r.ret();
582}
583
584int AudioClient::stream_out_get_next_write_timestamp(const struct audio_stream_out *stream,
585 int64_t *timestamp)
586{
587 TRACE_ENTRY();
588 ClientContext context;
589 StatusReturn r;
590 char *name = (audio_stream_out_to_client(stream))->name;
591 Status status = stub_->StreamOut_get_next_write_timestamp(&context, MakeStream(name), &r);
592 *timestamp = r.status_64();
593 return r.ret();
594}
595
596int AudioClient::stream_out_pause(struct audio_stream_out* stream)
597{
598 TRACE_ENTRY();
599 ClientContext context;
600 StatusReturn r;
601 char *name = (audio_stream_out_to_client(stream))->name;
602 Status status = stub_->StreamOut_pause(&context, MakeStream(name), &r);
603 return r.ret();
604}
605
606int AudioClient::stream_out_resume(struct audio_stream_out* stream)
607{
608 TRACE_ENTRY();
609 ClientContext context;
610 StatusReturn r;
611 char *name = (audio_stream_out_to_client(stream))->name;
612 Status status = stub_->StreamOut_resume(&context, MakeStream(name), &r);
613 return r.ret();
614}
615
616int AudioClient::stream_out_flush(struct audio_stream_out* stream)
617{
618 TRACE_ENTRY();
619 ClientContext context;
620 StatusReturn r;
621 char *name = (audio_stream_out_to_client(stream))->name;
622 Status status = stub_->StreamOut_flush(&context, MakeStream(name), &r);
623 return r.ret();
624}
625
626int AudioClient::stream_out_get_presentation_position(const struct audio_stream_out *stream,
627 uint64_t *frames,
628 struct timespec *timestamp)
629{
630 TRACE_ENTRY();
631 ClientContext context;
632 GetFrameTimestampReturn r;
633 char *name = (audio_stream_out_to_client(stream))->name;
634 Status status = stub_->StreamOut_get_presentation_position(&context, MakeStream(name), &r);
635 *frames = r.frames();
636 timestamp->tv_sec = r.timestamp().seconds();
637 timestamp->tv_nsec = r.timestamp().nanos();
638 return r.ret();
639}
640
641uint32_t AudioClient::stream_get_sample_rate(const struct audio_stream *stream)
642{
643 TRACE_ENTRY();
644 ClientContext context;
645 StatusReturn r;
646 char *name = (audio_stream_to_client(stream))->name;
647 Status status = stub_->Stream_get_sample_rate(&context, MakeStream(name), &r);
648 return r.ret();
649}
650
651size_t AudioClient::stream_get_buffer_size(const struct audio_stream *stream)
652{
653 TRACE_ENTRY();
654 ClientContext context;
655 StatusReturn r;
656 char *name = (audio_stream_to_client(stream))->name;
657 Status status = stub_->Stream_get_buffer_size(&context, MakeStream(name), &r);
658 return r.ret();
659}
660
661audio_channel_mask_t AudioClient::stream_get_channels(const struct audio_stream *stream)
662{
663 TRACE_ENTRY();
664 ClientContext context;
665 StatusReturn r;
666 char *name = (audio_stream_to_client(stream))->name;
667 Status status = stub_->Stream_get_channels(&context, MakeStream(name), &r);
668 return r.ret();
669}
670
671audio_format_t AudioClient::stream_get_format(const struct audio_stream *stream)
672{
673 TRACE_ENTRY();
674 ClientContext context;
675 StatusReturn r;
676 char *name = (audio_stream_to_client(stream))->name;
677 Status status = stub_->Stream_get_format(&context, MakeStream(name), &r);
678 return (audio_format_t)(r.ret());
679}
680
681int AudioClient::stream_standby(struct audio_stream *stream)
682{
683 TRACE_ENTRY();
684 ClientContext context;
685 StatusReturn r;
686 char *name = (audio_stream_to_client(stream))->name;
687 Status status = stub_->Stream_standby(&context, MakeStream(name), &r);
688 return r.ret();
689}
690
691int AudioClient::stream_dump(const struct audio_stream *stream, int fd)
692{
693 TRACE_ENTRY();
694 //TODO
695 return 0;
696}
697
698audio_devices_t AudioClient::stream_get_device(const struct audio_stream *stream)
699{
700 TRACE_ENTRY();
701 ClientContext context;
702 StatusReturn r;
703 char *name = (audio_stream_to_client(stream))->name;
704 Status status = stub_->Stream_get_device(&context, MakeStream(name), &r);
705 return r.ret();
706}
707
708int AudioClient::stream_set_parameters(struct audio_stream *stream, const char *kv_pairs)
709{
710 TRACE_ENTRY();
711 ClientContext context;
712 StatusReturn r;
713 char *name = (audio_stream_to_client(stream))->name;
714 Status status = stub_->Stream_set_parameters(&context, MakeStreamSetParameters(name, kv_pairs), &r);
715 return r.ret();
716}
717
718char * AudioClient::stream_get_parameters(const struct audio_stream *stream,
719 const char *keys)
720{
721 TRACE_ENTRY();
722 ClientContext context;
723 StatusReturn r;
724 char *name = (audio_stream_to_client(stream))->name;
725 Status status = stub_->Stream_get_parameters(&context, MakeStreamGetParameters(name, keys), &r);
726 char *p = (char *)malloc(r.status_string().size() + 1);
727 if (p) {
728 strcpy(p, r.status_string().c_str());
729 }
730 return p;
731}
cheng tong7d907882020-09-04 18:53:04 +0800732
733int AudioClient::Effect_set_parameters(aml_audio_effect_type_e type, effect_param_t *param)
734{
735 TRACE_ENTRY();
736 ClientContext context;
737 StatusReturn r;
738 Status status = stub_->Effect_set_parameters(&context, MakeEffectSetParameters(type, param), &r);
739 param->status = r.status_32();
740 return r.ret();
741}
742
743int AudioClient::Effect_get_parameters(aml_audio_effect_type_e type, effect_param_t *param)
744{
745 TRACE_ENTRY();
746 ClientContext context;
747 StatusReturn r;
748 Status status = stub_->Effect_get_parameters(&context, MakeEffectGetParameters(type, param), &r);
749 memcpy(param, r.status_bytes().data(), r.status_bytes().size());
750 return r.ret();
751}
752