2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include "cpp_audio_io.h"
21 #include <sound_manager_internal.h>
23 #include "CAudioIODef.h"
25 #include <system_info.h>
27 #define FEATURE_MICROPHONE "http://tizen.org/feature/microphone"
30 using namespace tizen_media_audio;
36 * Name : audio_io_interrupted_cb_s
37 * Declaration : Keeps user callback pointer and user data for delivering an interrupt event
39 typedef struct audio_io_interrupted_cb_s {
41 audio_io_interrupted_cb onInterrupt;
43 audio_io_interrupted_cb_s() : user_data(NULL), onInterrupt(NULL)
45 } audio_io_interrupted_cb_s;
50 * Name : audio_io_stream_cb_s
51 * Declaration : Keeps user callback pointer and user data for delivering an stream event
53 typedef struct audio_io_stream_cb_s {
55 audio_in_stream_cb onStream;
57 audio_io_stream_cb_s() : user_data(NULL), onStream(NULL)
59 } audio_io_stream_cb_s;
64 * Name : audio_io_state_changed_cb_s
65 * Declaration : Keeps user callback pointer and user data for delivering an state changed event
67 typedef struct audio_io_state_changed_cb_s {
69 audio_in_state_changed_cb onStateChanged;
71 audio_io_state_changed_cb_s() : user_data(NULL), onStateChanged(NULL)
73 } audio_io_state_changed_cb_s;
79 * Declaration : An handle of AudioIO
80 * The handle has two struct for user callback
81 * And the handle has a pointer of private audioIO object
82 * The CAudioIO is a abstract class object about Input and Output
84 typedef struct audio_io_s {
85 CAudioIO* audioIoHandle;
86 audio_io_interrupted_cb_s interrupt_callback;
87 audio_io_stream_cb_s stream_callback;
88 audio_io_state_changed_cb_s state_changed_callback;
90 audio_io_s() : audioIoHandle(NULL)
98 static audio_io_error_e __convert_CAudioError(CAudioError& error) {
99 audio_io_error_e ret = AUDIO_IO_ERROR_NONE;
100 CAudioError::EError err = error.getError();
103 case CAudioError::EError::ERROR_NONE:
104 ret = AUDIO_IO_ERROR_NONE;
106 case CAudioError::EError::ERROR_INVALID_ARGUMENT:
107 case CAudioError::EError::ERROR_INVALID_HANDLE:
108 case CAudioError::EError::ERROR_INVALID_SAMPLERATE:
109 case CAudioError::EError::ERROR_INVALID_CHANNEL:
110 case CAudioError::EError::ERROR_INVALID_FORMAT:
111 ret = AUDIO_IO_ERROR_INVALID_PARAMETER;
113 case CAudioError::EError::ERROR_DEVICE_NOT_OPENED:
114 ret = AUDIO_IO_ERROR_DEVICE_NOT_OPENED;
116 case CAudioError::EError::ERROR_DEVICE_NOT_CLOSED:
117 ret = AUDIO_IO_ERROR_DEVICE_NOT_CLOSED;
119 case CAudioError::EError::ERROR_PERMISSION_DENIED:
120 ret = AUDIO_IO_ERROR_PERMISSION_DENIED;
122 case CAudioError::EError::ERROR_DEVICE_POLICY_RESTRICTION:
123 ret = AUDIO_IO_ERROR_DEVICE_POLICY_RESTRICTION;
125 case CAudioError::EError::ERROR_NOT_SUPPORTED:
126 ret = AUDIO_IO_ERROR_NOT_SUPPORTED;
128 case CAudioError::EError::ERROR_NOT_SUPPORTED_TYPE:
129 ret = AUDIO_IO_ERROR_NOT_SUPPORTED_TYPE;
131 case CAudioError::EError::ERROR_MAX:
132 case CAudioError::EError::ERROR_INTERNAL_OPERATION:
133 case CAudioError::EError::ERROR_NOT_INITIALIZED:
134 case CAudioError::EError::ERROR_FAILED_OPERATION:
135 case CAudioError::EError::ERROR_INVALID_OPERATION:
136 ret = AUDIO_IO_ERROR_INVALID_OPERATION;
138 case CAudioError::EError::ERROR_INVALID_STATE:
139 ret = AUDIO_IO_ERROR_INVALID_STATE;
141 case CAudioError::EError::ERROR_OUT_OF_MEMORY:
142 case CAudioError::EError::ERROR_INVALID_POINTER:
143 ret = AUDIO_IO_ERROR_INVALID_BUFFER;
145 case CAudioError::EError::ERROR_POLICY_BLOCKED:
146 case CAudioError::EError::ERROR_POLICY_INTERRUPTED:
147 case CAudioError::EError::ERROR_POLICY_DUPLICATED:
148 ret = AUDIO_IO_ERROR_SOUND_POLICY;
155 static void __convert_channel_2_audio_info_channel(const audio_channel_e& src_channel,
156 CAudioInfo::EChannel& dst_channel) {
157 switch (src_channel) {
158 case AUDIO_CHANNEL_MONO:
159 dst_channel = CAudioInfo::EChannel::CHANNEL_MONO;
161 case AUDIO_CHANNEL_STEREO:
162 dst_channel = CAudioInfo::EChannel::CHANNEL_STEREO;
165 dst_channel = CAudioInfo::EChannel::CHANNEL_MONO;
170 static void __convert_audio_info_channel_2_channel(const CAudioInfo::EChannel& src_channel,
171 audio_channel_e& dst_channel) {
172 switch (src_channel) {
173 case CAudioInfo::EChannel::CHANNEL_MONO:
174 dst_channel = AUDIO_CHANNEL_MONO;
176 case CAudioInfo::EChannel::CHANNEL_STEREO:
177 dst_channel = AUDIO_CHANNEL_STEREO;
180 dst_channel = AUDIO_CHANNEL_MONO;
185 static void __convert_sample_type_2_audio_info_sample_type(const audio_sample_type_e& src_type,
186 CAudioInfo::ESampleType& dst_type) {
188 case AUDIO_SAMPLE_TYPE_U8:
189 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_U8;
191 case AUDIO_SAMPLE_TYPE_S16_LE:
192 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE;
195 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_U8;
200 static void __convert_audio_info_sample_type_2_sample_type(const CAudioInfo::ESampleType& src_type,
201 audio_sample_type_e& dst_type) {
203 case CAudioInfo::ESampleType::SAMPLE_TYPE_U8:
204 dst_type = AUDIO_SAMPLE_TYPE_U8;
206 case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
207 dst_type = AUDIO_SAMPLE_TYPE_S16_LE;
210 dst_type = AUDIO_SAMPLE_TYPE_U8;
215 static void __convert_sound_type_2_audio_info_audio_type(const sound_type_e& src_type,
216 CAudioInfo::EAudioType& dst_type) {
218 case SOUND_TYPE_SYSTEM:
219 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM;
221 case SOUND_TYPE_NOTIFICATION:
222 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_NOTIFICATION;
224 case SOUND_TYPE_ALARM:
225 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_ALARM;
227 case SOUND_TYPE_RINGTONE:
228 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_RINGTONE_VOIP;
230 case SOUND_TYPE_MEDIA:
231 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA;
233 case SOUND_TYPE_CALL:
234 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM;
236 case SOUND_TYPE_VOIP:
237 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOIP;
239 case SOUND_TYPE_VOICE:
240 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOICE_INFORMATION;
243 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA;
248 static void __convert_audio_info_audio_type_2_sound_type(const CAudioInfo::EAudioType& src_type,
249 sound_type_e& dst_type) {
251 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA:
252 dst_type = SOUND_TYPE_MEDIA;
254 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM:
255 dst_type = SOUND_TYPE_SYSTEM;
257 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_ALARM:
258 dst_type = SOUND_TYPE_ALARM;
260 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_NOTIFICATION:
261 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_EMERGENCY:
262 dst_type = SOUND_TYPE_NOTIFICATION;
264 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOICE_INFORMATION:
265 dst_type = SOUND_TYPE_VOICE;
267 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_RINGTONE_VOIP:
268 dst_type = SOUND_TYPE_RINGTONE;
270 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOIP:
271 dst_type = SOUND_TYPE_VOIP;
274 dst_type = SOUND_TYPE_MEDIA;
279 static audio_io_state_e __convert_state_type(const CAudioInfo::EAudioIOState src_state) {
280 audio_io_state_e dst_state;
283 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_NONE:
284 dst_state = AUDIO_IO_STATE_IDLE;
286 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE:
287 dst_state = AUDIO_IO_STATE_IDLE;
289 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING:
290 dst_state = AUDIO_IO_STATE_RUNNING;
292 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED:
293 dst_state = AUDIO_IO_STATE_PAUSED;
296 dst_state = AUDIO_IO_STATE_IDLE;
302 static void __check_audio_param(int sample_rate, audio_channel_e channel, audio_sample_type_e type) throw(CAudioError) {
303 if (sample_rate < 0) {
304 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sample rate :%d", sample_rate);
307 if (channel != AUDIO_CHANNEL_MONO && channel != AUDIO_CHANNEL_STEREO) {
308 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid channel :%d", channel);
311 if (type != AUDIO_SAMPLE_TYPE_U8 && type != AUDIO_SAMPLE_TYPE_S16_LE) {
312 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sample type :%d", type);
316 static void __check_audio_param(int sample_rate, audio_channel_e channel, audio_sample_type_e type, sound_type_e sound_type) throw(CAudioError) {
317 __check_audio_param(sample_rate, channel, type);
319 if (sound_type < SOUND_TYPE_SYSTEM || sound_type > SOUND_TYPE_VOICE) {
320 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sound type : %d", sound_type);
324 static CAudioInfo __generate_audio_input_info(int sampleRate, audio_channel_e channel, audio_sample_type_e sample_type) throw(CAudioError) {
325 CAudioInfo::EChannel dstChannel;
326 CAudioInfo::ESampleType dstSampleType;
327 CAudioInfo::EAudioType dstAudioType = CAudioInfo::EAudioType::AUDIO_IN_TYPE_MEDIA;
329 __convert_channel_2_audio_info_channel(channel, dstChannel);
330 __convert_sample_type_2_audio_info_sample_type(sample_type, dstSampleType);
332 return CAudioInfo(sampleRate, dstChannel, dstSampleType, dstAudioType, -1);
335 static CAudioInfo __generate_audio_input_loopback_info(int sampleRate, audio_channel_e channel, audio_sample_type_e sample_type) throw(CAudioError) {
336 CAudioInfo::EChannel dstChannel;
337 CAudioInfo::ESampleType dstSampleType;
338 CAudioInfo::EAudioType dstAudioType = CAudioInfo::EAudioType::AUDIO_IN_TYPE_LOOPBACK;
340 __convert_channel_2_audio_info_channel(channel, dstChannel);
341 __convert_sample_type_2_audio_info_sample_type(sample_type, dstSampleType);
343 return CAudioInfo(sampleRate, dstChannel, dstSampleType, dstAudioType, -1);
346 static CAudioInfo __generate_audio_output_info(int sampleRate, audio_channel_e channel, audio_sample_type_e sample_type, sound_type_e sound_type) throw(CAudioError) {
347 CAudioInfo::EChannel dstChannel;
348 CAudioInfo::ESampleType dstSampleType;
349 CAudioInfo::EAudioType dstAudioType;
351 __convert_channel_2_audio_info_channel(channel, dstChannel);
352 __convert_sample_type_2_audio_info_sample_type(sample_type, dstSampleType);
353 __convert_sound_type_2_audio_info_audio_type(sound_type, dstAudioType);
355 return CAudioInfo(sampleRate, dstChannel, dstSampleType, dstAudioType, -1);
358 static audio_io_interrupted_code_e __convert_interrupted_code(IAudioSessionEventListener::EInterruptCode code) {
360 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_COMPLETED:
361 return AUDIO_IO_INTERRUPTED_COMPLETED;
362 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_CALL:
363 return AUDIO_IO_INTERRUPTED_BY_CALL;
364 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_EARJACK_UNPLUG:
365 return AUDIO_IO_INTERRUPTED_BY_EARJACK_UNPLUG;
366 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_RESOURCE_CONFLICT:
367 return AUDIO_IO_INTERRUPTED_BY_RESOURCE_CONFLICT;
368 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_ALARM:
369 return AUDIO_IO_INTERRUPTED_BY_ALARM;
370 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_EMERGENCY:
371 return AUDIO_IO_INTERRUPTED_BY_EMERGENCY;
372 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_NOTIFICATION:
373 return AUDIO_IO_INTERRUPTED_BY_NOTIFICATION;
374 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_BY_MEDIA:
375 case IAudioSessionEventListener::EInterruptCode::INTERRUPT_MAX:
377 return AUDIO_IO_INTERRUPTED_BY_MEDIA;
381 static void __handle_safe_free(audio_io_s* handle, void *obj, bool is_output) {
382 VALID_POINTER_START(handle)
383 SAFE_FINALIZE(handle->audioIoHandle);
384 SAFE_DELETE(handle->audioIoHandle);
388 VALID_POINTER_START(obj)
390 *(audio_out_h *)obj = NULL;
392 *(audio_in_h *)obj = NULL;
397 * Implements CAPI functions
399 int cpp_audio_in_create(int sample_rate, audio_channel_e channel, audio_sample_type_e type, audio_in_h *input) {
400 audio_io_s* handle = NULL;
401 bool mic_enable = false;
405 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
406 "Parameters are NULL input:%p", input);
409 __check_audio_param(sample_rate, channel, type);
411 /* If MIC is not supported, return NOT_SUPPORTED error */
412 ret = system_info_get_platform_bool(FEATURE_MICROPHONE, &mic_enable);
413 AUDIO_IO_LOGD("system_info_platform [%s]=[%d], ret[%d]", FEATURE_MICROPHONE, mic_enable, ret);
414 if (ret != SYSTEM_INFO_ERROR_NONE || !mic_enable) {
415 THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_SUPPORTED, "System doesn't support microphone!");
418 handle = new audio_io_s;
420 CAudioInfo audioInfo = __generate_audio_input_info(sample_rate, channel, type);
422 handle->audioIoHandle = new CAudioInput(audioInfo);
424 handle->audioIoHandle->initialize();
427 } catch (CAudioError e) {
428 AUDIO_IO_LOGE("%s", e.getErrorMsg());
429 __handle_safe_free(handle, (void *)input, false);
430 return __convert_CAudioError(e);
431 } catch (std::bad_alloc&) {
432 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
433 AUDIO_IO_LOGE("Failed to allocate handle");
434 __handle_safe_free(handle, (void *)input, false);
435 return __convert_CAudioError(e);
438 return AUDIO_IO_ERROR_NONE;
441 int cpp_audio_in_create_loopback(int sample_rate, audio_channel_e channel, audio_sample_type_e type , audio_in_h* input) {
442 audio_io_s* handle = NULL;
445 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
446 "Parameters are NULL input:%p", input);
449 __check_audio_param(sample_rate, channel, type);
451 handle = new audio_io_s;
453 CAudioInfo audioInfo = __generate_audio_input_loopback_info(sample_rate, channel, type);
455 handle->audioIoHandle = new CAudioInput(audioInfo);
457 handle->audioIoHandle->initialize();
460 } catch (CAudioError e) {
461 AUDIO_IO_LOGE("%s", e.getErrorMsg());
462 __handle_safe_free(handle, (void *)input, false);
463 return __convert_CAudioError(e);
464 } catch (std::bad_alloc&) {
465 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
466 AUDIO_IO_LOGE("Failed to allocate handle");
467 __handle_safe_free(handle, (void *)input, false);
468 return __convert_CAudioError(e);
471 return AUDIO_IO_ERROR_NONE;
474 int cpp_audio_in_destroy(audio_in_h input) {
475 audio_io_s* handle = static_cast<audio_io_s*>(input);
478 if (handle == NULL) {
479 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
480 "Parameters are NULL input:%p", input);
482 assert(handle->audioIoHandle);
484 /* Internal unprepare for backward compatibility */
485 handle->audioIoHandle->unprepare();
487 SAFE_FINALIZE(handle->audioIoHandle);
488 SAFE_DELETE(handle->audioIoHandle);
490 } catch (CAudioError e) {
491 AUDIO_IO_LOGE("%s", e.getErrorMsg());
492 return __convert_CAudioError(e);
495 return AUDIO_IO_ERROR_NONE;
498 int cpp_audio_in_set_sound_stream_info(audio_in_h input, sound_stream_info_h stream_info) {
499 audio_io_s* handle = static_cast<audio_io_s*>(input);
502 if (handle == NULL || stream_info == NULL) {
503 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
504 "Parameters are NULL input:%p, stream_info:%p", input, stream_info);
506 assert(handle->audioIoHandle);
508 handle->audioIoHandle->setStreamInfo(stream_info);
509 } catch (CAudioError e) {
510 AUDIO_IO_LOGE("%s", e.getErrorMsg());
511 return __convert_CAudioError(e);
514 return AUDIO_IO_ERROR_NONE;
517 int cpp_audio_in_prepare(audio_in_h input) {
518 audio_io_s* handle = static_cast<audio_io_s*>(input);
521 if (handle == NULL) {
522 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
523 "Parameters are NULL input:%p", input);
525 assert(handle->audioIoHandle);
527 handle->audioIoHandle->prepare();
528 } catch (CAudioError e) {
529 AUDIO_IO_LOGE("%s", e.getErrorMsg());
530 return __convert_CAudioError(e);
533 return AUDIO_IO_ERROR_NONE;
536 int cpp_audio_in_unprepare(audio_in_h input) {
537 audio_io_s* handle = static_cast<audio_io_s*>(input);
540 if (handle == NULL) {
541 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
542 "Parameters are NULL input:%p", input);
544 assert(handle->audioIoHandle);
546 handle->audioIoHandle->unprepare();
547 } catch (CAudioError e) {
548 AUDIO_IO_LOGE("%s", e.getErrorMsg());
549 return __convert_CAudioError(e);
552 return AUDIO_IO_ERROR_NONE;
555 int cpp_audio_in_pause(audio_in_h input) {
556 audio_io_s* handle = static_cast<audio_io_s*>(input);
559 if (handle == NULL) {
560 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
561 "Parameters are NULL input:%p", input);
563 assert(handle->audioIoHandle);
565 handle->audioIoHandle->pause();
566 } catch (CAudioError e) {
567 AUDIO_IO_LOGE("%s", e.getErrorMsg());
568 return __convert_CAudioError(e);
571 return AUDIO_IO_ERROR_NONE;
574 int cpp_audio_in_resume(audio_in_h input) {
575 audio_io_s* handle = static_cast<audio_io_s*>(input);
578 if (handle == NULL) {
579 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
580 "Parameters are NULL input:%p", input);
582 assert(handle->audioIoHandle);
584 handle->audioIoHandle->resume();
585 } catch (CAudioError e) {
586 AUDIO_IO_LOGE("%s", e.getErrorMsg());
587 return __convert_CAudioError(e);
590 return AUDIO_IO_ERROR_NONE;
593 int cpp_audio_in_drain(audio_in_h input) {
594 audio_io_s* handle = static_cast<audio_io_s*>(input);
597 if (handle == NULL) {
598 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
599 "Parameters are NULL input:%p", input);
601 assert(handle->audioIoHandle);
603 handle->audioIoHandle->drain();
604 } catch (CAudioError e) {
605 AUDIO_IO_LOGE("%s", e.getErrorMsg());
606 return __convert_CAudioError(e);
609 return AUDIO_IO_ERROR_NONE;
612 int cpp_audio_in_flush(audio_in_h input) {
613 audio_io_s* handle = static_cast<audio_io_s*>(input);
616 if (handle == NULL) {
617 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
618 "Parameters are NULL input:%p", input);
620 assert(handle->audioIoHandle);
622 handle->audioIoHandle->flush();
623 } catch (CAudioError e) {
624 AUDIO_IO_LOGE("%s", e.getErrorMsg());
625 return __convert_CAudioError(e);
628 return AUDIO_IO_ERROR_NONE;
631 int cpp_audio_in_read(audio_in_h input, void *buffer, unsigned int length) {
632 audio_io_s* handle = static_cast<audio_io_s*>(input);
636 if (handle == NULL || buffer == NULL) {
637 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
638 "Parameters are NULL input:%p, buffer:%p", input, buffer);
640 assert(handle->audioIoHandle);
642 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
643 if (inputHandle == NULL) {
644 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
647 size_t readn = inputHandle->read(buffer, static_cast<size_t>(length));
648 ret = static_cast<int>(readn);
649 #ifdef _AUDIO_IO_DEBUG_TIMING_
650 AUDIO_IO_LOGD("readn:%d", readn);
652 } catch (CAudioError e) {
653 AUDIO_IO_LOGE("%s", e.getErrorMsg());
654 return __convert_CAudioError(e);
660 int cpp_audio_in_get_buffer_size(audio_in_h input, int *size) {
661 audio_io_s* handle = static_cast<audio_io_s*>(input);
664 if (handle == NULL || size == NULL) {
665 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
666 "Parameters are NULL input:%p, size:%p", input, size);
668 assert(handle->audioIoHandle);
670 CAudioIO* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
671 if (inputHandle == NULL) {
672 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
674 *size = inputHandle->getBufferSize();
675 } catch (CAudioError e) {
676 AUDIO_IO_LOGE("%s", e.getErrorMsg());
677 return __convert_CAudioError(e);
680 return AUDIO_IO_ERROR_NONE;
683 int cpp_audio_in_get_sample_rate(audio_in_h input, int *sample_rate) {
684 audio_io_s* handle = static_cast<audio_io_s*>(input);
687 if (handle == NULL || sample_rate == NULL) {
688 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
689 "Parameters are NULL input:%p, sample_rate:%p", input, sample_rate);
691 assert(handle->audioIoHandle);
693 *sample_rate = handle->audioIoHandle->getAudioInfo().getSampleRate();
694 } catch (CAudioError e) {
695 AUDIO_IO_LOGE("%s", e.getErrorMsg());
696 return __convert_CAudioError(e);
699 return AUDIO_IO_ERROR_NONE;
702 int cpp_audio_in_get_channel(audio_in_h input, audio_channel_e *channel) {
703 audio_io_s* handle = static_cast<audio_io_s*>(input);
706 if (handle == NULL || channel == NULL) {
707 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
708 "Parameters are NULL input:%p, channel:%p", input, channel);
710 assert(handle->audioIoHandle);
712 const CAudioInfo::EChannel srcChannel = handle->audioIoHandle->getAudioInfo().getChannel();
713 audio_channel_e dstChannel = AUDIO_CHANNEL_MONO;
714 __convert_audio_info_channel_2_channel(srcChannel, dstChannel);
716 *channel = dstChannel;
717 } catch (CAudioError e) {
718 AUDIO_IO_LOGE("%s", e.getErrorMsg());
719 return __convert_CAudioError(e);
722 return AUDIO_IO_ERROR_NONE;
725 int cpp_audio_in_get_sample_type(audio_in_h input, audio_sample_type_e *type) {
726 audio_io_s* handle = static_cast<audio_io_s*>(input);
729 if (handle == NULL || type == NULL) {
730 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
731 "Parameters are NULL input:%p, type:%p", input, type);
733 assert(handle->audioIoHandle);
735 const CAudioInfo::ESampleType srcSampleType = handle->audioIoHandle->getAudioInfo().getSampleType();
736 audio_sample_type_e dstSampleType = AUDIO_SAMPLE_TYPE_U8;
737 __convert_audio_info_sample_type_2_sample_type(srcSampleType, dstSampleType);
739 *type = dstSampleType;
740 } catch (CAudioError e) {
741 AUDIO_IO_LOGE("%s", e.getErrorMsg());
742 return __convert_CAudioError(e);
745 return AUDIO_IO_ERROR_NONE;
748 static void __interrupt_cb_internal(IAudioSessionEventListener::EInterruptCode _code, void* user_data) {
749 audio_io_s* handle = static_cast<audio_io_s*>(user_data);
750 audio_io_interrupted_code_e code = __convert_interrupted_code(_code);
754 if (handle->interrupt_callback.onInterrupt) {
755 handle->interrupt_callback.onInterrupt(code, handle->interrupt_callback.user_data);
759 int cpp_audio_in_set_interrupted_cb(audio_in_h input, audio_io_interrupted_cb callback, void *user_data) {
760 audio_io_s* handle = static_cast<audio_io_s*>(input);
763 if (handle == NULL || callback == NULL) {
764 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
765 "Parameters are NULL input:%p, callback:%p", input, callback);
767 assert(handle->audioIoHandle);
769 handle->interrupt_callback.onInterrupt = callback;
770 handle->interrupt_callback.user_data = user_data;
772 CAudioIO::SInterruptCallback cb = handle->audioIoHandle->getInterruptCallback();
773 cb.mUserData = static_cast<void*>(handle);
774 cb.onInterrupt = __interrupt_cb_internal;
776 handle->audioIoHandle->setInterruptCallback(cb);
777 } catch (CAudioError e) {
778 AUDIO_IO_LOGE("%s", e.getErrorMsg());
779 return __convert_CAudioError(e);
782 return AUDIO_IO_ERROR_NONE;
785 int cpp_audio_in_unset_interrupted_cb(audio_in_h input) {
786 audio_io_s* handle = static_cast<audio_io_s*>(input);
789 if (handle == NULL) {
790 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
791 "Parameters are NULL input:%p", input);
793 assert(handle->audioIoHandle);
795 handle->interrupt_callback.onInterrupt = NULL;
796 handle->interrupt_callback.user_data = NULL;
798 CAudioIO::SInterruptCallback cb = handle->audioIoHandle->getInterruptCallback();
800 cb.onInterrupt = NULL;
802 handle->audioIoHandle->setInterruptCallback(cb);
803 } catch (CAudioError e) {
804 AUDIO_IO_LOGE("%s", e.getErrorMsg());
805 return __convert_CAudioError(e);
808 return AUDIO_IO_ERROR_NONE;
811 int cpp_audio_in_ignore_session(audio_in_h input) {
812 audio_io_s* handle = static_cast<audio_io_s*>(input);
815 if (handle == NULL) {
816 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
817 "Parameters are NULL input:%p", input);
820 if (handle->stream_callback.onStream) {
821 THROW_ERROR_MSG(CAudioError::EError::ERROR_INVALID_OPERATION,
822 "Not support ignore session in async mode");
824 assert(handle->audioIoHandle);
826 handle->audioIoHandle->ignoreSession();
827 } catch (CAudioError e) {
828 AUDIO_IO_LOGE("%s", e.getErrorMsg());
829 return __convert_CAudioError(e);
832 return AUDIO_IO_ERROR_NONE;
835 static void __stream_cb_internal(size_t nbytes, void *user_data) {
836 audio_io_s* audioIo = static_cast<audio_io_s*>(user_data);
839 if (audioIo->stream_callback.onStream) {
840 audioIo->stream_callback.onStream(audioIo, nbytes, audioIo->stream_callback.user_data);
844 static void __state_changed_cb_internal(CAudioInfo::EAudioIOState state,
845 CAudioInfo::EAudioIOState state_prev,
848 audio_io_s* audioIo = static_cast<audio_io_s*>(user_data);
851 if (audioIo->state_changed_callback.onStateChanged) {
852 audioIo->state_changed_callback.onStateChanged(audioIo, __convert_state_type(state_prev),
853 __convert_state_type(state), by_policy,
854 audioIo->state_changed_callback.user_data);
858 int cpp_audio_in_set_stream_cb(audio_in_h input, audio_in_stream_cb callback, void* user_data) {
859 audio_io_s* handle = static_cast<audio_io_s*>(input);
862 if (handle == NULL || callback == NULL) {
863 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
864 "Parameters are NULL input:%p, callback:%p", input, callback);
866 assert(handle->audioIoHandle);
868 handle->stream_callback.onStream = callback;
869 handle->stream_callback.user_data = user_data;
871 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
872 cb.mUserData = static_cast<void*>(handle);
873 cb.onStream = __stream_cb_internal;
875 handle->audioIoHandle->setStreamCallback(cb);
876 } catch (CAudioError e) {
877 AUDIO_IO_LOGE("%s", e.getErrorMsg());
878 return __convert_CAudioError(e);
881 return AUDIO_IO_ERROR_NONE;
884 int cpp_audio_in_unset_stream_cb(audio_in_h input) {
885 audio_io_s* handle = static_cast<audio_io_s*>(input);
888 if (handle == NULL) {
889 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
890 "Parameters are NULL input:%p", input);
892 assert(handle->audioIoHandle);
894 handle->stream_callback.onStream = NULL;
895 handle->stream_callback.user_data = NULL;
897 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
901 handle->audioIoHandle->setStreamCallback(cb);
902 } catch (CAudioError e) {
903 AUDIO_IO_LOGE("%s", e.getErrorMsg());
904 return __convert_CAudioError(e);
907 return AUDIO_IO_ERROR_NONE;
910 int cpp_audio_in_peek(audio_in_h input, const void **buffer, unsigned int *length) {
911 audio_io_s* handle = static_cast<audio_io_s*>(input);
915 if (handle == NULL || buffer == NULL) {
916 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
917 "Parameters are NULL input:%p, buffer:%p", input, buffer);
920 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
921 if (inputHandle == NULL) {
922 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
925 inputHandle->peek(buffer, &_length);
926 } catch (CAudioError e) {
927 AUDIO_IO_LOGE("%s", e.getErrorMsg());
928 return __convert_CAudioError(e);
931 *length = (unsigned int)_length;
933 return AUDIO_IO_ERROR_NONE;
936 int cpp_audio_in_drop(audio_in_h input) {
937 audio_io_s* handle = static_cast<audio_io_s*>(input);
940 if (handle == NULL) {
941 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
942 "Parameters are NULL input:%p", input);
945 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
946 if (inputHandle == NULL) {
947 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
951 } catch (CAudioError e) {
952 AUDIO_IO_LOGE("%s", e.getErrorMsg());
953 return __convert_CAudioError(e);
956 return AUDIO_IO_ERROR_NONE;
959 int cpp_audio_in_set_state_changed_cb(audio_in_h input, audio_in_state_changed_cb callback, void* user_data) {
960 audio_io_s* handle = static_cast<audio_io_s*>(input);
963 if (handle == NULL || callback == NULL) {
964 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
965 "Parameters are NULL input:%p, callback:%p", input, callback);
967 assert(handle->audioIoHandle);
969 handle->state_changed_callback.onStateChanged = callback;
970 handle->state_changed_callback.user_data = user_data;
972 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
973 cb.mUserData = static_cast<void*>(handle);
974 cb.onStateChanged = __state_changed_cb_internal;
976 handle->audioIoHandle->setStateChangedCallback(cb);
977 } catch (CAudioError e) {
978 AUDIO_IO_LOGE("%s", e.getErrorMsg());
979 return __convert_CAudioError(e);
982 return AUDIO_IO_ERROR_NONE;
985 int cpp_audio_in_unset_state_changed_cb(audio_in_h input) {
986 audio_io_s* handle = static_cast<audio_io_s*>(input);
989 if (handle == NULL) {
990 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
991 "Parameters are NULL output:%p", input);
993 assert(handle->audioIoHandle);
995 handle->state_changed_callback.onStateChanged = NULL;
996 handle->state_changed_callback.user_data = NULL;
998 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
1000 cb.onStateChanged = NULL;
1002 handle->audioIoHandle->setStateChangedCallback(cb);
1003 } catch (CAudioError e) {
1004 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1005 return __convert_CAudioError(e);
1008 return AUDIO_IO_ERROR_NONE;
1015 int cpp_audio_out_create(int sample_rate, audio_channel_e channel, audio_sample_type_e type, sound_type_e sound_type, audio_out_h *output) {
1016 audio_io_s* handle = NULL;
1018 if (output == NULL) {
1019 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1020 "Parameters are NULL output:%p", output);
1023 __check_audio_param(sample_rate, channel, type, sound_type);
1025 handle = new audio_io_s;
1027 CAudioInfo audioInfo = __generate_audio_output_info(sample_rate, channel, type, sound_type);
1029 handle->audioIoHandle = new CAudioOutput(audioInfo);
1031 handle->audioIoHandle->initialize();
1034 } catch (CAudioError e) {
1035 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1036 __handle_safe_free(handle, (void *)output, true);
1037 return __convert_CAudioError(e);
1038 } catch (std::bad_alloc&) {
1039 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
1040 AUDIO_IO_LOGE("Failed to allocate handle");
1041 __handle_safe_free(handle, (void *)output, true);
1042 return __convert_CAudioError(e);
1045 return AUDIO_IO_ERROR_NONE;
1048 int cpp_audio_out_create_new(int sample_rate, audio_channel_e channel, audio_sample_type_e type, audio_out_h *output) {
1049 audio_io_s* handle = NULL;
1051 if (output == NULL) {
1052 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1053 "Parameters are NULL output:%p", output);
1056 __check_audio_param(sample_rate, channel, type, SOUND_TYPE_SYSTEM /*default check */);
1058 handle = new audio_io_s;
1060 CAudioInfo audioInfo = __generate_audio_output_info(sample_rate, channel, type, SOUND_TYPE_MEDIA);
1062 handle->audioIoHandle = new CAudioOutput(audioInfo);
1064 handle->audioIoHandle->initialize();
1067 } catch (CAudioError e) {
1068 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1069 __handle_safe_free(handle, (void *)output, true);
1070 return __convert_CAudioError(e);
1071 } catch (std::bad_alloc&) {
1072 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
1073 AUDIO_IO_LOGE("Failed to allocate handle");
1074 __handle_safe_free(handle, (void *)output, true);
1075 return __convert_CAudioError(e);
1078 return AUDIO_IO_ERROR_NONE;
1081 int cpp_audio_out_destroy(audio_out_h output) {
1082 audio_io_s* handle = static_cast<audio_io_s*>(output);
1085 if (handle == NULL) {
1086 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1087 "Parameter is NULL output:%p", output);
1089 assert(handle->audioIoHandle);
1091 /* Internal unprepare for backward compatibility */
1092 handle->audioIoHandle->unprepare();
1094 SAFE_FINALIZE(handle->audioIoHandle);
1095 SAFE_DELETE(handle->audioIoHandle);
1096 SAFE_DELETE(handle);
1097 } catch (CAudioError e) {
1098 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1099 return __convert_CAudioError(e);
1102 return AUDIO_IO_ERROR_NONE;
1105 int cpp_audio_out_set_sound_stream_info(audio_out_h output, sound_stream_info_h stream_info) {
1106 audio_io_s* handle = static_cast<audio_io_s*>(output);
1109 if (handle == NULL || stream_info == NULL) {
1110 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1111 "Parameters are NULL output:%p, stream_info:%p", output, stream_info);
1113 assert(handle->audioIoHandle);
1115 handle->audioIoHandle->setStreamInfo(stream_info);
1116 } catch (CAudioError e) {
1117 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1118 return __convert_CAudioError(e);
1121 return AUDIO_IO_ERROR_NONE;
1124 int cpp_audio_out_prepare(audio_out_h output) {
1125 audio_io_s* handle = static_cast<audio_io_s*>(output);
1128 if (handle == NULL) {
1129 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1130 "Parameter is NULL output:%p", output);
1132 assert(handle->audioIoHandle);
1134 handle->audioIoHandle->prepare();
1135 } catch (CAudioError e) {
1136 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1137 return __convert_CAudioError(e);
1140 return AUDIO_IO_ERROR_NONE;
1143 int cpp_audio_out_unprepare(audio_out_h output) {
1144 audio_io_s* handle = static_cast<audio_io_s*>(output);
1147 if (handle == NULL) {
1148 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1149 "Parameter is NULL output:%p", output);
1151 assert(handle->audioIoHandle);
1153 handle->audioIoHandle->unprepare();
1154 } catch (CAudioError e) {
1155 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1156 return __convert_CAudioError(e);
1159 return AUDIO_IO_ERROR_NONE;
1162 int cpp_audio_out_pause(audio_out_h output) {
1163 audio_io_s* handle = static_cast<audio_io_s*>(output);
1166 if (handle == NULL) {
1167 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1168 "Parameter is NULL output:%p", output);
1170 assert(handle->audioIoHandle);
1172 handle->audioIoHandle->pause();
1173 } catch (CAudioError e) {
1174 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1175 return __convert_CAudioError(e);
1178 return AUDIO_IO_ERROR_NONE;
1181 int cpp_audio_out_resume(audio_out_h output) {
1182 audio_io_s* handle = static_cast<audio_io_s*>(output);
1185 if (handle == NULL) {
1186 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1187 "Parameter is NULL output:%p", output);
1189 assert(handle->audioIoHandle);
1191 handle->audioIoHandle->resume();
1192 } catch (CAudioError e) {
1193 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1194 return __convert_CAudioError(e);
1197 return AUDIO_IO_ERROR_NONE;
1200 int cpp_audio_out_drain(audio_out_h output) {
1201 audio_io_s* handle = static_cast<audio_io_s*>(output);
1204 if (handle == NULL) {
1205 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1206 "Parameter is NULL output:%p", output);
1208 assert(handle->audioIoHandle);
1210 handle->audioIoHandle->drain();
1211 } catch (CAudioError e) {
1212 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1213 return __convert_CAudioError(e);
1216 return AUDIO_IO_ERROR_NONE;
1219 int cpp_audio_out_flush(audio_out_h output) {
1220 audio_io_s* handle = static_cast<audio_io_s*>(output);
1223 if (handle == NULL) {
1224 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1225 "Parameter is NULL output:%p", output);
1227 assert(handle->audioIoHandle);
1229 handle->audioIoHandle->flush();
1230 } catch (CAudioError e) {
1231 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1232 return __convert_CAudioError(e);
1235 return AUDIO_IO_ERROR_NONE;
1238 int cpp_audio_out_write(audio_out_h output, void *buffer, unsigned int length) {
1239 audio_io_s* handle = static_cast<audio_io_s*>(output);
1243 if (handle == NULL || buffer == NULL) {
1244 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1245 "Parameter is NULL output:%p, buffer:%p", output, buffer);
1247 assert(handle->audioIoHandle);
1249 CAudioOutput* outputHandle = static_cast<CAudioOutput*>(handle->audioIoHandle);
1250 if (outputHandle == NULL) {
1251 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
1254 size_t written = outputHandle->write(buffer, static_cast<size_t>(length));
1255 ret = static_cast<int>(written);
1256 #ifdef _AUDIO_IO_DEBUG_TIMING_
1257 AUDIO_IO_LOGD("written:%d", written);
1259 } catch (CAudioError e) {
1260 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1261 return __convert_CAudioError(e);
1267 int cpp_audio_out_get_buffer_size(audio_out_h output, int *size) {
1268 audio_io_s* handle = static_cast<audio_io_s*>(output);
1271 if (handle == NULL || size == NULL) {
1272 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1273 "Parameters are NULL output:%p, size:%p", output, size);
1275 assert(handle->audioIoHandle);
1277 CAudioOutput* outputHandle = static_cast<CAudioOutput*>(handle->audioIoHandle);
1278 if (outputHandle == NULL) {
1279 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
1281 *size = outputHandle->getBufferSize();
1282 } catch (CAudioError e) {
1283 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1284 return __convert_CAudioError(e);
1287 return AUDIO_IO_ERROR_NONE;
1290 int cpp_audio_out_get_sample_rate(audio_out_h output, int *sample_rate) {
1291 audio_io_s* handle = static_cast<audio_io_s*>(output);
1294 if (handle == NULL || sample_rate == NULL) {
1295 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1296 "Parameters are NULL output:%p, sample_rate:%p", output, sample_rate);
1298 assert(handle->audioIoHandle);
1300 *sample_rate = handle->audioIoHandle->getAudioInfo().getSampleRate();
1301 } catch (CAudioError e) {
1302 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1303 return __convert_CAudioError(e);
1306 return AUDIO_IO_ERROR_NONE;
1309 int cpp_audio_out_get_channel(audio_out_h output, audio_channel_e *channel) {
1310 audio_io_s* handle = static_cast<audio_io_s*>(output);
1313 if (handle == NULL || channel == NULL) {
1314 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1315 "Parameters are NULL output:%p, channel:%p", output, channel);
1317 assert(handle->audioIoHandle);
1319 const CAudioInfo::EChannel srcChannel = handle->audioIoHandle->getAudioInfo().getChannel();
1320 audio_channel_e dstChannel = AUDIO_CHANNEL_MONO;
1321 __convert_audio_info_channel_2_channel(srcChannel, dstChannel);
1323 *channel = dstChannel;
1324 } catch (CAudioError e) {
1325 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1326 return __convert_CAudioError(e);
1329 return AUDIO_IO_ERROR_NONE;
1332 int cpp_audio_out_get_sample_type(audio_out_h output, audio_sample_type_e *type) {
1333 audio_io_s* handle = static_cast<audio_io_s*>(output);
1336 if (handle == NULL || type == NULL) {
1337 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1338 "Parameters are NULL output:%p, type:%p", output, type);
1340 assert(handle->audioIoHandle);
1342 const CAudioInfo::ESampleType srcSampleType = handle->audioIoHandle->getAudioInfo().getSampleType();
1343 audio_sample_type_e dstSampleType = AUDIO_SAMPLE_TYPE_U8;
1344 __convert_audio_info_sample_type_2_sample_type(srcSampleType, dstSampleType);
1346 *type = dstSampleType;
1347 } catch (CAudioError e) {
1348 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1349 return __convert_CAudioError(e);
1352 return AUDIO_IO_ERROR_NONE;
1355 int cpp_audio_out_get_sound_type(audio_out_h output, sound_type_e *type) {
1356 audio_io_s* handle = static_cast<audio_io_s*>(output);
1359 if (handle == NULL || type == NULL) {
1360 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1361 "Parameters are NULL output:%p, type:%p", output, type);
1363 assert(handle->audioIoHandle);
1365 const CAudioInfo::EAudioType srcAudioType = handle->audioIoHandle->getAudioInfo().getAudioType();
1366 sound_type_e dstSoundType = SOUND_TYPE_MEDIA;
1367 __convert_audio_info_audio_type_2_sound_type(srcAudioType, dstSoundType);
1369 *type = dstSoundType;
1370 } catch (CAudioError e) {
1371 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1372 return __convert_CAudioError(e);
1375 return AUDIO_IO_ERROR_NONE;
1378 int cpp_audio_out_set_interrupted_cb(audio_out_h output, audio_io_interrupted_cb callback, void *user_data) {
1379 audio_io_s* handle = static_cast<audio_io_s*>(output);
1382 if (handle == NULL || callback == NULL) {
1383 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1384 "Parameters are NULL output:%p, callback:%p", output, callback);
1386 assert(handle->audioIoHandle);
1388 handle->interrupt_callback.onInterrupt = callback;
1389 handle->interrupt_callback.user_data = user_data;
1391 CAudioIO::SInterruptCallback cb = handle->audioIoHandle->getInterruptCallback();
1392 cb.mUserData = static_cast<void*>(handle);
1393 cb.onInterrupt = __interrupt_cb_internal;
1395 handle->audioIoHandle->setInterruptCallback(cb);
1396 } catch (CAudioError e) {
1397 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1398 return __convert_CAudioError(e);
1401 return AUDIO_IO_ERROR_NONE;
1404 int cpp_audio_out_unset_interrupted_cb(audio_out_h output) {
1405 audio_io_s* handle = static_cast<audio_io_s*>(output);
1408 if (handle == NULL) {
1409 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1410 "Parameters are NULL output:%p", output);
1412 assert(handle->audioIoHandle);
1414 handle->interrupt_callback.onInterrupt = NULL;
1415 handle->interrupt_callback.user_data = NULL;
1417 CAudioIO::SInterruptCallback cb = handle->audioIoHandle->getInterruptCallback();
1418 cb.mUserData = NULL;
1419 cb.onInterrupt = NULL;
1421 handle->audioIoHandle->setInterruptCallback(cb);
1422 } catch (CAudioError e) {
1423 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1424 return __convert_CAudioError(e);
1427 return AUDIO_IO_ERROR_NONE;
1430 int cpp_audio_out_ignore_session(audio_out_h output) {
1431 audio_io_s* handle = static_cast<audio_io_s*>(output);
1434 if (handle == NULL) {
1435 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1436 "Parameters are NULL output:%p", output);
1439 if (handle->stream_callback.onStream) {
1440 THROW_ERROR_MSG(CAudioError::EError::ERROR_INVALID_OPERATION,
1441 "Not support ignore session in async mode");
1443 assert(handle->audioIoHandle);
1445 handle->audioIoHandle->ignoreSession();
1446 } catch (CAudioError e) {
1447 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1448 return __convert_CAudioError(e);
1451 return AUDIO_IO_ERROR_NONE;
1454 int cpp_audio_out_set_stream_cb(audio_out_h output, audio_out_stream_cb callback, void* user_data) {
1455 audio_io_s* handle = static_cast<audio_io_s*>(output);
1458 if (handle == NULL || callback == NULL) {
1459 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1460 "Parameters are NULL output:%p, callback:%p", output, callback);
1462 assert(handle->audioIoHandle);
1464 handle->stream_callback.onStream = callback;
1465 handle->stream_callback.user_data = user_data;
1467 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
1468 cb.mUserData = static_cast<void*>(handle);
1469 cb.onStream = __stream_cb_internal;
1471 handle->audioIoHandle->setStreamCallback(cb);
1472 } catch (CAudioError e) {
1473 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1474 return __convert_CAudioError(e);
1477 return AUDIO_IO_ERROR_NONE;
1480 int cpp_audio_out_unset_stream_cb(audio_out_h output) {
1481 audio_io_s* handle = static_cast<audio_io_s*>(output);
1484 if (handle == NULL) {
1485 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1486 "Parameters are NULL output:%p", output);
1488 assert(handle->audioIoHandle);
1490 handle->stream_callback.onStream = NULL;
1491 handle->stream_callback.user_data = NULL;
1493 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
1494 cb.mUserData = NULL;
1497 handle->audioIoHandle->setStreamCallback(cb);
1498 } catch (CAudioError e) {
1499 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1500 return __convert_CAudioError(e);
1503 return AUDIO_IO_ERROR_NONE;
1506 int cpp_audio_out_set_state_changed_cb(audio_out_h output, audio_in_state_changed_cb callback, void* user_data) {
1507 audio_io_s* handle = static_cast<audio_io_s*>(output);
1510 if (handle == NULL || callback == NULL) {
1511 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1512 "Parameters are NULL output:%p, callback:%p", output, callback);
1514 assert(handle->audioIoHandle);
1516 handle->state_changed_callback.onStateChanged = callback;
1517 handle->state_changed_callback.user_data = user_data;
1519 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
1520 cb.mUserData = static_cast<void*>(handle);
1521 cb.onStateChanged = __state_changed_cb_internal;
1523 handle->audioIoHandle->setStateChangedCallback(cb);
1524 } catch (CAudioError e) {
1525 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1526 return __convert_CAudioError(e);
1529 return AUDIO_IO_ERROR_NONE;
1532 int cpp_audio_out_unset_state_changed_cb(audio_out_h output) {
1533 audio_io_s* handle = static_cast<audio_io_s*>(output);
1536 if (handle == NULL) {
1537 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1538 "Parameters are NULL output:%p", output);
1540 assert(handle->audioIoHandle);
1542 handle->state_changed_callback.onStateChanged = NULL;
1543 handle->state_changed_callback.user_data = NULL;
1545 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
1546 cb.mUserData = NULL;
1547 cb.onStateChanged = NULL;
1549 handle->audioIoHandle->setStateChangedCallback(cb);
1550 } catch (CAudioError e) {
1551 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1552 return __convert_CAudioError(e);
1555 return AUDIO_IO_ERROR_NONE;