package main /* HDS-Audio Author: tobychui Experimental HDS based iot device for Audio playback in local area network */ import ( "flag" "log" "net/http" "os" "os/signal" "strconv" "strings" "syscall" "time" "github.com/faiface/beep/speaker" "imuslab.com/hds/audio/mod/mdns" ) var ( port = flag.Int("port", 12110, "The port for the HDS device API") MDNS *mdns.MDNSHost deviceStatus *Status deviceUUID = "" ) func SetupCloseHandler() { c := make(chan os.Signal, 2) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { <-c //Stop the speaker speaker.Clear() speaker.Close() //Clear up the tmp folder os.RemoveAll("./tmp") //Exit os.Exit(0) }() } func main() { //Parse flag flag.Parse() //Get system UUID by MAC addr macAddr, _ := getMacAddr() if len(macAddr) > 0 { deviceUUID = strings.ReplaceAll(macAddr[0], ":", "-") } else { //Just generate one randomly deviceUUID = strconv.Itoa(int(time.Now().Unix())) } SetupCloseHandler() //Start MDNS broadcast hostController, err := mdns.NewMDNS(mdns.NetworkHost{ HostName: "hdsAudio_" + deviceUUID, Port: *port, Domain: "hds.arozos.com", Model: "Audio Device", UUID: deviceUUID, Vendor: "Home Dynamic Project", BuildVersion: "1.0", MinorVersion: "0.00", }) if err != nil { panic(err) } MDNS = hostController //Create a new status objecty currentStatus := Status{ Playing: false, Status: "ready", Gain: 0, } deviceStatus = ¤tStatus //Register all required APIs for HDSv2 http.HandleFunc("/", handleIndex) http.HandleFunc("/status", handleStatus) http.HandleFunc("/eps", handleEndpoints) //handlers for playback endpoints http.HandleFunc("/play", handlePlayToggle) http.HandleFunc("/stop", handleStop) http.HandleFunc("/load", handleLoad) http.HandleFunc("/loop", handleLoop) http.HandleFunc("/gain", handleVol) http.HandleFunc("/mute", handleMute) http.HandleFunc("/name", handleSetName) //Start web server log.Println("Web API Started on port ", *port) err = http.ListenAndServe(":"+strconv.Itoa(*port), nil) if err != nil { panic(err) } }