Echo 샘플 작동 방법

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

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

지연 시간은 밀리초 단위입니다. 샘플링 주기 및 블록 맞춤 값은 WAVEFORMATEX 구조체에서 제공 됩니다. 샘플 비율은 초당 샘플입니다. 1000로 나누면 밀리초 당 샘플이 생성 됩니다. 블록 맞춤은 채널 수 (mono의 경우 1, 스테레오의 경우 2)와 샘플 당 비트 수 (8 또는 16)를 8 (바이트 당 비트)으로 나눈 값과 같습니다.

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

지연 버퍼가 있고, 오디오 데이터를 제공 하기 위해 입력 버퍼를 할당 하 고 Windows Media Player, 처리 된 오디오 데이터를 수신 하기 위해 출력 버퍼를 할당 한 후에는 다음과 같이 echo 처리가 진행 됩니다.

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

2 단계에서 검색 한 입력 샘플을 4 단계에서 지연 버퍼에 복사 하면 이동 가능한 포인터가 지연 버퍼의 각 샘플을 통해 이동 하 고 마지막으로 동일한 위치로 반환 될 때까지이 샘플이 남아 있습니다. 지연 버퍼의 크기는 지연 시간에 맞게 디자인 되었기 때문에 지연 버퍼에 복사 되는 샘플 사이에 경과 된 시간 및 한 번 검색 된 샘플이 지정 된 지연 (실제 처리에서 발생 하는 대기 시간)과 일치 합니다.

스트림이 시작 될 때 지연 시간이 경과할 때까지 지연 데이터가 생성 되지 않습니다. 따라서 지연 버퍼에는 처음에는 침묵가 포함 되어 있어야 합니다. 지연 버퍼가 임의의 데이터를 포함 하는 경우 사용자는 플러그 인에서 전체 지연 버퍼를 덮어쓰도록 충분 한 지연 데이터를 생성할 때까지 흰색의 소음을 발생 시킵니다.

Echo 샘플 개요