removed Stream interface, can now use filters to get similar functionality
This commit is contained in:
parent
9ece89c3e6
commit
1581d6813d
|
@ -1,99 +0,0 @@
|
|||
package audio
|
||||
|
||||
type Stream struct {
|
||||
source Source
|
||||
channel chan []float32
|
||||
samplesProcessed int
|
||||
buffer []float32
|
||||
blockSize int
|
||||
}
|
||||
|
||||
func NewStream(source Source, blockSize int) *Stream {
|
||||
return &Stream{
|
||||
source: source,
|
||||
blockSize: blockSize,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Stream) GetChannels() int {
|
||||
return s.source.GetChannels()
|
||||
}
|
||||
|
||||
func (s *Stream) GetSampleRate() int {
|
||||
return s.source.GetSampleRate()
|
||||
}
|
||||
|
||||
func (s *Stream) GetSamplesProcessed() int {
|
||||
return s.samplesProcessed
|
||||
}
|
||||
|
||||
func (s *Stream) GetAsChannel() chan float32 {
|
||||
newChannel := make(chan float32)
|
||||
go func() {
|
||||
defer close(newChannel)
|
||||
for {
|
||||
v, more := s.Get()
|
||||
if !more {
|
||||
return
|
||||
}
|
||||
newChannel <- v
|
||||
s.samplesProcessed++
|
||||
}
|
||||
}()
|
||||
return newChannel
|
||||
}
|
||||
|
||||
func (s *Stream) GetAsBlockChannel() chan []float32 {
|
||||
newChannel := make(chan []float32)
|
||||
|
||||
go func() {
|
||||
defer close(newChannel)
|
||||
for buf := range s.source.ToFloat32().GetBlocks() {
|
||||
s.buffer = append(s.buffer, buf...)
|
||||
for len(s.buffer) >= s.blockSize*s.source.GetChannels() {
|
||||
newChannel <- s.buffer[0 : s.blockSize*s.source.GetChannels()]
|
||||
s.samplesProcessed += s.blockSize * s.source.GetChannels()
|
||||
s.buffer = s.buffer[s.blockSize*s.source.GetChannels():]
|
||||
}
|
||||
}
|
||||
|
||||
if len(s.buffer) > 0 {
|
||||
newChannel <- s.buffer
|
||||
s.samplesProcessed += len(s.buffer)
|
||||
}
|
||||
s.buffer = nil
|
||||
}()
|
||||
return newChannel
|
||||
}
|
||||
|
||||
func (s *Stream) Get() (float32, bool) {
|
||||
if s.channel == nil {
|
||||
s.channel = s.source.ToFloat32().GetBlocks()
|
||||
}
|
||||
var more bool
|
||||
if len(s.buffer) == 0 {
|
||||
s.buffer, more = <-s.channel
|
||||
if !more {
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
f := s.buffer[0]
|
||||
s.buffer = s.buffer[1:]
|
||||
s.samplesProcessed++
|
||||
return f, true
|
||||
}
|
||||
|
||||
func (s *Stream) AdvanceSeconds(seconds float64) bool {
|
||||
stopAt := s.secondsIndex(seconds)
|
||||
for i := 0; i < stopAt; i++ {
|
||||
_, more := s.Get()
|
||||
if !more {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (s *Stream) secondsIndex(seconds float64) int {
|
||||
return int(seconds * float64(s.source.GetSampleRate()))
|
||||
}
|
Loading…
Reference in a new issue