Skip to content

Commit

Permalink
♻️ (streamer)Split Serve function
Browse files Browse the repository at this point in the history
  • Loading branch information
tuarrep committed Feb 28, 2019
1 parent e9858bd commit 1551798
Showing 1 changed file with 50 additions and 37 deletions.
87 changes: 50 additions & 37 deletions service/streamer.go
Expand Up @@ -41,60 +41,73 @@ func (s *Streamer) Serve() {
s.log.Info(fmt.Sprintf("Streamer started. %d files found", len(files)))

for _, file := range files {
fileData, err := os.Open(fmt.Sprintf("%s/%s", s.sb.Config.Streamer.PlaylistDir, file.Name()))
//util.CheckError(err, s.log)

head := make([]byte, 261)
_, err = fileData.Read(head)
stream, format, err := s.getStream(file)

if err != nil {
s.log.Warn(fmt.Sprintf("File %s seems corrupted", file.Name()))
s.log.Warn(err)
continue
}

ft, err := filetype.Match(head)
s.streamToMessage(stream, format)
}
}

if ft == filetype.Unknown {
continue
}
func (s *Streamer) getStream(file os.FileInfo) (beep.StreamCloser, beep.Format, error) {
fileData, err := os.Open(fmt.Sprintf("%s/%s", s.sb.Config.Streamer.PlaylistDir, file.Name()))
util.CheckError(err, s.log)

var stream beep.StreamCloser
var format beep.Format
head := make([]byte, 261)
_, err = fileData.Read(head)

s.log.Debug(fmt.Sprintf("File %s has type %s", file.Name(), ft.MIME.Value))
if err != nil {
s.log.Warn(fmt.Sprintf("File %s seems corrupted", file.Name()))
return nil, beep.Format{}, err
}

if ft.MIME.Value == "audio/x-xav" {
stream, format, err = wav.Decode(fileData)
util.CheckError(err, s.log)
} else if ft.MIME.Value == "audio/mpeg" {
stream, format, err = mp3.Decode(fileData)
util.CheckError(err, s.log)
}
s.log.Info(fmt.Sprintf("Audio format is: channels=%d, sampleRate=%d, precision=%d", format.NumChannels, format.SampleRate, format.Precision))
ft, err := filetype.Match(head)

buff := make([][2]float64, 512)
if ft == filetype.Unknown {
return nil, beep.Format{}, fmt.Errorf("unknown file type")
}

var stream beep.StreamCloser
var format beep.Format

ok := true
n := 512
s.log.Debug(fmt.Sprintf("File %s has type %s", file.Name(), ft.MIME.Value))

for ok == true {
n, ok = stream.Stream(buff)
if ft.MIME.Value == "audio/x-xav" {
stream, format, err = wav.Decode(fileData)
util.CheckError(err, s.log)
} else if ft.MIME.Value == "audio/mpeg" {
stream, format, err = mp3.Decode(fileData)
util.CheckError(err, s.log)
}
s.log.Info(fmt.Sprintf("Audio format is: channels=%d, sampleRate=%d, precision=%d", format.NumChannels, format.SampleRate, format.Precision))

samplesLeft := make([]float64, n)
samplesRight := make([]float64, n)
return stream, format, nil
}

for i := 0; i < n; i++ {
samplesLeft[i] = buff[i][0]
samplesRight[i] = buff[i][1]
}
func (s *Streamer) streamToMessage(stream beep.StreamCloser, format beep.Format) {
buff := make([][2]float64, 512)

msg := &message.StreamData{SamplesLeft: samplesLeft, SamplesRight: samplesRight}
msgData, _ := message.ToBuffer(msg)
s.Messenger.Message <- &message.WriteRequest{DeviceName: "*", Message: msgData}
ok := true
n := 512

time.Sleep(format.SampleRate.D(n))
for ok == true {
n, ok = stream.Stream(buff)

samplesLeft := make([]float64, n)
samplesRight := make([]float64, n)

for i := 0; i < n; i++ {
samplesLeft[i] = buff[i][0]
samplesRight[i] = buff[i][1]
}

_ = fileData.Close()
msg := &message.StreamData{SamplesLeft: samplesLeft, SamplesRight: samplesRight}
msgData, _ := message.ToBuffer(msg)
s.Messenger.Message <- &message.WriteRequest{DeviceName: "*", Message: msgData}

time.Sleep(format.SampleRate.D(n))
}
}

0 comments on commit 1551798

Please sign in to comment.