package main
import (
- "code.octet-stream.net/broadcaster/internal/protocol"
"encoding/json"
"flag"
"fmt"
- "github.com/gopxl/beep/v2"
- "github.com/gopxl/beep/v2/mp3"
- "github.com/gopxl/beep/v2/speaker"
- "github.com/gopxl/beep/v2/wav"
- "golang.org/x/net/websocket"
"log"
"os"
"os/signal"
"strings"
"syscall"
"time"
+
+ "code.octet-stream.net/broadcaster/internal/protocol"
+ "github.com/gopxl/beep/v2"
+ "github.com/gopxl/beep/v2/mp3"
+ "github.com/gopxl/beep/v2/speaker"
+ "github.com/gopxl/beep/v2/wav"
+ "golang.org/x/net/websocket"
)
-const version = "v1.0.0"
+const version = "v1.1.0"
const sampleRate = 44100
var config RadioConfig = NewRadioConfig()
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
go func() {
sig := <-sig
- log.Println("Radio shutting down due to signal", sig)
+ log.Println("Radio shutting down due to signal:", sig)
// Make sure we always stop PTT when program ends
ptt.DisengagePTT()
os.Exit(0)
}
if t == protocol.StopType {
+ log.Println("Received stop transmission message from server")
stop <- true
}
}
}
var soonestTime time.Time
for _, v := range specs {
- t, err := time.ParseInLocation(protocol.StartTimeFormat, v.StartTime, loc)
+ t, err := time.ParseInLocation(protocol.StartTimeFormatSecs, v.StartTime, loc)
+ if err != nil {
+ t, err = time.ParseInLocation(protocol.StartTimeFormat, v.StartTime, loc)
+ }
if err != nil {
log.Println("Error parsing start time", err)
continue
}
}
if found {
- duration := soonestTime.Sub(time.Now())
+ duration := time.Until(soonestTime)
log.Println("Next playlist will be id", nextId, "in", duration.Seconds(), "seconds")
timer = time.NewTimer(duration)
} else {
select {
case <-time.After(duration):
case <-cancel:
+ log.Println("Cancelling pre-play delay")
break entries
}
Playlist: playlist.Name,
Filename: p.Filename,
}
- ptt.EngagePTT()
f, err := os.Open(filepath.Join(config.CachePath, p.Filename))
if err != nil {
log.Println("Couldn't open file for playlist", p.Filename)
defer streamer.Close()
done := make(chan bool)
+ log.Println("PTT on for playback")
+ ptt.EngagePTT()
if format.SampleRate != sampleRate {
+ log.Println("Configuring resampler for audio provided at sample rate", format.SampleRate)
resampled := beep.Resample(4, format.SampleRate, sampleRate, streamer)
+ log.Println("Playing resampled audio")
speaker.Play(beep.Seq(resampled, beep.Callback(func() {
done <- true
})))
} else {
+ log.Println("Playing audio at native sample rate")
speaker.Play(beep.Seq(streamer, beep.Callback(func() {
done <- true
})))
select {
case <-done:
+ log.Println("Audio playback complete")
case <-cancel:
+ log.Println("Disengaging PTT and aborting playlist playback")
ptt.DisengagePTT()
break entries
}
+ log.Println("PTT off since audio file has finished")
ptt.DisengagePTT()
}
log.Println("Playlist finished", playlist.Name)