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"
22 #include "CAudioIODef.h"
24 #include <system_info.h>
26 #define FEATURE_MICROPHONE "http://tizen.org/feature/microphone"
29 using namespace tizen_media_audio;
34 * Name : audio_io_stream_cb_s
35 * Declaration : Keeps user callback pointer and user data for delivering an stream event
37 typedef struct audio_io_stream_cb_s {
39 audio_in_stream_cb onStream;
41 audio_io_stream_cb_s() : user_data(NULL), onStream(NULL)
43 } audio_io_stream_cb_s;
48 * Name : audio_io_state_changed_cb_s
49 * Declaration : Keeps user callback pointer and user data for delivering an state changed event
51 typedef struct audio_io_state_changed_cb_s {
53 audio_in_state_changed_cb onStateChanged;
55 audio_io_state_changed_cb_s() : user_data(NULL), onStateChanged(NULL)
57 } audio_io_state_changed_cb_s;
63 * Declaration : An handle of AudioIO
64 * The handle has two struct for user callback
65 * And the handle has a pointer of private audioIO object
66 * The CAudioIO is a abstract class object about Input and Output
68 typedef struct audio_io_s {
69 CAudioIO* audioIoHandle;
70 audio_io_stream_cb_s stream_callback;
71 audio_io_state_changed_cb_s state_changed_callback;
73 audio_io_s() : audioIoHandle(NULL)
81 static audio_io_error_e __convert_CAudioError(CAudioError& error) {
82 audio_io_error_e ret = AUDIO_IO_ERROR_NONE;
83 CAudioError::EError err = error.getError();
86 case CAudioError::EError::ERROR_NONE:
87 ret = AUDIO_IO_ERROR_NONE;
89 case CAudioError::EError::ERROR_INVALID_ARGUMENT:
90 case CAudioError::EError::ERROR_INVALID_HANDLE:
91 case CAudioError::EError::ERROR_INVALID_SAMPLERATE:
92 case CAudioError::EError::ERROR_INVALID_CHANNEL:
93 case CAudioError::EError::ERROR_INVALID_FORMAT:
94 ret = AUDIO_IO_ERROR_INVALID_PARAMETER;
96 case CAudioError::EError::ERROR_DEVICE_NOT_OPENED:
97 ret = AUDIO_IO_ERROR_DEVICE_NOT_OPENED;
99 case CAudioError::EError::ERROR_DEVICE_NOT_CLOSED:
100 ret = AUDIO_IO_ERROR_DEVICE_NOT_CLOSED;
102 case CAudioError::EError::ERROR_PERMISSION_DENIED:
103 ret = AUDIO_IO_ERROR_PERMISSION_DENIED;
105 case CAudioError::EError::ERROR_DEVICE_POLICY_RESTRICTION:
106 ret = AUDIO_IO_ERROR_DEVICE_POLICY_RESTRICTION;
108 case CAudioError::EError::ERROR_NOT_SUPPORTED:
109 ret = AUDIO_IO_ERROR_NOT_SUPPORTED;
111 case CAudioError::EError::ERROR_NOT_SUPPORTED_TYPE:
112 ret = AUDIO_IO_ERROR_NOT_SUPPORTED_TYPE;
114 case CAudioError::EError::ERROR_MAX:
115 case CAudioError::EError::ERROR_INTERNAL_OPERATION:
116 case CAudioError::EError::ERROR_NOT_INITIALIZED:
117 case CAudioError::EError::ERROR_FAILED_OPERATION:
118 case CAudioError::EError::ERROR_INVALID_OPERATION:
119 ret = AUDIO_IO_ERROR_INVALID_OPERATION;
121 case CAudioError::EError::ERROR_INVALID_STATE:
122 ret = AUDIO_IO_ERROR_INVALID_STATE;
124 case CAudioError::EError::ERROR_OUT_OF_MEMORY:
125 case CAudioError::EError::ERROR_INVALID_POINTER:
126 ret = AUDIO_IO_ERROR_INVALID_BUFFER;
128 case CAudioError::EError::ERROR_POLICY_BLOCKED:
129 case CAudioError::EError::ERROR_POLICY_INTERRUPTED:
130 case CAudioError::EError::ERROR_POLICY_DUPLICATED:
131 ret = AUDIO_IO_ERROR_SOUND_POLICY;
138 static void __convert_channel_2_audio_info_channel(const audio_channel_e& src_channel,
139 CAudioInfo::EChannel& dst_channel) {
140 switch (src_channel) {
141 case AUDIO_CHANNEL_MONO:
142 dst_channel = CAudioInfo::EChannel::CHANNEL_MONO;
144 case AUDIO_CHANNEL_STEREO:
145 dst_channel = CAudioInfo::EChannel::CHANNEL_STEREO;
148 dst_channel = CAudioInfo::EChannel::CHANNEL_MONO;
153 static void __convert_audio_info_channel_2_channel(const CAudioInfo::EChannel& src_channel,
154 audio_channel_e& dst_channel) {
155 switch (src_channel) {
156 case CAudioInfo::EChannel::CHANNEL_MONO:
157 dst_channel = AUDIO_CHANNEL_MONO;
159 case CAudioInfo::EChannel::CHANNEL_STEREO:
160 dst_channel = AUDIO_CHANNEL_STEREO;
163 dst_channel = AUDIO_CHANNEL_MONO;
168 static void __convert_sample_type_2_audio_info_sample_type(const audio_sample_type_e& src_type,
169 CAudioInfo::ESampleType& dst_type) {
171 case AUDIO_SAMPLE_TYPE_U8:
172 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_U8;
174 case AUDIO_SAMPLE_TYPE_S16_LE:
175 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE;
177 case AUDIO_SAMPLE_TYPE_S24_LE:
178 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE;
180 case AUDIO_SAMPLE_TYPE_S24_32_LE:
181 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE;
184 dst_type = CAudioInfo::ESampleType::SAMPLE_TYPE_U8;
189 static void __convert_audio_info_sample_type_2_sample_type(const CAudioInfo::ESampleType& src_type,
190 audio_sample_type_e& dst_type) {
192 case CAudioInfo::ESampleType::SAMPLE_TYPE_U8:
193 dst_type = AUDIO_SAMPLE_TYPE_U8;
195 case CAudioInfo::ESampleType::SAMPLE_TYPE_S16_LE:
196 dst_type = AUDIO_SAMPLE_TYPE_S16_LE;
198 case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_LE:
199 dst_type = AUDIO_SAMPLE_TYPE_S24_LE;
201 case CAudioInfo::ESampleType::SAMPLE_TYPE_S24_32_LE:
202 dst_type = AUDIO_SAMPLE_TYPE_S24_32_LE;
205 dst_type = AUDIO_SAMPLE_TYPE_U8;
210 static void __convert_sound_type_2_audio_info_audio_type(const sound_type_e& src_type,
211 CAudioInfo::EAudioType& dst_type) {
213 case SOUND_TYPE_SYSTEM:
214 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM;
216 case SOUND_TYPE_NOTIFICATION:
217 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_NOTIFICATION;
219 case SOUND_TYPE_ALARM:
220 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_ALARM;
222 case SOUND_TYPE_RINGTONE:
223 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_RINGTONE_VOIP;
225 case SOUND_TYPE_MEDIA:
226 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA;
228 case SOUND_TYPE_CALL:
229 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM;
231 case SOUND_TYPE_VOIP:
232 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOIP;
234 case SOUND_TYPE_VOICE:
235 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOICE_INFORMATION;
238 dst_type = CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA;
243 static void __convert_audio_info_audio_type_2_sound_type(const CAudioInfo::EAudioType& src_type,
244 sound_type_e& dst_type) {
246 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_MEDIA:
247 dst_type = SOUND_TYPE_MEDIA;
249 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_SYSTEM:
250 dst_type = SOUND_TYPE_SYSTEM;
252 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_ALARM:
253 dst_type = SOUND_TYPE_ALARM;
255 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_NOTIFICATION:
256 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_EMERGENCY:
257 dst_type = SOUND_TYPE_NOTIFICATION;
259 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOICE_INFORMATION:
260 dst_type = SOUND_TYPE_VOICE;
262 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_RINGTONE_VOIP:
263 dst_type = SOUND_TYPE_RINGTONE;
265 case CAudioInfo::EAudioType::AUDIO_OUT_TYPE_VOIP:
266 dst_type = SOUND_TYPE_VOIP;
269 dst_type = SOUND_TYPE_MEDIA;
274 static audio_io_state_e __convert_state_type(const CAudioInfo::EAudioIOState src_state) {
275 audio_io_state_e dst_state;
278 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_NONE:
279 dst_state = AUDIO_IO_STATE_IDLE;
281 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE:
282 dst_state = AUDIO_IO_STATE_IDLE;
284 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING:
285 dst_state = AUDIO_IO_STATE_RUNNING;
287 case CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED:
288 dst_state = AUDIO_IO_STATE_PAUSED;
291 dst_state = AUDIO_IO_STATE_IDLE;
297 static void __check_audio_param(int sample_rate, audio_channel_e channel, audio_sample_type_e type) {
299 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sample rate :%d", sample_rate);
301 if (channel != AUDIO_CHANNEL_MONO && channel != AUDIO_CHANNEL_STEREO)
302 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid channel :%d", channel);
304 if (type != AUDIO_SAMPLE_TYPE_U8 &&
305 type != AUDIO_SAMPLE_TYPE_S16_LE &&
306 type != AUDIO_SAMPLE_TYPE_S24_LE &&
307 type != AUDIO_SAMPLE_TYPE_S24_32_LE)
308 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sample type :%d", type);
311 static void __check_audio_param(int sample_rate, audio_channel_e channel, audio_sample_type_e type, sound_type_e sound_type) {
312 __check_audio_param(sample_rate, channel, type);
314 if (sound_type < SOUND_TYPE_SYSTEM || sound_type > SOUND_TYPE_VOICE)
315 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT, "Invalid sound type : %d", sound_type);
318 static CAudioInfo __generate_audio_input_info(int sampleRate, audio_channel_e channel, audio_sample_type_e sample_type) {
319 CAudioInfo::EChannel dstChannel;
320 CAudioInfo::ESampleType dstSampleType;
321 CAudioInfo::EAudioType dstAudioType = CAudioInfo::EAudioType::AUDIO_IN_TYPE_MEDIA;
323 __convert_channel_2_audio_info_channel(channel, dstChannel);
324 __convert_sample_type_2_audio_info_sample_type(sample_type, dstSampleType);
326 return CAudioInfo(sampleRate, dstChannel, dstSampleType, dstAudioType, -1);
329 static CAudioInfo __generate_audio_output_info(int sampleRate, audio_channel_e channel, audio_sample_type_e sample_type, sound_type_e sound_type) {
330 CAudioInfo::EChannel dstChannel;
331 CAudioInfo::ESampleType dstSampleType;
332 CAudioInfo::EAudioType dstAudioType;
334 __convert_channel_2_audio_info_channel(channel, dstChannel);
335 __convert_sample_type_2_audio_info_sample_type(sample_type, dstSampleType);
336 __convert_sound_type_2_audio_info_audio_type(sound_type, dstAudioType);
338 return CAudioInfo(sampleRate, dstChannel, dstSampleType, dstAudioType, -1);
341 static void __handle_safe_free(audio_io_s* handle, void *obj, bool is_output) {
342 VALID_POINTER_START(handle)
343 SAFE_FINALIZE(handle->audioIoHandle);
344 SAFE_DELETE(handle->audioIoHandle);
348 VALID_POINTER_START(obj)
350 *(audio_out_h *)obj = NULL;
352 *(audio_in_h *)obj = NULL;
357 * Implements CAPI functions
359 int cpp_audio_in_create(int sample_rate, audio_channel_e channel, audio_sample_type_e type, audio_in_h *input) {
360 audio_io_s* handle = NULL;
361 bool mic_enable = false;
365 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
366 "Parameters are NULL input:%p", input);
369 __check_audio_param(sample_rate, channel, type);
371 AUDIO_IO_LOGD("samplerate:[%d] channel:[0x%x] sample_type:[0x%x]", sample_rate, channel, type);
373 /* If MIC is not supported, return NOT_SUPPORTED error */
374 ret = system_info_get_platform_bool(FEATURE_MICROPHONE, &mic_enable);
375 AUDIO_IO_LOGD("system_info_platform [%s]=[%d], ret[%d]", FEATURE_MICROPHONE, mic_enable, ret);
376 if (ret != SYSTEM_INFO_ERROR_NONE || !mic_enable) {
377 THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_SUPPORTED, "System doesn't support microphone!");
380 CAudioInfo audioInfo = __generate_audio_input_info(sample_rate, channel, type);
382 handle = new audio_io_s;
383 handle->audioIoHandle = new CAudioInput(audioInfo);
384 handle->audioIoHandle->initialize();
386 AUDIO_IO_LOGD("[%p] created", handle);
388 } catch (CAudioError& e) {
389 AUDIO_IO_LOGE("%s", e.getErrorMsg());
390 __handle_safe_free(handle, (void *)input, false);
391 return __convert_CAudioError(e);
392 } catch (const std::bad_alloc&) {
393 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
394 AUDIO_IO_LOGE("Failed to allocate handle");
395 __handle_safe_free(handle, (void *)input, false);
396 return __convert_CAudioError(e);
399 return AUDIO_IO_ERROR_NONE;
402 int cpp_audio_in_destroy(audio_in_h input) {
403 audio_io_s* handle = static_cast<audio_io_s*>(input);
407 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
408 "Parameters are NULL input:%p", input);
409 assert(handle->audioIoHandle);
410 AUDIO_IO_LOGD("[%p]", handle);
412 /* Internal unprepare for backward compatibility */
413 handle->audioIoHandle->unprepare();
415 SAFE_FINALIZE(handle->audioIoHandle);
416 SAFE_DELETE(handle->audioIoHandle);
418 } catch (CAudioError& e) {
419 AUDIO_IO_LOGE("%s", e.getErrorMsg());
420 return __convert_CAudioError(e);
423 AUDIO_IO_LOGD("destroyed");
425 return AUDIO_IO_ERROR_NONE;
428 int cpp_audio_in_set_sound_stream_info(audio_in_h input, sound_stream_info_h stream_info) {
429 audio_io_s* handle = static_cast<audio_io_s*>(input);
432 if (handle == NULL || stream_info == NULL)
433 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
434 "Parameters are NULL input:%p, stream_info:%p", input, stream_info);
435 assert(handle->audioIoHandle);
436 AUDIO_IO_LOGD("[%p], stream_info:[%p]", handle, stream_info);
438 handle->audioIoHandle->setStreamInfo(stream_info);
439 } catch (CAudioError& e) {
440 AUDIO_IO_LOGE("%s", e.getErrorMsg());
441 return __convert_CAudioError(e);
444 AUDIO_IO_LOGD("[%p] done", handle);
446 return AUDIO_IO_ERROR_NONE;
449 int cpp_audio_in_prepare(audio_in_h input) {
450 audio_io_s* handle = static_cast<audio_io_s*>(input);
454 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
455 "Parameters are NULL input:%p", input);
456 assert(handle->audioIoHandle);
457 AUDIO_IO_LOGD("[%p]", handle);
459 handle->audioIoHandle->prepare();
460 } catch (CAudioError& e) {
461 AUDIO_IO_LOGE("%s", e.getErrorMsg());
462 return __convert_CAudioError(e);
465 AUDIO_IO_LOGD("[%p] prepared", handle);
467 return AUDIO_IO_ERROR_NONE;
470 int cpp_audio_in_unprepare(audio_in_h input) {
471 audio_io_s* handle = static_cast<audio_io_s*>(input);
475 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
476 "Parameters are NULL input:%p", input);
477 assert(handle->audioIoHandle);
478 AUDIO_IO_LOGD("[%p]", handle);
480 handle->audioIoHandle->unprepare();
481 } catch (CAudioError& e) {
482 AUDIO_IO_LOGE("%s", e.getErrorMsg());
483 return __convert_CAudioError(e);
486 AUDIO_IO_LOGD("[%p] unprepared", handle);
488 return AUDIO_IO_ERROR_NONE;
491 int cpp_audio_in_pause(audio_in_h input) {
492 audio_io_s* handle = static_cast<audio_io_s*>(input);
496 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
497 "Parameters are NULL input:%p", input);
498 assert(handle->audioIoHandle);
499 AUDIO_IO_LOGD("[%p]", handle);
501 handle->audioIoHandle->pause();
502 } catch (CAudioError& e) {
503 AUDIO_IO_LOGE("%s", e.getErrorMsg());
504 return __convert_CAudioError(e);
507 AUDIO_IO_LOGD("[%p] paused", handle);
509 return AUDIO_IO_ERROR_NONE;
512 int cpp_audio_in_resume(audio_in_h input) {
513 audio_io_s* handle = static_cast<audio_io_s*>(input);
517 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
518 "Parameters are NULL input:%p", input);
519 assert(handle->audioIoHandle);
520 AUDIO_IO_LOGD("[%p]", handle);
522 handle->audioIoHandle->resume();
523 } catch (CAudioError& e) {
524 AUDIO_IO_LOGE("%s", e.getErrorMsg());
525 return __convert_CAudioError(e);
528 AUDIO_IO_LOGD("[%p] resumed", handle);
530 return AUDIO_IO_ERROR_NONE;
533 int cpp_audio_in_drain(audio_in_h input) {
534 audio_io_s* handle = static_cast<audio_io_s*>(input);
538 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
539 "Parameters are NULL input:%p", input);
540 assert(handle->audioIoHandle);
541 AUDIO_IO_LOGD("[%p]", handle);
543 handle->audioIoHandle->drain();
544 } catch (CAudioError& e) {
545 AUDIO_IO_LOGE("%s", e.getErrorMsg());
546 return __convert_CAudioError(e);
549 AUDIO_IO_LOGD("[%p] drained", handle);
551 return AUDIO_IO_ERROR_NONE;
554 int cpp_audio_in_flush(audio_in_h input) {
555 audio_io_s* handle = static_cast<audio_io_s*>(input);
559 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
560 "Parameters are NULL input:%p", input);
561 assert(handle->audioIoHandle);
562 AUDIO_IO_LOGD("[%p]", handle);
564 handle->audioIoHandle->flush();
565 } catch (CAudioError& e) {
566 AUDIO_IO_LOGE("%s", e.getErrorMsg());
567 return __convert_CAudioError(e);
570 AUDIO_IO_LOGD("[%p] flushed", handle);
572 return AUDIO_IO_ERROR_NONE;
575 int cpp_audio_in_read(audio_in_h input, void *buffer, unsigned int length) {
576 audio_io_s* handle = static_cast<audio_io_s*>(input);
580 if (handle == NULL || buffer == NULL)
581 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
582 "Parameters are NULL input:%p, buffer:%p", input, buffer);
583 assert(handle->audioIoHandle);
585 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
586 if (inputHandle == NULL) {
587 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
590 size_t readn = inputHandle->read(buffer, static_cast<size_t>(length));
591 ret = static_cast<int>(readn);
592 #ifdef _AUDIO_IO_DEBUG_TIMING_
593 AUDIO_IO_LOGD("readn:%d", readn);
595 } catch (CAudioError& e) {
596 AUDIO_IO_LOGE("%s", e.getErrorMsg());
597 return __convert_CAudioError(e);
603 int cpp_audio_in_get_buffer_size(audio_in_h input, int *size) {
604 audio_io_s* handle = static_cast<audio_io_s*>(input);
607 if (handle == NULL || size == NULL)
608 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
609 "Parameters are NULL input:%p, size:%p", input, size);
610 assert(handle->audioIoHandle);
612 CAudioIO* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
613 if (inputHandle == NULL) {
614 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
616 *size = inputHandle->getBufferSize();
617 } catch (CAudioError& e) {
618 AUDIO_IO_LOGE("%s", e.getErrorMsg());
619 return __convert_CAudioError(e);
622 return AUDIO_IO_ERROR_NONE;
625 int cpp_audio_in_get_sample_rate(audio_in_h input, int *sample_rate) {
626 audio_io_s* handle = static_cast<audio_io_s*>(input);
629 if (handle == NULL || sample_rate == NULL)
630 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
631 "Parameters are NULL input:%p, sample_rate:%p", input, sample_rate);
632 assert(handle->audioIoHandle);
634 *sample_rate = handle->audioIoHandle->getAudioInfo().getSampleRate();
635 } catch (CAudioError& e) {
636 AUDIO_IO_LOGE("%s", e.getErrorMsg());
637 return __convert_CAudioError(e);
640 return AUDIO_IO_ERROR_NONE;
643 int cpp_audio_in_get_channel(audio_in_h input, audio_channel_e *channel) {
644 audio_io_s* handle = static_cast<audio_io_s*>(input);
647 if (handle == NULL || channel == NULL)
648 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
649 "Parameters are NULL input:%p, channel:%p", input, channel);
650 assert(handle->audioIoHandle);
652 const CAudioInfo::EChannel srcChannel = handle->audioIoHandle->getAudioInfo().getChannel();
653 audio_channel_e dstChannel = AUDIO_CHANNEL_MONO;
654 __convert_audio_info_channel_2_channel(srcChannel, dstChannel);
656 *channel = dstChannel;
657 } catch (CAudioError& e) {
658 AUDIO_IO_LOGE("%s", e.getErrorMsg());
659 return __convert_CAudioError(e);
662 return AUDIO_IO_ERROR_NONE;
665 int cpp_audio_in_get_sample_type(audio_in_h input, audio_sample_type_e *type) {
666 audio_io_s* handle = static_cast<audio_io_s*>(input);
669 if (handle == NULL || type == NULL)
670 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
671 "Parameters are NULL input:%p, type:%p", input, type);
672 assert(handle->audioIoHandle);
674 const CAudioInfo::ESampleType srcSampleType = handle->audioIoHandle->getAudioInfo().getSampleType();
675 audio_sample_type_e dstSampleType = AUDIO_SAMPLE_TYPE_U8;
676 __convert_audio_info_sample_type_2_sample_type(srcSampleType, dstSampleType);
678 *type = dstSampleType;
679 } catch (CAudioError& e) {
680 AUDIO_IO_LOGE("%s", e.getErrorMsg());
681 return __convert_CAudioError(e);
684 return AUDIO_IO_ERROR_NONE;
687 static void __stream_cb_internal(size_t nbytes, void *user_data) {
688 audio_io_s* audioIo = static_cast<audio_io_s*>(user_data);
691 if (audioIo->stream_callback.onStream)
692 audioIo->stream_callback.onStream(audioIo, nbytes, audioIo->stream_callback.user_data);
695 static void __state_changed_cb_internal(CAudioInfo::EAudioIOState state,
696 CAudioInfo::EAudioIOState state_prev,
699 audio_io_s* audioIo = static_cast<audio_io_s*>(user_data);
702 if (audioIo->state_changed_callback.onStateChanged)
703 audioIo->state_changed_callback.onStateChanged(audioIo, __convert_state_type(state_prev),
704 __convert_state_type(state), by_policy,
705 audioIo->state_changed_callback.user_data);
708 int cpp_audio_in_set_stream_cb(audio_in_h input, audio_in_stream_cb callback, void* user_data) {
709 audio_io_s* handle = static_cast<audio_io_s*>(input);
712 if (handle == NULL || callback == NULL)
713 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
714 "Parameters are NULL input:%p, callback:%p", input, callback);
715 assert(handle->audioIoHandle);
716 AUDIO_IO_LOGD("[%p], callback:[%p], user_data:[%p]", handle, callback, user_data);
718 handle->stream_callback.onStream = callback;
719 handle->stream_callback.user_data = user_data;
721 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
722 cb.mUserData = static_cast<void*>(handle);
723 cb.onStream = __stream_cb_internal;
725 handle->audioIoHandle->setStreamCallback(cb);
726 } catch (CAudioError& e) {
727 AUDIO_IO_LOGE("%s", e.getErrorMsg());
728 return __convert_CAudioError(e);
731 AUDIO_IO_LOGD("[%p] done", handle);
733 return AUDIO_IO_ERROR_NONE;
736 int cpp_audio_in_unset_stream_cb(audio_in_h input) {
737 audio_io_s* handle = static_cast<audio_io_s*>(input);
741 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
742 "Parameters are NULL input:%p", input);
743 assert(handle->audioIoHandle);
744 AUDIO_IO_LOGD("[%p]", handle);
746 handle->stream_callback.onStream = NULL;
747 handle->stream_callback.user_data = NULL;
749 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
753 handle->audioIoHandle->setStreamCallback(cb);
754 } catch (CAudioError& e) {
755 AUDIO_IO_LOGE("%s", e.getErrorMsg());
756 return __convert_CAudioError(e);
759 AUDIO_IO_LOGD("[%p] done", handle);
761 return AUDIO_IO_ERROR_NONE;
764 int cpp_audio_in_peek(audio_in_h input, const void **buffer, unsigned int *length) {
765 audio_io_s* handle = static_cast<audio_io_s*>(input);
769 if (handle == NULL || buffer == NULL)
770 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
771 "Parameters are NULL input:%p, buffer:%p", input, buffer);
773 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
774 if (inputHandle == NULL)
775 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
777 inputHandle->peek(buffer, &_length);
778 } catch (CAudioError& e) {
779 AUDIO_IO_LOGE("%s", e.getErrorMsg());
780 return __convert_CAudioError(e);
783 *length = (unsigned int)_length;
785 return AUDIO_IO_ERROR_NONE;
788 int cpp_audio_in_drop(audio_in_h input) {
789 audio_io_s* handle = static_cast<audio_io_s*>(input);
793 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
794 "Parameters are NULL input:%p", input);
796 CAudioInput* inputHandle = static_cast<CAudioInput*>(handle->audioIoHandle);
797 if (inputHandle == NULL)
798 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
801 } catch (CAudioError& e) {
802 AUDIO_IO_LOGE("%s", e.getErrorMsg());
803 return __convert_CAudioError(e);
806 return AUDIO_IO_ERROR_NONE;
809 int cpp_audio_in_set_state_changed_cb(audio_in_h input, audio_in_state_changed_cb callback, void* user_data) {
810 audio_io_s* handle = static_cast<audio_io_s*>(input);
813 if (handle == NULL || callback == NULL)
814 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
815 "Parameters are NULL input:%p, callback:%p", input, callback);
816 assert(handle->audioIoHandle);
817 AUDIO_IO_LOGD("[%p], callback:[%p], user_data:[%p]", handle, callback, user_data);
819 handle->state_changed_callback.onStateChanged = callback;
820 handle->state_changed_callback.user_data = user_data;
822 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
823 cb.mUserData = static_cast<void*>(handle);
824 cb.onStateChanged = __state_changed_cb_internal;
826 handle->audioIoHandle->setStateChangedCallback(cb);
827 } catch (CAudioError& e) {
828 AUDIO_IO_LOGE("%s", e.getErrorMsg());
829 return __convert_CAudioError(e);
832 AUDIO_IO_LOGD("[%p] done", handle);
834 return AUDIO_IO_ERROR_NONE;
837 int cpp_audio_in_unset_state_changed_cb(audio_in_h input) {
838 audio_io_s* handle = static_cast<audio_io_s*>(input);
842 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
843 "Parameters are NULL output:%p", input);
844 assert(handle->audioIoHandle);
845 AUDIO_IO_LOGD("[%p]", handle);
847 handle->state_changed_callback.onStateChanged = NULL;
848 handle->state_changed_callback.user_data = NULL;
850 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
852 cb.onStateChanged = NULL;
854 handle->audioIoHandle->setStateChangedCallback(cb);
855 } catch (CAudioError& e) {
856 AUDIO_IO_LOGE("%s", e.getErrorMsg());
857 return __convert_CAudioError(e);
860 AUDIO_IO_LOGD("[%p] done", handle);
862 return AUDIO_IO_ERROR_NONE;
869 int cpp_audio_out_create_new(int sample_rate, audio_channel_e channel, audio_sample_type_e type, audio_out_h *output) {
870 audio_io_s* handle = NULL;
873 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
874 "Parameters are NULL output:%p", output);
876 __check_audio_param(sample_rate, channel, type, SOUND_TYPE_SYSTEM /*default check */);
878 AUDIO_IO_LOGD("samplerate:[%d] channel:[0x%x] sample_type:[0x%x]", sample_rate, channel, type);
879 CAudioInfo audioInfo = __generate_audio_output_info(sample_rate, channel, type, SOUND_TYPE_MEDIA);
881 handle = new audio_io_s;
882 handle->audioIoHandle = new CAudioOutput(audioInfo);
883 handle->audioIoHandle->initialize();
885 AUDIO_IO_LOGD("[%p] created", handle);
887 } catch (CAudioError& e) {
888 AUDIO_IO_LOGE("%s", e.getErrorMsg());
889 __handle_safe_free(handle, (void *)output, true);
890 return __convert_CAudioError(e);
891 } catch (const std::bad_alloc&) {
892 CAudioError e = CAudioError::EError::ERROR_OUT_OF_MEMORY;
893 AUDIO_IO_LOGE("Failed to allocate handle");
894 __handle_safe_free(handle, (void *)output, true);
895 return __convert_CAudioError(e);
898 return AUDIO_IO_ERROR_NONE;
901 int cpp_audio_out_destroy(audio_out_h output) {
902 audio_io_s* handle = static_cast<audio_io_s*>(output);
906 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
907 "Parameter is NULL output:%p", output);
908 assert(handle->audioIoHandle);
909 AUDIO_IO_LOGD("[%p]", handle);
911 /* Internal unprepare for backward compatibility */
912 handle->audioIoHandle->unprepare();
914 SAFE_FINALIZE(handle->audioIoHandle);
915 SAFE_DELETE(handle->audioIoHandle);
917 } catch (CAudioError& e) {
918 AUDIO_IO_LOGE("%s", e.getErrorMsg());
919 return __convert_CAudioError(e);
922 AUDIO_IO_LOGD("destroyed");
924 return AUDIO_IO_ERROR_NONE;
927 int cpp_audio_out_set_sound_stream_info(audio_out_h output, sound_stream_info_h stream_info) {
928 audio_io_s* handle = static_cast<audio_io_s*>(output);
931 if (handle == NULL || stream_info == NULL)
932 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
933 "Parameters are NULL output:%p, stream_info:%p", output, stream_info);
934 assert(handle->audioIoHandle);
935 AUDIO_IO_LOGD("[%p], stream_info:[%p]", handle, stream_info);
937 handle->audioIoHandle->setStreamInfo(stream_info);
938 } catch (CAudioError& e) {
939 AUDIO_IO_LOGE("%s", e.getErrorMsg());
940 return __convert_CAudioError(e);
943 AUDIO_IO_LOGD("[%p] done", handle);
945 return AUDIO_IO_ERROR_NONE;
948 int cpp_audio_out_prepare(audio_out_h output) {
949 audio_io_s* handle = static_cast<audio_io_s*>(output);
953 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
954 "Parameter is NULL output:%p", output);
955 assert(handle->audioIoHandle);
956 AUDIO_IO_LOGD("[%p]", handle);
958 handle->audioIoHandle->prepare();
959 } catch (CAudioError& e) {
960 AUDIO_IO_LOGE("%s", e.getErrorMsg());
961 return __convert_CAudioError(e);
964 AUDIO_IO_LOGD("[%p] prepared", handle);
966 return AUDIO_IO_ERROR_NONE;
969 int cpp_audio_out_unprepare(audio_out_h output) {
970 audio_io_s* handle = static_cast<audio_io_s*>(output);
974 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
975 "Parameter is NULL output:%p", output);
976 assert(handle->audioIoHandle);
977 AUDIO_IO_LOGD("[%p]", handle);
979 handle->audioIoHandle->unprepare();
980 } catch (CAudioError& e) {
981 AUDIO_IO_LOGE("%s", e.getErrorMsg());
982 return __convert_CAudioError(e);
985 AUDIO_IO_LOGD("[%p] unprepared", handle);
987 return AUDIO_IO_ERROR_NONE;
990 int cpp_audio_out_pause(audio_out_h output) {
991 audio_io_s* handle = static_cast<audio_io_s*>(output);
995 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
996 "Parameter is NULL output:%p", output);
997 assert(handle->audioIoHandle);
998 AUDIO_IO_LOGD("[%p]", handle);
1000 handle->audioIoHandle->pause();
1001 } catch (CAudioError& e) {
1002 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1003 return __convert_CAudioError(e);
1006 AUDIO_IO_LOGD("[%p] paused", handle);
1008 return AUDIO_IO_ERROR_NONE;
1011 int cpp_audio_out_resume(audio_out_h output) {
1012 audio_io_s* handle = static_cast<audio_io_s*>(output);
1016 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1017 "Parameter is NULL output:%p", output);
1018 assert(handle->audioIoHandle);
1019 AUDIO_IO_LOGD("[%p]", handle);
1021 handle->audioIoHandle->resume();
1022 } catch (CAudioError& e) {
1023 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1024 return __convert_CAudioError(e);
1027 AUDIO_IO_LOGD("[%p] resumed", handle);
1029 return AUDIO_IO_ERROR_NONE;
1032 int cpp_audio_out_drain(audio_out_h output) {
1033 audio_io_s* handle = static_cast<audio_io_s*>(output);
1037 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1038 "Parameter is NULL output:%p", output);
1039 assert(handle->audioIoHandle);
1040 AUDIO_IO_LOGD("[%p]", handle);
1042 handle->audioIoHandle->drain();
1043 } catch (CAudioError& e) {
1044 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1045 return __convert_CAudioError(e);
1048 AUDIO_IO_LOGD("[%p] drained", handle);
1050 return AUDIO_IO_ERROR_NONE;
1053 int cpp_audio_out_flush(audio_out_h output) {
1054 audio_io_s* handle = static_cast<audio_io_s*>(output);
1058 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1059 "Parameter is NULL output:%p", output);
1060 assert(handle->audioIoHandle);
1061 AUDIO_IO_LOGD("[%p]", handle);
1063 handle->audioIoHandle->flush();
1064 } catch (CAudioError& e) {
1065 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1066 return __convert_CAudioError(e);
1069 AUDIO_IO_LOGD("[%p] flushed", handle);
1071 return AUDIO_IO_ERROR_NONE;
1074 int cpp_audio_out_write(audio_out_h output, void *buffer, unsigned int length) {
1075 audio_io_s* handle = static_cast<audio_io_s*>(output);
1079 if (handle == NULL || buffer == NULL)
1080 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1081 "Parameter is NULL output:%p, buffer:%p", output, buffer);
1082 assert(handle->audioIoHandle);
1084 CAudioOutput* outputHandle = static_cast<CAudioOutput*>(handle->audioIoHandle);
1085 if (outputHandle == NULL)
1086 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
1088 size_t written = outputHandle->write(buffer, static_cast<size_t>(length));
1089 ret = static_cast<int>(written);
1090 #ifdef _AUDIO_IO_DEBUG_TIMING_
1091 AUDIO_IO_LOGD("written:%d", written);
1093 } catch (CAudioError& e) {
1094 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1095 return __convert_CAudioError(e);
1101 int cpp_audio_out_get_buffer_size(audio_out_h output, int *size) {
1102 audio_io_s* handle = static_cast<audio_io_s*>(output);
1105 if (handle == NULL || size == NULL)
1106 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1107 "Parameters are NULL output:%p, size:%p", output, size);
1108 assert(handle->audioIoHandle);
1110 CAudioOutput* outputHandle = static_cast<CAudioOutput*>(handle->audioIoHandle);
1111 if (outputHandle == NULL)
1112 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_HANDLE, "Handle is NULL");
1114 *size = outputHandle->getBufferSize();
1115 } catch (CAudioError& e) {
1116 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1117 return __convert_CAudioError(e);
1120 return AUDIO_IO_ERROR_NONE;
1123 int cpp_audio_out_get_sample_rate(audio_out_h output, int *sample_rate) {
1124 audio_io_s* handle = static_cast<audio_io_s*>(output);
1127 if (handle == NULL || sample_rate == NULL)
1128 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1129 "Parameters are NULL output:%p, sample_rate:%p", output, sample_rate);
1130 assert(handle->audioIoHandle);
1132 *sample_rate = handle->audioIoHandle->getAudioInfo().getSampleRate();
1133 } catch (CAudioError& e) {
1134 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1135 return __convert_CAudioError(e);
1138 return AUDIO_IO_ERROR_NONE;
1141 int cpp_audio_out_get_channel(audio_out_h output, audio_channel_e *channel) {
1142 audio_io_s* handle = static_cast<audio_io_s*>(output);
1145 if (handle == NULL || channel == NULL)
1146 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1147 "Parameters are NULL output:%p, channel:%p", output, channel);
1148 assert(handle->audioIoHandle);
1150 const CAudioInfo::EChannel srcChannel = handle->audioIoHandle->getAudioInfo().getChannel();
1151 audio_channel_e dstChannel = AUDIO_CHANNEL_MONO;
1152 __convert_audio_info_channel_2_channel(srcChannel, dstChannel);
1154 *channel = dstChannel;
1155 } catch (CAudioError& e) {
1156 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1157 return __convert_CAudioError(e);
1160 return AUDIO_IO_ERROR_NONE;
1163 int cpp_audio_out_get_sample_type(audio_out_h output, audio_sample_type_e *type) {
1164 audio_io_s* handle = static_cast<audio_io_s*>(output);
1167 if (handle == NULL || type == NULL)
1168 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1169 "Parameters are NULL output:%p, type:%p", output, type);
1170 assert(handle->audioIoHandle);
1172 const CAudioInfo::ESampleType srcSampleType = handle->audioIoHandle->getAudioInfo().getSampleType();
1173 audio_sample_type_e dstSampleType = AUDIO_SAMPLE_TYPE_U8;
1174 __convert_audio_info_sample_type_2_sample_type(srcSampleType, dstSampleType);
1176 *type = dstSampleType;
1177 } catch (CAudioError& e) {
1178 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1179 return __convert_CAudioError(e);
1182 return AUDIO_IO_ERROR_NONE;
1185 int cpp_audio_out_get_sound_type(audio_out_h output, sound_type_e *type) {
1186 audio_io_s* handle = static_cast<audio_io_s*>(output);
1189 if (handle == NULL || type == NULL)
1190 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1191 "Parameters are NULL output:%p, type:%p", output, type);
1192 assert(handle->audioIoHandle);
1194 const CAudioInfo::EAudioType srcAudioType = handle->audioIoHandle->getAudioInfo().getAudioType();
1195 sound_type_e dstSoundType = SOUND_TYPE_MEDIA;
1196 __convert_audio_info_audio_type_2_sound_type(srcAudioType, dstSoundType);
1198 *type = dstSoundType;
1199 } catch (CAudioError& e) {
1200 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1201 return __convert_CAudioError(e);
1204 return AUDIO_IO_ERROR_NONE;
1207 int cpp_audio_out_set_stream_cb(audio_out_h output, audio_out_stream_cb callback, void* user_data) {
1208 audio_io_s* handle = static_cast<audio_io_s*>(output);
1211 if (handle == NULL || callback == NULL)
1212 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1213 "Parameters are NULL output:%p, callback:%p", output, callback);
1214 assert(handle->audioIoHandle);
1215 AUDIO_IO_LOGD("[%p], callback:[%p], user_data:[%p]", handle, callback, user_data);
1217 handle->stream_callback.onStream = callback;
1218 handle->stream_callback.user_data = user_data;
1220 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
1221 cb.mUserData = static_cast<void*>(handle);
1222 cb.onStream = __stream_cb_internal;
1224 handle->audioIoHandle->setStreamCallback(cb);
1225 } catch (CAudioError& e) {
1226 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1227 return __convert_CAudioError(e);
1230 AUDIO_IO_LOGD("[%p] done", handle);
1232 return AUDIO_IO_ERROR_NONE;
1235 int cpp_audio_out_unset_stream_cb(audio_out_h output) {
1236 audio_io_s* handle = static_cast<audio_io_s*>(output);
1240 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1241 "Parameters are NULL output:%p", output);
1242 assert(handle->audioIoHandle);
1243 AUDIO_IO_LOGD("[%p]", handle);
1245 handle->stream_callback.onStream = NULL;
1246 handle->stream_callback.user_data = NULL;
1248 CAudioIO::SStreamCallback cb = handle->audioIoHandle->getStreamCallback();
1249 cb.mUserData = NULL;
1252 handle->audioIoHandle->setStreamCallback(cb);
1253 } catch (CAudioError& e) {
1254 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1255 return __convert_CAudioError(e);
1258 AUDIO_IO_LOGD("[%p] done", handle);
1260 return AUDIO_IO_ERROR_NONE;
1263 int cpp_audio_out_set_state_changed_cb(audio_out_h output, audio_in_state_changed_cb callback, void* user_data) {
1264 audio_io_s* handle = static_cast<audio_io_s*>(output);
1267 if (handle == NULL || callback == NULL)
1268 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1269 "Parameters are NULL output:%p, callback:%p", output, callback);
1270 assert(handle->audioIoHandle);
1271 AUDIO_IO_LOGD("[%p], callback:[%p], user_data:[%p]", handle, callback, user_data);
1273 handle->state_changed_callback.onStateChanged = callback;
1274 handle->state_changed_callback.user_data = user_data;
1276 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
1277 cb.mUserData = static_cast<void*>(handle);
1278 cb.onStateChanged = __state_changed_cb_internal;
1280 handle->audioIoHandle->setStateChangedCallback(cb);
1281 } catch (CAudioError& e) {
1282 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1283 return __convert_CAudioError(e);
1286 AUDIO_IO_LOGD("[%p] done", handle);
1288 return AUDIO_IO_ERROR_NONE;
1291 int cpp_audio_out_unset_state_changed_cb(audio_out_h output) {
1292 audio_io_s* handle = static_cast<audio_io_s*>(output);
1296 THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_ARGUMENT,
1297 "Parameters are NULL output:%p", output);
1298 assert(handle->audioIoHandle);
1299 AUDIO_IO_LOGD("[%p]", handle);
1301 handle->state_changed_callback.onStateChanged = NULL;
1302 handle->state_changed_callback.user_data = NULL;
1304 CAudioIO::SStateChangedCallback cb = handle->audioIoHandle->getStateChangedCallback();
1305 cb.mUserData = NULL;
1306 cb.onStateChanged = NULL;
1308 handle->audioIoHandle->setStateChangedCallback(cb);
1309 } catch (CAudioError& e) {
1310 AUDIO_IO_LOGE("%s", e.getErrorMsg());
1311 return __convert_CAudioError(e);
1314 AUDIO_IO_LOGD("[%p] done", handle);
1316 return AUDIO_IO_ERROR_NONE;