diff --git a/internal/wyoming/wyoming.go b/internal/wyoming/wyoming.go index bdff4b03..aa76eab7 100644 --- a/internal/wyoming/wyoming.go +++ b/internal/wyoming/wyoming.go @@ -93,6 +93,8 @@ func handle(srv *wyoming.Server, mode string, conn net.Conn) { switch mode { case "mic": err = srv.HandleMic(conn) + case "snd": + err = srv.HandleSnd(conn) default: err = srv.Handle(conn) } diff --git a/pkg/wyoming/satellite.go b/pkg/wyoming/satellite.go index a787dfde..c542e3a9 100644 --- a/pkg/wyoming/satellite.go +++ b/pkg/wyoming/satellite.go @@ -377,7 +377,9 @@ func (s *sndProducer) Start() error { seq++ } - s.onClose() + if s.onClose != nil { + s.onClose() + } return nil } diff --git a/pkg/wyoming/snd.go b/pkg/wyoming/snd.go new file mode 100644 index 00000000..71148efe --- /dev/null +++ b/pkg/wyoming/snd.go @@ -0,0 +1,40 @@ +package wyoming + +import ( + "io" + "net" + "time" +) + +func (s *Server) HandleSnd(conn net.Conn) error { + defer conn.Close() + + var snd []byte + + api := NewAPI(conn) + for { + evt, err := api.ReadEvent() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + + s.Trace("event: %s data: %s payload: %d", evt.Type, evt.Data, len(evt.Payload)) + + switch evt.Type { + case "audio-start": + snd = snd[:0] + case "audio-chunk": + snd = append(snd, evt.Payload...) + case "audio-stop": + prod := newSndProducer(snd, func() { + time.Sleep(time.Second) // some extra delay before close + }) + if err = s.SndHandler(prod); err != nil { + return err + } + } + } +}