Add audio recording

This commit is contained in:
Nonoo 2020-10-20 16:04:35 +02:00
parent fed1672c0d
commit e484a51c31
2 changed files with 63 additions and 32 deletions

View file

@ -2,6 +2,8 @@ package main
import (
"bytes"
"errors"
"os"
"github.com/akosmarton/papipes"
"github.com/nonoo/kappanhang/log"
@ -25,39 +27,70 @@ func (a *audioStruct) playLoop() {
for {
<-a.canPlay
// Trying to read the whole buffer.
d := make([]byte, a.playBuf.Len())
bytesToWrite, err := a.playBuf.Read(d)
if err == nil {
for {
written, err := a.source.Write(d)
if err != nil {
log.Error(err)
break
}
bytesToWrite -= written
if bytesToWrite == 0 {
break
}
d = d[written:]
}
} else {
if err != nil {
log.Error(err)
continue
}
for {
written, err := a.source.Write(d)
if err != nil {
if _, ok := err.(*os.PathError); !ok {
log.Error(err)
}
return
}
bytesToWrite -= written
if bytesToWrite == 0 {
break
}
d = d[written:]
}
}
}
func (a *audioStruct) recLoop() {
frameBuf := make([]byte, 1920)
buf := bytes.NewBuffer([]byte{})
for {
n, err := a.sink.Read(frameBuf)
if err != nil {
if _, ok := err.(*os.PathError); !ok {
log.Error(err)
}
return
}
buf.Write(frameBuf[:n])
for buf.Len() >= len(frameBuf) {
n, err = buf.Read(frameBuf)
if err != nil {
exit(err)
}
if n != len(frameBuf) {
exit(errors.New("buffer read error"))
}
a.rec <- frameBuf
}
}
}
func (a *audioStruct) loop() {
go a.playLoop()
go a.recLoop()
for {
select {
case d := <-a.play:
a.playBuf.Write(d)
d := <-a.play
a.playBuf.Write(d)
select {
case a.canPlay <- true:
default:
}
select {
case a.canPlay <- true:
default:
}
}
}
@ -97,13 +130,17 @@ func (a *audioStruct) init() {
func (a *audioStruct) deinit() {
if a.source.IsOpen() {
if err := a.source.Close(); err != nil {
log.Error(err)
if _, ok := err.(*os.PathError); !ok {
log.Error(err)
}
}
}
if a.sink.IsOpen() {
if err := a.sink.Close(); err != nil {
log.Error(err)
if _, ok := err.(*os.PathError); !ok {
log.Error(err)
}
}
}
}

View file

@ -107,8 +107,6 @@ func (s *audioStream) handleAudioPacket(r []byte) {
}
}
// TODO: audioPipes.sink.Read() + sendPart1(); sendPart2()
func (s *audioStream) handleRead(r []byte) {
if len(r) >= 580 && (bytes.Equal(r[:6], []byte{0x6c, 0x05, 0x00, 0x00, 0x00, 0x00}) || bytes.Equal(r[:6], []byte{0x44, 0x02, 0x00, 0x00, 0x00, 0x00})) {
s.handleAudioPacket(r)
@ -135,8 +133,6 @@ func (s *audioStream) start() {
s.audioSendSeq = 1
testSendTicker := time.NewTicker(80 * time.Millisecond) // TODO: remove
for {
select {
case r := <-s.common.readChan:
@ -145,11 +141,9 @@ func (s *audioStream) start() {
exit(errors.New("timeout"))
case e := <-s.rxSeqBufEntryChan:
s.handleRxSeqBufEntry(e)
case <-testSendTicker.C: // TODO: remove
b1 := make([]byte, 1364)
s.sendPart1(b1)
b2 := make([]byte, 556)
s.sendPart2(b2)
case d := <-audio.rec:
s.sendPart1(d[:1364])
s.sendPart2(d[1364:1920])
}
}
}