IAudioRenderClient::GetBuffer 메서드(audioclient.h)
호출자가 데이터 패킷을 작성할 수 있는 렌더링 엔드포인트 버퍼에서 사용 가능한 다음 공간에 대한 포인터를 검색합니다.
구문
HRESULT GetBuffer(
[in] UINT32 NumFramesRequested,
[out] BYTE **ppData
);
매개 변수
[in] NumFramesRequested
호출자가 버퍼의 요청된 공간에 쓸 데이터 패킷의 오디오 프레임 수입니다. 호출이 성공하면 *ppData 가 가리키는 버퍼 영역의 크기가 NumFramesRequested에 지정된 크기와 일치합니다.
[out] ppData
메서드가 호출자가 데이터 패킷을 쓸 버퍼 영역의 시작 주소를 쓰는 포인터 변수에 대한 포인터입니다.
반환 값
메서드가 성공하면 S_OK가 반환되고, 실패할 경우 가능한 반환 코드에는 다음 표에 표시된 값이 포함되지만 이에 국한되지는 않습니다.
반환 코드 | 설명 |
---|---|
|
GetBuffer 가 데이터 버퍼를 검색하지 못하고 *ppData 가 NULL을 가리킵니다. 자세한 내용은 설명 부분을 참조하세요. |
|
NumFramesRequested 값이 사용 가능한 버퍼 공간(버퍼 크기에서 패딩 크기를 뺀 값)을 초과합니다. |
|
스트림은 배타적 모드이며 이벤트 기반 버퍼링을 사용하지만 클라이언트는 버퍼 크기가 아닌 패킷을 얻으려고 시도했습니다. |
|
이전 IAudioRenderClient::GetBuffer 호출은 여전히 유효합니다. |
|
오디오 엔드포인트 디바이스가 분리되었거나 오디오 하드웨어 또는 관련 하드웨어 리소스가 다시 구성, 비활성화, 제거 또는 사용할 수 없게 되었습니다. |
|
스트림 재설정이 진행 중이므로 버퍼에 액세스할 수 없습니다. |
|
Windows 오디오 서비스가 실행되고 있지 않습니다. |
|
매개 변수 ppData는 NULL입니다. |
설명
호출자는 버퍼에서 사용 가능한 공간의 양보다 작거나 같은 패킷 크기를 요청할 수 있습니다(이벤트 기반 버퍼링을 사용하는 배타적 모드 스트림의 경우 제외). 자세한 내용은 IAudioClient::Initialize를 참조하세요. 사용 가능한 공간은 단순히 버퍼 크기에서 이미 재생 대기 중인 버퍼의 데이터 양을 뺀 값입니다. 호출자가 버퍼에서 사용 가능한 공간을 초과하는 NumFramesRequested 값을 지정하면 호출이 실패하고 오류 코드 AUDCLNT_E_BUFFER_TOO_LARGE 반환합니다.
클라이언트는 오디오 스트림에서 결함이 발생하지 않도록 버퍼에 충분한 양의 데이터를 작성해야 합니다. 버퍼링 요구 사항에 대한 자세한 내용은 IAudioClient::Initialize를 참조하세요.
GetBuffer를 호출하여 데이터 패킷을 가져온 후 클라이언트는 렌더링 데이터로 패킷을 채우고 IAudioRenderClient::ReleaseBuffer 메서드를 호출하여 오디오 엔진에 패킷을 발급합니다.
클라이언트는 0 이외의 크기의 패킷을 성공적으로 가져오는 GetBuffer 호출 후 ReleaseBuffer를 호출해야 합니다. 클라이언트에는 ReleaseBuffer 를 호출하거나 호출하지 않고 크기 0 패킷을 해제할 수 있습니다.
0이 아닌 패킷 크기의 경우 클라이언트는 GetBuffer 및 ReleaseBuffer에 대한 호출을 대체해야 합니다. 각 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 오류 코드를 반환할 수 있습니다. 이 오류는 데이터 패킷을 사용할 수 없기 때문에 데이터 버퍼가 검색되지 않음을 나타냅니다(*ppData 가 NULL을 수신).
GetBuffer가 AUDCLNT_E_BUFFER_ERROR 반환하는 경우 오디오 샘플을 사용하는 스레드는 다음 처리 단계를 기다려야 합니다. 클라이언트는 실패한 GetBuffer 호출 수를 유지하는 것이 도움이 될 수 있습니다. GetBuffer가 이 오류를 반복적으로 반환하는 경우 클라이언트는 IAudioClient::Stop, IAudioClient::Reset을 호출하고 오디오 클라이언트를 해제하여 현재 클라이언트를 종료한 후 새 처리 루프를 시작할 수 있습니다.
예제
GetBuffer 메서드를 호출하는 코드 예제는 다음 topics 참조하세요.
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2008 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | audioclient.h |