Files
pmomusic/pmostream/audio.go

61 lines
1.2 KiB
Go

package pmostream
import (
"fmt"
"os"
"strings"
"github.com/gopxl/beep"
"github.com/gopxl/beep/flac"
"github.com/gopxl/beep/mp3"
"github.com/gopxl/beep/vorbis"
"github.com/gopxl/beep/wav"
)
type streamerWithCloser struct {
beep.Streamer
closer func() error
}
func (s *streamerWithCloser) Close() error {
if s.closer != nil {
return s.closer()
}
return nil
}
func LoadAudio(uri string) (beep.Streamer, beep.Format, error) {
f, err := os.Open(uri)
if err != nil {
return nil, beep.Format{}, err
}
var streamer beep.Streamer
var format beep.Format
lowerURI := strings.ToLower(uri)
switch {
case strings.HasSuffix(lowerURI, ".flac"):
streamer, format, err = flac.Decode(f)
case strings.HasSuffix(lowerURI, ".wav"):
streamer, format, err = wav.Decode(f)
case strings.HasSuffix(lowerURI, ".mp3"):
streamer, format, err = mp3.Decode(f)
case strings.HasSuffix(lowerURI, ".ogg"):
streamer, format, err = vorbis.Decode(f)
default:
f.Close()
return nil, beep.Format{}, fmt.Errorf("unsupported format: %s", uri)
}
if err != nil {
f.Close()
return nil, beep.Format{}, err
}
return &streamerWithCloser{
Streamer: streamer,
closer: f.Close,
}, format, nil
}