mirror of
https://github.com/vsariola/sointu.git
synced 2025-05-28 03:10:24 -04:00
The -er suffix is more idiomatic for single method interfaces, and the interface is not doing much more than converting the patch to a synth. Names were updated throughout the project to reflect this change. In particular, the "Service" in SynthService was not telling anything helpful.
89 lines
2.2 KiB
Go
89 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"runtime/pprof"
|
|
|
|
"gioui.org/app"
|
|
"github.com/vsariola/sointu"
|
|
"github.com/vsariola/sointu/cmd"
|
|
"github.com/vsariola/sointu/oto"
|
|
"github.com/vsariola/sointu/tracker"
|
|
"github.com/vsariola/sointu/tracker/gioui"
|
|
)
|
|
|
|
type NullContext struct {
|
|
}
|
|
|
|
func (NullContext) NextEvent() (event tracker.PlayerProcessEvent, ok bool) {
|
|
return tracker.PlayerProcessEvent{}, false
|
|
}
|
|
|
|
func (NullContext) BPM() (bpm float64, ok bool) {
|
|
return 0, false
|
|
}
|
|
|
|
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`")
|
|
var memprofile = flag.String("memprofile", "", "write memory profile to `file`")
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
if *cpuprofile != "" {
|
|
f, err := os.Create(*cpuprofile)
|
|
if err != nil {
|
|
log.Fatal("could not create CPU profile: ", err)
|
|
}
|
|
defer f.Close() // error handling omitted for example
|
|
if err := pprof.StartCPUProfile(f); err != nil {
|
|
log.Fatal("could not start CPU profile: ", err)
|
|
}
|
|
defer pprof.StopCPUProfile()
|
|
}
|
|
audioContext, err := oto.NewContext()
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
defer audioContext.Close()
|
|
modelMessages := make(chan interface{}, 1024)
|
|
playerMessages := make(chan tracker.PlayerMessage, 1024)
|
|
recoveryFile := ""
|
|
if configDir, err := os.UserConfigDir(); err == nil {
|
|
recoveryFile = filepath.Join(configDir, "Sointu", "sointu-track-recovery")
|
|
}
|
|
model := tracker.NewModel(modelMessages, playerMessages, recoveryFile)
|
|
player := tracker.NewPlayer(cmd.MainSynther, playerMessages, modelMessages)
|
|
tracker := gioui.NewTracker(model, cmd.MainSynther)
|
|
output := audioContext.Output()
|
|
defer output.Close()
|
|
go func() {
|
|
buf := make(sointu.AudioBuffer, 1024)
|
|
ctx := NullContext{}
|
|
for {
|
|
player.Process(buf, ctx)
|
|
output.WriteAudio(buf)
|
|
}
|
|
}()
|
|
go func() {
|
|
tracker.Main()
|
|
if *memprofile != "" {
|
|
f, err := os.Create(*memprofile)
|
|
if err != nil {
|
|
log.Fatal("could not create memory profile: ", err)
|
|
}
|
|
defer f.Close() // error handling omitted for example
|
|
runtime.GC() // get up-to-date statistics
|
|
if err := pprof.WriteHeapProfile(f); err != nil {
|
|
log.Fatal("could not write memory profile: ", err)
|
|
}
|
|
}
|
|
os.Exit(0)
|
|
}()
|
|
app.Main()
|
|
}
|