|
1 | 1 | package kvm
|
2 | 2 |
|
3 | 3 | import (
|
4 |
| - "fmt" |
5 |
| - "net" |
6 | 4 | "os/exec"
|
7 |
| - "sync" |
8 |
| - "syscall" |
9 |
| - "time" |
10 | 5 | )
|
11 | 6 |
|
12 |
| -func startFFmpeg() (cmd *exec.Cmd, err error) { |
13 |
| - binaryPath := "/userdata/jetkvm/bin/ffmpeg" |
14 |
| - // Run the binary in the background |
15 |
| - cmd = exec.Command(binaryPath, |
16 |
| - "-f", "alsa", |
17 |
| - "-channels", "2", |
18 |
| - "-sample_rate", "48000", |
19 |
| - "-i", "hw:1,0", |
20 |
| - "-c:a", "libopus", |
21 |
| - "-b:a", "64k", // ought to be enough for anybody |
22 |
| - "-vbr", "off", |
23 |
| - "-frame_duration", "20", |
24 |
| - "-compression_level", "2", |
25 |
| - "-f", "rtp", |
26 |
| - "rtp://127.0.0.1:3333") |
27 |
| - |
28 |
| - nativeOutputLock := sync.Mutex{} |
29 |
| - nativeStdout := &nativeOutput{ |
30 |
| - mu: &nativeOutputLock, |
31 |
| - logger: nativeLogger.Info().Str("pipe", "stdout"), |
32 |
| - } |
33 |
| - nativeStderr := &nativeOutput{ |
34 |
| - mu: &nativeOutputLock, |
35 |
| - logger: nativeLogger.Info().Str("pipe", "stderr"), |
36 |
| - } |
37 |
| - |
38 |
| - // Redirect stdout and stderr to the current process |
39 |
| - cmd.Stdout = nativeStdout |
40 |
| - cmd.Stderr = nativeStderr |
41 |
| - |
42 |
| - // Set the process group ID so we can kill the process and its children when this process exits |
43 |
| - cmd.SysProcAttr = &syscall.SysProcAttr{ |
44 |
| - Setpgid: true, |
45 |
| - Pdeathsig: syscall.SIGKILL, |
46 |
| - } |
47 |
| - |
48 |
| - // Start the command |
49 |
| - if err := cmd.Start(); err != nil { |
50 |
| - return nil, fmt.Errorf("failed to start binary: %w", err) |
51 |
| - } |
52 |
| - |
53 |
| - return |
| 7 | +func runAudioClient() (cmd *exec.Cmd, err error) { |
| 8 | + return startNativeBinary("/userdata/jetkvm/bin/jetkvm_audio") |
54 | 9 | }
|
55 | 10 |
|
56 |
| -func StartRtpAudioServer(handleClient func(net.Conn)) { |
57 |
| - scopedLogger := nativeLogger.With(). |
58 |
| - Logger() |
59 |
| - |
60 |
| - listener, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.ParseIP("127.0.0.1"), Port: 3333}) |
61 |
| - if err != nil { |
62 |
| - scopedLogger.Warn().Err(err).Msg("failed to start server") |
63 |
| - return |
64 |
| - } |
65 |
| - |
66 |
| - scopedLogger.Info().Msg("server listening") |
67 |
| - |
68 |
| - go func() { |
69 |
| - for { |
70 |
| - cmd, err := startFFmpeg() |
71 |
| - if err != nil { |
72 |
| - scopedLogger.Error().Err(err).Msg("failed to start ffmpeg") |
73 |
| - } |
74 |
| - err = cmd.Wait() |
75 |
| - scopedLogger.Error().Err(err).Msg("ffmpeg exited, restarting") |
76 |
| - time.Sleep(2 * time.Second) |
77 |
| - } |
78 |
| - }() |
79 |
| - |
80 |
| - go handleClient(listener) |
| 11 | +func StartAudioServer() { |
| 12 | + nativeAudioSocketListener = StartNativeSocketServer("/var/run/jetkvm_audio.sock", handleAudioClient, false) |
| 13 | + nativeLogger.Debug().Msg("native app audio sock started") |
81 | 14 | }
|
0 commit comments