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() {
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);
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);
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;
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;
}
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() {
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
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