Revise cpp codes (mutex/cond)
[platform/core/api/audio-io.git] / src / cpp / CAudioIO.cpp
index 00cfd59..3115d75 100644 (file)
@@ -15,7 +15,6 @@
  */
 
 
-#include <pthread.h>
 #include <assert.h>
 #include "CAudioIODef.h"
 #include <sound_manager_internal.h>
@@ -32,9 +31,6 @@ using namespace tizen_media_audio;
 //LCOV_EXCL_START
 CAudioIO::CAudioIO() :
     mpPulseAudioClient(nullptr),
-    __mMutex(PTHREAD_MUTEX_INITIALIZER),
-    __mCondMutex(PTHREAD_MUTEX_INITIALIZER),
-    __mCond(PTHREAD_COND_INITIALIZER),
     __mIsInit(false) {
     mDirection = CAudioInfo::EAudioDirection::AUDIO_DIRECTION_MAX;
     mState = CAudioInfo::EAudioIOState::AUDIO_IO_STATE_NONE;
@@ -45,9 +41,6 @@ CAudioIO::CAudioIO() :
 
 CAudioIO::CAudioIO(CAudioInfo& audioInfo) :
     mpPulseAudioClient(nullptr),
-    __mMutex(PTHREAD_MUTEX_INITIALIZER),
-    __mCondMutex(PTHREAD_MUTEX_INITIALIZER),
-    __mCond(PTHREAD_COND_INITIALIZER),
     __mIsInit(false) {
     mAudioInfo = audioInfo;
     mDirection = CAudioInfo::EAudioDirection::AUDIO_DIRECTION_MAX;
@@ -69,89 +62,11 @@ bool CAudioIO::IsReady() {
              mState == CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED));
 }
 
-void CAudioIO::internalLock() {
-    if (!__mIsInit)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioIO"); //LCOV_EXCL_LINE
-
-    if (pthread_mutex_lock(&__mMutex) != 0)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_lock()"); //LCOV_EXCL_LINE
-
-#ifdef _AUDIO_IO_DEBUG_TIMING_
-    AUDIO_IO_LOGD(COLOR_RED "%p LOCKED" COLOR_END, &__mMutex);
-#endif
-}
-
-void CAudioIO::internalUnlock() {
-    if (!__mIsInit)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioIO"); //LCOV_EXCL_LINE
-
-    if (pthread_mutex_unlock(&__mMutex) != 0)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Failed pthread_mutex_lock()"); //LCOV_EXCL_LINE
-
-#ifdef _AUDIO_IO_DEBUG_TIMING_
-    AUDIO_IO_LOGD(COLOR_GREEN "%p UNLOCKED" COLOR_END, &__mMutex);
-#endif
-}
-
-void CAudioIO::internalWait() {
-    if (!__mIsInit)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioIO"); //LCOV_EXCL_LINE
-
-#ifdef _AUDIO_IO_DEBUG_TIMING_
-    AUDIO_IO_LOGD(COLOR_RED "WAIT" COLOR_END);
-#endif
-    pthread_mutex_lock(&__mCondMutex);
-
-    struct timeval now = { 0, };
-    struct timeval to_wait = { 0, };
-    struct timeval until = { 0, };
-    struct timespec until_ts = { 0, };
-
-    constexpr int COND_TIMEOUT_MS = 200;
-
-    gettimeofday(&now, nullptr);
-    to_wait.tv_sec = COND_TIMEOUT_MS / 1000UL;
-    to_wait.tv_usec = (COND_TIMEOUT_MS % 1000UL) * 1000UL;
-    timeradd(&now, &to_wait, &until);
-    until_ts.tv_sec = until.tv_sec;
-    until_ts.tv_nsec = until.tv_usec * 1000UL;
-
-    int ret = pthread_cond_timedwait(&__mCond, &__mCondMutex, &until_ts);
-    if (ret != 0) {
-        char str_error[256];
-        AUDIO_IO_LOGE("pthread_cond_timedwait error=[%d][%s]", ret, strerror_r(ret, str_error, sizeof(str_error)));
-    }
-
-    pthread_mutex_unlock(&__mCondMutex);
-}
-
-void CAudioIO::internalSignal() {
-    if (!__mIsInit)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Doesn't initialize CAudioIO"); //LCOV_EXCL_LINE
-
-#ifdef _AUDIO_IO_DEBUG_TIMING_
-    AUDIO_IO_LOGD(COLOR_GREEN "SIGNAL" COLOR_END);
-#endif
-
-    pthread_mutex_lock(&__mCondMutex);
-    pthread_cond_signal(&__mCond);
-    pthread_mutex_unlock(&__mCondMutex);
-}
-
 void CAudioIO::initialize() {
     if (__mIsInit)
         return;
 
     AUDIO_IO_LOGD("initialize");
-
-    int ret = pthread_mutex_init(&__mMutex, NULL);
-    if (ret != 0)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pthread_mutex_init()"); //LCOV_EXCL_LINE
-
-    ret = pthread_cond_init(&__mCond, NULL);
-    if (ret != 0)
-        THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pthread_cond_init()"); //LCOV_EXCL_LINE
-
     __mIsInit = true;
 }
 
@@ -160,35 +75,6 @@ void CAudioIO::finalize() {
         return;
 
     AUDIO_IO_LOGD("finalize");
-
-    bool error_occured = false;
-    int ret = pthread_mutex_destroy(&__mMutex);
-    if (ret != 0) {
-//LCOV_EXCL_START
-        AUDIO_IO_LOGE("Failed pthread_mutex_destroy(%p) errno:%d", &__mMutex, ret);
-        error_occured = true;
-//LCOV_EXCL_STOP
-    }
-
-    ret = pthread_mutex_destroy(&__mCondMutex);
-    if (ret != 0) {
-//LCOV_EXCL_START
-        AUDIO_IO_LOGE("Failed cond pthread_mutex_destroy(%p) errno:%d", &__mCondMutex, ret);
-        error_occured = true;
-//LCOV_EXCL_STOP
-    }
-
-    ret = pthread_cond_destroy(&__mCond);
-    if (ret != 0) {
-//LCOV_EXCL_START
-        AUDIO_IO_LOGE("Failed pthread_cond_destroy(%p) errno:%d", &__mCond, ret);
-        error_occured = true;
-//LCOV_EXCL_STOP
-    }
-
-    if (error_occured)
-        THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INTERNAL_OPERATION, "Finalize Failed"); //LCOV_EXCL_LINE
-
     __mIsInit = false;
 }
 
@@ -251,48 +137,27 @@ void CAudioIO::pause() {
     if (!__mIsInit || !IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Did not initialize or prepare CAudioIO"); //LCOV_EXCL_LINE
 
-    try {
-        internalLock();
-        AUDIO_IO_LOGD("pause");
-        mpPulseAudioClient->cork(true);
-        internalUnlock();
-    } catch (const CAudioError& e) {
-        internalUnlock();
-        throw;
-    }
+    std::lock_guard<std::mutex> guard(mMutex);
+    AUDIO_IO_LOGD("pause");
+    mpPulseAudioClient->cork(true);
 }
 
 void CAudioIO::resume() {
     if (!__mIsInit || !IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Did not initialize or prepare CAudioIO"); //LCOV_EXCL_LINE
 
-    try {
-        internalLock();
-        AUDIO_IO_LOGD("resume");
-        mpPulseAudioClient->cork(false);
-        internalUnlock();
-    } catch (const CAudioError& e) {
-        internalUnlock();
-        throw;
-    }
+    std::lock_guard<std::mutex> guard(mMutex);
+    mpPulseAudioClient->cork(false);
 }
+
 void CAudioIO::flush() {
     if (!__mIsInit || !IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Did not initialize or prepare CAudioIO"); //LCOV_EXCL_LINE
 
-    try {
-        if (mpPulseAudioClient->isInThread()) {
-            mpPulseAudioClient->flush();
-        } else {
-            internalLock();
-            mpPulseAudioClient->flush();
-            internalUnlock();
-        }
-    } catch (const CAudioError& e) {
-        if (!mpPulseAudioClient->isInThread())
-            internalUnlock();
-        throw;
-    }
+    std::unique_lock<std::mutex> defer_mutex(mMutex, std::defer_lock);
+    if (!mpPulseAudioClient->isInThread())
+        defer_mutex.lock();
+    mpPulseAudioClient->flush();
 }
 
 CAudioInfo& CAudioIO::getAudioInfo() {