Latest code. Working voice, still needs some ui cleanup and accessibility fixes but in decent shape.
This commit is contained in:
+462
-488
File diff suppressed because it is too large
Load Diff
+65
-124
@@ -1,10 +1,13 @@
|
||||
package diskwriter
|
||||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"git.stormux.org/storm/skald/rtptime"
|
||||
)
|
||||
|
||||
func TestSanitise(t *testing.T) {
|
||||
@@ -23,151 +26,89 @@ func TestSanitise(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustOriginLocalNow(t *testing.T) {
|
||||
now := time.Now()
|
||||
|
||||
c := &diskConn{
|
||||
tracks: []*diskTrack{
|
||||
{},
|
||||
},
|
||||
func TestOpenDiskFileUsesSkaldOggName(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
f, err := openDiskFile(dir, "ogg")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, t := range c.tracks {
|
||||
t.conn = c
|
||||
}
|
||||
c.tracks[0].setOrigin(132, now, 100)
|
||||
name := filepath.Base(f.Name())
|
||||
f.Close()
|
||||
|
||||
if !c.originLocal.Equal(now) {
|
||||
t.Errorf("Expected %v, got %v", now, c.originLocal)
|
||||
if !strings.HasPrefix(name, "skald-recording-") {
|
||||
t.Fatalf("filename %q does not use Skald recording prefix", name)
|
||||
}
|
||||
|
||||
if c.originRemote != 0 {
|
||||
t.Errorf("Expected 0, got %v", c.originRemote)
|
||||
if !strings.HasSuffix(name, ".ogg") {
|
||||
t.Fatalf("filename %q does not use Ogg extension", name)
|
||||
}
|
||||
|
||||
if c.tracks[0].origin != some(132) {
|
||||
t.Errorf("Expected 132, got %v", value(c.tracks[0].origin))
|
||||
if _, err := os.Stat(filepath.Join(dir, name)); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustOriginLocalEarlier(t *testing.T) {
|
||||
now := time.Now()
|
||||
earlier := now.Add(-time.Second)
|
||||
func TestMixFrameClipsAndSumsSources(t *testing.T) {
|
||||
a := make(chan []byte, 1)
|
||||
b := make(chan []byte, 1)
|
||||
a <- pcmFrame(20000)
|
||||
b <- pcmFrame(20000)
|
||||
|
||||
c := &diskConn{
|
||||
originLocal: earlier,
|
||||
tracks: []*diskTrack{
|
||||
{},
|
||||
},
|
||||
}
|
||||
for _, t := range c.tracks {
|
||||
t.conn = c
|
||||
}
|
||||
c.tracks[0].setOrigin(132, now, 100)
|
||||
|
||||
if !c.originLocal.Equal(earlier) {
|
||||
t.Errorf("Expected %v, got %v", earlier, c.originLocal)
|
||||
out := mixFrame([]chan []byte{a, b})
|
||||
if len(out) != bytesPerFrame {
|
||||
t.Fatalf("mixed frame has length %d, expected %d", len(out), bytesPerFrame)
|
||||
}
|
||||
|
||||
if c.originRemote != 0 {
|
||||
t.Errorf("Expected 0, got %v", c.originRemote)
|
||||
}
|
||||
|
||||
if c.tracks[0].origin != some(32) {
|
||||
t.Errorf("Expected 32, got %v", value(c.tracks[0].origin))
|
||||
for i := 0; i < len(out); i += 2 {
|
||||
got := int16(binary.LittleEndian.Uint16(out[i:]))
|
||||
if got != 32767 {
|
||||
t.Fatalf("sample %d = %d, expected clipped 32767", i/2, got)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustOriginLocalLater(t *testing.T) {
|
||||
now := time.Now()
|
||||
later := now.Add(time.Second)
|
||||
|
||||
c := &diskConn{
|
||||
originLocal: later,
|
||||
tracks: []*diskTrack{
|
||||
{},
|
||||
},
|
||||
}
|
||||
for _, t := range c.tracks {
|
||||
t.conn = c
|
||||
}
|
||||
c.tracks[0].setOrigin(32, now, 100)
|
||||
|
||||
if !c.originLocal.Equal(later) {
|
||||
t.Errorf("Expected %v, got %v", later, c.originLocal)
|
||||
}
|
||||
|
||||
if c.originRemote != 0 {
|
||||
t.Errorf("Expected 0, got %v", c.originRemote)
|
||||
}
|
||||
|
||||
if c.tracks[0].origin != some(132) {
|
||||
t.Errorf("Expected 132, got %v", value(c.tracks[0].origin))
|
||||
func TestMixFrameReturnsNilForSilence(t *testing.T) {
|
||||
if out := mixFrame(nil); out != nil {
|
||||
t.Fatalf("expected nil silent frame, got %d bytes", len(out))
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustOriginRemote(t *testing.T) {
|
||||
now := time.Now()
|
||||
earlier := now.Add(-time.Second)
|
||||
|
||||
c := &diskConn{
|
||||
tracks: []*diskTrack{
|
||||
{
|
||||
remoteNTP: rtptime.TimeToNTP(earlier),
|
||||
remoteRTP: 32,
|
||||
},
|
||||
},
|
||||
func TestRecorderCreatesPlayableOgg(t *testing.T) {
|
||||
if _, err := exec.LookPath("ffmpeg"); err != nil {
|
||||
t.Skip("ffmpeg not installed")
|
||||
}
|
||||
for _, t := range c.tracks {
|
||||
t.conn = c
|
||||
}
|
||||
c.tracks[0].setOrigin(132, now, 100)
|
||||
|
||||
if !c.originLocal.Equal(now) {
|
||||
t.Errorf("Expected %v, got %v", now, c.originLocal)
|
||||
if _, err := exec.LookPath("ffprobe"); err != nil {
|
||||
t.Skip("ffprobe not installed")
|
||||
}
|
||||
|
||||
d := now.Sub(rtptime.NTPToTime(c.originRemote))
|
||||
if d < -time.Millisecond || d > time.Millisecond {
|
||||
t.Errorf("Expected %v, got %v (delta %v)",
|
||||
rtptime.TimeToNTP(now),
|
||||
c.originRemote, d)
|
||||
r, err := newRecorder(nil, t.TempDir())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
if err := r.Close(); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if c.tracks[0].origin != some(132) {
|
||||
t.Errorf("Expected 132, got %v", value(c.tracks[0].origin))
|
||||
cmd := exec.Command(
|
||||
"ffprobe",
|
||||
"-v", "error",
|
||||
"-select_streams", "a:0",
|
||||
"-show_entries", "stream=codec_name",
|
||||
"-of", "default=noprint_wrappers=1:nokey=1",
|
||||
r.path,
|
||||
)
|
||||
out, err := cmd.Output()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if strings.TrimSpace(string(out)) != "opus" {
|
||||
t.Fatalf("expected opus stream, got %q", strings.TrimSpace(string(out)))
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustOriginLocalRemote(t *testing.T) {
|
||||
now := time.Now()
|
||||
earlier := now.Add(-time.Second)
|
||||
|
||||
c := &diskConn{
|
||||
tracks: []*diskTrack{
|
||||
{},
|
||||
},
|
||||
}
|
||||
for _, t := range c.tracks {
|
||||
t.conn = c
|
||||
}
|
||||
c.tracks[0].setOrigin(132, now, 100)
|
||||
|
||||
c.tracks[0].setTimeOffset(rtptime.TimeToNTP(earlier), 32, 100)
|
||||
|
||||
c.tracks[0].setOrigin(132, now, 100)
|
||||
|
||||
if !c.originLocal.Equal(now) {
|
||||
t.Errorf("Expected %v, got %v", now, c.originLocal)
|
||||
}
|
||||
|
||||
d := now.Sub(rtptime.NTPToTime(c.originRemote))
|
||||
if d < -time.Millisecond || d > time.Millisecond {
|
||||
t.Errorf("Expected %v, got %v (delta %v)",
|
||||
rtptime.TimeToNTP(now),
|
||||
c.originRemote, d)
|
||||
}
|
||||
|
||||
if c.tracks[0].origin != some(132) {
|
||||
t.Errorf("Expected 132, got %v", value(c.tracks[0].origin))
|
||||
func pcmFrame(sample int16) []byte {
|
||||
out := make([]byte, bytesPerFrame)
|
||||
for i := 0; i < len(out); i += 2 {
|
||||
binary.LittleEndian.PutUint16(out[i:], uint16(sample))
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user