[c++] 사운드 레벨 미터링

음향이나 음악 애플리케이션을 개발하는 경우, 사운드 레벨을 측정하고 표시하는 기능이 중요합니다. 이 기능을 C++로 구현하는 방법에 대해 설명하겠습니다.

사전 요구사항

  1. PortAudio 라이브러리 설치: 이 예제에서는 PortAudio 라이브러리를 사용합니다. 해당 라이브러리는 오디오 입력 및 출력을 다룰 수 있는 크로스 플랫폼 오디오 라이브러리로 유용합니다.

  2. CMake 프로젝트 설정: CMake를 사용하여 프로젝트를 설정하고 PortAudio 라이브러리를 연동합니다.

코드 예시

#include <iostream>
#include "portaudio.h"

#define SAMPLE_RATE (44100)
#define FRAMES_PER_BUFFER (64)

// 콜백 함수 정의
static int audioCallback(const void *inputBuffer, void *outputBuffer,
                         unsigned long framesPerBuffer,
                         const PaStreamCallbackTimeInfo *timeInfo,
                         PaStreamCallbackFlags statusFlags,
                         void *userData)
{
    float *in = (float *)inputBuffer;
    (void)outputBuffer;
    (void)timeInfo;
    (void)statusFlags;
    (void)userData;

    // 입력된 오디오 데이터의 레벨 계산
    float maxLevel = 0;
    for (int i = 0; i < framesPerBuffer; i++)
    {
        float absIn = in[i] < 0 ? -in[i] : in[i];
        if (absIn > maxLevel)
        {
            maxLevel = absIn;
        }
    }

    // 레벨을 퍼센티지로 표시
    float levelPercent = 100 * maxLevel;

    // 레벨 표시
    std::cout << "Sound level: " << levelPercent << "%" << std::endl;

    return paContinue;
}

int main()
{
    PaStream *stream;
    Pa_Initialize();
    
    Pa_OpenDefaultStream(&stream, 1, 0, paFloat32, SAMPLE_RATE, FRAMES_PER_BUFFER, audioCallback, NULL);
    Pa_StartStream(stream);

    // 애플리케이션 실행 중에 계속해서 오디오 레벨을 확인하고 표시
    while (true)
    {
        Pa_Sleep(1000);
    }

    Pa_StopStream(stream);
    Pa_CloseStream(stream);
    Pa_Terminate();

    return 0;
}

위의 코드 예시는 PortAudio 라이브러리를 사용하여 오디오 스트림을 열고, 매 프레임마다 입력된 오디오 데이터의 레벨을 계산하여 표시하는 방법을 보여줍니다.

마치며

C++을 사용하여 음향 레벨을 미터링하는 것은 PortAudio와 같은 오디오 라이브러리를 활용하는 것이 중요합니다. 이를 통해 음악 애플리케이션 및 음향 관련 소프트웨어에서 오디오 신호의 레벨을 정확하게 표시하고 이해할 수 있습니다.

참고: PortAudio 라이브러리 공식 홈페이지