mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
fix(tracker): use non-blocking sends from Model to Player
This ensures that the GUI can never hang, even if the Player has completely crashed.
This commit is contained in:
parent
6337101985
commit
04deac5722
@ -204,7 +204,7 @@ func (m *Model) Undo() Action {
|
|||||||
m.d = m.undoStack[len(m.undoStack)-1]
|
m.d = m.undoStack[len(m.undoStack)-1]
|
||||||
m.undoStack = m.undoStack[:len(m.undoStack)-1]
|
m.undoStack = m.undoStack[:len(m.undoStack)-1]
|
||||||
m.prevUndoKind = ""
|
m.prevUndoKind = ""
|
||||||
(*Model)(m).send(m.d.Song.Copy())
|
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -221,7 +221,7 @@ func (m *Model) Redo() Action {
|
|||||||
m.d = m.redoStack[len(m.redoStack)-1]
|
m.d = m.redoStack[len(m.redoStack)-1]
|
||||||
m.redoStack = m.redoStack[:len(m.redoStack)-1]
|
m.redoStack = m.redoStack[:len(m.redoStack)-1]
|
||||||
m.prevUndoKind = ""
|
m.prevUndoKind = ""
|
||||||
(*Model)(m).send(m.d.Song.Copy())
|
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -311,7 +311,7 @@ func (m *Model) PlayCurrentPos() Action {
|
|||||||
m.setPanic(false)
|
m.setPanic(false)
|
||||||
m.setLoop(Loop{})
|
m.setLoop(Loop{})
|
||||||
m.playing = true
|
m.playing = true
|
||||||
m.send(StartPlayMsg{m.d.Cursor.SongPos})
|
trySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -323,7 +323,7 @@ func (m *Model) PlaySongStart() Action {
|
|||||||
m.setPanic(false)
|
m.setPanic(false)
|
||||||
m.setLoop(Loop{})
|
m.setLoop(Loop{})
|
||||||
m.playing = true
|
m.playing = true
|
||||||
m.send(StartPlayMsg{})
|
trySend(m.broker.ToPlayer, any(StartPlayMsg{}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -338,7 +338,7 @@ func (m *Model) PlaySelected() Action {
|
|||||||
r := l.listRange()
|
r := l.listRange()
|
||||||
newLoop := Loop{r.Start, r.End - r.Start}
|
newLoop := Loop{r.Start, r.End - r.Start}
|
||||||
m.setLoop(newLoop)
|
m.setLoop(newLoop)
|
||||||
m.send(StartPlayMsg{sointu.SongPos{OrderRow: r.Start, PatternRow: 0}})
|
trySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: r.Start, PatternRow: 0}}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -353,7 +353,7 @@ func (m *Model) PlayFromLoopStart() Action {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
m.playing = true
|
m.playing = true
|
||||||
m.send(StartPlayMsg{sointu.SongPos{OrderRow: m.loop.Start, PatternRow: 0}})
|
trySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: m.loop.Start, PatternRow: 0}}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -368,7 +368,7 @@ func (m *Model) StopPlaying() Action {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
m.playing = false
|
m.playing = false
|
||||||
(*Model)(m).send(IsPlayingMsg{false})
|
trySend(m.broker.ToPlayer, any(IsPlayingMsg{false}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -510,13 +510,13 @@ func (m *Model) completeAction(checkSave bool) {
|
|||||||
func (m *Model) setPanic(val bool) {
|
func (m *Model) setPanic(val bool) {
|
||||||
if m.panic != val {
|
if m.panic != val {
|
||||||
m.panic = val
|
m.panic = val
|
||||||
m.send(PanicMsg{val})
|
trySend(m.broker.ToPlayer, any(PanicMsg{val}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) setLoop(newLoop Loop) {
|
func (m *Model) setLoop(newLoop Loop) {
|
||||||
if m.loop != newLoop {
|
if m.loop != newLoop {
|
||||||
m.loop = newLoop
|
m.loop = newLoop
|
||||||
m.send(newLoop)
|
trySend(m.broker.ToPlayer, any(newLoop))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,7 +72,7 @@ func (m *IsRecording) Value() bool { return (*Model)(m).recording }
|
|||||||
func (m *IsRecording) setValue(val bool) {
|
func (m *IsRecording) setValue(val bool) {
|
||||||
m.recording = val
|
m.recording = val
|
||||||
m.instrEnlarged = val
|
m.instrEnlarged = val
|
||||||
(*Model)(m).send(RecordingMsg{val})
|
trySend(m.broker.ToPlayer, any(RecordingMsg{val}))
|
||||||
}
|
}
|
||||||
func (m *IsRecording) Enabled() bool { return true }
|
func (m *IsRecording) Enabled() bool { return true }
|
||||||
|
|
||||||
@ -84,9 +84,9 @@ func (m *Playing) setValue(val bool) {
|
|||||||
m.playing = val
|
m.playing = val
|
||||||
if m.playing {
|
if m.playing {
|
||||||
(*Model)(m).setPanic(false)
|
(*Model)(m).setPanic(false)
|
||||||
(*Model)(m).send(StartPlayMsg{m.d.Cursor.SongPos})
|
trySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
||||||
} else {
|
} else {
|
||||||
(*Model)(m).send(IsPlayingMsg{val})
|
trySend(m.broker.ToPlayer, any(IsPlayingMsg{val}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (m *Playing) Enabled() bool { return m.playing || !m.instrEnlarged }
|
func (m *Playing) Enabled() bool { return m.playing || !m.instrEnlarged }
|
||||||
|
@ -235,7 +235,7 @@ func (m *Model) change(kind string, t ChangeType, severity ChangeSeverity) func(
|
|||||||
m.updatePatternUseCount()
|
m.updatePatternUseCount()
|
||||||
m.d.Cursor.SongPos = m.d.Song.Score.Clamp(m.d.Cursor.SongPos)
|
m.d.Cursor.SongPos = m.d.Song.Score.Clamp(m.d.Cursor.SongPos)
|
||||||
m.d.Cursor2.SongPos = m.d.Song.Score.Clamp(m.d.Cursor2.SongPos)
|
m.d.Cursor2.SongPos = m.d.Song.Score.Clamp(m.d.Cursor2.SongPos)
|
||||||
m.send(m.d.Song.Score.Copy())
|
trySend(m.broker.ToPlayer, any(m.d.Song.Score.Copy()))
|
||||||
}
|
}
|
||||||
if m.changeType&PatchChange != 0 {
|
if m.changeType&PatchChange != 0 {
|
||||||
m.fixIDCollisions()
|
m.fixIDCollisions()
|
||||||
@ -250,14 +250,14 @@ func (m *Model) change(kind string, t ChangeType, severity ChangeSeverity) func(
|
|||||||
m.d.UnitIndex2 = clamp(m.d.UnitIndex2, 0, unitCount-1)
|
m.d.UnitIndex2 = clamp(m.d.UnitIndex2, 0, unitCount-1)
|
||||||
m.d.UnitSearching = false // if we change anything in the patch, reset the unit searching
|
m.d.UnitSearching = false // if we change anything in the patch, reset the unit searching
|
||||||
m.d.UnitSearchString = ""
|
m.d.UnitSearchString = ""
|
||||||
m.send(m.d.Song.Patch.Copy())
|
trySend(m.broker.ToPlayer, any(m.d.Song.Patch.Copy()))
|
||||||
}
|
}
|
||||||
if m.changeType&BPMChange != 0 {
|
if m.changeType&BPMChange != 0 {
|
||||||
m.send(BPMMsg{m.d.Song.BPM})
|
trySend(m.broker.ToPlayer, any(BPMMsg{m.d.Song.BPM}))
|
||||||
m.signalAnalyzer.SetBpm(m.d.Song.BPM)
|
m.signalAnalyzer.SetBpm(m.d.Song.BPM)
|
||||||
}
|
}
|
||||||
if m.changeType&RowsPerBeatChange != 0 {
|
if m.changeType&RowsPerBeatChange != 0 {
|
||||||
m.send(RowsPerBeatMsg{m.d.Song.RowsPerBeat})
|
trySend(m.broker.ToPlayer, any(RowsPerBeatMsg{m.d.Song.RowsPerBeat}))
|
||||||
}
|
}
|
||||||
m.undoSkipCounter++
|
m.undoSkipCounter++
|
||||||
var limit int
|
var limit int
|
||||||
@ -338,7 +338,7 @@ func (m *Model) UnmarshalRecovery(bytes []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.d.ChangedSinceRecovery = false
|
m.d.ChangedSinceRecovery = false
|
||||||
m.send(m.d.Song.Copy())
|
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
m.updatePatternUseCount()
|
m.updatePatternUseCount()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -391,18 +391,18 @@ func (m *Model) Broker() *Broker { return m.broker }
|
|||||||
|
|
||||||
func (m *Model) TrackNoteOn(track int, note byte) (id NoteID) {
|
func (m *Model) TrackNoteOn(track int, note byte) (id NoteID) {
|
||||||
id = NoteID{IsInstr: false, Track: track, Note: note, model: m}
|
id = NoteID{IsInstr: false, Track: track, Note: note, model: m}
|
||||||
m.send(NoteOnMsg{id})
|
trySend(m.broker.ToPlayer, any(NoteOnMsg{id}))
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) InstrNoteOn(instr int, note byte) (id NoteID) {
|
func (m *Model) InstrNoteOn(instr int, note byte) (id NoteID) {
|
||||||
id = NoteID{IsInstr: true, Instr: instr, Note: note, model: m}
|
id = NoteID{IsInstr: true, Instr: instr, Note: note, model: m}
|
||||||
m.send(NoteOnMsg{id})
|
trySend(m.broker.ToPlayer, any(NoteOnMsg{id}))
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n NoteID) NoteOff() {
|
func (n NoteID) NoteOff() {
|
||||||
n.model.send(NoteOffMsg{n})
|
trySend(n.model.broker.ToPlayer, any(NoteOffMsg{n}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Model) FindUnit(id int) (instrIndex, unitIndex int, err error) {
|
func (m *Model) FindUnit(id int) (instrIndex, unitIndex int, err error) {
|
||||||
@ -434,11 +434,6 @@ func (m *Model) resetSong() {
|
|||||||
m.d.ChangedSinceSave = false
|
m.d.ChangedSinceSave = false
|
||||||
}
|
}
|
||||||
|
|
||||||
// send sends a message to the player
|
|
||||||
func (m *Model) send(message interface{}) {
|
|
||||||
m.broker.ToPlayer <- message
|
|
||||||
}
|
|
||||||
|
|
||||||
func (m *Model) maxID() int {
|
func (m *Model) maxID() int {
|
||||||
maxID := 0
|
maxID := 0
|
||||||
for _, instr := range m.d.Song.Patch {
|
for _, instr := range m.d.Song.Patch {
|
||||||
|
Loading…
Reference in New Issue
Block a user