1. Produk
  2.   Audio
  3.   C++
  4.   portaudio

portaudio

 
 

Perpustakaan C Sumber Terbuka untuk I/O Audio

Input & Output Audio Masa Nyata Merentasi Windows, macOS, Linux, dan Lain-lain melalui API C Sumber Terbuka.

Apakah portaudio?

PortAudio ialah perpustakaan C percuma, sumber terbuka, lintas platform yang membolehkan pemaju menulis aplikasi audio mudah alih dengan keupayaan input dan output masa nyata. Ia mengabstrakkan subsistem audio khusus platform seperti ASIO, CoreAudio, ALSA, WASAPI, dan JACK, membenarkan I/O audio yang konsisten merentasi Windows, macOS, Linux, dan sistem operasi lain. Perpustakaan ini menyokong pelbagai format audio—termasuk titik apung 32-bit—dan mengendalikan penukaran format secara dalaman. Dengan API yang mudah tetapi berkuasa, PortAudio banyak digunakan dalam perisian audio, plugin, alat pendidikan, dan projek penyelidikan yang memerlukan pemprosesan audio berlatensi rendah dan berprestasi tinggi.

PortAudio menyediakan dua mod operasi utama: berasaskan panggilan balik (untuk penstriman latensi rendah) dan bacaan/penulisan blok (untuk I/O serentak yang lebih mudah). Ia termasuk dokumentasi yang meluas, program contoh, dan utiliti ujian untuk membantu pemaju memulakan dengan cepat. Perpustakaan ini diselenggarakan oleh komuniti global dan dilesenkan di bawah lesen MIT, menjadikannya sesuai untuk aplikasi sumber terbuka dan komersial. Sama ada anda membina stesen kerja audio digital, alat pengecaman suara, atau aplikasi muzik interaktif, PortAudio menyediakan asas yang boleh dipercayai dan ringan untuk pembangunan audio merentas platform.

Previous Next

Mula Menggunakan portaudio

Untuk mula menggunakan PortAudio, anda boleh sama ada membina ia daripada sumber atau memasangnya melalui pengurus pakej. Bagi kebanyakan pembangun, kaedah paling mudah ialah menyalin repositori portaudio GitHub rasmi dan menyusunnya menggunakan CMake atau autotools. Pada Linux, pasang melalui `apt install portaudio19-dev`; pada macOS, gunakan `brew install portaudio`; pada Windows, muat turun binari pra-bina atau gunakan vcpkg (`vcpkg install portaudio`). Selepas pemasangan, sertakan `portaudio.h` dan pautkan terhadap perpustakaan (`-lportaudio`). Perpustakaan ini ringan dan mempunyai kebergantungan yang minimum, menjadikan integrasi mudah untuk aplikasi audio masa nyata.

Pasang PortAudio melalui Pengurus Pakej

# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Penstriman Audio Masa Nyata dengan Panggilan Balik

Mod penstriman berasaskan panggilan balik PortAudio adalah ideal untuk pemprosesan audio masa nyata dengan latensi rendah. Apabila aliran dimulakan, PortAudio secara berkala memanggil fungsi panggilan balik anda untuk meminta atau menyediakan data audio. Mod ini memberi anda kawalan tepat ke atas masa dan mengurangkan kekurangan penimbal. Panggilan balik menerima penimbal input dan output, kiraan bingkai, maklumat masa, dan bendera status—membolehkan penjanaan audio dinamik, pemprosesan kesan, atau analisis. Oleh kerana panggilan balik dijalankan dalam benang keutamaan tinggi, ia mesti dilaksanakan dengan cepat (biasanya kurang daripada 10ms) untuk mengelakkan gangguan. Ini menjadikannya sempurna untuk aplikasi audio langsung seperti sintesis, pedal kesan gitar, atau sistem komunikasi suara di mana prestasi deterministik sangat penting.

Penjana Gelombang Sinus Masa Nyata melalui Panggilan Balik

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;
}

Penyenaraian Peranti dan Pertanyaan

PortAudio menyediakan API yang kukuh untuk menyenaraikan dan memeriksa peranti audio yang tersedia—termasuk peranti input dan output—bersama dengan keupayaannya. Pembangun boleh menanya nama peranti, bilangan saluran, kadar sampel lalai, dan nilai latensi menggunakan fungsi seperti `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()`, dan `Pa_GetDefaultInputDeviceID()`. Ini membolehkan aplikasi memaparkan senarai peranti yang sah kepada pengguna dan mengkonfigurasi aliran dengan optimum. Anda juga boleh mengesan peranti lalai, memeriksa kadar sampel yang disokong, dan menentukan latensi minimum/maksimum. Fleksibiliti ini penting untuk membina alat audio yang boleh dikonfigurasi, DAW, atau perakam suara yang menyesuaikan diri dengan pelbagai susunan perkakasan tanpa konfigurasi manual.

Senaraikan Semua Peranti 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();

Sokongan API Host Merentas Platform

PortAudio mengabstrakkan API audio khusus platform melalui pelaksanaan API host modular, memastikan tingkah laku yang konsisten merentasi sistem operasi. Pada Windows, ia menyokong ASIO (untuk audio profesional), WASAPI (Vista+), DirectSound, dan MME warisan. macOS memanfaatkan Core Audio untuk kelambatan ultra-rendah, manakala Linux menyokong ALSA, JACK, dan PulseAudio. Sistem BSD menggunakan OSS atau sndio. Pembangun menulis sekali dan menyebarkan ke mana-mana—tiada kompilasi bersyarat diperlukan untuk logik teras. Perpustakaan secara automatik memilih API host terbaik yang tersedia atau membenarkan anda menentukan satu secara eksplisit. Keserbagunaan ini menjadikan PortAudio ideal untuk alat audio mudah alih, perisian pendidikan, dan rangka kerja penyelidikan yang mesti beroperasi dengan boleh dipercayakan pada perkakasan dan konfigurasi OS yang pelbagai.

Paksa Penggunaan API Host JACK pada 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);

Penukaran Format Audio dan Dithering

PortAudio mengendalikan penukaran format sampel dalaman secara telus, membolehkan klien menggunakan format yang mudah seperti titik terapung 32-bit sambil sistem asas menggunakan format integer asli (contoh, 16-bit PCM). Ia menyokong penukaran antara format integer 8-, 16-, 24-, dan 32-bit, serta 32-bit float. Selain itu, ia menawarkan dithering pilihan semasa pengurangan kedalaman bit untuk meminimumkan hingar kuantisasi—ciri halus tetapi penting bagi aplikasi audio berketepatan tinggi. Dithering mengekalkan kualiti audio yang dirasakan apabila menukar dari kedalaman bit yang lebih tinggi ke yang lebih rendah. Keupayaan ini memastikan kesetiaan audio yang konsisten merentasi platform tanpa memaksa pembangun melaksanakan logik pengendalian format yang kompleks secara sendiri.

Konfigurasikan Input 32-bit Float 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
 Melayu