Audio Package - Go Implementation

Import: github.com/haivivi/giztoy/pkg/audio

📚 Go Documentation

The main audio package is an umbrella for sub-packages. Import specific packages directly.

Sub-packages

pcm (PCM Audio)

import "github.com/haivivi/giztoy/pkg/audio/pcm"

Key Types:

TypeDescription
FormatAudio format (sample rate, channels, depth)
ChunkInterface for audio data chunks
DataChunkRaw audio data chunk
SilenceChunkSilence generator
MixerMulti-track audio mixer
TrackSingle audio track in mixer
TrackCtrlTrack control (gain, play/stop)

codec/opus (Opus Codec)

import "github.com/haivivi/giztoy/pkg/audio/codec/opus"

Key Types:

TypeDescription
EncoderOpus encoder (wraps libopus)
DecoderOpus decoder (wraps libopus)
FrameRaw Opus frame data ([]byte)
TOCTable of Contents byte parser
FrameDurationFrame duration enum

codec/mp3 (MP3 Codec)

import "github.com/haivivi/giztoy/pkg/audio/codec/mp3"

Key Types:

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

codec/ogg (OGG Container)

import "github.com/haivivi/giztoy/pkg/audio/codec/ogg"

Key Types:

TypeDescription
EncoderOGG page encoder
StreamOGG logical bitstream
SyncOGG page synchronizer

resampler (Sample Rate Conversion)

import "github.com/haivivi/giztoy/pkg/audio/resampler"

Key Types:

TypeDescription
ResamplerInterface for sample rate conversion
Soxrlibsoxr-based resampler
FormatSource/destination format

opusrt (Realtime Opus)

import "github.com/haivivi/giztoy/pkg/audio/opusrt"

Key Types:

TypeDescription
BufferJitter buffer for out-of-order frames
RealtimeBufferReal-time playback simulation
StampedFrameOpus frame with timestamp
OggReaderRead Opus from OGG container
OggWriterWrite Opus to OGG container

portaudio (Audio I/O)

import "github.com/haivivi/giztoy/pkg/audio/portaudio"

Key Types:

TypeDescription
StreamAudio input/output stream

songs (Built-in Melodies)

import "github.com/haivivi/giztoy/pkg/audio/songs"

Key Types:

TypeDescription
SongMelody definition
NoteMusical note

Usage Examples

PCM Mixer

import "github.com/haivivi/giztoy/pkg/audio/pcm"

// Create mixer
mixer := pcm.NewMixer(pcm.L16Mono16K, pcm.WithAutoClose())

// Create track
track, ctrl, _ := mixer.CreateTrack(pcm.WithTrackLabel("voice"))

// Write audio to track
track.Write(audioData)

// Adjust gain
ctrl.SetGain(0.8)

// Read mixed output
buf := make([]byte, 1600) // 50ms at 16kHz
mixer.Read(buf)

Opus Encoding

import "github.com/haivivi/giztoy/pkg/audio/codec/opus"

// Create encoder
enc, _ := opus.NewVoIPEncoder(16000, 1)
defer enc.Close()

enc.SetBitrate(24000)

// Encode PCM to Opus
pcmData := make([]int16, 320) // 20ms at 16kHz
frame, _ := enc.Encode(pcmData, 320)

Sample Rate Conversion

import "github.com/haivivi/giztoy/pkg/audio/resampler"

srcFmt := resampler.Format{SampleRate: 24000, Stereo: false}
dstFmt := resampler.Format{SampleRate: 16000, Stereo: false}

rs, _ := resampler.New(audioReader, srcFmt, dstFmt)
defer rs.Close()

// Read resampled data
io.Copy(output, rs)

Realtime Opus Buffer

import "github.com/haivivi/giztoy/pkg/audio/opusrt"

// Create jitter buffer (2 minute capacity)
buf := opusrt.NewBuffer(2 * time.Minute)

// Write stamped frames (can arrive out of order)
buf.Write(stampedFrameData)

// Read in order
frame, loss, _ := buf.Frame()
if loss > 0 {
    // Use decoder PLC for lost frames
}

CGO Dependencies

All codec packages use CGO to bind native libraries:

// Example: opus encoder
/*
#cgo pkg-config: opus
#include <opus.h>
*/
import "C"

Build requirements:

  • pkg-config for native builds
  • Bazel cdeps for Bazel builds