diff options
Diffstat (limited to 'soundbox/pipewire.go')
-rw-r--r-- | soundbox/pipewire.go | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/soundbox/pipewire.go b/soundbox/pipewire.go new file mode 100644 index 0000000..fbae73b --- /dev/null +++ b/soundbox/pipewire.go @@ -0,0 +1,80 @@ +package soundbox + +/* +#cgo pkg-config: libpipewire-0.3 +#include "pipewire-binding.h" +*/ +import "C" + +import ( + "bytes" + "context" + "io" + "net" + "log" + "os/exec" + "unsafe" +) + +var pipewireAudio = make(chan []byte, 5) + +func StreamPipewireContext(ctx context.Context, targets []net.HardwareAddr) error { + cmd := exec.CommandContext( + ctx, + "ffmpeg", + "-ac", + "2", + "-ar", + "48000", + "-f", + "s16le", + "-channel_layout", + "stereo", + "-i", + "-", + "-acodec", + "flac", + "-f", + "ogg", + "-", + ) + stdout, err := cmd.StdoutPipe() + if err != nil { + return err + } + stdin, err := cmd.StdinPipe() + if err != nil { + return err + } + + go C.pw_stdout() + + go func() { + for buffer := range pipewireAudio { + tempReader := bytes.NewReader(buffer) + _, err := io.Copy(stdin, tempReader) + if err != nil { + log.Println("Failed to copy from PipeWire to ffmpeg.") + break + } + } + }() + + err = cmd.Start() + if err != nil { + return err + } + + err = streamContext(ctx, stdout, targets) + if err != nil { + return err + } + + return cmd.Wait() +} + +//export goHandleData +func goHandleData(data *C.int16_t, size C.size_t) { + buf := C.GoBytes(unsafe.Pointer(data), C.int(size)) + pipewireAudio <- buf +} |