
portaudio
Perpustakaan C Sumber Terbuka untuk I/O Audio
Input & Output Audio Real-Time di Windows, macOS, Linux, dan Lainnya melalui API C Sumber Terbuka.
Apa itu portaudio?
PortAudio adalah perpustakaan C gratis, sumber terbuka, lintas platform yang memungkinkan pengembang menulis aplikasi audio portabel dengan kemampuan input dan output waktu nyata. Ia mengabstraksi subsistem audio spesifik platform seperti ASIO, CoreAudio, ALSA, WASAPI, dan JACK, memungkinkan I/O audio yang konsisten di Windows, macOS, Linux, dan sistem operasi lainnya. Perpustakaan ini mendukung berbagai format audio—termasuk floating point 32-bit—dan menangani konversi format secara internal. Dengan API yang sederhana namun kuat, PortAudio banyak digunakan dalam perangkat lunak audio, plugin, alat pendidikan, dan proyek penelitian yang memerlukan pemrosesan audio berlatensi rendah dan kinerja tinggi.
PortAudio menyediakan dua mode operasi utama: berbasis callback (untuk streaming latensi rendah) dan blocking read/write (untuk I/O sinkron yang lebih sederhana). Ini mencakup dokumentasi yang luas, program contoh, dan utilitas pengujian untuk membantu pengembang memulai dengan cepat. Perpustakaan ini dipelihara oleh komunitas global dan dilisensikan di bawah lisensi MIT, menjadikannya cocok untuk aplikasi sumber terbuka maupun komersial. Baik Anda membangun workstation audio digital, alat pengenalan suara, atau aplikasi musik interaktif, PortAudio memberikan fondasi yang andal dan ringan untuk pengembangan audio lintas platform.
Memulai dengan portaudio
Untuk mulai menggunakan PortAudio, Anda dapat membangun dari sumber atau menginstal melalui manajer paket. Bagi kebanyakan pengembang, metode termudah adalah mengkloning repositori resmi GitHub portaudio dan mengkompilasi menggunakan CMake atau autotools. Di Linux, instal melalui `apt install portaudio19-dev`; di macOS, gunakan `brew install portaudio`; di Windows, unduh binari pra-bangun atau gunakan vcpkg (`vcpkg install portaudio`). Setelah instalasi, sertakan `portaudio.h` dan tautkan ke pustaka (`-lportaudio`). Pustaka ini ringan dan memiliki ketergantungan minimal, sehingga integrasi menjadi mudah untuk aplikasi audio waktu nyata.
Instal PortAudio melalui Pengelola Paket
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
Streaming Audio Real-Time dengan Callback
Mode streaming berbasis callback PortAudio ideal untuk pemrosesan audio waktu nyata dengan latensi rendah. Ketika aliran dimulai, PortAudio secara berkala memanggil fungsi callback Anda untuk meminta atau menyediakan data audio. Mode ini memberi Anda kontrol yang tepat atas timing dan meminimalkan underrun buffer. Callback menerima buffer input dan output, jumlah frame, informasi waktu, dan flag status—memungkinkan pembuatan audio dinamis, pemrosesan efek, atau analisis. Karena callback berjalan di thread prioritas tinggi, ia harus dieksekusi dengan cepat (biasanya di bawah 10ms) untuk menghindari gangguan. Ini membuatnya sempurna untuk aplikasi audio langsung seperti synthesizer, pedal efek gitar, atau sistem komunikasi suara di mana kinerja deterministik sangat penting.
Generator Gelombang Sinus Real-Time melalui Callback
typedef struct {
float phase;
float phase_increment;
} paTestData;
int patestCallback(const void *input, void *output,
unsigned long frameCount,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData)
{
paTestData *data = (paTestData*)userData;
float *out = (float*)output;
for (unsigned long i = 0; i < frameCount; i++) {
*out++ = sinf(data->phase);
data->phase += data->phase_increment;
if (data->phase >= M_PI * 2) data->phase -= M_PI * 2;
}
return paContinue;
}
Enumerasi dan Kuery Perangkat
PortAudio menyediakan API yang kuat untuk mendaftar dan memeriksa perangkat audio yang tersedia—termasuk perangkat input dan output—beserta kemampuan mereka. Pengembang dapat menanyakan nama perangkat, jumlah saluran, laju sampel default, dan nilai latensi menggunakan fungsi seperti `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()`, dan `Pa_GetDefaultInputDeviceID()`. Hal ini memungkinkan aplikasi menampilkan daftar perangkat yang valid kepada pengguna dan mengonfigurasi aliran secara optimal. Anda juga dapat mendeteksi perangkat default, memeriksa laju sampel yang didukung, dan menentukan latensi minimum/maksimum. Fleksibilitas ini penting untuk membangun alat audio yang dapat dikonfigurasi, DAW, atau perekam suara yang beradaptasi dengan berbagai konfigurasi perangkat keras tanpa konfigurasi manual.
Daftar Semua Perangkat Audio yang Tersedia
PaError err;
err = Pa_Initialize();
if (err != paNoError) goto error;
int numDevices = Pa_GetDeviceCount();
for (int i = 0; i < numDevices; i++) {
const PaDeviceInfo *info = Pa_GetDeviceInfo(i);
printf("%d: %s (in: %d, out: %d)\n",
i, info->name,
info->maxInputChannels,
info->maxOutputChannels);
}
Pa_Terminate();
Dukungan Host API Lintas Platform
PortAudio mengabstraksi API audio spesifik platform melalui implementasi host API modular, memastikan perilaku konsisten di seluruh sistem operasi. Di Windows, ia mendukung ASIO (untuk audio profesional), WASAPI (Vista+), DirectSound, dan MME warisan. macOS memanfaatkan Core Audio untuk latensi ultra-rendah, sementara Linux mendukung ALSA, JACK, dan PulseAudio. Sistem BSD menggunakan OSS atau sndio. Pengembang menulis sekali dan menyebarkan ke mana saja—tidak diperlukan kompilasi kondisional untuk logika inti. Perpustakaan secara otomatis memilih host API terbaik yang tersedia atau memungkinkan Anda menentukan secara eksplisit. Universalisme ini menjadikan PortAudio ideal untuk alat audio portabel, perangkat lunak edukasi, dan kerangka kerja riset yang harus berjalan andal pada beragam perangkat keras dan konfigurasi OS.
Paksa Penggunaan JACK Host API di Linux
PaStreamParameters inputParam, outputParam;
PaError err;
inputParam.device = Pa_GetHostApiInfoByType(paJACK)->defaultInputDevice;
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
// ... configure outputParam similarly ...
PaStream *stream;
err = Pa_OpenStream(&stream, &inputParam, &outputParam,
44100, 256, paNoFlag, callback, NULL);
Konversi Format Audio dan Dithering
PortAudio menangani konversi format sampel internal secara transparan, memungkinkan klien menggunakan format yang nyaman seperti floating point 32-bit sementara sistem dasar menggunakan format integer native (mis., PCM 16-bit). Ia mendukung konversi antara format integer 8-, 16-, 24-, dan 32-bit, serta 32-bit float. Selain itu, ia menawarkan dithering opsional selama pengurangan kedalaman bit untuk meminimalkan noise kuantisasi—fitur halus namun penting untuk aplikasi audio berfidelitas tinggi. Dithering mempertahankan kualitas audio yang dirasakan saat mengonversi dari kedalaman bit yang lebih tinggi ke yang lebih rendah. Kemampuan ini memastikan konsistensi fidelitas audio di seluruh platform tanpa mengharuskan pengembang mengimplementasikan logika penanganan format yang kompleks secara manual.
Konfigurasikan Input Float 32-bit dengan Dithering
PaStreamParameters inputParam = {0};
inputParam.device = Pa_GetDefaultInputDevice();
inputParam.channelCount = 2;
inputParam.sampleFormat = paFloat32;
inputParam.suggestedLatency = Pa_GetDeviceInfo(inputParam.device)->defaultLowInputLatency;
// Enable dithering for output conversion
PaStream *stream;
Pa_OpenStream(&stream, &inputParam, NULL, 44100, 128,
paClipOff | paDitherOff, NULL, NULL);
// Note: paDitherOff disables dithering; omit for default dithering
