Add support snd mode for wyoming module

This commit is contained in:
Alex X
2025-04-22 13:16:57 +03:00
parent 3b7309d9f7
commit 80f57a0292
3 changed files with 45 additions and 1 deletions

View File

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

View File

@@ -377,7 +377,9 @@ func (s *sndProducer) Start() error {
seq++
}
s.onClose()
if s.onClose != nil {
s.onClose()
}
return nil
}

40
pkg/wyoming/snd.go Normal file
View File

@@ -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
}
}
}
}