go-opengl-pixel/audio/mixer.go

51 lines
978 B
Go
Raw Normal View History

2017-07-07 11:46:26 -05:00
package audio
type Mixer struct {
streamers []Streamer
}
2017-07-08 07:28:34 -05:00
func (m *Mixer) Len() int {
return len(m.streamers)
}
2017-07-07 11:46:26 -05:00
func (m *Mixer) Play(s ...Streamer) {
m.streamers = append(m.streamers, s...)
}
func (m *Mixer) Stream(samples [][2]float64) (n int, ok bool) {
var tmp [512][2]float64
2017-07-07 11:46:26 -05:00
for len(samples) > 0 {
toStream := len(tmp)
2017-07-07 11:46:26 -05:00
if toStream > len(samples) {
toStream = len(samples)
}
// clear the samples
for i := range samples[:toStream] {
samples[i] = [2]float64{}
2017-07-07 11:46:26 -05:00
}
for si := 0; si < len(m.streamers); si++ {
// mix the stream
sn, sok := m.streamers[si].Stream(tmp[:toStream])
for i := range tmp[:sn] {
samples[i][0] += tmp[i][0]
samples[i][1] += tmp[i][1]
2017-07-07 11:46:26 -05:00
}
if !sok {
// remove drained streamer
sj := len(m.streamers) - 1
m.streamers[si], m.streamers[sj] = m.streamers[sj], m.streamers[si]
m.streamers = m.streamers[:sj]
si--
}
}
samples = samples[toStream:]
n += toStream
}
return n, true
}