rework needed

This commit is contained in:
TonyChyi
2022-09-27 10:21:06 +08:00
parent 821c0cffb8
commit 18f5d649d1
9 changed files with 141 additions and 104 deletions

View File

@@ -3,6 +3,8 @@ package qemuserver
import (
"fmt"
"net/url"
"os"
"time"
"git.sense-t.eu.org/ACE/ace/lib/audiodriver"
"git.sense-t.eu.org/ACE/ace/lib/qemuconnection"
@@ -19,7 +21,9 @@ type Server struct {
RX chan *qemuconnection.Event
TX chan qemu.Status
}
qemu *qemu.Domain
qemu *qemu.Domain
audioHeader chan *audiodriver.WavHeader
pcm chan [audiodriver.BufferSize]byte
}
var DefaultServer *Server
@@ -30,7 +34,9 @@ func NewServer(o *Options) (*Server, error) {
}
server := &Server{
options: o,
options: o,
audioHeader: make(chan *audiodriver.WavHeader, 1),
pcm: make(chan [audiodriver.BufferSize]byte),
}
server.QmpConnector.RX = make(chan *qemuconnection.Event)
server.QmpConnector.TX = make(chan qemu.Status)
@@ -62,8 +68,9 @@ func NewServer(o *Options) (*Server, error) {
}
server.qemu = qemu
audio := audiodriver.New()
if err := driver.GetManager().Register(
audiodriver.New(o.AudioPipe),
audio,
driver.Info{
Label: "audioFifo",
DeviceType: driver.Microphone,
@@ -72,6 +79,9 @@ func NewServer(o *Options) (*Server, error) {
); err != nil {
return nil, err
}
audio.PCM = server.pcm
audio.WaveHeader = server.audioHeader
if err := driver.GetManager().Register(
vncdriver.NewVnc(o.VNCAddress),
driver.Info{
@@ -91,7 +101,7 @@ func (s *Server) Run() error {
defer logrus.Debug("qemu server exit")
defer s.qemu.Close()
go s.startCapture()
s.startCapture()
logrus.Debug("qemu capture start")
for ev := range s.QmpConnector.RX {
@@ -115,46 +125,71 @@ func (s *Server) Run() error {
}
func (s *Server) startCapture() {
if _, err := s.qemu.Run(qmp.Command{
Execute: "human-monitor-command",
Args: map[string]string{
"command-line": fmt.Sprintf(
"wavcapture %s %s",
s.options.AudioPipe,
s.options.AudioDevice,
),
},
}); err != nil {
logrus.Fatal("run audio command failed: ", err)
}
logrus.Debug("audio capture set")
}
func Setup(o *Options) error {
DefaultServer, err := NewServer(o)
if err != nil {
return err
}
go func() {
if err := DefaultServer.Run(); err != nil {
logrus.Fatal("cannot run qemuserver with error: ", err)
f, err := os.Open(s.options.AudioPipe)
if err != nil {
logrus.Fatal(err)
}
defer f.Close()
logrus.Debug("start reading from fifo")
waveHeader, err := audiodriver.NewHeader(f)
if err != nil {
logrus.Fatal(err)
}
logrus.Debug(waveHeader)
s.audioHeader <- waveHeader
close(s.audioHeader) // only once
// skip riff data chunk ID and size, 8 bytes
var _dataChunkHeader [audiodriver.DataChunkIDSize + audiodriver.DataChunkSizeSize]byte
if _, err := f.Read(_dataChunkHeader[:]); err != nil {
logrus.Fatal(err)
}
defer close(s.pcm)
for {
var b [audiodriver.BufferSize]byte
if _, err := f.Read(b[:]); err != nil {
logrus.Error(err)
}
select {
case s.pcm <- b:
case <-time.After(waveHeader.GetLatnecy()):
}
}
}()
return nil
go func() {
if _, err := s.qemu.Run(qmp.Command{
Execute: "human-monitor-command",
Args: map[string]string{
"command-line": fmt.Sprintf(
"wavcapture %s %s",
s.options.AudioPipe,
s.options.AudioDevice,
),
},
}); err != nil {
logrus.Fatal("run audio command failed: ", err)
}
logrus.Debug("audio capture set")
}()
}
func SendEvent(b []byte) error {
func (s *Server) SendEvent(b []byte) error {
ev, err := qemuconnection.ParseEvent(b)
if err != nil {
return err
}
DefaultServer.QmpConnector.RX <- ev
s.QmpConnector.RX <- ev
return nil
}
func GetStatus() qemu.Status {
DefaultServer.QmpConnector.RX <- &qemuconnection.Event{
func (s *Server) GetStatus() qemu.Status {
s.QmpConnector.RX <- &qemuconnection.Event{
Type: qemuconnection.QueryStatusEvent,
}
return <-DefaultServer.QmpConnector.TX
return <-s.QmpConnector.TX
}