|
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