playbackcache: made thread-safe

Since this class is regularly accessed by multiple threads, it makes the
most sense to make all of its functions thread-safe.
This commit is contained in:
itsmattkc
2020-06-03 03:38:28 +10:00
parent 08eb12710c
commit e30d278327
6 changed files with 183 additions and 70 deletions
+16 -2
View File
@@ -39,6 +39,8 @@ AudioPlaybackCache::AudioPlaybackCache()
void AudioPlaybackCache::SetParameters(const AudioRenderingParams &params)
{
QMutexLocker locker(lock());
if (params_ == params) {
return;
}
@@ -52,13 +54,19 @@ void AudioPlaybackCache::SetParameters(const AudioRenderingParams &params)
}
// Our current audio cache is unusable, so we truncate it automatically
InvalidateAll();
TimeRange invalidate_range(0, NoLockGetLength());
NoLockInvalidate(invalidate_range);
locker.unlock();
emit ParametersChanged();
emit Invalidated(invalidate_range);
}
void AudioPlaybackCache::WritePCM(const TimeRange &range, SampleBufferPtr samples)
{
QMutexLocker locker(lock());
QFile f(filename_);
if (f.open(QFile::ReadWrite)) {
qint64 start_offset = params_.time_to_bytes(range.in());
@@ -82,7 +90,11 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, SampleBufferPtr sample
f.close();
Validate(range);
NoLockValidate(range);
locker.unlock();
emit Validated(range);
} else {
qWarning() << "Failed to write PCM data to" << filename_;
}
@@ -90,6 +102,8 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, SampleBufferPtr sample
void AudioPlaybackCache::WriteSilence(const TimeRange &range)
{
QMutexLocker locker(lock());
QFile f(filename_);
if (f.open(QFile::ReadWrite)) {
qint64 start_offset = params_.time_to_bytes(range.in());