Add get ns/agc function
[platform/core/api/audio-io.git] / src / cpp / CPulseAudioClient.cpp
index f57c592..d143d94 100644 (file)
@@ -61,20 +61,7 @@ CPulseAudioClient::CPulseAudioClient(
         IPulseStreamListener* listener) :
     __mDirection(direction),
     __mSpec(spec),
-    __mpListener(listener),
-    __mpMainloop(nullptr),
-    __mpContext(nullptr),
-    __mpStream(nullptr),
-    __mpPropList(nullptr),
-    __mIsInit(false),
-    __mIsOperationSuccess(false),
-    __mpSyncReadDataPtr(nullptr),
-    __mSyncReadIndex(0),
-    __mSyncReadLength(0),
-    __mIsUsedSyncRead(false),
-    __mIsFirstStream(false),
-    __mIsDraining(false),
-    __mIsStarted(false) {
+    __mpListener(listener) {
 }
 
 CPulseAudioClient::~CPulseAudioClient() {
@@ -276,6 +263,15 @@ void CPulseAudioClient::__streamUnderflowCb(pa_stream* s, void* user_data) {
     pClient->__mIsStarted = false;
 }
 
+void CPulseAudioClient::__streamOverflowCb(pa_stream* s, void* user_data) {
+    assert(s);
+    assert(user_data);
+
+    auto pClient = static_cast<CPulseAudioClient*>(user_data);
+
+    AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] OverFlow...", pClient, s);
+}
+
 //LCOV_EXCL_START
 void CPulseAudioClient::__streamEventCb(pa_stream* s, const char* name, pa_proplist* pl, void* user_data) {
     assert(s);
@@ -302,7 +298,7 @@ void CPulseAudioClient::__successStreamCb(pa_stream* s, int success, void* user_
 
     auto pClient = static_cast<CPulseAudioClient*>(user_data);
 
-    AUDIO_IO_LOGD("pClient[%p], pa_stream[%p], success[%d], user_data[%p]", pClient, s, success, user_data);
+    AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] success[%d] user_data[%p]", pClient, s, success, user_data);
 
     pClient->__mIsOperationSuccess = static_cast<bool>(success);
 
@@ -317,7 +313,7 @@ void CPulseAudioClient::__successDrainCbInThread(pa_stream* s, int success, void
 
     auto pClient = static_cast<CPulseAudioClient*>(user_data);
 
-    AUDIO_IO_LOGD("pClient[%p], pa_stream[%p], success[%d], user_data[%p]", pClient, s, success, user_data);
+    AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] success[%d] user_data[%p]", pClient, s, success, user_data);
 
     pClient->__mIsOperationSuccess = static_cast<bool>(success);
     pClient->__mIsDraining = false;
@@ -330,7 +326,7 @@ void CPulseAudioClient::__successDrainCb(pa_stream* s, int success, void* user_d
 
     auto pClient = static_cast<CPulseAudioClient*>(user_data);
 
-    AUDIO_IO_LOGD("pClient[%p], pa_stream[%p], success[%d], user_data[%p]", pClient, s, success, user_data);
+    AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] success[%d] user_data[%p]", pClient, s, success, user_data);
 
     pClient->__mIsOperationSuccess = static_cast<bool>(success);
     pClient->__mIsDraining = false;
@@ -339,7 +335,7 @@ void CPulseAudioClient::__successDrainCb(pa_stream* s, int success, void* user_d
 }
 
 void CPulseAudioClient::__successVolumeCb(pa_context* c, int success, void* user_data) {
-    AUDIO_IO_LOGD("pa_context[%p], success[%d], user_data[%p]", c, success, user_data);
+    AUDIO_IO_LOGD("pa_context[%p] success[%d] user_data[%p]", c, success, user_data);
 }
 
 void CPulseAudioClient::resetStreamCallbacks() {
@@ -396,16 +392,26 @@ void CPulseAudioClient::initialize() {
             THROW_ERROR_MSG(CAudioError::EError::ERROR_OUT_OF_MEMORY, "Failed pa_proplist_new()"); //LCOV_EXCL_LINE
 
         // Adds values on proplist for delivery to PULSEAUDIO
-        pa_proplist_sets(__mpPropList, PA_PROP_MEDIA_ROLE, __mSpec.getAudioInfo().getConvertedStreamType());
+        auto [ streamType, streamIndex ] = __mSpec.getAudioInfo().getStreamProperties();
+
+        pa_proplist_sets(__mpPropList, PA_PROP_MEDIA_ROLE, streamType);
+        if (streamIndex >= 0)
+            pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_PARENT_ID, "%d", streamIndex);
+
+        if (__mDirection == EStreamDirection::STREAM_DIRECTION_RECORD) {
+            /* Noise-suppression effect should be set first. */
+            std::string ns_method = __mSpec.getAudioInfo().getEffectNoiseSuppressionMethod();
+            auto [ method_reference, device_id ] = __mSpec.getAudioInfo().getEffectMethodWithReference();
+            std::string agc_method = __mSpec.getAudioInfo().getEffectAutomaticGainControlMethod();
 
-        int index = __mSpec.getAudioInfo().getAudioIndex();
-        if (index >= 0)
-            pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_PARENT_ID, "%u", (unsigned int) index);
+            std::string method_all = ns_method + method_reference + agc_method;
 
-        int reference_id = __mSpec.getAudioInfo().getEchoCancelReferenceDeviceId();
-        if (reference_id > 0) {
-            pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_ECHO_CANCEL_METHOD, "%s", ec_method);
-            pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_ECHO_CANCEL_REFERENCE_DEVICE, "%d", reference_id);
+            if (!method_all.empty()) {
+                pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_PREPROCESSOR_METHOD, "%s", method_all.c_str());
+                pa_proplist_setf(__mpPropList, PA_PROP_MEDIA_ECHO_CANCEL_REFERENCE_DEVICE, "%d", device_id);
+
+                AUDIO_IO_LOGD("preprocess will be set. method[%s], device_id[%d]", method_all.c_str(), device_id);
+            }
         }
 
         // Adds latency on proplist for delivery to PULSEAUDIO
@@ -483,6 +489,7 @@ void CPulseAudioClient::initialize() {
         if (__mDirection == EStreamDirection::STREAM_DIRECTION_PLAYBACK) {
             pa_stream_set_started_callback(__mpStream, __streamStartedCb, this);
             pa_stream_set_underflow_callback(__mpStream, __streamUnderflowCb, this);
+            pa_stream_set_overflow_callback(__mpStream, __streamOverflowCb, this);
         }
 
         // Connect stream with PA Server