-/*
-* Internal Macros
-*/
-#define AUDIO_IO_CHECK_CONDITION(condition,error,msg) \
- if(condition) {} else \
- { LOGE("[%s] %s(0x%08x)",__FUNCTION__, msg,error); return error;}; \
-
-#define AUDIO_IO_NULL_ARG_CHECK(arg) \
- AUDIO_IO_CHECK_CONDITION(arg != NULL, AUDIO_IO_ERROR_INVALID_PARAMETER, "AUDIO_IO_ERROR_INVALID_PARAMETER" )
-
-/*
-* Internal Implementation
-*/
-static int __convert_error_code(int code, char *func_name)
-{
- int ret = AUDIO_IO_ERROR_NONE;
- char* msg = "AUDIO_IO_ERROR_NONE";
-
- switch(code)
- {
- case MM_ERROR_NONE:
- ret = AUDIO_IO_ERROR_NONE;
- msg = "AUDIO_IO_ERROR_NONE";
- break;
- case MM_ERROR_INVALID_ARGUMENT:
- case MM_ERROR_SOUND_DEVICE_INVALID_SAMPLERATE:
- case MM_ERROR_SOUND_DEVICE_INVALID_CHANNEL:
- case MM_ERROR_SOUND_DEVICE_INVALID_FORMAT:
- ret = AUDIO_IO_ERROR_INVALID_PARAMETER;
- msg = "AUDIO_IO_ERROR_INVALID_PARAMETER";
- break;
- case MM_ERROR_SOUND_DEVICE_NOT_OPENED:
- ret = AUDIO_IO_ERROR_DEVICE_NOT_OPENED;
- msg = "AUDIO_IO_ERROR_DEVICE_NOT_OPENED";
- break;
- case MM_ERROR_SOUND_INTERNAL:
- ret = AUDIO_IO_ERROR_DEVICE_NOT_CLOSED;
- msg = "AUDIO_IO_ERROR_DEVICE_NOT_CLOSED";
- break;
- case MM_ERROR_SOUND_INVALID_POINTER:
- ret = AUDIO_IO_ERROR_INVALID_BUFFER;
- msg = "AUDIO_IO_ERROR_INVALID_BUFFER";
- break;
- case MM_ERROR_POLICY_BLOCKED:
- case MM_ERROR_POLICY_INTERRUPTED:
- case MM_ERROR_POLICY_INTERNAL:
- case MM_ERROR_POLICY_DUPLICATED:
- ret = AUDIO_IO_ERROR_SOUND_POLICY;
- msg = "AUDIO_IO_ERROR_SOUND_POLICY";
- break;
- }
- LOGE("[%s] %s(0x%08x) : core fw error(0x%x)",func_name,msg, ret, code);
- return ret;
-}
-
-static int __check_parameter(int sample_rate, audio_channel_e channel, audio_sample_type_e type)
-{
- if(sample_rate<8000 || sample_rate > 48000) {
- LOGE("[%s] AUDIO_IO_ERROR_INVALID_PARAMETER(0x%08x) : Invalid sample rate (8000~48000Hz) : %d",__FUNCTION__, AUDIO_IO_ERROR_INVALID_PARAMETER,sample_rate);
- return AUDIO_IO_ERROR_INVALID_PARAMETER;
- }
- if (channel < AUDIO_CHANNEL_MONO || channel > AUDIO_CHANNEL_STEREO) {
- LOGE("[%s] AUDIO_IO_ERROR_INVALID_PARAMETER(0x%08x) : Invalid audio channel : %d",__FUNCTION__, AUDIO_IO_ERROR_INVALID_PARAMETER,channel);
- return AUDIO_IO_ERROR_INVALID_PARAMETER;
- }
- if (type < AUDIO_SAMPLE_TYPE_U8 || type > AUDIO_SAMPLE_TYPE_S16_LE) {
- LOGE("[%s] AUDIO_IO_ERROR_INVALID_PARAMETER(0x%08x) : Invalid sample typel : %d",__FUNCTION__, AUDIO_IO_ERROR_INVALID_PARAMETER,type);
- return AUDIO_IO_ERROR_INVALID_PARAMETER;
- }
- return AUDIO_IO_ERROR_NONE;
-}
-
-
-static audio_io_interrupted_code_e __translate_interrupted_code (int code)
-{
- audio_io_interrupted_code_e e = AUDIO_IO_INTERRUPTED_COMPLETED;
-
- switch(code)
- {
- case MM_MSG_CODE_INTERRUPTED_BY_ALARM_END:
- case MM_MSG_CODE_INTERRUPTED_BY_EMERGENCY_END:
- e = AUDIO_IO_INTERRUPTED_COMPLETED;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_MEDIA:
- case MM_MSG_CODE_INTERRUPTED_BY_OTHER_PLAYER_APP:
- e = AUDIO_IO_INTERRUPTED_BY_MEDIA;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_CALL_START:
- e = AUDIO_IO_INTERRUPTED_BY_CALL;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_EARJACK_UNPLUG:
- e = AUDIO_IO_INTERRUPTED_BY_EARJACK_UNPLUG;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_RESOURCE_CONFLICT:
- e = AUDIO_IO_INTERRUPTED_BY_RESOURCE_CONFLICT;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_ALARM_START:
- e = AUDIO_IO_INTERRUPTED_BY_ALARM;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_EMERGENCY_START:
- e = AUDIO_IO_INTERRUPTED_BY_EMERGENCY;
- break;
-
- case MM_MSG_CODE_INTERRUPTED_BY_RESUMABLE_MEDIA:
- e = AUDIO_IO_INTERRUPTED_BY_RESUMABLE_MEDIA;
- break;
- }
-
- return e;
-}
-
-static int __mm_sound_pcm_capture_msg_cb (int message, void *param, void *user_param)
-{
- audio_io_interrupted_code_e e = AUDIO_IO_INTERRUPTED_COMPLETED;
- audio_in_s *handle = (audio_in_s *) user_param;
- MMMessageParamType *msg = (MMMessageParamType*)param;
-
- LOGI("[%s] Got message type : 0x%x with code : %d" ,__FUNCTION__, message, msg->code);
-
- if (handle->user_cb == NULL) {
- LOGI("[%s] No interrupt callback is set. Skip this" ,__FUNCTION__);
- return 0;
- }
-
- if (message == MM_MESSAGE_SOUND_PCM_INTERRUPTED) {
- e = __translate_interrupted_code (msg->code);
- } else if (message == MM_MESSAGE_SOUND_PCM_CAPTURE_RESTRICTED) {
- /* TODO : handling restricted code is needed */
- /* e = _translate_restricted_code (msg->code); */
- }
-
- handle->user_cb (e, handle->user_data);
-
- return 0;
-}
-
-static int __mm_sound_pcm_playback_msg_cb (int message, void *param, void *user_param)
-{
- audio_io_interrupted_code_e e = AUDIO_IO_INTERRUPTED_COMPLETED;
- audio_out_s *handle = (audio_out_s *) user_param;
- MMMessageParamType *msg = (MMMessageParamType*)param;
-
- LOGI("[%s] Got message type : 0x%x with code : %d" ,__FUNCTION__, message, msg->code);
-
- if (handle->user_cb == NULL) {
- LOGI("[%s] No interrupt callback is set. Skip this" ,__FUNCTION__);
- return 0;
- }
-
- if (message == MM_MESSAGE_SOUND_PCM_INTERRUPTED) {
- e = __translate_interrupted_code (msg->code);
- }
-
- handle->user_cb (e, handle->user_data);
-
- return 0;
-}
-
-
-/*
-* Public Implementation
-*/
-
-/* Audio In */