61 lines
1.2 KiB
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
|
|
}
|