mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
refactor(tracker): rename trySend to TrySend to make it public
This commit is contained in:
parent
0199658025
commit
9f89c37956
@ -211,7 +211,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 = ""
|
||||||
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
TrySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,7 +228,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 = ""
|
||||||
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
TrySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -318,7 +318,7 @@ func (m *Model) PlayCurrentPos() Action {
|
|||||||
m.setPanic(false)
|
m.setPanic(false)
|
||||||
m.setLoop(Loop{})
|
m.setLoop(Loop{})
|
||||||
m.playing = true
|
m.playing = true
|
||||||
trySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
TrySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -330,7 +330,7 @@ func (m *Model) PlaySongStart() Action {
|
|||||||
m.setPanic(false)
|
m.setPanic(false)
|
||||||
m.setLoop(Loop{})
|
m.setLoop(Loop{})
|
||||||
m.playing = true
|
m.playing = true
|
||||||
trySend(m.broker.ToPlayer, any(StartPlayMsg{}))
|
TrySend(m.broker.ToPlayer, any(StartPlayMsg{}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -345,7 +345,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)
|
||||||
trySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: r.Start, PatternRow: 0}}))
|
TrySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: r.Start, PatternRow: 0}}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -360,7 +360,7 @@ func (m *Model) PlayFromLoopStart() Action {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
m.playing = true
|
m.playing = true
|
||||||
trySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: m.loop.Start, PatternRow: 0}}))
|
TrySend(m.broker.ToPlayer, any(StartPlayMsg{sointu.SongPos{OrderRow: m.loop.Start, PatternRow: 0}}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -375,7 +375,7 @@ func (m *Model) StopPlaying() Action {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
m.playing = false
|
m.playing = false
|
||||||
trySend(m.broker.ToPlayer, any(IsPlayingMsg{false}))
|
TrySend(m.broker.ToPlayer, any(IsPlayingMsg{false}))
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -517,13 +517,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
|
||||||
trySend(m.broker.ToPlayer, any(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
|
||||||
trySend(m.broker.ToPlayer, any(newLoop))
|
TrySend(m.broker.ToPlayer, any(newLoop))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,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
|
||||||
trySend(m.broker.ToPlayer, any(RecordingMsg{val}))
|
TrySend(m.broker.ToPlayer, any(RecordingMsg{val}))
|
||||||
}
|
}
|
||||||
func (m *IsRecording) Enabled() bool { return true }
|
func (m *IsRecording) Enabled() bool { return true }
|
||||||
|
|
||||||
@ -86,9 +86,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)
|
||||||
trySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
TrySend(m.broker.ToPlayer, any(StartPlayMsg{m.d.Cursor.SongPos}))
|
||||||
} else {
|
} else {
|
||||||
trySend(m.broker.ToPlayer, any(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 }
|
||||||
@ -144,7 +144,7 @@ func (m *Oversampling) Bool() Bool { return Bool{m} }
|
|||||||
func (m *Oversampling) Value() bool { return m.oversampling }
|
func (m *Oversampling) Value() bool { return m.oversampling }
|
||||||
func (m *Oversampling) setValue(val bool) {
|
func (m *Oversampling) setValue(val bool) {
|
||||||
m.oversampling = val
|
m.oversampling = val
|
||||||
trySend(m.broker.ToDetector, MsgToDetector{HasOversampling: true, Oversampling: val})
|
TrySend(m.broker.ToDetector, MsgToDetector{HasOversampling: true, Oversampling: val})
|
||||||
}
|
}
|
||||||
func (m *Oversampling) Enabled() bool { return true }
|
func (m *Oversampling) Enabled() bool { return true }
|
||||||
|
|
||||||
|
@ -85,10 +85,10 @@ func (b *Broker) PutAudioBuffer(buf *sointu.AudioBuffer) {
|
|||||||
b.bufferPool.Put(buf)
|
b.bufferPool.Put(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
// trySend is a helper function to send a value to a channel if it is not full.
|
// TrySend is a helper function to send a value to a channel if it is not full.
|
||||||
// It is guaranteed to be non-blocking. Return true if the value was sent, false
|
// It is guaranteed to be non-blocking. Return true if the value was sent, false
|
||||||
// otherwise.
|
// otherwise.
|
||||||
func trySend[T any](c chan<- T, v T) bool {
|
func TrySend[T any](c chan<- T, v T) bool {
|
||||||
select {
|
select {
|
||||||
case c <- v:
|
case c <- v:
|
||||||
default:
|
default:
|
||||||
|
@ -139,7 +139,7 @@ func (s *Detector) Run() {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trySend(s.broker.ToModel, MsgToModel{
|
TrySend(s.broker.ToModel, MsgToModel{
|
||||||
HasDetectorResult: true,
|
HasDetectorResult: true,
|
||||||
DetectorResult: DetectorResult{
|
DetectorResult: DetectorResult{
|
||||||
Loudness: s.loudnessDetector.update(chunk),
|
Loudness: s.loudnessDetector.update(chunk),
|
||||||
|
@ -84,17 +84,17 @@ func (m *Model) WriteWav(w io.WriteCloser, pcm16 bool) {
|
|||||||
name := fmt.Sprintf("%x", b)[2 : 32+2]
|
name := fmt.Sprintf("%x", b)[2 : 32+2]
|
||||||
data, err := sointu.Play(m.synther, song, func(p float32) {
|
data, err := sointu.Play(m.synther, song, func(p float32) {
|
||||||
txt := fmt.Sprintf("Exporting song: %.0f%%", p*100)
|
txt := fmt.Sprintf("Exporting song: %.0f%%", p*100)
|
||||||
trySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Info, Name: name, Duration: defaultAlertDuration}})
|
TrySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Info, Name: name, Duration: defaultAlertDuration}})
|
||||||
}) // render the song to calculate its length
|
}) // render the song to calculate its length
|
||||||
if err != nil {
|
if err != nil {
|
||||||
txt := fmt.Sprintf("Error rendering the song during export: %v", err)
|
txt := fmt.Sprintf("Error rendering the song during export: %v", err)
|
||||||
trySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Error, Name: name, Duration: defaultAlertDuration}})
|
TrySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Error, Name: name, Duration: defaultAlertDuration}})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
buffer, err := data.Wav(pcm16)
|
buffer, err := data.Wav(pcm16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
txt := fmt.Sprintf("Error converting to .wav: %v", err)
|
txt := fmt.Sprintf("Error converting to .wav: %v", err)
|
||||||
trySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Error, Name: name, Duration: defaultAlertDuration}})
|
TrySend(m.broker.ToModel, MsgToModel{Data: Alert{Message: txt, Priority: Error, Name: name, Duration: defaultAlertDuration}})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.Write(buffer)
|
w.Write(buffer)
|
||||||
|
@ -135,7 +135,7 @@ func (v *DetectorWeighting) Int() Int { return Int{v} }
|
|||||||
func (v *DetectorWeighting) Value() int { return int(v.weightingType) }
|
func (v *DetectorWeighting) Value() int { return int(v.weightingType) }
|
||||||
func (v *DetectorWeighting) setValue(value int) {
|
func (v *DetectorWeighting) setValue(value int) {
|
||||||
v.weightingType = WeightingType(value)
|
v.weightingType = WeightingType(value)
|
||||||
trySend(v.broker.ToDetector, MsgToDetector{HasWeightingType: true, WeightingType: WeightingType(value)})
|
TrySend(v.broker.ToDetector, MsgToDetector{HasWeightingType: true, WeightingType: WeightingType(value)})
|
||||||
}
|
}
|
||||||
func (v *DetectorWeighting) Range() intRange { return intRange{0, int(NumLoudnessTypes) - 1} }
|
func (v *DetectorWeighting) Range() intRange { return intRange{0, int(NumLoudnessTypes) - 1} }
|
||||||
func (v *DetectorWeighting) change(kind string) func() { return func() {} }
|
func (v *DetectorWeighting) change(kind string) func() { return func() {} }
|
||||||
|
@ -201,7 +201,7 @@ func NewModel(broker *Broker, synther sointu.Synther, midiContext MIDIContext, r
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trySend(broker.ToPlayer, any(m.d.Song.Copy())) // we should be non-blocking in the constructor
|
TrySend(broker.ToPlayer, any(m.d.Song.Copy())) // we should be non-blocking in the constructor
|
||||||
m.signalAnalyzer = NewScopeModel(broker, m.d.Song.BPM)
|
m.signalAnalyzer = NewScopeModel(broker, m.d.Song.BPM)
|
||||||
m.initDerivedData()
|
m.initDerivedData()
|
||||||
return m
|
return m
|
||||||
@ -238,7 +238,7 @@ func (m *Model) change(kind string, t ChangeType, severity ChangeSeverity) func(
|
|||||||
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.updateDerivedScoreData()
|
m.updateDerivedScoreData()
|
||||||
trySend(m.broker.ToPlayer, any(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()
|
||||||
@ -254,14 +254,14 @@ func (m *Model) change(kind string, t ChangeType, severity ChangeSeverity) func(
|
|||||||
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.updateDerivedPatchData()
|
m.updateDerivedPatchData()
|
||||||
trySend(m.broker.ToPlayer, any(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 {
|
||||||
trySend(m.broker.ToPlayer, any(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 {
|
||||||
trySend(m.broker.ToPlayer, any(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
|
||||||
@ -342,7 +342,7 @@ func (m *Model) UnmarshalRecovery(bytes []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
m.d.ChangedSinceRecovery = false
|
m.d.ChangedSinceRecovery = false
|
||||||
trySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
TrySend(m.broker.ToPlayer, any(m.d.Song.Copy()))
|
||||||
m.initDerivedData()
|
m.initDerivedData()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,18 +395,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}
|
||||||
trySend(m.broker.ToPlayer, any(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}
|
||||||
trySend(m.broker.ToPlayer, any(NoteOnMsg{id}))
|
TrySend(m.broker.ToPlayer, any(NoteOnMsg{id}))
|
||||||
return id
|
return id
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n NoteID) NoteOff() {
|
func (n NoteID) NoteOff() {
|
||||||
trySend(n.model.broker.ToPlayer, any(NoteOffMsg{n}))
|
TrySend(n.model.broker.ToPlayer, any(NoteOffMsg{n}))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *modelData) Copy() modelData {
|
func (d *modelData) Copy() modelData {
|
||||||
|
@ -153,7 +153,7 @@ func (p *Player) Process(buffer sointu.AudioBuffer, context PlayerProcessContext
|
|||||||
|
|
||||||
bufPtr := p.broker.GetAudioBuffer() // borrow a buffer from the broker
|
bufPtr := p.broker.GetAudioBuffer() // borrow a buffer from the broker
|
||||||
*bufPtr = append(*bufPtr, buffer[:rendered]...)
|
*bufPtr = append(*bufPtr, buffer[:rendered]...)
|
||||||
if len(*bufPtr) == 0 || !trySend(p.broker.ToModel, MsgToModel{Data: bufPtr}) {
|
if len(*bufPtr) == 0 || !TrySend(p.broker.ToModel, MsgToModel{Data: bufPtr}) {
|
||||||
// if the buffer is empty or sending the rendered waveform to Model
|
// if the buffer is empty or sending the rendered waveform to Model
|
||||||
// failed, return the buffer to the broker
|
// failed, return the buffer to the broker
|
||||||
p.broker.PutAudioBuffer(bufPtr)
|
p.broker.PutAudioBuffer(bufPtr)
|
||||||
@ -249,7 +249,7 @@ loop:
|
|||||||
p.releaseTrack(i)
|
p.releaseTrack(i)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
trySend(p.broker.ToModel, MsgToModel{Reset: true})
|
TrySend(p.broker.ToModel, MsgToModel{Reset: true})
|
||||||
}
|
}
|
||||||
case BPMMsg:
|
case BPMMsg:
|
||||||
p.song.BPM = m.int
|
p.song.BPM = m.int
|
||||||
@ -268,7 +268,7 @@ loop:
|
|||||||
p.releaseTrack(i)
|
p.releaseTrack(i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trySend(p.broker.ToModel, MsgToModel{Reset: true})
|
TrySend(p.broker.ToModel, MsgToModel{Reset: true})
|
||||||
case NoteOnMsg:
|
case NoteOnMsg:
|
||||||
if m.IsInstr {
|
if m.IsInstr {
|
||||||
p.triggerInstrument(m.Instr, m.Note)
|
p.triggerInstrument(m.Instr, m.Note)
|
||||||
@ -346,7 +346,7 @@ func (p *Player) compileOrUpdateSynth() {
|
|||||||
|
|
||||||
// all sendTargets from player are always non-blocking, to ensure that the player thread cannot end up in a dead-lock
|
// all sendTargets from player are always non-blocking, to ensure that the player thread cannot end up in a dead-lock
|
||||||
func (p *Player) send(message interface{}) {
|
func (p *Player) send(message interface{}) {
|
||||||
trySend(p.broker.ToModel, MsgToModel{HasPanicPosLevels: true, Panic: p.synth == nil, SongPosition: p.songPos, VoiceLevels: p.voiceLevels, Data: message})
|
TrySend(p.broker.ToModel, MsgToModel{HasPanicPosLevels: true, Panic: p.synth == nil, SongPosition: p.songPos, VoiceLevels: p.voiceLevels, Data: message})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) triggerInstrument(instrument int, note byte) {
|
func (p *Player) triggerInstrument(instrument int, note byte) {
|
||||||
@ -402,7 +402,7 @@ func (p *Player) trigger(voiceStart, voiceEnd int, note byte, ID int) {
|
|||||||
p.voices[oldestVoice] = voice{noteID: ID, sustain: true, samplesSinceEvent: 0}
|
p.voices[oldestVoice] = voice{noteID: ID, sustain: true, samplesSinceEvent: 0}
|
||||||
p.voiceLevels[oldestVoice] = 1.0
|
p.voiceLevels[oldestVoice] = 1.0
|
||||||
p.synth.Trigger(oldestVoice, note)
|
p.synth.Trigger(oldestVoice, note)
|
||||||
trySend(p.broker.ToModel, MsgToModel{TriggerChannel: instrIndex + 1})
|
TrySend(p.broker.ToModel, MsgToModel{TriggerChannel: instrIndex + 1})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Player) release(ID int) {
|
func (p *Player) release(ID int) {
|
||||||
|
@ -106,7 +106,7 @@ func (s *ScopeModel) ProcessAudioBuffer(bufPtr *sointu.AudioBuffer) {
|
|||||||
s.waveForm.WriteOnce(*bufPtr)
|
s.waveForm.WriteOnce(*bufPtr)
|
||||||
}
|
}
|
||||||
// chain the messages: when we have a new audio buffer, try passing it on to the detector
|
// chain the messages: when we have a new audio buffer, try passing it on to the detector
|
||||||
if !trySend(s.broker.ToDetector, MsgToDetector{Data: bufPtr}) {
|
if !TrySend(s.broker.ToDetector, MsgToDetector{Data: bufPtr}) {
|
||||||
s.broker.PutAudioBuffer(bufPtr)
|
s.broker.PutAudioBuffer(bufPtr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,7 +125,7 @@ func (s *ScopeModel) Reset() {
|
|||||||
l := len(s.waveForm.Buffer)
|
l := len(s.waveForm.Buffer)
|
||||||
s.waveForm.Buffer = s.waveForm.Buffer[:0]
|
s.waveForm.Buffer = s.waveForm.Buffer[:0]
|
||||||
s.waveForm.Buffer = append(s.waveForm.Buffer, make([][2]float32, l)...)
|
s.waveForm.Buffer = append(s.waveForm.Buffer, make([][2]float32, l)...)
|
||||||
trySend(s.broker.ToDetector, MsgToDetector{Reset: true}) // chain the messages: when the signal analyzer is reset, also reset the detector
|
TrySend(s.broker.ToDetector, MsgToDetector{Reset: true}) // chain the messages: when the signal analyzer is reset, also reset the detector
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *ScopeModel) SetBpm(bpm int) {
|
func (s *ScopeModel) SetBpm(bpm int) {
|
||||||
|
Loading…
Reference in New Issue
Block a user