soundr/handlerFunctions.go

111 lines
2.3 KiB
Go
Raw Permalink Normal View History

package main
import (
"fmt"
2022-05-16 21:19:00 +02:00
"io/ioutil"
"log"
"os"
"time"
"github.com/faiface/beep"
2022-05-16 21:19:00 +02:00
"github.com/faiface/beep/flac"
"github.com/faiface/beep/mp3"
"github.com/faiface/beep/speaker"
2022-05-16 21:19:00 +02:00
"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")
2022-05-16 21:19:00 +02:00
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,
2022-10-13 16:04:51 +02:00
Format: streamMap[file].Format,
}
fmt.Println("Playing sound: " + file)
var buffer *beep.Buffer
BufferSound(file)
buffer = streamMap[file].Buffer
2022-10-13 16:04:51 +02:00
// streamer := streamMap[file].Streamer
fmt.Println("Trying to play sound")
2022-10-13 16:04:51 +02:00
amountOfLoops := 1
if loop {
amountOfLoops = -1
}
shot := buffer.Streamer(amountOfLoops, buffer.Len())
done := make(chan bool)
2022-10-13 16:04:51 +02:00
ctrl := &beep.Ctrl{Streamer: shot, Paused: false}
playbacks[index] = playback{
File: file,
IsLoaded: true,
2022-10-13 16:04:51 +02:00
Streamer: shot,
Control: ctrl,
Loop: loop,
2022-10-13 16:04:51 +02:00
Format: streamMap[file].Format,
Done: done,
}
speaker.Play(ctrl)
<-done
fmt.Println("Finished playing sound: " + file)
2022-10-13 16:04:51 +02:00
delete(playbacks, index)
return 1
}