assert(user_data);
auto pClient = static_cast<CPulseAudioClient*>(user_data);
+ pa_stream_state_t state = pa_stream_get_state(s);
+
+ switch (state) {
+ case PA_STREAM_UNCONNECTED:
+ break;
+
+ case PA_STREAM_CREATING:
+ break;
- switch (pa_stream_get_state(s)) {
case PA_STREAM_READY:
- AUDIO_IO_LOGD("The pa_stream[%p] is ready", s);
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] is READY[%d]", pClient, s, PA_STREAM_READY);
pClient->__mpListener->setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING);
pClient->__mpListener->onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_RUNNING);
if (pClient->__mDirection == EStreamDirection::STREAM_DIRECTION_PLAYBACK)
pClient->__mIsFirstStream = true;
pClient->__mIsInit = true;
- pa_threaded_mainloop_signal(pClient->__mpMainloop, 0);
+
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] now signaling...", pClient, s);
+ pa_threaded_mainloop_signal(pClient->__mpMainloop, 1);
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] signal accepted", pClient, s);
break;
//LCOV_EXCL_START
case PA_STREAM_FAILED:
- AUDIO_IO_LOGD("The pa_stream[%p] is failed", s);
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] is FAILED[%d]", pClient, s, PA_STREAM_FAILED);
pClient->__mpListener->setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
pClient->__mpListener->onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE,
__is_microphone_restricted());
+
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] now signaling...", pClient, s);
pa_threaded_mainloop_signal(pClient->__mpMainloop, 0);
break;
//LCOV_EXCL_STOP
case PA_STREAM_TERMINATED:
- AUDIO_IO_LOGD("The pa_stream[%p] is terminated", s);
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] is TERMINATED[%d]", pClient, s, PA_STREAM_TERMINATED);
pClient->__mpListener->setState(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
pClient->__mpListener->onStateChanged(CAudioInfo::EAudioIOState::AUDIO_IO_STATE_IDLE);
+
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] now signaling...", pClient, s);
pa_threaded_mainloop_signal(pClient->__mpMainloop, 0);
break;
- case PA_STREAM_UNCONNECTED:
- case PA_STREAM_CREATING:
+ default:
+ AUDIO_IO_LOGW("Unexpected state[%d]", state);
break;
}
+
+ AUDIO_IO_LOGD("pClient[%p] pa_stream[%p] state[%d] done", pClient, s, state);
}
void CPulseAudioClient::__streamCaptureCb(pa_stream* s, size_t length, void* user_data) {
pClient->__mIsOperationSuccess = static_cast<bool>(success);
- /* FIXME : verify following action without any waitings */
+ /* FIXME : verify following action without any waiting */
pa_threaded_mainloop_signal(pClient->__mpMainloop, 0);
}
pa_threaded_mainloop_wait(__mpMainloop);
}
+ AUDIO_IO_LOGD("pa_context[%p] now ready", __mpContext);
+
// Allocates PA stream
pa_sample_spec ss = __mSpec.getSampleSpec();
pa_channel_map map = __mSpec.getChannelMap();
ret = pa_stream_connect_record(__mpStream, NULL, NULL, flags);
}
-
if (ret != 0) {
//LCOV_EXCL_START
err = pa_context_errno(__mpContext);
//LCOV_EXCL_STOP
}
+ AUDIO_IO_LOGD("pa_stream[%p] now wait for stream ready...", __mpStream);
+
while (true) {
pa_stream_state_t state = pa_stream_get_state(__mpStream);
+ AUDIO_IO_LOGD("pa_stream[%p] current state[%d]", __mpStream, state);
- if (state == PA_STREAM_READY) {
- AUDIO_IO_LOGD("STREAM READY");
+ if (state == PA_STREAM_READY)
break;
- }
if (!PA_STREAM_IS_GOOD(state)) {
err = pa_context_errno(__mpContext);
}
/* Wait until the stream is ready */
+ AUDIO_IO_LOGD("pa_mainloop[%p] signal wait...", __mpMainloop);
pa_threaded_mainloop_wait(__mpMainloop);
+ AUDIO_IO_LOGD("pa_mainloop[%p] signal wait done", __mpMainloop);
}
+ pa_threaded_mainloop_accept(__mpMainloop);
// __mIsInit = true; // Moved to __streamStateChangeCb()
} catch (const CAudioError& e) {
/* FIXME: wait for completion like drain? */
pa_operation_unref(pa_stream_cork(__mpStream, static_cast<int>(cork), __successStreamCb, this));
+ AUDIO_IO_LOGD("cork[%d] done", cork);
}
bool CPulseAudioClient::isCorked() {