mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-25 23:29:44 -06:00
Merge pull request #3105 from phire/dont_block
ALSA: Don't block on Clear() call.
This commit is contained in:
@ -48,21 +48,31 @@ void AlsaSound::Update()
|
|||||||
void AlsaSound::SoundLoop()
|
void AlsaSound::SoundLoop()
|
||||||
{
|
{
|
||||||
Common::SetCurrentThreadName("Audio thread - alsa");
|
Common::SetCurrentThreadName("Audio thread - alsa");
|
||||||
while (m_thread_status.load() == ALSAThreadStatus::RUNNING)
|
while (m_thread_status.load() != ALSAThreadStatus::STOPPING)
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lock(cv_m);
|
while (m_thread_status.load() == ALSAThreadStatus::RUNNING)
|
||||||
cv.wait(lock, [this]{return !m_muted || m_thread_status.load() != ALSAThreadStatus::RUNNING;});
|
|
||||||
|
|
||||||
m_mixer->Mix(mix_buffer, frames_to_deliver);
|
|
||||||
int rc = snd_pcm_writei(handle, mix_buffer, frames_to_deliver);
|
|
||||||
if (rc == -EPIPE)
|
|
||||||
{
|
{
|
||||||
// Underrun
|
m_mixer->Mix(mix_buffer, frames_to_deliver);
|
||||||
snd_pcm_prepare(handle);
|
int rc = snd_pcm_writei(handle, mix_buffer, frames_to_deliver);
|
||||||
|
if (rc == -EPIPE)
|
||||||
|
{
|
||||||
|
// Underrun
|
||||||
|
snd_pcm_prepare(handle);
|
||||||
|
}
|
||||||
|
else if (rc < 0)
|
||||||
|
{
|
||||||
|
ERROR_LOG(AUDIO, "writei fail: %s", snd_strerror(rc));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (rc < 0)
|
if (m_thread_status.load() == ALSAThreadStatus::PAUSED)
|
||||||
{
|
{
|
||||||
ERROR_LOG(AUDIO, "writei fail: %s", snd_strerror(rc));
|
snd_pcm_drop(handle); // Stop sound output
|
||||||
|
|
||||||
|
// Block until thread status changes.
|
||||||
|
std::unique_lock<std::mutex> lock(cv_m);
|
||||||
|
cv.wait(lock, [this]{ return m_thread_status.load() != ALSAThreadStatus::PAUSED; });
|
||||||
|
|
||||||
|
snd_pcm_prepare(handle); // resume sound output
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
AlsaShutdown();
|
AlsaShutdown();
|
||||||
@ -73,18 +83,8 @@ void AlsaSound::SoundLoop()
|
|||||||
void AlsaSound::Clear(bool muted)
|
void AlsaSound::Clear(bool muted)
|
||||||
{
|
{
|
||||||
m_muted = muted;
|
m_muted = muted;
|
||||||
if (m_muted)
|
m_thread_status.store(muted ? ALSAThreadStatus::PAUSED : ALSAThreadStatus::RUNNING);
|
||||||
{
|
cv.notify_one(); // Notify thread that status has changed
|
||||||
std::lock_guard<std::mutex> lock(cv_m);
|
|
||||||
snd_pcm_drop(handle);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::unique_lock<std::mutex> lock(cv_m);
|
|
||||||
snd_pcm_prepare(handle);
|
|
||||||
lock.unlock();
|
|
||||||
cv.notify_one();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AlsaSound::AlsaInit()
|
bool AlsaSound::AlsaInit()
|
||||||
|
@ -46,6 +46,7 @@ private:
|
|||||||
enum class ALSAThreadStatus
|
enum class ALSAThreadStatus
|
||||||
{
|
{
|
||||||
RUNNING,
|
RUNNING,
|
||||||
|
PAUSED,
|
||||||
STOPPING,
|
STOPPING,
|
||||||
STOPPED,
|
STOPPED,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user