mirror of
https://github.com/rustdesk/magnum-opus.git
synced 2025-07-01 15:25:27 +00:00
Initial commit
This commit is contained in:
commit
2d7ef8336d
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
target
|
||||||
|
Cargo.lock
|
8
Cargo.toml
Normal file
8
Cargo.toml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Tad Hardesty <tad@platymuus.com>"]
|
||||||
|
name = "opus"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
opus-sys = "0.1.2"
|
||||||
|
libc = "0.1"
|
102
src/lib.rs
Normal file
102
src/lib.rs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
extern crate opus_sys as ffi;
|
||||||
|
extern crate libc;
|
||||||
|
|
||||||
|
use libc::{c_int};
|
||||||
|
|
||||||
|
// Generic CTLs
|
||||||
|
const OPUS_RESET_STATE: c_int = 4028; // void
|
||||||
|
const OPUS_GET_FINAL_RANGE: c_int = 4031; // *uint
|
||||||
|
const OPUS_GET_BANDWIDTH: c_int = 4009; // *int
|
||||||
|
const OPUS_GET_SAMPLE_RATE: c_int = 4029; // *int
|
||||||
|
|
||||||
|
pub enum CodingMode {
|
||||||
|
Voip = 2048,
|
||||||
|
Audio = 2049,
|
||||||
|
LowDelay = 2051,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum Channels {
|
||||||
|
Mono = 1,
|
||||||
|
Stereo = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Error(&'static str, c_int);
|
||||||
|
|
||||||
|
fn check(what: &'static str, code: c_int) -> Result<()> {
|
||||||
|
if code < 0 {
|
||||||
|
Err(Error(what, code))
|
||||||
|
} else {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
|
pub struct Encoder {
|
||||||
|
ptr: *mut ffi::OpusEncoder,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Encoder {
|
||||||
|
pub fn new(sample_rate: u32, channels: Channels, mode: CodingMode) -> Result<Encoder> {
|
||||||
|
let mut error = 0;
|
||||||
|
let ptr = unsafe { ffi::opus_encoder_create(
|
||||||
|
sample_rate as i32,
|
||||||
|
channels as c_int,
|
||||||
|
mode as c_int,
|
||||||
|
&mut error) };
|
||||||
|
if error != ffi::OPUS_OK || ptr.is_null() {
|
||||||
|
Err(Error("opus_encoder_create", error))
|
||||||
|
} else {
|
||||||
|
Ok(Encoder { ptr: ptr })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn encode(&mut self, input: &[i16], output: &mut [u8]) -> Result<usize> {
|
||||||
|
let len = unsafe { ffi::opus_encode(self.ptr,
|
||||||
|
input.as_ptr(), input.len() as c_int,
|
||||||
|
output.as_mut_ptr(), output.len() as c_int) };
|
||||||
|
try!(check("opus_encode", len));
|
||||||
|
Ok(len as usize)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn encode_float(&mut self, input: &[f32], output: &mut [u8]) -> Result<usize> {
|
||||||
|
let len = unsafe { ffi::opus_encode_float(self.ptr,
|
||||||
|
input.as_ptr(), input.len() as c_int,
|
||||||
|
output.as_mut_ptr(), output.len() as c_int) };
|
||||||
|
try!(check("opus_encode_float", len));
|
||||||
|
Ok(len as usize)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn reset_state(&mut self) -> Result<()> {
|
||||||
|
check("opus_encoder_ctl(OPUS_RESET_STATE)", unsafe { ffi::opus_encoder_ctl(self.ptr, OPUS_RESET_STATE) })
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_final_range(&mut self) -> Result<u32> {
|
||||||
|
let mut value = 0;
|
||||||
|
let result = unsafe { ffi::opus_encoder_ctl(self.ptr, OPUS_GET_FINAL_RANGE, &mut value) };
|
||||||
|
try!(check("opus_encoder_ctl(OPUS_GET_FINAL_RANGE)", result));
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_bandwidth(&mut self) -> Result<i32> {
|
||||||
|
let mut value = 0;
|
||||||
|
let result = unsafe { ffi::opus_encoder_ctl(self.ptr, OPUS_GET_BANDWIDTH, &mut value) };
|
||||||
|
try!(check("opus_encoder_ctl(OPUS_GET_BANDWIDTH)", result));
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_sample_rate(&mut self) -> Result<i32> {
|
||||||
|
let mut value = 0;
|
||||||
|
let result = unsafe { ffi::opus_encoder_ctl(self.ptr, OPUS_GET_SAMPLE_RATE, &mut value) };
|
||||||
|
try!(check("opus_encoder_ctl(OPUS_GET_SAMPLE_RATE)", result));
|
||||||
|
Ok(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Many more CTLs
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for Encoder {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
unsafe { ffi::opus_encoder_destroy(self.ptr) }
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user