soundr/handlerFunctions.go
grey f3e07d3f4d - add error handeling
- add loop parameter
- improve documentation
2022-05-26 17:46:03 +02:00

109 lines
2.3 KiB
Go

package main
import (
"fmt"
"io/ioutil"
"log"
"os"
"time"
"github.com/faiface/beep"
"github.com/faiface/beep/flac"
"github.com/faiface/beep/mp3"
"github.com/faiface/beep/speaker"
"github.com/faiface/beep/vorbis"
"github.com/faiface/beep/wav"
"github.com/h2non/filetype"
)
func BufferSound(file string) bool {
_, ok := streamMap[file]
if !ok {
fmt.Println("Not in memory, loading")
f, err := os.Open("./sounds/" + file)
if err != nil {
log.Fatal(err)
}
fmt.Println("Opened file")
buf, _ := ioutil.ReadFile("sounds/" + string(file))
kind, _ := filetype.Match(buf)
fmt.Println("File type: " + kind.MIME.Subtype)
var streamer beep.StreamSeekCloser
var format beep.Format
if kind.MIME.Subtype == "mpeg" {
streamer, format, _ = mp3.Decode(f)
} else if kind.MIME.Subtype == "x-wav" {
streamer, format, _ = wav.Decode(f)
} else if kind.MIME.Subtype == "x-flac" {
streamer, format, _ = flac.Decode(f)
} else if kind.MIME.Subtype == "ogg" {
streamer, format, _ = vorbis.Decode(f)
} else {
fmt.Println("!!!!! Unsupported file type for " + file)
return false
}
speaker.Init(format.SampleRate, format.SampleRate.N(time.Second/10))
fmt.Println("Decoded file")
buffer := beep.NewBuffer(format)
buffer.Append(streamer)
streamer.Close()
fmt.Println("Bufferd file")
// Save to streamMap
streamMap[file] = streamBuf{
Streamer: streamer,
Format: format,
Buffer: buffer,
}
return (true)
} else {
return (false)
}
}
func PlaySound(file string, index int, loop bool) int {
playbacks[index] = playback{
File: file,
IsLoaded: false,
Streamer: nil,
Control: nil,
Loop: loop,
}
fmt.Println("Playing sound: " + file)
var buffer *beep.Buffer
BufferSound(file)
buffer = streamMap[file].Buffer
streamer := streamMap[file].Streamer
fmt.Println("Trying to play sound")
shot := buffer.Streamer(0, buffer.Len())
done := make(chan bool)
ctrl := &beep.Ctrl{Streamer: beep.Seq(shot, beep.Callback(func() {
done <- true
})), Paused: false}
playbacks[index] = playback{
File: file,
IsLoaded: true,
Streamer: streamer,
Control: ctrl,
Loop: loop,
}
speaker.Play(ctrl)
<-done
fmt.Println("Finished playing sound: " + file)
if playbacks[index].Loop {
playbacks[index].Control.Paused = true
PlaySound(file, index, loop)
delete(playbacks, index)
}
return 1
}