From 3b7309d9f78649ac34560b1fc7b62bc1508b2028 Mon Sep 17 00:00:00 2001 From: Alex X Date: Tue, 22 Apr 2025 11:49:08 +0300 Subject: [PATCH] Add support mic mode for wyoming module --- internal/wyoming/wyoming.go | 20 +++++++++++++++----- pkg/wyoming/mic.go | 35 +++++++++++++++++++++++++++++++++++ pkg/wyoming/satellite.go | 10 +++++++--- 3 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 pkg/wyoming/mic.go diff --git a/internal/wyoming/wyoming.go b/internal/wyoming/wyoming.go index af5cd65d..bdff4b03 100644 --- a/internal/wyoming/wyoming.go +++ b/internal/wyoming/wyoming.go @@ -18,6 +18,7 @@ func Init() { Mod map[string]struct { Listen string `yaml:"listen"` Name string `yaml:"name"` + Mode string `yaml:"mode"` WakeURI string `yaml:"wake_uri"` VADThreshold float32 `yaml:"vad_threshold"` } `yaml:"wyoming"` @@ -60,13 +61,13 @@ func Init() { log.Trace().Msgf("[wyoming] "+format, v...) }, } - go serve(srv, cfg.Listen) + go serve(srv, cfg.Mode, cfg.Listen) } } var log zerolog.Logger -func serve(srv *wyoming.Server, address string) { +func serve(srv *wyoming.Server, mode, address string) { ln, err := net.Listen("tcp", address) if err != nil { log.Warn().Msgf("[wyoming] listen error: %s", err) @@ -78,16 +79,25 @@ func serve(srv *wyoming.Server, address string) { return } - go handle(srv, conn) + go handle(srv, mode, conn) } } -func handle(srv *wyoming.Server, conn net.Conn) { +func handle(srv *wyoming.Server, mode string, conn net.Conn) { addr := conn.RemoteAddr() log.Trace().Msgf("[wyoming] %s connected", addr) - if err := srv.Handle(conn); err != nil { + var err error + + switch mode { + case "mic": + err = srv.HandleMic(conn) + default: + err = srv.Handle(conn) + } + + if err != nil { log.Error().Msgf("[wyoming] %s error: %s", addr, err) } diff --git a/pkg/wyoming/mic.go b/pkg/wyoming/mic.go new file mode 100644 index 00000000..014ba4ea --- /dev/null +++ b/pkg/wyoming/mic.go @@ -0,0 +1,35 @@ +package wyoming + +import ( + "fmt" + "net" + + "github.com/AlexxIT/go2rtc/pkg/core" +) + +func (s *Server) HandleMic(conn net.Conn) error { + defer conn.Close() + + var closed core.Waiter + var timestamp int + + api := NewAPI(conn) + mic := newMicConsumer(func(chunk []byte) { + data := fmt.Sprintf(`{"rate":16000,"width":2,"channels":1,"timestamp":%d}`, timestamp) + evt := &Event{Type: "audio-chunk", Data: []byte(data), Payload: chunk} + if err := api.WriteEvent(evt); err != nil { + closed.Done(nil) + } + + timestamp += len(chunk) / 2 + }) + mic.RemoteAddr = api.conn.RemoteAddr().String() + + if err := s.MicHandler(mic); err != nil { + return err + } + + defer mic.Stop() + + return closed.Wait() +} diff --git a/pkg/wyoming/satellite.go b/pkg/wyoming/satellite.go index bab3c761..a787dfde 100644 --- a/pkg/wyoming/satellite.go +++ b/pkg/wyoming/satellite.go @@ -142,9 +142,6 @@ func (s *satellite) pause() { s.state = stateUnavailable if s.mic != nil { - if s.mic.onClose != nil { - s.mic.onClose() - } _ = s.mic.Stop() s.mic = nil } @@ -296,6 +293,13 @@ func (c *micConsumer) AddTrack(media *core.Media, codec *core.Codec, track *core return nil } +func (c *micConsumer) Stop() error { + if c.onClose != nil { + c.onClose() + } + return c.Connection.Stop() +} + type sndProducer struct { core.Connection data []byte