diff --git a/channel.go b/channel.go index a1b4a15..0f6e866 100644 --- a/channel.go +++ b/channel.go @@ -5,11 +5,11 @@ import ( "github.com/gotracker/gomixing/sampling" "github.com/gotracker/gomixing/volume" "github.com/gotracker/playback/period" + "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/voice" "github.com/gotracker/playback/instrument" "github.com/gotracker/playback/note" - "github.com/gotracker/playback/player/output" ) // Channel is an interface for channel state @@ -52,8 +52,8 @@ type Channel[TMemory, TChannelData any] interface { SetPanEnabled(bool) GetPan() panning.Position SetPan(panning.Position) - SetOutputChannel(*output.Channel) - GetOutputChannel() *output.Channel + SetRenderChannel(*render.Channel) + GetRenderChannel() *render.Channel SetVolumeActive(bool) SetGlobalVolume(volume.Volume) SetChannelVolume(volume.Volume) diff --git a/format/it/layout/song.go b/format/it/layout/song.go index 1b8e247..5574863 100644 --- a/format/it/layout/song.go +++ b/format/it/layout/song.go @@ -39,8 +39,8 @@ func (s Song) IsChannelEnabled(channelNum int) bool { return s.ChannelSettings[channelNum].Enabled } -// GetOutputChannel returns the output channel for the channel at index `channelNum` -func (s Song) GetOutputChannel(channelNum int) int { +// GetRenderChannel returns the output channel for the channel at index `channelNum` +func (s Song) GetRenderChannel(channelNum int) int { return s.ChannelSettings[channelNum].OutputChannelNum } diff --git a/format/it/playback/playback.go b/format/it/playback/playback.go index 33764ef..3265f2f 100644 --- a/format/it/playback/playback.go +++ b/format/it/playback/playback.go @@ -2,7 +2,6 @@ package playback import ( "github.com/gotracker/gomixing/volume" - device "github.com/gotracker/gosound" "github.com/gotracker/playback" "github.com/gotracker/playback/format/it/channel" @@ -12,10 +11,11 @@ import ( itPeriod "github.com/gotracker/playback/format/it/period" "github.com/gotracker/playback/index" "github.com/gotracker/playback/note" + "github.com/gotracker/playback/output" playpattern "github.com/gotracker/playback/pattern" "github.com/gotracker/playback/player" "github.com/gotracker/playback/player/feature" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" "github.com/gotracker/playback/song" ) @@ -32,7 +32,7 @@ type Manager struct { preMixRowTxn *playpattern.RowUpdateTransaction postMixRowTxn *playpattern.RowUpdateTransaction - premix *device.PremixData + premix *output.PremixData rowRenderState *rowRenderState OnEffect func(playback.Effect) @@ -64,11 +64,11 @@ func NewManager(song *layout.Song) (*Manager, error) { m.SetNumChannels(len(song.ChannelSettings)) for i, ch := range song.ChannelSettings { - oc := m.GetOutputChannel(ch.OutputChannelNum, m.channelInit) + oc := m.GetRenderChannel(ch.OutputChannelNum, m.channelInit) cs := m.GetChannel(i) cs.SetSongDataInterface(song) - cs.SetOutputChannel(oc) + cs.SetRenderChannel(oc) cs.SetGlobalVolume(m.GetGlobalVolume()) cs.SetActiveVolume(ch.InitialVolume) cs.SetChannelVolume(ch.ChannelVolume) @@ -121,8 +121,8 @@ func (m *Manager) SetNumChannels(num int) { cs.Trigger.Reset() cs.RetriggerCount = 0 _ = cs.SetData(nil) - ocNum := m.song.GetOutputChannel(ch) - cs.Output = m.GetOutputChannel(ocNum, m.channelInit) + ocNum := m.song.GetRenderChannel(ch) + cs.RenderChannel = m.GetRenderChannel(ocNum, m.channelInit) if m.enableNewNoteActions { cs.PastNotes = &m.PastNotes @@ -130,8 +130,8 @@ func (m *Manager) SetNumChannels(num int) { } } -func (m *Manager) channelInit(ch int) *output.Channel { - return &output.Channel{ +func (m *Manager) channelInit(ch int) *render.Channel { + return &render.Channel{ ChannelNum: ch, Filter: nil, GetSampleRate: m.GetSampleRate, diff --git a/format/it/playback/playback_command.go b/format/it/playback/playback_command.go index 1ad5927..311ef82 100644 --- a/format/it/playback/playback_command.go +++ b/format/it/playback/playback_command.go @@ -119,7 +119,7 @@ func (m *Manager) processVoiceUpdates(ch int, cs *state.ChannelState[channel.Mem func (m *Manager) SetFilterEnable(on bool) { for i := range m.song.ChannelSettings { c := m.GetChannel(i) - if o := c.GetOutputChannel(); o != nil { + if o := c.GetRenderChannel(); o != nil { if on { if o.Filter == nil { o.Filter = filter.NewAmigaLPF(period.Frequency(itPeriod.DefaultC2Spd), m.GetSampleRate()) diff --git a/format/it/playback/playback_render.go b/format/it/playback/playback_render.go index 801678a..b2add6c 100644 --- a/format/it/playback/playback_render.go +++ b/format/it/playback/playback_render.go @@ -1,8 +1,7 @@ package playback import ( - device "github.com/gotracker/gosound" - + "github.com/gotracker/playback/output" "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" ) @@ -23,12 +22,12 @@ func (m *Manager) OnTick() error { } // GetPremixData gets the current premix data from the manager -func (m *Manager) GetPremixData() (*device.PremixData, error) { +func (m *Manager) GetPremixData() (*output.PremixData, error) { return m.premix, nil } // RenderOneRow renders the next single row from the song pattern data into a RowRender object -func (m *Manager) renderTick() (*device.PremixData, error) { +func (m *Manager) renderTick() (*output.PremixData, error) { postMixRowTxn := m.pattern.StartTransaction() defer func() { postMixRowTxn.Cancel() @@ -43,7 +42,7 @@ func (m *Manager) renderTick() (*device.PremixData, error) { } var finalData render.RowRender - premix := &device.PremixData{ + premix := &output.PremixData{ Userdata: &finalData, SamplesLen: m.rowRenderState.Samples, } @@ -78,7 +77,7 @@ type rowRenderState struct { currentTick int } -func (m *Manager) soundRenderTick(premix *device.PremixData) error { +func (m *Manager) soundRenderTick(premix *output.PremixData) error { tick := m.rowRenderState.currentTick var lastTick = (tick+1 == m.rowRenderState.ticksThisRow) diff --git a/format/s3m/layout/song.go b/format/s3m/layout/song.go index 5ff5769..11b60e3 100644 --- a/format/s3m/layout/song.go +++ b/format/s3m/layout/song.go @@ -36,8 +36,8 @@ func (s Song) IsChannelEnabled(channelNum int) bool { return s.ChannelSettings[channelNum].Enabled } -// GetOutputChannel returns the output channel for the channel at index `channelNum` -func (s Song) GetOutputChannel(channelNum int) int { +// GetRenderChannel returns the output channel for the channel at index `channelNum` +func (s Song) GetRenderChannel(channelNum int) int { return s.ChannelSettings[channelNum].OutputChannelNum } diff --git a/format/s3m/playback/playback.go b/format/s3m/playback/playback.go index aced919..11ee3f4 100644 --- a/format/s3m/playback/playback.go +++ b/format/s3m/playback/playback.go @@ -4,7 +4,6 @@ import ( s3mfile "github.com/gotracker/goaudiofile/music/tracked/s3m" "github.com/gotracker/gomixing/panning" "github.com/gotracker/gomixing/volume" - device "github.com/gotracker/gosound" "github.com/gotracker/playback" "github.com/gotracker/playback/format/s3m/channel" @@ -13,10 +12,11 @@ import ( s3mPeriod "github.com/gotracker/playback/format/s3m/period" "github.com/gotracker/playback/index" "github.com/gotracker/playback/note" + "github.com/gotracker/playback/output" playpattern "github.com/gotracker/playback/pattern" "github.com/gotracker/playback/player" "github.com/gotracker/playback/player/feature" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" "github.com/gotracker/playback/song" ) @@ -32,7 +32,7 @@ type Manager struct { preMixRowTxn *playpattern.RowUpdateTransaction postMixRowTxn *playpattern.RowUpdateTransaction - premix *device.PremixData + premix *output.PremixData rowRenderState *rowRenderState OnEffect func(playback.Effect) @@ -62,11 +62,11 @@ func NewManager(song *layout.Song) (*Manager, error) { m.SetNumChannels(len(song.ChannelSettings)) lowpassEnabled := false for i, ch := range song.ChannelSettings { - oc := m.GetOutputChannel(ch.OutputChannelNum, m.channelInit) + oc := m.GetRenderChannel(ch.OutputChannelNum, m.channelInit) cs := m.GetChannel(i) cs.SetSongDataInterface(song) - cs.SetOutputChannel(oc) + cs.SetRenderChannel(oc) cs.SetGlobalVolume(m.GetGlobalVolume()) cs.SetActiveVolume(ch.InitialVolume) if song.Head.Stereo { @@ -111,8 +111,8 @@ func NewManager(song *layout.Song) (*Manager, error) { return &m, nil } -func (m *Manager) channelInit(ch int) *output.Channel { - return &output.Channel{ +func (m *Manager) channelInit(ch int) *render.Channel { + return &render.Channel{ ChannelNum: ch, Filter: nil, GetSampleRate: m.GetSampleRate, @@ -152,8 +152,8 @@ func (m *Manager) SetNumChannels(num int) { cs.Trigger.Reset() cs.RetriggerCount = 0 _ = cs.SetData(nil) - ocNum := m.song.GetOutputChannel(ch) - cs.Output = m.GetOutputChannel(ocNum, m.channelInit) + ocNum := m.song.GetRenderChannel(ch) + cs.RenderChannel = m.GetRenderChannel(ocNum, m.channelInit) } } diff --git a/format/s3m/playback/playback_command.go b/format/s3m/playback/playback_command.go index a0ff0ff..62abe93 100644 --- a/format/s3m/playback/playback_command.go +++ b/format/s3m/playback/playback_command.go @@ -119,7 +119,7 @@ func (m *Manager) processVoiceUpdates(ch int, cs *state.ChannelState[channel.Mem func (m *Manager) SetFilterEnable(on bool) { for i := range m.song.ChannelSettings { c := m.GetChannel(i) - if o := c.GetOutputChannel(); o != nil { + if o := c.GetRenderChannel(); o != nil { if on { if o.Filter == nil { o.Filter = filter.NewAmigaLPF(s3mPeriod.DefaultC2Spd, m.GetSampleRate()) diff --git a/format/s3m/playback/playback_render.go b/format/s3m/playback/playback_render.go index 1a54b39..b946c1e 100644 --- a/format/s3m/playback/playback_render.go +++ b/format/s3m/playback/playback_render.go @@ -1,8 +1,7 @@ package playback import ( - device "github.com/gotracker/gosound" - + "github.com/gotracker/playback/output" "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" ) @@ -20,12 +19,12 @@ func (m *Manager) OnTick() error { } // GetPremixData gets the current premix data from the manager -func (m *Manager) GetPremixData() (*device.PremixData, error) { +func (m *Manager) GetPremixData() (*output.PremixData, error) { return m.premix, nil } // RenderOneRow renders the next single row from the song pattern data into a RowRender object -func (m *Manager) renderTick() (*device.PremixData, error) { +func (m *Manager) renderTick() (*output.PremixData, error) { postMixRowTxn := m.pattern.StartTransaction() defer func() { postMixRowTxn.Cancel() @@ -40,7 +39,7 @@ func (m *Manager) renderTick() (*device.PremixData, error) { } var finalData render.RowRender - premix := &device.PremixData{ + premix := &output.PremixData{ Userdata: &finalData, SamplesLen: m.rowRenderState.Samples, } @@ -74,7 +73,7 @@ type rowRenderState struct { currentTick int } -func (m *Manager) soundRenderTick(premix *device.PremixData) error { +func (m *Manager) soundRenderTick(premix *output.PremixData) error { tick := m.rowRenderState.currentTick var lastTick = (tick+1 == m.rowRenderState.ticksThisRow) diff --git a/format/xm/layout/song.go b/format/xm/layout/song.go index d122a1c..5b13e8e 100644 --- a/format/xm/layout/song.go +++ b/format/xm/layout/song.go @@ -37,8 +37,8 @@ func (s Song) IsChannelEnabled(channelNum int) bool { return s.ChannelSettings[channelNum].Enabled } -// GetOutputChannel returns the output channel for the channel at index `channelNum` -func (s Song) GetOutputChannel(channelNum int) int { +// GetRenderChannel returns the output channel for the channel at index `channelNum` +func (s Song) GetRenderChannel(channelNum int) int { return s.ChannelSettings[channelNum].OutputChannelNum } diff --git a/format/xm/playback/playback.go b/format/xm/playback/playback.go index b27d997..c9b608c 100644 --- a/format/xm/playback/playback.go +++ b/format/xm/playback/playback.go @@ -2,7 +2,6 @@ package playback import ( "github.com/gotracker/gomixing/volume" - device "github.com/gotracker/gosound" "github.com/gotracker/playback" "github.com/gotracker/playback/format/xm/channel" @@ -11,10 +10,11 @@ import ( xmPeriod "github.com/gotracker/playback/format/xm/period" "github.com/gotracker/playback/index" "github.com/gotracker/playback/note" + "github.com/gotracker/playback/output" playpattern "github.com/gotracker/playback/pattern" "github.com/gotracker/playback/player" "github.com/gotracker/playback/player/feature" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" "github.com/gotracker/playback/song" ) @@ -30,7 +30,7 @@ type Manager struct { preMixRowTxn *playpattern.RowUpdateTransaction postMixRowTxn *playpattern.RowUpdateTransaction - premix *device.PremixData + premix *output.PremixData rowRenderState *rowRenderState OnEffect func(playback.Effect) @@ -57,11 +57,11 @@ func NewManager(song *layout.Song) (*Manager, error) { m.SetNumChannels(len(song.ChannelSettings)) for i, ch := range song.ChannelSettings { - oc := m.GetOutputChannel(ch.OutputChannelNum, m.channelInit) + oc := m.GetRenderChannel(ch.OutputChannelNum, m.channelInit) cs := m.GetChannel(i) cs.SetSongDataInterface(song) - cs.SetOutputChannel(oc) + cs.SetRenderChannel(oc) cs.SetGlobalVolume(m.GetGlobalVolume()) cs.SetActiveVolume(ch.InitialVolume) cs.SetPanEnabled(true) @@ -82,8 +82,8 @@ func NewManager(song *layout.Song) (*Manager, error) { return &m, nil } -func (m *Manager) channelInit(ch int) *output.Channel { - return &output.Channel{ +func (m *Manager) channelInit(ch int) *render.Channel { + return &render.Channel{ ChannelNum: ch, Filter: nil, GetSampleRate: m.GetSampleRate, @@ -123,8 +123,8 @@ func (m *Manager) SetNumChannels(num int) { cs.Trigger.Reset() cs.RetriggerCount = 0 _ = cs.SetData(nil) - ocNum := m.song.GetOutputChannel(ch) - cs.Output = m.GetOutputChannel(ocNum, m.channelInit) + ocNum := m.song.GetRenderChannel(ch) + cs.RenderChannel = m.GetRenderChannel(ocNum, m.channelInit) } } diff --git a/format/xm/playback/playback_command.go b/format/xm/playback/playback_command.go index 3c80b17..b93e2de 100644 --- a/format/xm/playback/playback_command.go +++ b/format/xm/playback/playback_command.go @@ -126,7 +126,7 @@ func (m *Manager) processVoiceUpdates(ch int, cs *state.ChannelState[channel.Mem func (m *Manager) SetFilterEnable(on bool) { for i := range m.song.ChannelSettings { c := m.GetChannel(i) - if o := c.GetOutputChannel(); o != nil { + if o := c.GetRenderChannel(); o != nil { if on { if o.Filter == nil { o.Filter = filter.NewAmigaLPF(period.Frequency(xmPeriod.DefaultC2Spd), m.GetSampleRate()) diff --git a/format/xm/playback/playback_render.go b/format/xm/playback/playback_render.go index 5f4d9f7..466b40a 100644 --- a/format/xm/playback/playback_render.go +++ b/format/xm/playback/playback_render.go @@ -1,8 +1,7 @@ package playback import ( - device "github.com/gotracker/gosound" - + "github.com/gotracker/playback/output" "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/state" ) @@ -20,12 +19,12 @@ func (m *Manager) OnTick() error { } // GetPremixData gets the current premix data from the manager -func (m *Manager) GetPremixData() (*device.PremixData, error) { +func (m *Manager) GetPremixData() (*output.PremixData, error) { return m.premix, nil } // RenderOneRow renders the next single row from the song pattern data into a RowRender object -func (m *Manager) renderTick() (*device.PremixData, error) { +func (m *Manager) renderTick() (*output.PremixData, error) { postMixRowTxn := m.pattern.StartTransaction() defer func() { postMixRowTxn.Cancel() @@ -40,7 +39,7 @@ func (m *Manager) renderTick() (*device.PremixData, error) { } var finalData render.RowRender - premix := &device.PremixData{ + premix := &output.PremixData{ Userdata: &finalData, SamplesLen: m.rowRenderState.Samples, } @@ -74,7 +73,7 @@ type rowRenderState struct { currentTick int } -func (m *Manager) soundRenderTick(premix *device.PremixData) error { +func (m *Manager) soundRenderTick(premix *output.PremixData) error { tick := m.rowRenderState.currentTick var lastTick = (tick+1 == m.rowRenderState.ticksThisRow) diff --git a/go.mod b/go.mod index 7134814..07d0cdf 100644 --- a/go.mod +++ b/go.mod @@ -5,21 +5,10 @@ go 1.18 require ( github.com/gotracker/goaudiofile v1.0.14 github.com/gotracker/gomixing v1.1.2 - github.com/gotracker/gosound v1.1.1 github.com/gotracker/opl2 v1.0.1 github.com/heucuva/comparison v1.0.0 github.com/heucuva/optional v0.0.1 golang.org/x/exp v0.0.0-20220713135740-79cabaa25d75 ) -require ( - github.com/heucuva/go-directsound v1.0.0 // indirect - github.com/heucuva/go-win32 v1.0.0 // indirect - github.com/heucuva/go-winmm v1.0.0 // indirect - github.com/icza/bitio v1.1.0 // indirect - github.com/jfreymuth/pulse v0.1.0 // indirect - github.com/mewkiz/flac v1.0.7 // indirect - github.com/mewkiz/pkg v0.0.0-20211102230744-16a6ce8f1b77 // indirect - github.com/pkg/errors v0.9.1 // indirect - golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 // indirect -) +require github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index d06b36a..5b9446f 100644 --- a/go.sum +++ b/go.sum @@ -1,47 +1,15 @@ -github.com/d4l3k/messagediff v1.2.2-0.20190829033028-7e0a312ae40b/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= -github.com/go-audio/audio v1.0.0/go.mod h1:6uAu0+H2lHkwdGsAY+j2wHPNPpPoeg5AaEFh9FlA+Zs= -github.com/go-audio/riff v1.0.0/go.mod h1:l3cQwc85y79NQFCRB7TiPoNiaijp6q8Z0Uv38rVG498= -github.com/go-audio/wav v1.0.0/go.mod h1:3yoReyQOsiARkvPl3ERCi8JFjihzG6WhjYpZCf5zAWE= github.com/gotracker/goaudiofile v1.0.14 h1:gbut0vivYxV0EWH/rzvqukmx6GjbtvMylLHQpZ//7d0= github.com/gotracker/goaudiofile v1.0.14/go.mod h1:+biBmTEKcFRF4hCR1flCtqOA76p6OReIAwqqV+07N8Y= github.com/gotracker/gomixing v1.1.2 h1:ybaPf1MBtBQaAeSj40Os8EUPurDySULHA0YR7KtL0JI= github.com/gotracker/gomixing v1.1.2/go.mod h1:KSwLWBk4HMKTVZH+zq4Db7nlDVcRegIL4uStkat0ASg= -github.com/gotracker/gosound v1.1.1 h1:r5/0m5Z1bG4ZCN5sw7wMK93iXtWalX+VVm2PHKHq4q4= -github.com/gotracker/gosound v1.1.1/go.mod h1:fdSlHuyjMmgqbdHCBroJO0eyI1OZ+qw5APfgQ+dHC7k= github.com/gotracker/opl2 v1.0.1 h1:1PVNs0dXqEAQxdws7fz2WEE3nSKkMb1osTTT7KgEi5g= github.com/gotracker/opl2 v1.0.1/go.mod h1:lW1WbZlh7svEMpurp9LLYWSyf1WPAb750cQ7xGIhCnY= github.com/heucuva/comparison v1.0.0 h1:xxXNKS9GKHetQavOz35FitlAXWvmvM3U6M5IRIw7kN8= github.com/heucuva/comparison v1.0.0/go.mod h1:5l0Va1uxFyy7S4DgdflnayxV2HStFwWI2rzbrlNNNMk= -github.com/heucuva/go-directsound v1.0.0 h1:bN33QBwLmF95ZACyvJL9NDhauhMANi3g0tlsg0FaoEQ= -github.com/heucuva/go-directsound v1.0.0/go.mod h1:TCaliTXvuotXwuP1G9hasPHWqWrRnSlGRnvqswKf//w= -github.com/heucuva/go-win32 v1.0.0 h1:CXJEwYkGaW2ZubKt8GZO/g0z7xsKam97mMZjkzgE1IA= -github.com/heucuva/go-win32 v1.0.0/go.mod h1:vIRx8BmGjRCCwvCFn7rwlOGgRC+MjqS6ttY7e2vbyQ4= -github.com/heucuva/go-winmm v1.0.0 h1:ePsM4MEaKJBcnMvJKoe/bzCrQCnjaLicw/F/VtGOoyY= -github.com/heucuva/go-winmm v1.0.0/go.mod h1:MF2kyWivfQIAxPCVgRKYoxALaH6pCRo1GMaQ2znLeWA= github.com/heucuva/optional v0.0.1 h1:tLbVBMQBKzQVfe43bHQFSxjhTzYcRK8frnTBG6FLksM= github.com/heucuva/optional v0.0.1/go.mod h1:2AtE/X9279wzrHLkCNvKl0xP7AiEIj3RijGKwbO8R3M= -github.com/icza/bitio v1.0.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A= -github.com/icza/bitio v1.1.0 h1:ysX4vtldjdi3Ygai5m1cWy4oLkhWTAi+SyO6HC8L9T0= -github.com/icza/bitio v1.1.0/go.mod h1:0jGnlLAx8MKMr9VGnn/4YrvZiprkvBelsVIbA9Jjr9A= -github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6 h1:8UsGZ2rr2ksmEru6lToqnXgA8Mz1DP11X4zSJ159C3k= -github.com/icza/mighty v0.0.0-20180919140131-cfd07d671de6/go.mod h1:xQig96I1VNBDIWGCdTt54nHt6EeI639SmHycLYL7FkA= -github.com/jfreymuth/pulse v0.1.0 h1:KN38/9hoF9PJvP5DpEVhMRKNuwnJUonc8c9ARorRXUA= -github.com/jfreymuth/pulse v0.1.0/go.mod h1:cpYspI6YljhkUf1WLXLLDmeaaPFc3CnGLjDZf9dZ4no= -github.com/jszwec/csvutil v1.5.1/go.mod h1:Rpu7Uu9giO9subDyMCIQfHVDuLrcaC36UA4YcJjGBkg= -github.com/mewkiz/flac v1.0.7 h1:uIXEjnuXqdRaZttmSFM5v5Ukp4U6orrZsnYGGR3yow8= -github.com/mewkiz/flac v1.0.7/go.mod h1:yU74UH277dBUpqxPouHSQIar3G1X/QIclVbFahSd1pU= -github.com/mewkiz/pkg v0.0.0-20190919212034-518ade7978e2/go.mod h1:3E2FUC/qYUfM8+r9zAwpeHJzqRVVMIYnpzD/clwWxyA= -github.com/mewkiz/pkg v0.0.0-20211102230744-16a6ce8f1b77 h1:DDyKVkTkrFmd9lR84QW3EIfkkoHlurlpgW+DYuAUJn8= -github.com/mewkiz/pkg v0.0.0-20211102230744-16a6ce8f1b77/go.mod h1:J/rDzvIiwiVpv72OEP8aJFxLXjGpUdviIIeqJPLIctA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= golang.org/x/exp v0.0.0-20220713135740-79cabaa25d75 h1:x03zeu7B2B11ySp+daztnwM5oBJ/8wGUSqrwcw9L0RA= golang.org/x/exp v0.0.0-20220713135740-79cabaa25d75/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= -golang.org/x/image v0.0.0-20190220214146-31aff87c08e9/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/output/premixdata.go b/output/premixdata.go new file mode 100644 index 0000000..15c7b9c --- /dev/null +++ b/output/premixdata.go @@ -0,0 +1,14 @@ +package output + +import ( + "github.com/gotracker/gomixing/mixing" + "github.com/gotracker/gomixing/volume" +) + +// PremixData is a structure containing the audio pre-mix data for a specific row or buffer +type PremixData struct { + SamplesLen int + Data []mixing.ChannelData + MixerVolume volume.Volume + Userdata interface{} +} diff --git a/playback.go b/playback.go index 38930b4..d242688 100644 --- a/playback.go +++ b/playback.go @@ -4,9 +4,9 @@ import ( "time" "github.com/gotracker/gomixing/volume" - device "github.com/gotracker/gosound" "github.com/gotracker/playback/index" + "github.com/gotracker/playback/output" "github.com/gotracker/playback/pattern" "github.com/gotracker/playback/period" "github.com/gotracker/playback/player/feature" @@ -22,8 +22,8 @@ type Playback interface { GetGlobalVolume() volume.Volume SetGlobalVolume(volume.Volume) - Update(time.Duration, chan<- *device.PremixData) error - Generate(time.Duration) (*device.PremixData, error) + Update(time.Duration, chan<- *output.PremixData) error + Generate(time.Duration) (*output.PremixData, error) GetSongData() song.Data diff --git a/player/output/channel.go b/player/render/channel.go similarity index 98% rename from player/output/channel.go rename to player/render/channel.go index 8c30386..eb862df 100644 --- a/player/output/channel.go +++ b/player/render/channel.go @@ -1,4 +1,4 @@ -package output +package render import ( "github.com/gotracker/playback/filter" diff --git a/player/state/channel.go b/player/state/channel.go index 3e27c28..416056e 100644 --- a/player/state/channel.go +++ b/player/state/channel.go @@ -11,7 +11,7 @@ import ( "github.com/gotracker/playback" "github.com/gotracker/playback/instrument" "github.com/gotracker/playback/note" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" voiceImpl "github.com/gotracker/playback/player/voice" "github.com/gotracker/playback/song" "github.com/heucuva/optional" @@ -62,8 +62,8 @@ type ChannelState[TMemory, TChannelData any] struct { PanEnabled bool NewNoteAction note.Action - PastNotes *PastNotesProcessor - Output *output.Channel + PastNotes *PastNotesProcessor + RenderChannel *render.Channel } // WillTriggerOn returns true if a note will trigger on the tick specified @@ -246,7 +246,7 @@ func (cs *ChannelState[TMemory, TChannelData]) SetInstrument(inst *instrument.In if inst == cs.prevState.Instrument { cs.activeState.Voice = cs.prevState.Voice } else { - cs.activeState.Voice = voiceImpl.New(inst, cs.Output) + cs.activeState.Voice = voiceImpl.New(inst, cs.RenderChannel) } } } @@ -368,30 +368,30 @@ func (cs *ChannelState[TMemory, TChannelData]) SetStoredSemitone(st note.Semiton cs.StoredSemitone = st } -// SetOutputChannel sets the output channel for the channel -func (cs *ChannelState[TMemory, TChannelData]) SetOutputChannel(outputCh *output.Channel) { - cs.Output = outputCh +// SetRenderChannel sets the output channel for the channel +func (cs *ChannelState[TMemory, TChannelData]) SetRenderChannel(outputCh *render.Channel) { + cs.RenderChannel = outputCh } -// GetOutputChannel returns the output channel for the channel -func (cs *ChannelState[TMemory, TChannelData]) GetOutputChannel() *output.Channel { - return cs.Output +// GetRenderChannel returns the output channel for the channel +func (cs *ChannelState[TMemory, TChannelData]) GetRenderChannel() *render.Channel { + return cs.RenderChannel } // SetGlobalVolume sets the last-known global volume on the channel func (cs *ChannelState[TMemory, TChannelData]) SetGlobalVolume(gv volume.Volume) { - cs.Output.LastGlobalVolume = gv - cs.Output.SetGlobalVolume(gv) + cs.RenderChannel.LastGlobalVolume = gv + cs.RenderChannel.SetGlobalVolume(gv) } // SetChannelVolume sets the channel volume on the channel func (cs *ChannelState[TMemory, TChannelData]) SetChannelVolume(cv volume.Volume) { - cs.Output.ChannelVolume = cv + cs.RenderChannel.ChannelVolume = cv } // GetChannelVolume gets the channel volume on the channel func (cs *ChannelState[TMemory, TChannelData]) GetChannelVolume() volume.Volume { - return cs.Output.ChannelVolume + return cs.RenderChannel.ChannelVolume } // SetEnvelopePosition sets the envelope position for the active instrument @@ -416,14 +416,14 @@ func (cs *ChannelState[TMemory, TChannelData]) TransitionActiveToPastState() { // nothing pn := cs.activeState.Clone() if nc := pn.Voice; nc != nil { - cs.PastNotes.Add(cs.Output.ChannelNum, pn) + cs.PastNotes.Add(cs.RenderChannel.ChannelNum, pn) } case note.ActionRelease: pn := cs.activeState.Clone() if nc := pn.Voice; nc != nil { nc.Release() - cs.PastNotes.Add(cs.Output.ChannelNum, pn) + cs.PastNotes.Add(cs.RenderChannel.ChannelNum, pn) } case note.ActionFadeout: @@ -431,7 +431,7 @@ func (cs *ChannelState[TMemory, TChannelData]) TransitionActiveToPastState() { if nc := pn.Voice; nc != nil { nc.Release() nc.Fadeout() - cs.PastNotes.Add(cs.Output.ChannelNum, pn) + cs.PastNotes.Add(cs.RenderChannel.ChannelNum, pn) } } } @@ -440,7 +440,7 @@ func (cs *ChannelState[TMemory, TChannelData]) TransitionActiveToPastState() { // DoPastNoteEffect performs an action on all past-note playbacks associated with the channel func (cs *ChannelState[TMemory, TChannelData]) DoPastNoteEffect(action note.Action) { - cs.PastNotes.Do(cs.Output.ChannelNum, action) + cs.PastNotes.Do(cs.RenderChannel.ChannelNum, action) } // SetNewNoteAction sets the New-Note Action on the channel diff --git a/player/tracker.go b/player/tracker.go index 8c667bb..96da5fd 100644 --- a/player/tracker.go +++ b/player/tracker.go @@ -8,18 +8,17 @@ import ( "github.com/gotracker/gomixing/mixing" "github.com/gotracker/gomixing/panning" "github.com/gotracker/gomixing/volume" - device "github.com/gotracker/gosound" + "github.com/gotracker/playback/output" "github.com/gotracker/playback/period" - "github.com/gotracker/playback/voice/render" - "github.com/gotracker/playback/player/feature" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" "github.com/gotracker/playback/player/sampler" + voiceRender "github.com/gotracker/playback/voice/render" ) // Premixable is an interface to getting the premix data from the tracker type Premixable interface { - GetPremixData() (*device.PremixData, error) + GetPremixData() (*output.PremixData, error) } // Tracker is an extensible music tracker @@ -30,7 +29,7 @@ type Tracker struct { Traceable Traceable s *sampler.Sampler - opl2 render.OPL2Chip + opl2 voiceRender.OPL2Chip globalVolume volume.Volume mixerVolume volume.Volume @@ -38,7 +37,7 @@ type Tracker struct { ignoreUnknownEffect feature.IgnoreUnknownEffect tracingFile *os.File tracingState tracingState - outputChannels map[int]*output.Channel + outputChannels map[int]*render.Channel } func (t *Tracker) Close() { @@ -52,7 +51,7 @@ func (t *Tracker) Close() { } // Update runs processing on the tracker, producing premixed sound data -func (t *Tracker) Update(deltaTime time.Duration, out chan<- *device.PremixData) error { +func (t *Tracker) Update(deltaTime time.Duration, out chan<- *output.PremixData) error { premix, err := t.Generate(deltaTime) if err != nil { return err @@ -68,7 +67,7 @@ func (t *Tracker) Update(deltaTime time.Duration, out chan<- *device.PremixData) } // Generate runs processing on the tracker, then returns the premixed sound data (if possible) -func (t *Tracker) Generate(deltaTime time.Duration) (*device.PremixData, error) { +func (t *Tracker) Generate(deltaTime time.Duration) (*output.PremixData, error) { premix, err := t.renderTick() if err != nil { return nil, err @@ -92,10 +91,10 @@ func (t *Tracker) Generate(deltaTime time.Duration) (*device.PremixData, error) return nil, nil } -// GetOutputChannel returns the output channel for the provided index `ch` -func (t *Tracker) GetOutputChannel(ch int, init func(ch int) *output.Channel) *output.Channel { +// GetRenderChannel returns the output channel for the provided index `ch` +func (t *Tracker) GetRenderChannel(ch int, init func(ch int) *render.Channel) *render.Channel { if t.outputChannels == nil { - t.outputChannels = make(map[int]*output.Channel) + t.outputChannels = make(map[int]*render.Channel) } if oc, ok := t.outputChannels[ch]; ok { @@ -111,7 +110,7 @@ func (t *Tracker) GetSampleRate() period.Frequency { return period.Frequency(t.GetSampler().SampleRate) } -func (t *Tracker) renderTick() (*device.PremixData, error) { +func (t *Tracker) renderTick() (*output.PremixData, error) { if err := DoTick(t.Tickable); err != nil { return nil, err } @@ -165,12 +164,12 @@ func (t *Tracker) renderOPL2Tick(mixerData *mixing.Data, mix *mixing.Mixer, tick } // GetOPL2Chip returns the current song's OPL2 chip, if it's needed -func (t *Tracker) GetOPL2Chip() render.OPL2Chip { +func (t *Tracker) GetOPL2Chip() voiceRender.OPL2Chip { return t.opl2 } // SetOPL2Chip sets the current song's OPL2 chip -func (t *Tracker) SetOPL2Chip(opl2 render.OPL2Chip) { +func (t *Tracker) SetOPL2Chip(opl2 voiceRender.OPL2Chip) { t.opl2 = opl2 } diff --git a/player/voice/voice.go b/player/voice/voice.go index 191d448..5f72d52 100644 --- a/player/voice/voice.go +++ b/player/voice/voice.go @@ -5,11 +5,11 @@ import ( "github.com/gotracker/playback/filter" "github.com/gotracker/playback/instrument" - "github.com/gotracker/playback/player/output" + "github.com/gotracker/playback/player/render" ) // New returns a new Voice from the instrument and output channel provided -func New(inst *instrument.Instrument, output *output.Channel) voice.Voice { +func New(inst *instrument.Instrument, output *render.Channel) voice.Voice { switch data := inst.GetData().(type) { case *instrument.PCM: var ( diff --git a/song/song.go b/song/song.go index 3b53bf3..922a584 100644 --- a/song/song.go +++ b/song/song.go @@ -10,7 +10,7 @@ import ( type Data interface { GetOrderList() []index.Pattern IsChannelEnabled(int) bool - GetOutputChannel(int) int + GetRenderChannel(int) int NumInstruments() int IsValidInstrumentID(instrument.ID) bool GetInstrument(instrument.ID) (*instrument.Instrument, note.Semitone)