rework needed
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
@@ -36,7 +36,7 @@ func (s *Server) exchangeSDP(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
answer, err := s.rtcConnector.Regist(offer)
|
||||
answer, err := s.RTCConnector.Regist(offer)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, Response{
|
||||
Succeed: false,
|
||||
|
@@ -9,7 +9,7 @@ import (
|
||||
type Server struct {
|
||||
options *Options
|
||||
webServer *gin.Engine
|
||||
rtcConnector *webrtcconnection.Connection
|
||||
RTCConnector *webrtcconnection.Connection
|
||||
}
|
||||
|
||||
func NewServer(o *Options) (*Server, error) {
|
||||
@@ -21,7 +21,7 @@ func NewServer(o *Options) (*Server, error) {
|
||||
s := &Server{
|
||||
options: o,
|
||||
webServer: gin.New(),
|
||||
rtcConnector: rtc,
|
||||
RTCConnector: rtc,
|
||||
}
|
||||
return s, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user