From 139ca9695493a1684a1d85d4de3f7ba6c4103b99 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Mon, 30 Jun 2025 01:19:28 -0500 Subject: [PATCH] Audio Overhaul --- server/src/audio.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/server/src/audio.rs b/server/src/audio.rs index 599126e..7298c5b 100644 --- a/server/src/audio.rs +++ b/server/src/audio.rs @@ -6,6 +6,7 @@ use futures_util::Stream; use gstreamer as gst; use gstreamer_app as gst_app; use gst::prelude::*; +use gst::ElementFactory; use lesavka_common::lesavka::AudioPacket; use tokio_stream::wrappers::ReceiverStream; use tonic::Status; @@ -50,12 +51,7 @@ pub async fn eye_ear(alsa_dev: &str, id: u32) -> anyhow::Result { * │ alsasrc │────────────► voaacenc │────────► appsink │ * └───────────┘ └─────────┘ └──────────┘ */ - let desc = format!( - "alsasrc name=audsrc device=\"{alsa_dev}\" do-timestamp=true ! \ - audio/x-raw,channels=2,rate=48000 ! \ - voaacenc bitrate=192000 ! aacparse ! queue ! \ - appsink name=asink emit-signals=true max-buffers=64 drop=true" - ); + let desc = build_pipeline_desc(alsa_dev)?; let pipeline: gst::Pipeline = gst::parse::launch(&desc)? .downcast() @@ -115,3 +111,16 @@ pub async fn eye_ear(alsa_dev: &str, id: u32) -> anyhow::Result { inner: ReceiverStream::new(rx), }) } + +fn build_pipeline_desc(dev: &str) -> anyhow::Result { + let enc = ["voaacenc", "avenc_aac", "fdkaacenc"] + .into_iter() + .find(|&e| ElementFactory::find(e).is_some()) + .ok_or_else(|| anyhow::anyhow!("no AAC encoder plugin available"))?; + + Ok(format!( + "alsasrc name=audsrc device=\"{dev}\" do-timestamp=true ! \ + audio/x-raw,channels=2,rate=48000 ! {enc} bitrate=192000 ! \ + aacparse ! queue ! appsink name=asink emit-signals=true max-buffers=64 drop=true" + )) +}