1. 제품
  2.   오디오
  3.   C++
  4.   portaudio

portaudio

 
 

오디오 I/O를 위한 오픈 소스 C 라이브러리

오픈 소스 C API를 통해 Windows, macOS, Linux 등에서 실시간 오디오 입력 및 출력을 제공합니다.

portaudio란 무엇인가요?

PortAudio는 무료이며 오픈 소스인 크로스 플랫폼 C 라이브러리로, 개발자가 실시간 입력 및 출력 기능을 갖춘 휴대용 오디오 애플리케이션을 작성할 수 있게 합니다. 이 라이브러리는 ASIO, CoreAudio, ALSA, WASAPI, JACK과 같은 플랫폼별 오디오 서브시스템을 추상화하여 Windows, macOS, Linux 및 기타 운영 체제에서 일관된 오디오 I/O를 제공합니다. 라이브러리는 32비트 부동 소수점 등 다양한 오디오 포맷을 지원하며, 포맷 변환을 내부적으로 처리합니다. 간단하면서도 강력한 API를 통해 PortAudio는 저지연, 고성능 오디오 처리가 필요한 오디오 소프트웨어, 플러그인, 교육 도구 및 연구 프로젝트에서 널리 사용됩니다.

PortAudio는 두 가지 주요 동작 모드를 제공합니다: 콜백 기반(저지연 스트리밍용)과 블로킹 읽기/쓰기(보다 간단한 동기 I/O용). 풍부한 문서, 예제 프로그램 및 테스트 유틸리티를 포함하고 있어 개발자가 빠르게 시작할 수 있도록 돕습니다. 이 라이브러리는 전 세계 커뮤니티에 의해 유지 관리되며 MIT 라이선스로 제공되어 오픈 소스와 상용 애플리케이션 모두에 적합합니다. 디지털 오디오 워크스테이션, 음성 인식 도구, 인터랙티브 음악 애플리케이션을 구축하든, PortAudio는 크로스 플랫폼 오디오 개발을 위한 신뢰할 수 있고 가벼운 기반을 제공합니다.

Previous Next

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, WASAPI(Vista 이상), 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
 한국인