
portaudio
オーディオI/O用オープンソースCライブラリ
オープンソースC APIを通じて、Windows、macOS、Linuxなどでリアルタイムのオーディオ入出力を実現します。
portaudioとは何ですか?
PortAudio は、無料でオープンソースのクロスプラットフォーム C ライブラリで、開発者がリアルタイムの入出力機能を備えたポータブルなオーディオアプリケーションを作成できるようにします。ASIO、CoreAudio、ALSA、WASAPI、JACK などのプラットフォーム固有のオーディオサブシステムを抽象化し、Windows、macOS、Linux、その他の OS 間で一貫したオーディオ I/O を実現します。このライブラリは、32 ビット浮動小数点を含む複数のオーディオフォーマットをサポートし、フォーマット変換を内部で処理します。シンプルでありながら強力な API により、PortAudio は低レイテンシで高性能なオーディオ処理を必要とするオーディオソフトウェア、プラグイン、教育ツール、研究プロジェクトで広く利用されています。
PortAudio は、コールバックベース(低遅延ストリーミング向け)とブロッキングの読み書き(シンプルな同期 I/O 向け)の 2 つの主要な動作モードを提供します。豊富なドキュメント、サンプルプログラム、テストユーティリティが含まれており、開発者がすぐに始められるよう支援します。このライブラリはグローバルコミュニティによって保守されており、MIT ライセンスの下で提供されているため、オープンソースおよび商用アプリケーションの両方に適しています。デジタルオーディオワークステーション、音声認識ツール、インタラクティブな音楽アプリケーションを構築する場合でも、PortAudio はクロスプラットフォームのオーディオ開発のための信頼性が高く軽量な基盤を提供します。
portaudioの入門
PortAudio の使用を開始するには、ソースからビルドするか、パッケージマネージャーでインストールするかのいずれかです。ほとんどの開発者にとって最も簡単な方法は、公式 portaudio GitHub リポジトリをクローンし、CMake または autotools を使用してコンパイルすることです。Linux では `apt install portaudio19-dev` でインストールし、macOS では `brew install portaudio` を使用し、Windows では事前ビルドバイナリをダウンロードするか vcpkg(`vcpkg install portaudio`)を使用します。インストール後は `portaudio.h` をインクルードし、ライブラリ(`-lportaudio`)にリンクします。このライブラリは軽量で依存関係が最小限であるため、リアルタイムオーディオアプリケーションへの統合が容易です。
パッケージマネージャーでPortAudioをインストール
# Linux (Debian/Ubuntu)
sudo apt install portaudio19-dev
# macOS (Homebrew)
brew install portaudio
# Windows (vcpkg)
vcpkg install portaudio
コールバックを使用したリアルタイムオーディオストリーミング
PortAudio のコールバックベースのストリーミングモードは、低遅延・リアルタイムのオーディオ処理に最適です。ストリームが開始されると、PortAudio は定期的にコールバック関数を呼び出し、オーディオデータの取得または供給を要求します。このモードにより、タイミングを正確に制御でき、バッファアンダーランを最小限に抑えられます。コールバックは入力バッファと出力バッファ、フレーム数、時間情報、ステータスフラグを受け取り、動的なオーディオ生成、エフェクト処理、または解析を可能にします。コールバックは高優先度スレッドで実行されるため、グリッチを防ぐために迅速に(通常は 10ms 未満で)実行する必要があります。このため、シンセサイザー、ギターエフェクトペダル、音声通信システムなど、決定論的なパフォーマンスが重要なライブオーディオアプリケーションに最適です。
コールバックによるリアルタイム正弦波ジェネレータ
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;
}
デバイスの列挙とクエリ
PortAudio は、利用可能なオーディオデバイス(入力デバイスと出力デバイスを含む)を列挙・検査するための堅牢な API を提供し、デバイスの機能も取得できます。開発者は `Pa_GetDeviceCount()`、`Pa_GetDeviceInfo()`、`Pa_GetDefaultInputDeviceID()` などの関数を使用して、デバイス名、チャンネル数、デフォルトのサンプルレート、レイテンシ値を問い合わせることができます。これにより、アプリケーションはユーザーに有効なデバイスの一覧を提示し、ストリームを最適に構成できます。また、デフォルトデバイスの検出、サポートされているサンプルレートの確認、最小/最大レイテンシの決定も可能です。この柔軟性は、設定を手動で行うことなく、多様なハードウェア構成に適応する設定可能なオーディオツール、DAW、音声レコーダーの構築に不可欠です。
利用可能なすべてのオーディオデバイスを一覧表示
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();
クロスプラットフォームのホストAPIサポート
PortAudio は、モジュラーなホスト API 実装を通じてプラットフォーム固有のオーディオ API を抽象化し、オペレーティングシステム間で一貫した動作を保証します。Windows では、プロオーディオ向けの ASIO、Vista 以降の WASAPI、DirectSound、そしてレガシーな MME をサポートしています。macOS は超低遅延のために Core Audio を活用し、Linux は ALSA、JACK、PulseAudio をサポートします。BSD システムは OSS または sndio を使用します。開発者は一度コードを書くだけでどこでも展開でき、コアロジックに条件コンパイルは不要です。ライブラリは利用可能な最適なホスト API を自動的に選択するか、明示的に指定することもできます。この汎用性により、PortAudio はポータブルなオーディオツール、教育ソフトウェア、そして多様なハードウェアや OS 構成上で信頼性を持って動作しなければならない研究フレームワークに最適です。
LinuxでJACKホストAPIの使用を強制する
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);
オーディオフォーマット変換とディザリング
PortAudio は内部のサンプルフォーマット変換を透過的に処理し、クライアントが 32 ビット浮動小数点などの便利なフォーマットを使用できるようにし、基盤となるシステムはネイティブの整数フォーマット(例: 16 ビット PCM)を使用します。8、16、24、32 ビット整数フォーマット間および 32 ビット浮動小数点間の変換をサポートします。さらに、ビット深度の削減時に量子化ノイズを最小化するオプションのディザリングを提供し、ハイファイオーディオアプリケーションにとって微妙ながら重要な機能です。ディザリングは、上位ビット深度から下位ビット深度へ変換する際に知覚される音質を保護します。これらの機能により、開発者が複雑なフォーマット処理ロジックを実装する必要なく、プラットフォーム間で一貫したオーディオ忠実度が確保されます。
32ビット浮動小数点入力をディザリングで設定する
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
