IMediaObject 구현::AllocateStreamingResources

[이 페이지와 연결된 기능인 Windows 미디어 플레이어 SDK는 레거시 기능입니다. MediaPlayer로 대체되었습니다. MediaPlayer는 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 Windows 미디어 플레이어 SDK 대신 MediaPlayer를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

Echo 샘플에서 AllocateStreamingResources 메서드는 지연 버퍼를 만듭니다. 이 작업은 다음을 수행하여 수행합니다.

  1. 지정된 미디어 형식에 대해 지정된 지연 시간에 해당하는 버퍼의 크기를 계산합니다.
  2. 새 메모리를 할당하거나 버퍼 크기가 이미 있는 경우 다시 할당합니다.
  3. 버퍼를 무음으로 나타내는 값으로 채우는 메서드를 호출합니다.

무음 값은 비트 깊이에 따라 다릅니다. 8비트 오디오의 경우 무음은 16진수 값 80으로 표시됩니다. 16비트 오디오의 경우 무음은 0으로 표시됩니다.

지연 버퍼 크기 계산

지연 버퍼에 필요한 크기를 계산하려면 먼저 오디오 데이터에 대한 정보가 포함된 WAVEFORMATEX 구조를 검색해야 합니다. 다음 예제에서는 입력 DMO_MEDIA_TYPE 구조체에서 이 구조체에 대한 포인터를 검색합니다.

// Get a pointer to the WAVEFORMATEX structure.
WAVEFORMATEX *pWave = ( WAVEFORMATEX * ) m_mtInput.pbFormat;
if (NULL == pWave)
{
    return E_FAIL;
}

적절한 WAVEFORMATEX 구조체에 대한 포인터를 저장한 후에는 해당 멤버를 검사하고 이를 사용하여 필요한 버퍼 크기를 계산할 수 있습니다. 다음 코드 예제에서는 이를 보여 줍니다.

// Get the size of the buffer required.
m_cbDelayBuffer = (m_dwDelayTime * pWave->nSamplesPerSec * pWave->nBlockAlign) / 1000;

이 알고리즘은 지연 시간(밀리초)을 밀리초 단위로 곱한 다음, 결과를 채널 수와 곱한 다음, 결과에 샘플당 바이트 수를 곱하여 버퍼 크기를 계산합니다. 채널 수와 샘플당 바이트 수는 명확하지 않습니다. nBlockAlign 멤버에 인코딩됩니다. 1000으로 나누면 nSamplesPerSec 값이 밀리초당 샘플로 줄어듭니다. 지연 시간은 밀리초 단위로 표현되므로 원하는 단위는 밀리초입니다.

지연 버퍼 메모리 할당

메모리 요구 사항을 계산한 후에는 버퍼를 할당할 수 있습니다. 버퍼가 있는 경우 사용자가 속성 페이지를 호출하여 지연 시간 값을 변경하는 경우와 같이 버퍼를 삭제해야 할 수 있습니다. 다음 코드에서는 지연 버퍼를 할당하는 방법을 보여 줍니다.

// Test whether a buffer exists.
if (m_pbDelayBuffer)
{
    // A buffer already exists.
    // Delete the delay buffer.
    delete m_pbDelayBuffer;
    m_pbDelayBuffer = NULL;
}

// Allocate the buffer.
m_pbDelayBuffer = new BYTE[m_cbDelayBuffer];

if (!m_pbDelayBuffer)
    return E_OUTOFMEMORY;

버퍼가 성공적으로 할당되면 다음 예제와 같이 이동 가능한 포인터를 버퍼의 머리로 이동해야 합니다.

// Move the echo pointer to the head of the delay buffer.
m_pbDelayPointer = m_pbDelayBuffer;

지연 버퍼를 무음으로 채우기

지연 버퍼를 무음으로 나타내는 값으로 채우는 메서드를 작성하는 것이 편리합니다. 메서드는 유효한 WAVEFORMATEX 구조체에 대한 포인터를 받은 다음 wBitsPerSample 멤버를 검사하여 오디오가 8비트 이상인지 확인해야 합니다. 다음 예제에서는 지연 버퍼를 무음의 올바른 값으로 채웁니다.

void CEcho::FillBufferWithSilence(WAVEFORMATEX *pWfex)
{
    if (8 == pWfex->wBitsPerSample)
    {
    ::FillMemory(m_pbDelayBuffer, m_cbDelayBuffer, 0x80);
    }
    else
    ::ZeroMemory(m_pbDelayBuffer, m_cbDelayBuffer);
}

프라이빗 섹션의 헤더 파일 Echo.h에 함수에 대한 정방향 선언을 추가해야 합니다.

void FillBufferWithSilence(WAVEFORMATEX *pWfex);

Delay 버퍼를 만들거나 크기를 조정할 때마다 AllocateStreamingResources 끝에 코드를 추가하여 이 메서드를 호출해야 합니다. 다음 예제 코드는 pWave라는 WAVEFORMATEX 포인터를 새 메서드에 전달합니다.

// Fill the buffer with values representing silence.
FillBufferWithSilence(pWave);

지연 버퍼 메모리 재할당

사용자가 속성 페이지를 사용하여 지연 시간을 변경하는 경우 지연 버퍼의 크기도 변경해야 합니다. 버퍼 크기를 조정하기 위해 AllocateStreamingResources에 코드를 이미 추가했지만 CEcho::p ut_delay에 코드 줄을 추가하여 속성 값이 변경될 때마다 리소스 할당 메서드를 호출해야 합니다. 코드는 다음과 같습니다.

// Reallocate the delay buffer.
AllocateStreamingResources();

스트리밍 리소스 작업