Audio Package - Rust Implementation

Crate: giztoy-audio

📚 Rust Documentation

Modules

pcm (PCM Audio)

#![allow(unused)]
fn main() {
use giztoy_audio::pcm::{Format, FormatExt, Chunk, DataChunk, SilenceChunk, Mixer};
}

Key Types:

TypeDescription
FormatAudio format enum (re-exported from resampler)
FormatExtExtension trait for chunk creation
ChunkTrait for audio data chunks
DataChunkRaw audio data chunk
SilenceChunkSilence generator
MixerMulti-track audio mixer
TrackAudio track writer
TrackCtrlTrack control
AtomicF32Atomic float for gain control

codec::opus (Opus Codec)

#![allow(unused)]
fn main() {
use giztoy_audio::codec::opus::{Encoder, Decoder, Application, Frame, TOC};
}

Key Types:

TypeDescription
EncoderOpus encoder (wraps libopus)
DecoderOpus decoder
ApplicationEncoder application type enum
FrameRaw Opus frame data
TOCTable of Contents parser
FrameDurationFrame duration enum

codec::mp3 (MP3 Codec)

#![allow(unused)]
fn main() {
use giztoy_audio::codec::mp3::{Encoder, Decoder};
}

Key Types:

TypeDescription
EncoderMP3 encoder (wraps LAME)
DecoderMP3 decoder (wraps minimp3)

codec::ogg (OGG Container)

#![allow(unused)]
fn main() {
use giztoy_audio::codec::ogg::{Encoder, Stream, Sync, Page};
}

Key Types:

TypeDescription
EncoderOGG page encoder
StreamOGG logical bitstream
SyncOGG page synchronizer
PageOGG page data

resampler (Sample Rate Conversion)

#![allow(unused)]
fn main() {
use giztoy_audio::resampler::{Soxr, Format};
}

Key Types:

TypeDescription
Soxrlibsoxr-based resampler
FormatAudio format (sample rate, stereo flag)

opusrt (Realtime Opus)

#![allow(unused)]
fn main() {
use giztoy_audio::opusrt::{Buffer, StampedFrame, EpochMillis};
}

Key Types:

TypeDescription
BufferJitter buffer for frame reordering
StampedFrameOpus frame with timestamp
EpochMillisMillisecond timestamp

⚠️ Note: Rust opusrt is missing OGG Reader/Writer compared to Go.

songs (Built-in Melodies)

#![allow(unused)]
fn main() {
use giztoy_audio::songs::{Song, Note, Catalog};
}

Key Types:

TypeDescription
SongMelody definition
NoteMusical note
CatalogBuilt-in song collection

Usage Examples

PCM Format

#![allow(unused)]
fn main() {
use giztoy_audio::pcm::{Format, FormatExt};
use std::time::Duration;

let format = Format::L16Mono16K;

// Calculate bytes for duration
let bytes = format.bytes_in_duration(Duration::from_millis(100));
assert_eq!(bytes, 3200); // 1600 samples * 2 bytes

// Create chunks
let silence = format.silence_chunk(Duration::from_millis(100));
let data = format.data_chunk(vec![0u8; 3200]);
}

Opus Encoding

#![allow(unused)]
fn main() {
use giztoy_audio::codec::opus::{Encoder, Application};

let mut encoder = Encoder::new(16000, 1, Application::VoIP)?;
encoder.set_bitrate(24000)?;

// Encode PCM to Opus
let pcm: Vec<i16> = vec![0; 320]; // 20ms at 16kHz
let frame = encoder.encode(&pcm, 320)?;
}

Sample Rate Conversion

#![allow(unused)]
fn main() {
use giztoy_audio::resampler::{Soxr, Format};

let src_fmt = Format { sample_rate: 24000, stereo: false };
let dst_fmt = Format { sample_rate: 16000, stereo: false };

let mut resampler = Soxr::new(src_fmt, dst_fmt)?;

// Process audio data
let output = resampler.process(&input_pcm)?;
}

Mixer

#![allow(unused)]
fn main() {
use giztoy_audio::pcm::{Format, Mixer, MixerOptions};

let mut mixer = Mixer::new(Format::L16Mono16K, MixerOptions::default());

// Create track
let (track, ctrl) = mixer.create_track(None)?;

// Write audio
track.write(&audio_data)?;

// Adjust gain
ctrl.set_gain(0.8);

// Read mixed output
let mut buf = vec![0u8; 3200];
mixer.read(&mut buf)?;
}

FFI Bindings

Rust uses custom FFI modules for native library bindings:

#![allow(unused)]
fn main() {
// Example: codec/opus/ffi.rs
extern "C" {
    fn opus_encoder_create(
        fs: i32,
        channels: i32,
        application: i32,
        error: *mut i32,
    ) -> *mut OpusEncoder;
}
}

Differences from Go

FeatureGoRust
Format definitionIn pcm/In resampler/, re-exported by pcm/
opusrt OGG R/W❌ Missing
portaudio❌ Not implemented
Mixer thread-safetysync.Mutexstd::sync::Mutex
FFI error handlingCGO strerrorCustom error types