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

portaudio

 
 

Libreria C open source per audio I/O

Input e output audio in tempo reale su Windows, macOS, Linux e altro tramite API C open source.

Che cos'è portaudio?

PortAudio è una libreria C gratuita, open source e multipiattaforma che consente agli sviluppatori di scrivere applicazioni audio portabili con capacità di input e output in tempo reale. Astrae i sottosistemi audio specifici della piattaforma, come ASIO, CoreAudio, ALSA, WASAPI e JACK, permettendo un I/O audio coerente su Windows, macOS, Linux e altri sistemi operativi. La libreria supporta molteplici formati audio — inclusi i floating point a 32 bit — e gestisce internamente la conversione dei formati. Con un'API semplice ma potente, PortAudio è ampiamente utilizzata in software audio, plugin, strumenti educativi e progetti di ricerca che richiedono elaborazione audio a bassa latenza e alte prestazioni.

PortAudio fornisce due modalità operative principali: basata su callback (per streaming a bassa latenza) e lettura/scrittura bloccante (per I/O sincrono più semplice). Include una documentazione estesa, programmi di esempio e utility di test per aiutare gli sviluppatori a iniziare rapidamente. La libreria è mantenuta da una comunità globale ed è rilasciata sotto licenza MIT, rendendola adatta sia per applicazioni open source che commerciali. Che tu stia costruendo una workstation audio digitale, uno strumento di riconoscimento vocale o un'applicazione musicale interattiva, PortAudio offre una base affidabile e leggera per lo sviluppo audio multipiattaforma.

Previous Next

Iniziare con portaudio

Per iniziare a usare PortAudio, puoi sia compilare dal sorgente sia installarlo tramite gestori di pacchetti. Per la maggior parte degli sviluppatori, il metodo più semplice è clonare il repository ufficiale portaudio GitHub e compilare usando CMake o autotools. Su Linux, installa con `apt install portaudio19-dev`; su macOS, usa `brew install portaudio`; su Windows, scarica i binari precompilati o usa vcpkg (`vcpkg install portaudio`). Dopo l'installazione, includi `portaudio.h` e collega contro la libreria (`-lportaudio`). La libreria è leggera e ha dipendenze minime, rendendo l'integrazione semplice per applicazioni audio in tempo reale.

Installa PortAudio tramite gestori di pacchetti

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

# macOS (Homebrew)
brew install portaudio

# Windows (vcpkg)
vcpkg install portaudio

Streaming audio in tempo reale con callback

La modalità di streaming basata su callback di PortAudio è ideale per l'elaborazione audio a bassa latenza e in tempo reale. Quando viene avviato un flusso, PortAudio invoca periodicamente la tua funzione di callback per richiedere o fornire dati audio. Questa modalità ti offre un controllo preciso sul timing e riduce al minimo i buffer underrun. Il callback riceve buffer di ingresso e uscita, conteggio dei frame, informazioni temporali e flag di stato—consentendo la generazione dinamica di audio, l'elaborazione di effetti o l'analisi. Poiché il callback viene eseguito in un thread ad alta priorità, deve essere eseguito rapidamente (tipicamente sotto i 10 ms) per evitare glitch. Questo lo rende perfetto per applicazioni audio live come sintetizzatori, pedali di effetti per chitarra o sistemi di comunicazione vocale dove le prestazioni deterministiche sono critiche.

Generatore di onda sinusoidale in tempo reale tramite 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;
}

Enumerazione e interrogazione dei dispositivi

PortAudio fornisce API robuste per elencare e ispezionare i dispositivi audio disponibili—comprese le unità di input e output—insieme alle loro capacità. Gli sviluppatori possono interrogare i nomi dei dispositivi, il numero di canali, le frequenze di campionamento predefinite e i valori di latenza utilizzando funzioni come `Pa_GetDeviceCount()`, `Pa_GetDeviceInfo()` e `Pa_GetDefaultInputDeviceID()`. Questo consente alle applicazioni di presentare agli utenti un elenco di dispositivi validi e configurare i flussi in modo ottimale. È inoltre possibile rilevare i dispositivi predefiniti, verificare le frequenze di campionamento supportate e determinare le latenze minime/massime. Questa flessibilità è essenziale per costruire strumenti audio configurabili, DAW o registratori vocali che si adattano a diverse configurazioni hardware senza configurazione manuale.

Elenca tutti i dispositivi audio disponibili

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();

Supporto API host multipiattaforma

PortAudio astrae le API audio specifiche della piattaforma attraverso implementazioni modulari di host API, garantendo un comportamento coerente su tutti i sistemi operativi. Su Windows, supporta ASIO (per audio professionale), WASAPI (Vista+), DirectSound e MME legacy. macOS utilizza Core Audio per una latenza ultra-bassa, mentre Linux supporta ALSA, JACK e PulseAudio. I sistemi BSD usano OSS o sndio. Gli sviluppatori scrivono una volta e distribuiscono ovunque—non è necessaria la compilazione condizionale per la logica principale. La libreria seleziona automaticamente la migliore host API disponibile o consente di specificarne una esplicitamente. Questa universalità rende PortAudio ideale per strumenti audio portabili, software educativo e framework di ricerca che devono funzionare in modo affidabile su hardware e configurazioni OS diversificati.

Forza l'uso dell'API host JACK su 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);

Conversione del formato audio e dithering

PortAudio gestisce la conversione interna del formato dei campioni in modo trasparente, consentendo ai client di utilizzare formati comodi come 32-bit floating point mentre il sistema sottostante utilizza formati interi nativi (ad es., 16-bit PCM). Supporta la conversione tra formati interi a 8, 16, 24 e 32 bit, così come 32-bit float. Inoltre, offre dithering opzionale durante la riduzione della profondità di bit per ridurre al minimo il rumore di quantizzazione — una caratteristica sottile ma fondamentale per le applicazioni audio ad alta fedeltà. Il dithering preserva la qualità audio percepita quando si converte da profondità di bit più elevate a quelle più basse. Queste capacità garantiscono una fedeltà audio coerente su tutte le piattaforme senza richiedere agli sviluppatori di implementare logiche complesse di gestione del formato.

Configura l'input a 32 bit floating point con 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
 Italiano