다음을 통해 공유


IAudioRenderClient::GetBuffer 메서드(audioclient.h)

호출자가 데이터 패킷을 작성할 수 있는 렌더링 엔드포인트 버퍼에서 사용 가능한 다음 공간에 대한 포인터를 검색합니다.

구문

HRESULT GetBuffer(
  [in]  UINT32 NumFramesRequested,
  [out] BYTE   **ppData
);

매개 변수

[in] NumFramesRequested

호출자가 버퍼의 요청된 공간에 쓸 데이터 패킷의 오디오 프레임 수입니다. 호출이 성공하면 *ppData 가 가리키는 버퍼 영역의 크기가 NumFramesRequested에 지정된 크기와 일치합니다.

[out] ppData

메서드가 호출자가 데이터 패킷을 쓸 버퍼 영역의 시작 주소를 쓰는 포인터 변수에 대한 포인터입니다.

반환 값

메서드가 성공하면 S_OK가 반환되고, 실패할 경우 가능한 반환 코드에는 다음 표에 표시된 값이 포함되지만 이에 국한되지는 않습니다.

반환 코드 설명
AUDCLNT_E_BUFFER_ERROR

GetBuffer 가 데이터 버퍼를 검색하지 못하고 *ppDataNULL을 가리킵니다. 자세한 내용은 설명 부분을 참조하세요.

AUDCLNT_E_BUFFER_TOO_LARGE
NumFramesRequested 값이 사용 가능한 버퍼 공간(버퍼 크기에서 패딩 크기를 뺀 값)을 초과합니다.
AUDCLNT_E_BUFFER_SIZE_ERROR
스트림은 배타적 모드이며 이벤트 기반 버퍼링을 사용하지만 클라이언트는 버퍼 크기가 아닌 패킷을 얻으려고 시도했습니다.
AUDCLNT_E_OUT_OF_ORDER
이전 IAudioRenderClient::GetBuffer 호출은 여전히 유효합니다.
AUDCLNT_E_DEVICE_INVALIDATED
오디오 엔드포인트 디바이스가 분리되었거나 오디오 하드웨어 또는 관련 하드웨어 리소스가 다시 구성, 비활성화, 제거 또는 사용할 수 없게 되었습니다.
AUDCLNT_E_BUFFER_OPERATION_PENDING
스트림 재설정이 진행 중이므로 버퍼에 액세스할 수 없습니다.
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows 오디오 서비스가 실행되고 있지 않습니다.
E_POINTER
매개 변수 ppDataNULL입니다.

설명

호출자는 버퍼에서 사용 가능한 공간의 양보다 작거나 같은 패킷 크기를 요청할 수 있습니다(이벤트 기반 버퍼링을 사용하는 배타적 모드 스트림의 경우 제외). 자세한 내용은 IAudioClient::Initialize를 참조하세요. 사용 가능한 공간은 단순히 버퍼 크기에서 이미 재생 대기 중인 버퍼의 데이터 양을 뺀 값입니다. 호출자가 버퍼에서 사용 가능한 공간을 초과하는 NumFramesRequested 값을 지정하면 호출이 실패하고 오류 코드 AUDCLNT_E_BUFFER_TOO_LARGE 반환합니다.

클라이언트는 오디오 스트림에서 결함이 발생하지 않도록 버퍼에 충분한 양의 데이터를 작성해야 합니다. 버퍼링 요구 사항에 대한 자세한 내용은 IAudioClient::Initialize를 참조하세요.

GetBuffer를 호출하여 데이터 패킷을 가져온 후 클라이언트는 렌더링 데이터로 패킷을 채우고 IAudioRenderClient::ReleaseBuffer 메서드를 호출하여 오디오 엔진에 패킷을 발급합니다.

클라이언트는 0 이외의 크기의 패킷을 성공적으로 가져오는 GetBuffer 호출 후 ReleaseBuffer를 호출해야 합니다. 클라이언트에는 ReleaseBuffer 를 호출하거나 호출하지 않고 크기 0 패킷을 해제할 수 있습니다.

0이 아닌 패킷 크기의 경우 클라이언트는 GetBufferReleaseBuffer에 대한 호출을 대체해야 합니다. 각 GetBuffer 호출 뒤에 해당하는 ReleaseBuffer 호출이 있어야 합니다. 클라이언트가 GetBuffer 를 호출하여 데이터 패킷을 획득한 후에는 클라이언트가 ReleaseBuffer 를 호출하여 이전 패킷을 해제할 때까지 다음 데이터 패킷을 가져올 수 없습니다. GetBuffer 또는 ReleaseBuffer에 대한 두 개 이상의 연속 호출은 허용되지 않으며 오류 코드 AUDCLNT_E_OUT_OF_ORDER 실패합니다.

호출 순서가 올바른지 확인하려면 GetBuffer 호출과 해당 ReleaseBuffer 호출이 동일한 스레드에서 발생해야 합니다.

오디오 프레임의 크기는 IAudioClient::GetMixFormat 메서드를 호출하여 클라이언트가 가져오는 WAVEFORMATEX 구조체의 nBlockAlign 멤버에 의해 지정됩니다.

호출자가 NumFramesRequested = 0을 설정하면 메서드는 S_OK 상태 코드를 반환하지만 ppData 매개 변수가 가리키는 변수에 쓰지 않습니다.

클라이언트는 버퍼를 획득하는 GetBuffer 호출과 버퍼를 해제하는 ReleaseBuffer 호출 간에 과도한 지연을 방지해야 합니다. 오디오 엔진의 구현에서는 GetBuffer 호출 및 해당 ReleaseBuffer 호출이 동일한 버퍼 처리 기간 내에 발생한다고 가정합니다. 둘 이상의 기간 동안 버퍼 해제를 지연하는 클라이언트는 샘플 데이터를 잃을 위험이 있습니다.

Windows 7에서 GetBuffer 는 단독 모드에서 엔드포인트 버퍼를 사용하는 오디오 클라이언트에 대한 AUDCLNT_E_BUFFER_ERROR 오류 코드를 반환할 수 있습니다. 이 오류는 데이터 패킷을 사용할 수 없기 때문에 데이터 버퍼가 검색되지 않음을 나타냅니다(*ppDataNULL을 수신).

GetBufferAUDCLNT_E_BUFFER_ERROR 반환하는 경우 오디오 샘플을 사용하는 스레드는 다음 처리 단계를 기다려야 합니다. 클라이언트는 실패한 GetBuffer 호출 수를 유지하는 것이 도움이 될 수 있습니다. GetBuffer가 이 오류를 반복적으로 반환하는 경우 클라이언트는 IAudioClient::Stop, IAudioClient::Reset을 호출하고 오디오 클라이언트를 해제하여 현재 클라이언트를 종료한 후 새 처리 루프를 시작할 수 있습니다.

예제

GetBuffer 메서드를 호출하는 코드 예제는 다음 topics 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2008 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 audioclient.h

추가 정보

IAudioClient::GetBufferSize

IAudioClient::GetCurrentPadding

IAudioClient::Initialize

IAudioRenderClient 인터페이스

IAudioRenderClient::ReleaseBuffer