@@ -8,43 +8,43 @@ import (
88)
99
1010type sample interface {
11- int8 | int16 | int32 | int64 | float32 | float64
11+ byte | int8 | int16 | int32 | int64 | float32 | float64
1212}
1313
1414// FullFrames creates a writer that only writes full frames of a given size to the underlying writer (except the last one).
1515func FullFrames [T ~ []S , S sample ](w WriteCloser [T ], frameSize int ) WriteCloser [T ] {
1616 if frameSize <= 0 {
1717 panic ("invalid frame size" )
1818 }
19- return & frameBuffer [T , S ]{
19+ return & fullFrameBuffer [T , S ]{
2020 w : w ,
2121 frameSize : frameSize ,
2222 buf : make ([]S , 0 , frameSize ),
2323 }
2424}
2525
26- type frameBuffer [T ~ []S , S sample ] struct {
26+ type fullFrameBuffer [T ~ []S , S sample ] struct {
2727 frameSize int
2828 mu sync.Mutex
2929 w WriteCloser [T ]
3030 buf []S
3131}
3232
33- func (b * frameBuffer [T , S ]) String () string {
34- return fmt .Sprintf ("FrameBuf (%d) -> %s" , b .frameSize , b .w )
33+ func (b * fullFrameBuffer [T , S ]) String () string {
34+ return fmt .Sprintf ("FullFrameBuf (%d) -> %s" , b .frameSize , b .w )
3535}
36- func (b * frameBuffer [T , S ]) SampleRate () int {
36+ func (b * fullFrameBuffer [T , S ]) SampleRate () int {
3737 return b .w .SampleRate ()
3838}
3939
40- func (b * frameBuffer [T , S ]) WriteSample (in T ) error {
40+ func (b * fullFrameBuffer [T , S ]) WriteSample (in T ) error {
4141 b .mu .Lock ()
4242 defer b .mu .Unlock ()
4343 b .buf = append (b .buf , in ... )
4444 return b .flush (false )
4545}
4646
47- func (b * frameBuffer [T , S ]) flush (force bool ) error {
47+ func (b * fullFrameBuffer [T , S ]) flush (force bool ) error {
4848 it := b .buf
4949 defer func () {
5050 if len (it ) == 0 {
@@ -69,10 +69,40 @@ func (b *frameBuffer[T, S]) flush(force bool) error {
6969 return nil
7070}
7171
72- func (b * frameBuffer [T , S ]) Close () error {
72+ func (b * fullFrameBuffer [T , S ]) Close () error {
7373 b .mu .Lock ()
7474 defer b .mu .Unlock ()
7575 err := b .flush (true )
7676 err2 := b .w .Close ()
7777 return errors .Join (err , err2 )
7878}
79+
80+ // NewFrameWriter creates a writer that appends a copy of all written frames to a slice.
81+ func NewFrameWriter [T ~ []S , S sample ](buf * []T , sampleRate int ) WriteCloser [T ] {
82+ return & frameWriter [T , S ]{
83+ buf : buf ,
84+ sampleRate : sampleRate ,
85+ }
86+ }
87+
88+ type frameWriter [T ~ []S , S sample ] struct {
89+ buf * []T
90+ sampleRate int
91+ }
92+
93+ func (b * frameWriter [T , S ]) String () string {
94+ return fmt .Sprintf ("Frames(%d)" , b .sampleRate )
95+ }
96+
97+ func (b * frameWriter [T , S ]) SampleRate () int {
98+ return b .sampleRate
99+ }
100+
101+ func (b * frameWriter [T , S ]) Close () error {
102+ return nil
103+ }
104+
105+ func (b * frameWriter [T , S ]) WriteSample (data T ) error {
106+ * b .buf = append (* b .buf , slices .Clone (data ))
107+ return nil
108+ }
0 commit comments