89 lines
2.1 KiB
Go
89 lines
2.1 KiB
Go
// ABOUTME: Basic Sendspin player example
|
|
// ABOUTME: Demonstrates how to connect to a server and play audio
|
|
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
|
|
"github.com/Sendspin/sendspin-go/pkg/sendspin"
|
|
)
|
|
|
|
func main() {
|
|
serverAddr := flag.String("server", "localhost:8927", "Sendspin server address")
|
|
playerName := flag.String("name", "Basic Player", "Player name")
|
|
volume := flag.Int("volume", 80, "Initial volume (0-100)")
|
|
flag.Parse()
|
|
|
|
config := sendspin.PlayerConfig{
|
|
ServerAddr: *serverAddr,
|
|
PlayerName: *playerName,
|
|
Volume: *volume,
|
|
BufferMs: 500, // 500ms playback buffer
|
|
DeviceInfo: sendspin.DeviceInfo{
|
|
ProductName: "Sendspin Example Player",
|
|
Manufacturer: "Sendspin",
|
|
SoftwareVersion: "1.0.0",
|
|
},
|
|
OnMetadata: func(meta sendspin.Metadata) {
|
|
log.Printf("Now playing: %s - %s (%s)", meta.Artist, meta.Title, meta.Album)
|
|
},
|
|
OnStateChange: func(state sendspin.PlayerState) {
|
|
log.Printf("State changed: %s (volume: %d, muted: %v)", state.State, state.Volume, state.Muted)
|
|
},
|
|
OnError: func(err error) {
|
|
log.Printf("Error: %v", err)
|
|
},
|
|
}
|
|
|
|
player, err := sendspin.NewPlayer(config)
|
|
if err != nil {
|
|
log.Fatalf("Failed to create player: %v", err)
|
|
}
|
|
defer player.Close()
|
|
|
|
log.Printf("Connecting to %s...", *serverAddr)
|
|
if err := player.Connect(); err != nil {
|
|
log.Fatalf("Failed to connect: %v", err)
|
|
}
|
|
|
|
log.Printf("Connected! Starting playback...")
|
|
|
|
if err := player.Play(); err != nil {
|
|
log.Fatalf("Failed to start playback: %v", err)
|
|
}
|
|
|
|
go func() {
|
|
for {
|
|
status := player.Status()
|
|
stats := player.Stats()
|
|
if status.Connected {
|
|
log.Printf("Status: %s | %s %dHz %dch %dbit | Buffer: %dms | RTT: %dμs",
|
|
status.State,
|
|
status.Codec,
|
|
status.SampleRate,
|
|
status.Channels,
|
|
status.BitDepth,
|
|
stats.BufferDepth,
|
|
stats.SyncRTT)
|
|
}
|
|
// Sleep for 5 seconds
|
|
select {
|
|
case <-make(chan struct{}):
|
|
}
|
|
}
|
|
}()
|
|
|
|
// Wait for interrupt signal
|
|
fmt.Println("\nPress Ctrl+C to stop playback")
|
|
sigChan := make(chan os.Signal, 1)
|
|
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
|
|
<-sigChan
|
|
|
|
log.Printf("Shutting down...")
|
|
}
|