123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 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)
- }
- }
|