From f427eca1f4891566eba06f2a5da992053a6e050a Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Mon, 14 Oct 2024 16:57:21 +0300 Subject: [PATCH] fix(sointu-vsti): VST crashed due to Model.MIDI being nil --- cmd/sointu-track/main.go | 5 +++-- cmd/sointu-vsti/main.go | 20 ++++++++++++++++---- tracker/model.go | 1 - 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/cmd/sointu-track/main.go b/cmd/sointu-track/main.go index 9989e5f..fc63b02 100644 --- a/cmd/sointu-track/main.go +++ b/cmd/sointu-track/main.go @@ -54,7 +54,8 @@ func main() { recoveryFile = filepath.Join(configDir, "Sointu", "sointu-track-recovery") } model, player := tracker.NewModelPlayer(cmd.MainSynther, recoveryFile) - model.MIDI = gomidi.NewContext() + midiContext := gomidi.NewContext() + model.MIDI = midiContext defer model.MIDI.Close() if a := flag.Args(); len(a) > 0 { f, err := os.Open(a[0]) @@ -64,7 +65,7 @@ func main() { f.Close() } tracker := gioui.NewTracker(model) - audioCloser := audioContext.Play(&PlayerAudioSource{player, model.MIDI}) + audioCloser := audioContext.Play(&PlayerAudioSource{player, midiContext}) go func() { tracker.Main() audioCloser.Close() diff --git a/cmd/sointu-vsti/main.go b/cmd/sointu-vsti/main.go index 67a72a0..fc64264 100644 --- a/cmd/sointu-vsti/main.go +++ b/cmd/sointu-vsti/main.go @@ -17,12 +17,22 @@ import ( "pipelined.dev/audio/vst2" ) -type VSTIProcessContext struct { - events []vst2.MIDIEvent - eventIndex int - host vst2.Host +type ( + VSTIProcessContext struct { + events []vst2.MIDIEvent + eventIndex int + host vst2.Host + } + + NullMIDIContext struct{} +) + +func (m *NullMIDIContext) ListInputDevices() func(yield func(tracker.MIDIDevice) bool) { + return func(yield func(tracker.MIDIDevice) bool) {} } +func (m *NullMIDIContext) Close() {} + func (c *VSTIProcessContext) NextEvent() (event tracker.MIDINoteEvent, ok bool) { for c.eventIndex < len(c.events) { ev := c.events[c.eventIndex] @@ -63,6 +73,8 @@ func init() { recoveryFile = filepath.Join(configDir, "sointu", "sointu-vsti-recovery-"+hex.EncodeToString(randBytes)) } model, player := tracker.NewModelPlayer(cmd.MainSynther, recoveryFile) + model.MIDI = &NullMIDIContext{} + t := gioui.NewTracker(model) tracker.Bool{BoolData: (*tracker.InstrEnlarged)(model)}.Set(true) go t.Main() diff --git a/tracker/model.go b/tracker/model.go index 175d5f7..7c833f2 100644 --- a/tracker/model.go +++ b/tracker/model.go @@ -126,7 +126,6 @@ type ( MIDIContext interface { ListInputDevices() func(yield func(MIDIDevice) bool) Close() - PlayerProcessContext } MIDIDevice interface {