diff --git a/service/streamer.go b/service/streamer.go index 9f16d06..5b68179 100644 --- a/service/streamer.go +++ b/service/streamer.go @@ -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)) } }