From e83f248c676f1ed56e5c42d16da9fba395285fe3 Mon Sep 17 00:00:00 2001
From: cai <cai@nbcai.cc>
Date: Mon, 06 Jul 2026 03:54:46 +0800
Subject: [PATCH] fix: resample pcm stream chunks for livekit

---
 src/main.rs |   40 +++++++---------------------------------
 1 files changed, 7 insertions(+), 33 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 02d1777..e05f602 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1465,39 +1465,13 @@
     sample_rate: u32,
     channels: u32,
 ) -> Result<Vec<PcmFrame>> {
-    if sample_rate != TARGET_SAMPLE_RATE_HZ || channels != u32::from(TARGET_NUM_CHANNELS) {
-        return Err(anyhow!(
-            "unsupported pcm_s16le stream format: sample_rate={}, channels={}",
-            sample_rate,
-            channels
-        ));
-    }
-    if payload.len() % 2 != 0 {
-        return Err(anyhow!("pcm_s16le payload has odd byte length"));
-    }
-    let samples: Vec<i16> = payload
-        .chunks_exact(2)
-        .map(|chunk| i16::from_le_bytes([chunk[0], chunk[1]]))
-        .collect();
-    if samples.is_empty() {
-        return Ok(Vec::new());
-    }
-    let samples_per_channel = (sample_rate / 50).max(1);
-    let frame_sample_count = samples_per_channel as usize * channels as usize;
-    let mut frames = Vec::new();
-    for chunk in samples.chunks(frame_sample_count) {
-        let chunk_samples_per_channel = (chunk.len() / channels as usize) as u32;
-        if chunk_samples_per_channel == 0 {
-            continue;
-        }
-        frames.push(PcmFrame::new(
-            chunk.to_vec(),
-            sample_rate,
-            channels,
-            chunk_samples_per_channel,
-        ));
-    }
-    Ok(frames)
+    audio::pcm_s16le_bytes_to_frames(
+        payload,
+        sample_rate,
+        channels,
+        TARGET_SAMPLE_RATE_HZ,
+        TARGET_NUM_CHANNELS,
+    )
 }
 
 fn trim_ascii_whitespace(value: &[u8]) -> &[u8] {

--
Gitblit v1.9.3