AudioWorkletProcessor.process

AudioWorkletProcessor에서 파생된 클래스의 process() 메서드는 오디오 프로세서 worklet에 대한 오디오 프로세싱 알고리즘을 구현합니다.

비록 이 메서드가 AudioWorkletProcessor 인터페이스의 일부가 아니긴 하지만, AudioWorkletProcessor 의 모든 구현은 반드시 process() 메서드를 제공해야 합니다.

이 메서드는 오디오 렌더링 스레드에서 프로세서의 해당하는 AudioWorkletNode를 통해 향해지고 있는 (또한 렌더링 quantum으로도 알려져 있는) 각 오디오 블럭에 대해 한 번 동기적으로 호출됩니다. 다른 말로 하자면, 여러분의 프로세서가 조작할 새로운 오디오 블럭이 준비될 때마다, process() 함수가 그렇게 하기 위해 호출됩니다.

참고:

현재, 오디오 데이터 블럭은 항상 128 프레임 길이입니다—즉, 그것들은 입력들의 채널의 각각에 대해 128개의 32비트 부동점 샘플을 포함합니다. 그러나, 오디오 블럭의 크기가 상황에 따라 달라지게 할 수 있도록 명세를 개정할 준비가 이미 되어 있습니다 (예를 들자면, 만약 오디오 하드웨어나 CPU 활용이 더 큰 블럭 크기에서 더욱 효율적인 경우). 그러므로, 여러분은 특정한 크기를 추정하기보다는 항상 반드시 샘플 배열의 크기를 확인 해야 합니다.

이 크기는 심지어 시간에 따라 바뀌게 허용될지도 모르므로, 여러분은 절대로 단지 첫번째 블럭만을 보고 샘플 버퍼가 항상 같은 크기일 것이라고 추정해서는 안 됩니다.

구문

js
var isActivelyProcessing = audioWorkletProcessor.process(
  inputs,
  outputs,
  parameters,
);

매개변수

inputs

노드에 연결된 inputs 의 배열인데, 이것의 각각의 원소는 결국 channel 들의 배열입니다. 각 channel 은 128개의 샘플을 포함하고 있는 Float32Array입니다. 예를 들자면, inputs[n][m][i]n 번째 입력, 그 입력의 m 번째 채널, 그 채널의 i 번째 샘플에 접근할 것입니다.

각 샘플 값은 [-1 .. 1] 의 범위 내에 있습니다.

inputs 의 수와 따라서 그 배열의 길이는 노드의 생성에 고정되어 있습니다 (AudioWorkletNode를 참고하세요). 만약 노드의 n 번째 입력에 연결된 활성화된 노드가 없다면, inputs[n] 는 빈 배열일 것입니다 (0개의 입력 채널 사용 가능).

각 입력의 channel 들의 수는 channelCountchannelCountMode 속성에 따라 다양할 수 있습니다.

outputs

구조적으로 inputs 매개변수와 유사한 outputs 의 배열. 이것은 process() 메서드의 실행 중에 채워지도록 의도되었습니다. 각 출력 채널은 기본적으로 0으로 채워집니다 — 출력 배열이 수정되지 않는 한 프로세서는 무음을 출력할 것입니다.

parameters

문자열 키와 Float32Array 값들을 포함하고 있는 객체. parameterDescriptors getter를 사용해 정의된 각각의 사용자 정의 AudioParam에 대해, 이 객체의 키는 그 AudioParamname 이고, 그 값은 Float32Array입니다. 배열의 값들은 예정된 자동화 이벤트를 고려함으로써 계산됩니다.

만약 이 매개변수의 자동화 비율이"a-rate"라면, 배열은 128개의 값 — 현재 오디오 블럭에 있는 각 프레임에 대해 하나 — 을 포함할 것입니다. 만약 현재 블럭에 의해 표현된 시간 중에 발생한 자동화가 없다면, 128개의 동일한 값 대신 배열은 모든 블럭에 대해 변함없는 하나의 값을 포함할 것입니다.

만약 자동화 비율이 "k-rate"라면, 배열은 하나의 값을 포함할 것인데, 이는 128 프레임 각각에 대해 사용될 것입니다.

반환 값

사용자 에이전트의 내부 로직이 노드를 끄는 것이 안전하다고 다르게 판단할 지라도 AudioWorkletNode를 활성화된 채로 유지하게 할 것인지 말 것인지를 나타내는 Boolean 값.

반환된 값은 프로세서가 AudioWorkletProcessor와 이것을 소유하는 노드의 생애 주기 정책에 영향을 끼칠 수 있게 합니다. 만약 반환 값과 노드 상태의 조합이 브라우저로 하여금 노드를 멈추게 결정한다면, process()는 다시 호출되지 않을 것입니다.

true 를 반환하는 것은 Web Audio API가 노드를 계속 살려두게 하는 반면, false 를 반환하는 것은 만약 노드가 새로운 오디오 데이터를 생성하는 것도 아니고 처리되고 있는 이것의 입력을 통해 데이터를 받고 있는 것도 아니라면 브라우저가 노드를 제거할 수 있게 합니다.

세 가지 가장 흔한 유형의 오디오 노드는:

  1. 출력의 소스. 이런 노드를 구현하는 AudioWorkletProcessor는 이것이 출력을 생산하는 한 process 메서드에서 true 를 반환해야 합니다. 이 메서드는 이것이 더 이상 출력을 생산하지 않을 것이라는 것을 알게 되지마자 false 를 반환해야 합니다. 예시로, AudioBufferSourceNode를 생각해 보십시오 — 이런 노드 뒤의 프로세서는 버퍼가 재생되는 동안 process 메서드에서 true 를 반환해야 하고, 버퍼 재생이 끝났을 때 false 반환을 시작해야 합니다 (같은 AudioBufferSourceNode에서 다시 play 를 호출할 방법은 없습니다).
  2. 입력을 변형시키는 노드. 이런 노드를 구현하는 프로세서는 활동 중인 입력 노드들의 존재와 그 노드에 대한 참조들이 garbage-collected 될 수 있는지를 결정할 수 있게 허용하도록 process 메서드에서 false 를 반환해야 합니다. 이 동작을 하는 노드의 예시는 GainNode (en-US)입니다. 연결된 입력과 유지되는 참조가 없어지자마자, gain은 더 이상 무엇에도 적용되지 않을 수 있으므로, 이것은 안전하게 garbage-collected 될 수 있습니다.
  3. 입력을 변형시키나 소위 tail-time 을 가지고 있는 노드 — 이는 이것이 심지어 입력이 끊기거나 활동이 없는 후일지라도 (0개의 채널을 생산) 몇 번에 대해 출력을 생산할 것임을 의미합니다. 이런 노드를 구현하는 프로세서는 process 메서드에서, 0개의 채널을 포함하는 입력이 발견되자마자 시작하며, tail-time 의 기간 동안 true 를 반환해야 합니다.

참고:

return 문의 부재는 이 메서드가 undefined 를 반환할 것임을 의미하고, 이것은 falsy 값이므로, 이것은 false를 반환하는 것과도 같습니다. 명시적인 return 문을 누락하는 것은 여러분의 노드에서 감지하기 어려운 문제를 야기할 수도 있습니다.

예외

process() 메서드는 유저에 의해 구현되므로, 이것은 아무 것이나 발생시킬 수 있습니다. 만약 uncaught error가 발생된다면, 노드는 onprocessorerror 이벤트를 발생시킬 것이고 이것의 생애 주기의 나머지 동안 무음을 출력할 것입니다.

예제

이 예제에서 우리는 프로세서의 첫번째 출력에 백색소음을 출력하는 AudioWorkletProcessor 를 생성할 것입니다. gain은 customGain 파라미터에 의해 제어될 수 있습니다.

js
class WhiteNoiseProcessor extends AudioWorkletProcessor {
  process(inputs, outputs, parameters) {
    // 첫번째 출력을 취합니다
    const output = outputs[0];
    // 각 채널을 gain에 의해 곱해진 무작위 값으로 채웁니다
    output.forEach((channel) => {
      for (let i = 0; i < channel.length; i++) {
        // 각 샘플에 대해 무작위 값을 생성합니다
        // Math.random의 범위는 [0; 1)입니다; 우리는 [-1; 1]이 필요합니다
        // 이것은 정확한 1을 포함하지 않을 것이지만 단순성을 위해 지금으로선 괜찮습니다
        channel[i] =
          (Math.random() * 2 - 1) *
          // 배열은 자동화가 존재하는지와
          // 자동화가 k-rate인지 a-rate인지에 따라
          // 1개 또는 128개의 값을 포함할 수 있습니다
          (parameters["customGain"].length > 1
            ? parameters["customGain"][i]
            : parameters["customGain"][0]);
      }
    });
    // 이것은 자신만의 출력을 생성하는 소스 노드이므로, 만약 우리가
    // 메인 스레드에서 이것에 대해 어떠한 참조도 가지고 있지 않는다면
    // 이것이 뜻하지 않게 garbage-collected되지 않도록 우리는 true를 반환할 것입니다
    return true;
  }
  // process 메서드에서 사용되는 customGain 파라미터를 정의합니다
  static get parameterDescriptors() {
    return [
      {
        name: "customGain",
        defaultValue: 1,
        minValue: 0,
        maxValue: 1,
        automationRate: "a-rate",
      },
    ];
  }
}

명세서

Specification
Web Audio API
# process

브라우저 호환성

브라우저에서 제공하는 메서드가 아니라 클라이언트 코드로 작성해야 하는 콜백 메서드입니다.

같이 보기