52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package ai
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
"git.ipao.vip/rogee/go-sip/internal/media"
|
|
)
|
|
|
|
// Use actual local UDP/Pion RTP and G.711, not a media mock, for the opening,
|
|
// user input and AI reply in every ASR/TTS rate combination.
|
|
func protocolPCMAViaRTP(t *testing.T, ctx context.Context, pcm []byte) []byte {
|
|
t.Helper()
|
|
receiver, err := media.ListenRTP("127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer func() {
|
|
if err := receiver.Close(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}()
|
|
sender, err := media.ListenRTP("127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer func() {
|
|
if err := sender.Close(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}()
|
|
if err := sender.SetPeer(receiver.LocalAddr().String()); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := sender.SendPCM16(ctx, pcm, 16000); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var received []byte
|
|
for len(received) < len(pcm) {
|
|
frame, err := receiver.ReadPayload(ctx)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
received = append(received, frame...)
|
|
}
|
|
sentStats, receivedStats := sender.Stats(), receiver.Stats()
|
|
if len(received) != len(pcm) || sentStats.SentPackets != receivedStats.ReceivedPackets || sentStats.SentBytes != receivedStats.ReceivedBytes || sentStats.SentBytes != uint64(len(pcm)/4) {
|
|
t.Fatalf("PCMA duration/packet/byte mismatch: canonical=%d received=%d sent=%+v receivedStats=%+v", len(pcm), len(received), sentStats, receivedStats)
|
|
}
|
|
return received
|
|
}
|