mirror of
https://github.com/pion/mediadevices.git
synced 2025-10-23 08:39:24 +08:00
io/audio: fix ChunkInfo of Buffer output
This commit is contained in:

committed by
Lukas Herman

parent
cce22b117a
commit
1ebba951fb
@@ -28,7 +28,11 @@ func NewBuffer(nSamples int) TransformFunc {
|
|||||||
ib, ok := inBuff.(*wave.Float32Interleaved)
|
ib, ok := inBuff.(*wave.Float32Interleaved)
|
||||||
if !ok || ib.Size.Channels != b.Size.Channels {
|
if !ok || ib.Size.Channels != b.Size.Channels {
|
||||||
ib = wave.NewFloat32Interleaved(
|
ib = wave.NewFloat32Interleaved(
|
||||||
wave.ChunkInfo{Channels: b.Size.Channels, Len: nSamples},
|
wave.ChunkInfo{
|
||||||
|
SamplingRate: b.Size.SamplingRate,
|
||||||
|
Channels: b.Size.Channels,
|
||||||
|
Len: nSamples,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
ib.Data = ib.Data[:0]
|
ib.Data = ib.Data[:0]
|
||||||
ib.Size.Len = 0
|
ib.Size.Len = 0
|
||||||
@@ -41,7 +45,11 @@ func NewBuffer(nSamples int) TransformFunc {
|
|||||||
ib, ok := inBuff.(*wave.Int16Interleaved)
|
ib, ok := inBuff.(*wave.Int16Interleaved)
|
||||||
if !ok || ib.Size.Channels != b.Size.Channels {
|
if !ok || ib.Size.Channels != b.Size.Channels {
|
||||||
ib = wave.NewInt16Interleaved(
|
ib = wave.NewInt16Interleaved(
|
||||||
wave.ChunkInfo{Channels: b.Size.Channels, Len: nSamples},
|
wave.ChunkInfo{
|
||||||
|
SamplingRate: b.Size.SamplingRate,
|
||||||
|
Channels: b.Size.Channels,
|
||||||
|
Len: nSamples,
|
||||||
|
},
|
||||||
)
|
)
|
||||||
ib.Data = ib.Data[:0]
|
ib.Data = ib.Data[:0]
|
||||||
ib.Size.Len = 0
|
ib.Size.Len = 0
|
||||||
@@ -57,6 +65,7 @@ func NewBuffer(nSamples int) TransformFunc {
|
|||||||
switch ib := inBuff.(type) {
|
switch ib := inBuff.(type) {
|
||||||
case *wave.Int16Interleaved:
|
case *wave.Int16Interleaved:
|
||||||
ibCopy := *ib
|
ibCopy := *ib
|
||||||
|
ibCopy.Size.Len = nSamples
|
||||||
n := nSamples * ib.Size.Channels
|
n := nSamples * ib.Size.Channels
|
||||||
ibCopy.Data = make([]int16, n)
|
ibCopy.Data = make([]int16, n)
|
||||||
copy(ibCopy.Data, ib.Data)
|
copy(ibCopy.Data, ib.Data)
|
||||||
@@ -66,6 +75,7 @@ func NewBuffer(nSamples int) TransformFunc {
|
|||||||
|
|
||||||
case *wave.Float32Interleaved:
|
case *wave.Float32Interleaved:
|
||||||
ibCopy := *ib
|
ibCopy := *ib
|
||||||
|
ibCopy.Size.Len = nSamples
|
||||||
n := nSamples * ib.Size.Channels
|
n := nSamples * ib.Size.Channels
|
||||||
ibCopy.Data = make([]float32, n)
|
ibCopy.Data = make([]float32, n)
|
||||||
copy(ibCopy.Data, ib.Data)
|
copy(ibCopy.Data, ib.Data)
|
||||||
|
72
pkg/io/audio/buffer_test.go
Normal file
72
pkg/io/audio/buffer_test.go
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
package audio
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/pion/mediadevices/pkg/wave"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBuffer(t *testing.T) {
|
||||||
|
input := []wave.Audio{
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 1, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{1, 2},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 3, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{3, 4, 5, 6, 7, 8},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 2, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{9, 10, 11, 12},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 7, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
expected := []wave.Audio{
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 3, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{1, 2, 3, 4, 5, 6},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 3, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{7, 8, 9, 10, 11, 12},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 3, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{13, 14, 15, 16, 17, 18},
|
||||||
|
},
|
||||||
|
&wave.Int16Interleaved{
|
||||||
|
Size: wave.ChunkInfo{Len: 3, Channels: 2, SamplingRate: 1234},
|
||||||
|
Data: []int16{19, 20, 21, 22, 23, 24},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
trans := NewBuffer(3)
|
||||||
|
|
||||||
|
var iSent int
|
||||||
|
r := trans(ReaderFunc(func() (wave.Audio, error) {
|
||||||
|
if iSent < len(input) {
|
||||||
|
iSent++
|
||||||
|
return input[iSent-1], nil
|
||||||
|
}
|
||||||
|
return nil, io.EOF
|
||||||
|
}))
|
||||||
|
|
||||||
|
for i := 0; ; i++ {
|
||||||
|
a, err := r.Read()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF && i >= len(expected) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(expected[i], a) {
|
||||||
|
t.Errorf("Expected wave[%d]: %v, got: %v", i, expected[i], a)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user