change to pure rust opus lib

This commit is contained in:
2026-08-23 20:45:44 +02:00
parent 65759699eb
commit 9aa881d5cc
3 changed files with 52 additions and 41 deletions
Generated
+36 -30
View File
@@ -74,17 +74,6 @@ dependencies = [
"windows-sys", "windows-sys",
] ]
[[package]]
name = "audiopus_sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62314a1546a2064e033665d658e88c620a62904be945f8147e6b16c3db9f8651"
dependencies = [
"cmake",
"log",
"pkg-config",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.5.1" version = "1.5.1"
@@ -112,6 +101,12 @@ version = "3.20.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649"
[[package]]
name = "bytemuck"
version = "1.25.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797"
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.12.1" version = "1.12.1"
@@ -191,24 +186,15 @@ version = "0.1.0"
dependencies = [ dependencies = [
"clap", "clap",
"cpal", "cpal",
"opus",
"rand", "rand",
"ringbuf", "ringbuf",
"ropus",
"serde", "serde",
"serde_json", "serde_json",
"shared", "shared",
"tokio", "tokio",
] ]
[[package]]
name = "cmake"
version = "0.1.58"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678"
dependencies = [
"cc",
]
[[package]] [[package]]
name = "colorchoice" name = "colorchoice"
version = "1.0.5" version = "1.0.5"
@@ -678,15 +664,6 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "opus"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d3809943dff6fbad5f0484449ea26bdb9cb7d8efdf26ed50d3c7f227f69eb5c"
dependencies = [
"audiopus_sys",
]
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.5" version = "0.12.5"
@@ -807,6 +784,16 @@ dependencies = [
"portable-atomic-util", "portable-atomic-util",
] ]
[[package]]
name = "ropus"
version = "0.12.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "80804dadbfa2851c95fe45ff9ae8f4328d6371fdc0d51b14740d49a8b41d3758"
dependencies = [
"cc",
"wide",
]
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.4.1" version = "0.4.1"
@@ -822,6 +809,15 @@ version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
[[package]]
name = "safe_arch"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323"
dependencies = [
"bytemuck",
]
[[package]] [[package]]
name = "same-file" name = "same-file"
version = "1.0.6" version = "1.0.6"
@@ -1168,6 +1164,16 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "wide"
version = "0.7.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03"
dependencies = [
"bytemuck",
"safe_arch",
]
[[package]] [[package]]
name = "winapi-util" name = "winapi-util"
version = "0.1.11" version = "0.1.11"
+1 -1
View File
@@ -12,4 +12,4 @@ serde_json = "1.0.151"
tokio = { version = "1.53.1", features = ["full"] } tokio = { version = "1.53.1", features = ["full"] }
rand = "0.10.2" rand = "0.10.2"
clap = { version = "4.6.6", features = ["derive"] } clap = { version = "4.6.6", features = ["derive"] }
opus = "0.3.1" ropus = "0.12.18"
+15 -10
View File
@@ -3,12 +3,12 @@ use cpal::{
Device, Device,
traits::{DeviceTrait, HostTrait, StreamTrait}, traits::{DeviceTrait, HostTrait, StreamTrait},
}; };
use opus::{Decoder, Encoder};
use ringbuf::{ use ringbuf::{
HeapRb, consumer, HeapRb, consumer,
traits::{Consumer, Observer, Producer, Split}, traits::{Consumer, Observer, Producer, Split},
wrap::caching::Caching, wrap::caching::Caching,
}; };
use ropus::{Decoder, Encoder};
use shared::{AudioStreamInfo, ResponseStatus, TcpRequest, TcpResponse, TcpResponseData}; use shared::{AudioStreamInfo, ResponseStatus, TcpRequest, TcpResponse, TcpResponseData};
use std::{ use std::{
collections::HashMap, collections::HashMap,
@@ -157,11 +157,11 @@ async fn main() {
consumer, consumer,
); );
let channels: opus::Channels = { let channels: ropus::Channels = {
if audio_stream.channels == 1 { if audio_stream.channels == 1 {
opus::Channels::Mono ropus::Channels::Mono
} else { } else {
opus::Channels::Stereo ropus::Channels::Stereo
} }
}; };
@@ -333,7 +333,11 @@ async fn main() {
let mut decoder = decoder_mutex.lock().expect("failed to get encoder"); let mut decoder = decoder_mutex.lock().expect("failed to get encoder");
let decoded_len = decoder let decoded_len = decoder
.decode_float(audio_packet, &mut decoded_samples, false) .decode_float(
audio_packet,
&mut decoded_samples,
ropus::DecodeMode::Normal,
)
.expect("failed to decode opus"); .expect("failed to decode opus");
let mut active_streams_map = let mut active_streams_map =
@@ -477,16 +481,17 @@ async fn audio_stream_spawner(
let frames_needed = ((20.0 / 1000.0) * config.sample_rate as f32) as usize; let frames_needed = ((20.0 / 1000.0) * config.sample_rate as f32) as usize;
let mut frame_buffer = vec![0.0; frames_needed]; let mut frame_buffer = vec![0.0; frames_needed];
let channels: opus::Channels = { let channels: ropus::Channels = {
if config.channels == 1 { if config.channels == 1 {
opus::Channels::Mono ropus::Channels::Mono
} else { } else {
opus::Channels::Stereo ropus::Channels::Stereo
} }
}; };
let mut opus_encoder = Encoder::new(config.sample_rate, channels, opus::Application::Voip) let mut opus_encoder = Encoder::builder(config.sample_rate, channels, ropus::Application::Voip)
.expect("falied to create opus encoder"); .build()
.unwrap();
let mut encoded_frame_buffer = [0u8; 1024]; let mut encoded_frame_buffer = [0u8; 1024];