audio: optimize Mixer.Stream and Mix(...).Stream (remove unnecessary mix buffer)

This commit is contained in:
faiface 2017-07-08 14:43:24 +02:00
parent b3cceb1b7d
commit 62fcf430d2
2 changed files with 15 additions and 25 deletions

View File

@ -42,17 +42,17 @@ func Seq(s ...Streamer) Streamer {
// Mix takes zero or more Streamers and returns a Streamer which streames them mixed together. // Mix takes zero or more Streamers and returns a Streamer which streames them mixed together.
func Mix(s ...Streamer) Streamer { func Mix(s ...Streamer) Streamer {
return StreamerFunc(func(samples [][2]float64) (n int, ok bool) { return StreamerFunc(func(samples [][2]float64) (n int, ok bool) {
var tmp, mix [512][2]float64 var tmp [512][2]float64
for len(samples) > 0 { for len(samples) > 0 {
toStream := len(mix) toStream := len(tmp)
if toStream > len(samples) { if toStream > len(samples) {
toStream = len(samples) toStream = len(samples)
} }
// clear the mix buffer // clear the samples
for i := range mix[:toStream] { for i := range samples[:toStream] {
mix[i] = [2]float64{} samples[i] = [2]float64{}
} }
snMax := 0 // max number of streamed samples in this iteration snMax := 0 // max number of streamed samples in this iteration
@ -65,18 +65,13 @@ func Mix(s ...Streamer) Streamer {
ok = ok || sok ok = ok || sok
for i := range tmp[:sn] { for i := range tmp[:sn] {
mix[i][0] += tmp[i][0] samples[i][0] += tmp[i][0]
mix[i][1] += tmp[i][1] samples[i][1] += tmp[i][1]
} }
} }
// copy mix buffer into samples
for i := range mix[:snMax] {
samples[i] = mix[i]
}
n += snMax n += snMax
if snMax < len(mix) { if snMax < len(tmp) {
break break
} }
samples = samples[snMax:] samples = samples[snMax:]

View File

@ -13,25 +13,25 @@ func (m *Mixer) Play(s ...Streamer) {
} }
func (m *Mixer) Stream(samples [][2]float64) (n int, ok bool) { func (m *Mixer) Stream(samples [][2]float64) (n int, ok bool) {
var tmp, mix [512][2]float64 var tmp [512][2]float64
for len(samples) > 0 { for len(samples) > 0 {
toStream := len(mix) toStream := len(tmp)
if toStream > len(samples) { if toStream > len(samples) {
toStream = len(samples) toStream = len(samples)
} }
// clear the mix buffer // clear the samples
for i := range mix[:toStream] { for i := range samples[:toStream] {
mix[i] = [2]float64{} samples[i] = [2]float64{}
} }
for si := 0; si < len(m.streamers); si++ { for si := 0; si < len(m.streamers); si++ {
// mix the stream // mix the stream
sn, sok := m.streamers[si].Stream(tmp[:toStream]) sn, sok := m.streamers[si].Stream(tmp[:toStream])
for i := range tmp[:sn] { for i := range tmp[:sn] {
mix[i][0] += tmp[i][0] samples[i][0] += tmp[i][0]
mix[i][1] += tmp[i][1] samples[i][1] += tmp[i][1]
} }
if !sok { if !sok {
// remove drained streamer // remove drained streamer
@ -42,11 +42,6 @@ func (m *Mixer) Stream(samples [][2]float64) (n int, ok bool) {
} }
} }
// copy mix buffer into samples
for i := range mix[:toStream] {
samples[i] = mix[i]
}
samples = samples[toStream:] samples = samples[toStream:]
n += toStream n += toStream
} }