Echo 샘플의 작동 방식

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

이 코드는 지연 시간 값으로 지정된 시간 프레임에서 렌더링할 수 있는 오디오 데이터의 양을 정확하게 포함할 수 있을 만큼 큰 버퍼를 할당하여 에코 효과를 만듭니다. 버퍼의 크기는 다음 수식에 따라 바이트 단위로 계산됩니다.

버퍼 크기 = 지연 시간 * 샘플 속도 / 1000 * 블록 맞춤

지연 시간은 밀리초입니다. 샘플 속도 및 블록 맞춤 값은 WAVEFORMATEX 구조체에 제공됩니다. 샘플 속도는 초당 샘플입니다. 1000으로 분할하면 밀리초당 샘플이 생성됩니다. 블록 맞춤은 채널 수(모노의 경우 1개, 스테레오의 경우 2개) 및 샘플당 비트 수(8 또는 16)를 8(바이트당 비트)으로 나눈 값과 같습니다.

이 코드는 지연 버퍼의 헤드를 가리키는 포인터 변수 외에도 DoProcessOutput 함수의 처리 루프와 동기화 시 버퍼의 데이터를 단계별 처리하는 이동 가능한 포인터를 만듭니다. 이동 가능한 포인터가 지연 버퍼의 끝에 도달하면 버퍼의 헤드로 다시 이동합니다. 이러한 방식으로 사용되는 버퍼를 순환 버퍼라고 합니다.

지연 버퍼가 존재하고 Windows 미디어 플레이어 처리된 오디오 데이터를 수신하기 위해 오디오 데이터와 출력 버퍼를 제공하기 위해 입력 버퍼를 할당하면 에코 처리는 다음과 같이 진행됩니다.

  1. 입력 버퍼에서 각 오디오 샘플을 처리할 수 있는 루프를 입력합니다.
  2. 입력 버퍼에서 샘플을 검색합니다. 그런 다음 입력 버퍼 포인터를 다음 샘플로 앞으로 이동하여 다음 루프 반복을 준비합니다.
  3. 지연 버퍼에서 샘플을 검색합니다.
  4. 입력 버퍼에서 마지막 지연 샘플이 검색된 지연 버퍼의 동일한 위치에 샘플을 복사합니다.
  5. 지연 버퍼 포인터를 다음 샘플로 앞으로 이동합니다. 포인터가 버퍼의 끝을 지나 이동하면 버퍼의 헤드로 이동합니다.
  6. 입력 버퍼의 샘플을 지연 버퍼의 샘플과 결합합니다.
  7. 결과를 출력 버퍼에 복사합니다. 그런 다음 출력 버퍼 포인터를 다음 단원으로 이동하여 다음 루프 반복을 준비합니다.
  8. 모든 샘플이 처리될 때까지 반복합니다.

2단계에서 검색된 입력 샘플이 4단계의 지연 버퍼에 복사되면 이동 가능한 포인터가 지연 버퍼의 각 샘플을 단계별로 실행하고 마지막으로 동일한 위치로 반환될 때까지 유지됩니다. 지연 버퍼의 크기는 지연 시간에 맞게 설계되었으므로 지연 버퍼에 복사되는 샘플과 다시 한 번 검색되는 샘플 사이의 경과 시간은 지정된 지연(및 실제 처리에 의해 도입된 대기 시간)과 같습니다.

스트림이 시작되면 지연 시간이 경과할 때까지 지연 데이터가 생성되지 않습니다. 따라서 지연 버퍼에 처음에 무음이 포함되어 있는 것이 중요합니다. 지연 버퍼에 임의 데이터가 포함된 경우 플러그 인이 전체 지연 버퍼를 덮어쓰기에 충분한 지연 데이터를 생성할 때까지 사용자는 백색 잡음이 들립니다.

Echo 샘플 개요