아래에서 Core Audio를 사용하여 macOS에서 오디오를 캡처하는 간단한 예제 코드를 제공합니다.
이 예제는 C++로 작성되었고, 입력된 오디오를 터미널에 출력하는 기능을 수행합니다.
macOS에서 실행할 수 있으며, 실행 시 키보드에서 Enter를 누르면 오디오 캡처가 중지됩니다. 이 예제는 단순히 오디오 데이터를 콘솔에 출력하지만, 실제 애플리케이션에서는 데이터를 적절히 처리하고 저장해야 합니다.
#include <iostream>
#include <CoreAudio/CoreAudio.h>
#include <CoreFoundation/CoreFoundation.h>
#define BUFFER_SIZE 1024
AudioQueueRef audioQueue;
static void HandleInputBuffer(void *input, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime, UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc) {
// 오디오 데이터 처리 (여기서는 단순히 콘솔에 출력)
for (int i = 0; i < inNumPackets; ++i) {
std::cout << ((float *)((char *)inBuffer->mAudioData + (inPacketDesc ? inPacketDesc[i].mStartOffset : 0)))[0] << std::endl;
}
// 오디오 버퍼 재사용
AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, nullptr);
}
int main() {
// 오디오 입력 장치 찾기
AudioObjectPropertyAddress propertyAddress;
propertyAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice;
propertyAddress.mScope = kAudioObjectPropertyScopeGlobal;
propertyAddress.mElement = kAudioObjectPropertyElementMaster;
AudioDeviceID deviceId;
UInt32 size = sizeof(deviceId);
OSStatus status = AudioObjectGetPropertyData(
kAudioObjectSystemObject, &propertyAddress, 0, nullptr, &size, &deviceId);
if (status != noErr) {
std::cerr << "Failed to get default input device" << std::endl;
return 1;
}
// 오디오 캡처 세션 설정
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate = 44100.0;
audioFormat.mFormatID = kAudioFormatLinearPCM;
audioFormat.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket = 1;
audioFormat.mChannelsPerFrame = 1;
audioFormat.mBitsPerChannel = 16;
audioFormat.mBytesPerPacket = audioFormat.mBytesPerFrame = (audioFormat.mBitsPerChannel / 8) * audioFormat.mChannelsPerFrame;
// 오디오 큐 생성
status = AudioQueueNewInput(&audioFormat, HandleInputBuffer, nullptr, nullptr, kCFRunLoopCommonModes, 0, &audioQueue);
if (status != noErr) {
std::cerr << "Failed to create audio queue" << std::endl;
return 1;
}
// 오디오 큐 시작
status = AudioQueueStart(audioQueue, nullptr);
if (status != noErr) {
std::cerr << "Failed to start audio queue" << std::endl;
return 1;
}
// 콘솔에서 키 입력을 기다림
std::cout << "Press Enter to stop capturing audio..." << std::endl;
getchar();
// 오디오 큐 중지 및 해제
AudioQueueStop(audioQueue, true);
AudioQueueDispose(audioQueue, true);
return 0;
}