AudioStream: Don't call FramesAvailable() while locked

This commit is contained in:
Connor McLaughlin 2020-06-09 02:05:49 +10:00
parent 7b4b2d5dc5
commit 444a09efd4
2 changed files with 8 additions and 6 deletions

View file

@ -80,19 +80,20 @@ void AudioStream::BeginWrite(SampleType** buffer_ptr, u32* num_frames)
void AudioStream::WriteFrames(const SampleType* frames, u32 num_frames) void AudioStream::WriteFrames(const SampleType* frames, u32 num_frames)
{ {
const u32 num_samples = num_frames * m_channels; const u32 num_samples = num_frames * m_channels;
std::unique_lock<std::mutex> lock(m_buffer_mutex); {
std::unique_lock<std::mutex> lock(m_buffer_mutex);
EnsureBuffer(num_samples);
m_buffer.PushRange(frames, num_samples);
}
EnsureBuffer(num_samples);
m_buffer.PushRange(frames, num_samples);
FramesAvailable(); FramesAvailable();
} }
void AudioStream::EndWrite(u32 num_frames) void AudioStream::EndWrite(u32 num_frames)
{ {
m_buffer.AdvanceTail(num_frames * m_channels); m_buffer.AdvanceTail(num_frames * m_channels);
FramesAvailable();
m_buffer_mutex.unlock(); m_buffer_mutex.unlock();
FramesAvailable();
} }
float AudioStream::GetMaxLatency(u32 sample_rate, u32 buffer_size) float AudioStream::GetMaxLatency(u32 sample_rate, u32 buffer_size)
@ -209,6 +210,7 @@ void AudioStream::EnsureBuffer(u32 size)
void AudioStream::DropFrames(u32 count) void AudioStream::DropFrames(u32 count)
{ {
std::unique_lock<std::mutex> lock(m_buffer_mutex);
m_buffer.Remove(count); m_buffer.Remove(count);
} }

View file

@ -16,7 +16,7 @@ void NullAudioStream::CloseDevice() {}
void NullAudioStream::FramesAvailable() void NullAudioStream::FramesAvailable()
{ {
// drop any buffer as soon as they're available // drop any buffer as soon as they're available
DropFrames(GetSamplesAvailableLocked()); DropFrames(GetSamplesAvailable());
} }
std::unique_ptr<AudioStream> AudioStream::CreateNullAudioStream() std::unique_ptr<AudioStream> AudioStream::CreateNullAudioStream()