move __IsReady function into the critical section
[platform/core/api/audio-io.git] / src / cpp / CAudioInput.cpp
index cf607d4..e95918d 100644 (file)
@@ -90,6 +90,7 @@ void CAudioInput::initialize() {
 //LCOV_EXCL_STOP
     }
 
+    CAudioIO::setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
     CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
 }
 
@@ -107,6 +108,8 @@ void CAudioInput::finalize() {
 }
 
 void CAudioInput::prepare() {
+    std::lock_guard<std::mutex> mutex(mMutex);
+
     if (!__IsInit())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Did not initialize CAudioInput"); //LCOV_EXCL_LINE
 
@@ -133,7 +136,6 @@ void CAudioInput::prepare() {
 
         CPulseStreamSpec spec(streamSpec, mAudioInfo);
 
-        std::unique_lock<std::mutex> mutex(mMutex);
         mpPulseAudioClient = new CPulseAudioClient(CPulseAudioClient::EStreamDirection::STREAM_DIRECTION_RECORD, spec, this);
         mpPulseAudioClient->initialize();
         mpPulseAudioClient->applyRecordVolume(__mVolume);
@@ -141,8 +143,6 @@ void CAudioInput::prepare() {
         /* Uncork stream which is created with CORKED flag */
         mpPulseAudioClient->cork(false);
 #endif
-        mutex.unlock();
-
         CAudioIO::prepare();
     } catch (const CAudioError& e) {
 //LCOV_EXCL_START
@@ -156,6 +156,8 @@ void CAudioInput::prepare() {
 }
 
 void CAudioInput::unprepare() {
+    std::unique_lock<std::mutex> mutex(mMutex);
+
     if (!__IsInit())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, //LCOV_EXCL_LINE
                         "Did not initialize CAudioInput");          //LCOV_EXCL_LINE
@@ -167,17 +169,22 @@ void CAudioInput::unprepare() {
 
     CAudioIO::unprepare();
 
-    std::unique_lock<std::mutex> mutex(mMutex);
     if (mpPulseAudioClient && mpPulseAudioClient->isInThread())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_INVALID_OPERATION, "Can't unprepare inside pulseaudio thread");
+
     SAFE_FINALIZE(mpPulseAudioClient);
     SAFE_DELETE(mpPulseAudioClient);
+
+    CAudioIO::setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
+
     mutex.unlock();
 
     CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
 }
 
 void CAudioInput::pause() {
+    std::unique_lock<std::mutex> mutex(mMutex);
+
     if (!__IsInit() || !__IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED,   //LCOV_EXCL_LINE
                         "Did not initialize or prepare CAudioInput"); //LCOV_EXCL_LINE
@@ -190,10 +197,16 @@ void CAudioInput::pause() {
         THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_OPERATION, "Can't pause in thread"); //LCOV_EXCL_LINE
 
     CAudioIO::pause();
+    CAudioIO::setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED);
+
+    mutex.unlock();
+
     CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_PAUSED);
 }
 
 void CAudioInput::resume() {
+    std::unique_lock<std::mutex> mutex(mMutex);
+
     if (!__IsInit() || !__IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED,   //LCOV_EXCL_LINE
                         "Did not initialize or prepare CAudioInput"); //LCOV_EXCL_LINE
@@ -206,10 +219,16 @@ void CAudioInput::resume() {
         THROW_ERROR_MSG_FORMAT(CAudioError::EError::ERROR_INVALID_OPERATION, "Can't resume in thread"); //LCOV_EXCL_LINE
 
     CAudioIO::resume();
+    CAudioIO::setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING);
+
+    mutex.unlock();
+
     CAudioIO::onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING);
 }
 
 void CAudioInput::flush() {
+    std::lock_guard<std::mutex> mutex(mMutex);
+
     if (!__IsInit() || !__IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED,   //LCOV_EXCL_LINE
                         "Did not initialize or prepare CAudioInput"); //LCOV_EXCL_LINE
@@ -237,6 +256,8 @@ void CAudioInput::setStreamCallback(SStreamCallback callback) {
 }
 
 size_t CAudioInput::read(void* buffer, size_t length) {
+    std::unique_lock<std::mutex> mutex(mMutex);
+
     if (!__IsInit() || !__IsReady())
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED,   //LCOV_EXCL_LINE
                         "Did not initialize or prepare CAudioInput"); //LCOV_EXCL_LINE
@@ -256,7 +277,6 @@ size_t CAudioInput::read(void* buffer, size_t length) {
 
     int ret = 0;
 
-    std::unique_lock<std::mutex> mutex(mMutex);
     // If another thread did call unprepare, do not read
     if (!mpPulseAudioClient)
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, //LCOV_EXCL_LINE
@@ -321,4 +341,4 @@ double CAudioInput::getVolume() {
         THROW_ERROR_MSG(CAudioError::EError::ERROR_NOT_INITIALIZED, "Not initialized"); //LCOV_EXCL_LINE
 
     return __mVolume;
-}
\ No newline at end of file
+}