From 2aa0aaee0c54558827cee06ca2fde85633f18303 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Sat, 2 Nov 2024 19:50:20 +0200 Subject: [PATCH] refactor: AudioSource is a func instead of single function interface This avoids defining Processor altogether. --- audio.go | 19 ++++++++++++------- cmd/sointu-track/main.go | 7 +++++-- oto/oto.go | 2 +- tracker/processor.go | 20 -------------------- 4 files changed, 18 insertions(+), 30 deletions(-) delete mode 100644 tracker/processor.go diff --git a/audio.go b/audio.go index 51fd25f..dcc34ed 100644 --- a/audio.go +++ b/audio.go @@ -29,11 +29,9 @@ type ( Play(r AudioSource) CloserWaiter } - // AudioSource is an interface for reading audio samples into an - // AudioBuffer. Returns error if the buffer is not filled. - AudioSource interface { - ReadAudio(buf AudioBuffer) error - } + // AudioSource is an function for reading audio samples into an AudioBuffer. + // Returns error if the buffer is not filled. + AudioSource func(buf AudioBuffer) error BufferSource struct { buffer AudioBuffer @@ -154,8 +152,15 @@ func (buffer AudioBuffer) Fill(synth Synth) error { return nil } -func (b AudioBuffer) Source() *BufferSource { - return &BufferSource{buffer: b} +func (b AudioBuffer) Source() AudioSource { + return func(buf AudioBuffer) error { + n := copy(buf, b) + b = b[n:] + if n < len(buf) { + return io.EOF + } + return nil + } } // ReadAudio reads audio samples from an AudioSource into an AudioBuffer. diff --git a/cmd/sointu-track/main.go b/cmd/sointu-track/main.go index d8354b2..7b0a891 100644 --- a/cmd/sointu-track/main.go +++ b/cmd/sointu-track/main.go @@ -10,6 +10,7 @@ import ( "runtime/pprof" "gioui.org/app" + "github.com/vsariola/sointu" "github.com/vsariola/sointu/cmd" "github.com/vsariola/sointu/oto" "github.com/vsariola/sointu/tracker" @@ -61,8 +62,10 @@ func main() { } trackerUi := gioui.NewTracker(model) - processor := tracker.NewProcessor(player, midiContext, trackerUi) - audioCloser := audioContext.Play(processor) + audioCloser := audioContext.Play(func(buf sointu.AudioBuffer) error { + player.Process(buf, midiContext, trackerUi) + return nil + }) go func() { trackerUi.Main() diff --git a/oto/oto.go b/oto/oto.go index d0028a8..5bef7a6 100644 --- a/oto/oto.go +++ b/oto/oto.go @@ -77,7 +77,7 @@ func (o *OtoReader) Read(b []byte) (n int, err error) { } else if samples < len(o.tmpBuffer) { o.tmpBuffer = o.tmpBuffer[:samples] } - err = o.audioSource.ReadAudio(o.tmpBuffer) + err = o.audioSource(o.tmpBuffer) if err != nil { return o.closeWithError(err) } diff --git a/tracker/processor.go b/tracker/processor.go deleted file mode 100644 index 21c2bf1..0000000 --- a/tracker/processor.go +++ /dev/null @@ -1,20 +0,0 @@ -package tracker - -import ( - "github.com/vsariola/sointu" -) - -type Processor struct { - *Player - playerProcessContext PlayerProcessContext - uiProcessor EventProcessor -} - -func NewProcessor(player *Player, context PlayerProcessContext, uiProcessor EventProcessor) *Processor { - return &Processor{player, context, uiProcessor} -} - -func (p *Processor) ReadAudio(buf sointu.AudioBuffer) error { - p.Player.Process(buf, p.playerProcessContext, p.uiProcessor) - return nil -}