Handle pop-timeout event 30/76330/3 accepted/tizen/common/20160704.145315 accepted/tizen/ivi/20160704.090631 accepted/tizen/mobile/20160704.090539 accepted/tizen/tv/20160704.090518 accepted/tizen/wearable/20160704.090415 submit/tizen/20160704.004002
authorSeungbae Shin <seungbae.shin@samsung.com>
Thu, 23 Jun 2016 10:34:00 +0000 (19:34 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Thu, 30 Jun 2016 08:52:44 +0000 (17:52 +0900)
[Version] 0.3.37
[Profile] Common
[Issue Type] MPR-381

Change-Id: I0e2f62e63da52b96d6d3f662199a82b9cae753e7

include/CPulseAudioClient.h
packaging/capi-media-audio-io.spec
src/cpp/CAudioIO.cpp
src/cpp/CPulseAudioClient.cpp

index 33a6681..af3f0c5 100644 (file)
@@ -111,6 +111,7 @@ namespace tizen_media_audio {
         static void __streamCaptureCb(pa_stream* s, size_t length, void* user_data);
         static void __streamPlaybackCb(pa_stream* s, size_t length, void* user_data);
         static void __streamLatencyUpdateCb(pa_stream* s, void* user_data);
+        static void __streamEventCb(pa_stream* s, const char *name, pa_proplist *pl, void *user_data);
         static void __successStreamCb(pa_stream* s, int success, void* user_data);
     };
 
index f368524..d4f0cfa 100644 (file)
@@ -1,6 +1,6 @@
 Name:           capi-media-audio-io
 Summary:        An Audio Input & Audio Output library in Tizen Native API
-Version:        0.3.36
+Version:        0.3.37
 Release:        0
 Group:          Multimedia/API
 License:        Apache-2.0
index d1898f7..e1dd7a2 100644 (file)
@@ -460,7 +460,7 @@ void CAudioIO::ignoreSession() throw(CAudioError) {
     try {
         internalLock();
 
-        if (mpPulseAudioClient != NULL && mpPulseAudioClient->isCorked() == false) {
+        if (mpPulseAudioClient != NULL && mState == CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING) {
             THROW_ERROR_MSG(CAudioError::EError::ERROR_INVALID_OPERATION, "An Operation is not permitted while started");
         }
 
index da71fe3..f893159 100644 (file)
@@ -189,6 +189,19 @@ void CPulseAudioClient::__streamLatencyUpdateCb(pa_stream* s, void* user_data) {
     pa_threaded_mainloop_signal(pClient->__mpMainloop, 0);
 }
 
+void CPulseAudioClient::__streamEventCb(pa_stream* s, const char *name, pa_proplist *pl, void *user_data) {
+    assert(s);
+    assert(user_data);
+
+    AUDIO_IO_LOGE("NAME : %s, Prop : %p", name, pl);
+
+    CPulseAudioClient* pClient = static_cast<CPulseAudioClient*>(user_data);
+    if (strcmp(name, PA_STREAM_EVENT_POP_TIMEOUT) == 0) {
+        pa_operation_unref(pa_stream_cork(pClient->__mpStream, 1, NULL, NULL));
+    }
+}
+
+
 void CPulseAudioClient::__successStreamCb(pa_stream* s, int success, void* user_data) {
     AUDIO_IO_LOGD("pa_stream[%p], success[%d], user_data[%p]", s, success, user_data);
     assert(s);
@@ -296,6 +309,7 @@ void CPulseAudioClient::initialize() throw(CAudioError) {
         pa_stream_set_read_callback(__mpStream, __streamCaptureCb, this);
         pa_stream_set_write_callback(__mpStream, __streamPlaybackCb, this);
         pa_stream_set_latency_update_callback(__mpStream, __streamLatencyUpdateCb, this);
+        pa_stream_set_event_callback(__mpStream, __streamEventCb, this);
 
         // Connect stream with PA Server
 
@@ -572,6 +586,10 @@ int CPulseAudioClient::write(const void* data, size_t length) throw(CAudioError)
 #ifdef _AUDIO_IO_DEBUG_TIMING_
     AUDIO_IO_LOGD("data[%p], length[%d]", data, length);
 #endif
+    if (pa_stream_is_corked(__mpStream)) {
+        AUDIO_IO_LOGW("stream is corked...do uncork here first!!!!");
+        pa_operation_unref(pa_stream_cork(__mpStream, 0, NULL, this));
+    }
 
     if (isInThread() == false) {
         pa_threaded_mainloop_lock(__mpMainloop);