audio: optimize Mixer.Stream and Mix(...).Stream (remove unnecessary mix buffer)
This commit is contained in:
parent
b3cceb1b7d
commit
62fcf430d2
|
@ -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:]
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue