From a7d06f5eeaacd3b570ef805416e19959eef5aeb4 Mon Sep 17 00:00:00 2001 From: WeebDataHoarder <57538841+WeebDataHoarder@users.noreply.github.com> Date: Sun, 31 Jul 2022 22:42:18 +0200 Subject: [PATCH] Made QueueEntry.ReadSamples atomic --- audio/queue/queue.go | 11 ++++++----- audio/queue/queue_test.go | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/audio/queue/queue.go b/audio/queue/queue.go index f86d0f6..bfe9749 100644 --- a/audio/queue/queue.go +++ b/audio/queue/queue.go @@ -11,9 +11,10 @@ import ( type QueueIdentifier int type QueueEntry struct { - Identifier QueueIdentifier - Source audio.Source - ReadSamples int + Identifier QueueIdentifier + Source audio.Source + //TODO: convert ReadSamples to atomic.Uint64 once 1.19 releases + ReadSamples uint64 cancel chan bool StartCallback func(q *Queue, entry *QueueEntry) EndCallback func(q *Queue, entry *QueueEntry) @@ -146,10 +147,10 @@ func queueLoopStart[T audio.AllowedSourceTypes](q *Queue) { q.Remove(current.Identifier) break F1 } else { - if current.StartCallback != nil && current.ReadSamples == 0 && len(block) > 0 { + if current.StartCallback != nil && atomic.LoadUint64(¤t.ReadSamples) == 0 && len(block) > 0 { current.StartCallback(q, current) } - current.ReadSamples += len(block) / current.Source.GetChannels() + atomic.AddUint64(¤t.ReadSamples, uint64(len(block)/current.Source.GetChannels())) q.output.(audio.TypedSource[T]).IngestNative(block, current.Source.GetBitDepth()) } } diff --git a/audio/queue/queue_test.go b/audio/queue/queue_test.go index 6e9af9d..e590412 100644 --- a/audio/queue/queue_test.go +++ b/audio/queue/queue_test.go @@ -6,6 +6,7 @@ import ( "git.gammaspectra.live/S.O.N.G/Kirika/test" "os" "path" + "sync/atomic" "testing" ) @@ -42,7 +43,7 @@ func TestQueue(t *testing.T) { q.AddTail(source, func(q *Queue, entry *QueueEntry) { t.Logf("Started playback of %d %s\n", entry.Identifier, fullPath) }, func(q *Queue, entry *QueueEntry) { - t.Logf("Finished playback of %d %s: output %d samples\n", entry.Identifier, fullPath, entry.ReadSamples) + t.Logf("Finished playback of %d %s: output %d samples\n", entry.Identifier, fullPath, atomic.LoadUint64(&entry.ReadSamples)) }, func(q *Queue, entry *QueueEntry) { fp.Close() if q.GetQueueSize() == 0 {