X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fcpp%2FCAudioInput.cpp;h=498dd9b7c33a905f0c723f7f4e96a25fe1695eb2;hb=refs%2Ftags%2Faccepted%2Ftizen%2Funified%2F20181210.060219;hp=ecae45ca54df154566cae9b507b88bddd8c05962;hpb=41701aae153a4e3a00de9e23fec203538abe3576;p=platform%2Fcore%2Fapi%2Faudio-io.git diff --git a/src/cpp/CAudioInput.cpp b/src/cpp/CAudioInput.cpp index ecae45c..498dd9b 100644 --- a/src/cpp/CAudioInput.cpp +++ b/src/cpp/CAudioInput.cpp @@ -17,9 +17,9 @@ #include -#include #include "CAudioIODef.h" #include +#include "cpp_audio_in_privilege.h" #define RECORDER_PRIVILEGE "http://tizen.org/privilege/recorder" #define CLIENT_NAME "AUDIO_IO_PA_CLIENT" @@ -27,11 +27,6 @@ using namespace std; using namespace tizen_media_audio; -struct PrivilegeData { - bool isPrivilegeAllowed; - pa_threaded_mainloop *paMainloop; -}; - /** * class CAudioInput inherited by CAudioIO */ @@ -65,7 +60,7 @@ void CAudioInput::onStream(CPulseAudioClient* pClient, size_t length) { */ if (__mIsUsedSyncRead == true) { #ifdef _AUDIO_IO_DEBUG_TIMING_ - AUDIO_IO_LOGD("Sync Read Mode! - pClient:[%p], length:[%d]", pClient, length); + AUDIO_IO_LOGD("Sync Read Mode! - pClient:[%p], length:[%zu]", pClient, length); #endif return; } @@ -74,7 +69,7 @@ void CAudioInput::onStream(CPulseAudioClient* pClient, size_t length) { * Accrues callback function */ #ifdef _AUDIO_IO_DEBUG_TIMING_ - AUDIO_IO_LOGD("pClient:[%p], length:[%d]", pClient, length); + AUDIO_IO_LOGD("pClient:[%p], length:[%zu]", pClient, length); #endif CAudioIO::onStream(pClient, length); } @@ -91,119 +86,21 @@ bool CAudioInput::__IsReady() { return CAudioIO::IsReady(); } -static void __contextStateChangeCb(pa_context* c, void* user_data) { - pa_threaded_mainloop *paMainloop = static_cast(user_data); - assert(paMainloop); - assert(c); - - switch (pa_context_get_state(c)) { - case PA_CONTEXT_READY: - AUDIO_IO_LOGD("The context is ready"); - pa_threaded_mainloop_signal(paMainloop, 0); - break; - - case PA_CONTEXT_FAILED: - case PA_CONTEXT_TERMINATED: - AUDIO_IO_LOGD("The context is lost"); - pa_threaded_mainloop_signal(paMainloop, 0); - break; - - case PA_CONTEXT_UNCONNECTED: - case PA_CONTEXT_CONNECTING: - case PA_CONTEXT_AUTHORIZING: - case PA_CONTEXT_SETTING_NAME: - break; - } -} - -static void __checkPrivilegeCb(pa_context *c, int success, void *user_data) { - AUDIO_IO_LOGD("pa_context[%p], success[%d], user_data[%p]", c, success, user_data); - assert(c); - assert(user_data); - - PrivilegeData *prData = static_cast(user_data); - prData->isPrivilegeAllowed = success ? true : false; - - pa_threaded_mainloop_signal(prData->paMainloop, 0); -} - -static bool __IsPrivilegeAllowed() { - pa_operation *o; - pa_context *c; - int err = 0; - PrivilegeData prData; - - prData.paMainloop = pa_threaded_mainloop_new(); - if (prData.paMainloop == NULL) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_threaded_mainloop_new()"); - - c = pa_context_new(pa_threaded_mainloop_get_api(prData.paMainloop), CLIENT_NAME); - if (c == NULL) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_new()"); - - pa_context_set_state_callback(c, __contextStateChangeCb, prData.paMainloop); - - if (pa_context_connect(c, NULL, PA_CONTEXT_NOFLAGS, NULL) < 0) - THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_context_connect()"); - - pa_threaded_mainloop_lock(prData.paMainloop); - - if (pa_threaded_mainloop_start(prData.paMainloop) < 0) { - pa_threaded_mainloop_unlock(prData.paMainloop); - THROW_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed pa_threaded_mainloop_start()"); - } - - while (true) { - pa_context_state_t state; - state = pa_context_get_state(c); - - if (state == PA_CONTEXT_READY) - break; - - if (!PA_CONTEXT_IS_GOOD(state)) { - err = pa_context_errno(c); - pa_threaded_mainloop_unlock(prData.paMainloop); - THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INTERNAL_OPERATION, - "pa_context's state is not good : err[%d]", err); - } - - /* Wait until the context is ready */ - pa_threaded_mainloop_wait(prData.paMainloop); - } - - o = pa_context_check_privilege(c, RECORDER_PRIVILEGE, __checkPrivilegeCb, &prData); - if (!o) { - pa_threaded_mainloop_unlock(prData.paMainloop); - THROW_ERROR_MSG(CAudioError::EError::ERROR_FAILED_OPERATION, "Failed to pa_context_check_privilege()"); - } - while (pa_operation_get_state(o) == PA_OPERATION_RUNNING) - pa_threaded_mainloop_wait(prData.paMainloop); - pa_operation_unref(o); - - pa_threaded_mainloop_unlock(prData.paMainloop); - pa_threaded_mainloop_stop(prData.paMainloop); - pa_context_disconnect(c); - pa_context_unref(c); - pa_threaded_mainloop_free(prData.paMainloop); - - return prData.isPrivilegeAllowed; -} - void CAudioInput::initialize() { if (__IsInit() == true) return; + if (cpp_audio_in_has_record_privilege() == false) + THROW_ERROR_MSG(CAudioError::EError::ERROR_PERMISSION_DENIED, "No privilege for record"); + try { CAudioIO::initialize(); + __setInit(true); } catch (CAudioError& e) { finalize(); throw; } - if (__IsPrivilegeAllowed() == false) - THROW_ERROR_MSG(CAudioError::EError::ERROR_PERMISSION_DENIED, "No privilege for record"); - - __setInit(true); CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE); } @@ -321,10 +218,6 @@ void CAudioInput::resume() { CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING); } -void CAudioInput::drain() { - THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_SUPPORTED, "Did not support drain of CAudioInput"); -} - void CAudioInput::flush() { if (__IsInit() == false || __IsReady() == false) THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED,