Chrome 49의 웹 오디오 업데이트

Chris Wilson
Chris Wilson

Chrome은 Web Audio API 지원을 지속적으로 조용히 개선해 왔습니다. Chrome 49 (2016년 2월 현재 베타 버전이며 2016년 3월에 안정화 버전으로 출시될 예정)에서는 사양을 추적하기 위해 여러 기능을 업데이트하고 새 노드 하나를 추가했습니다.

decodeAudioData()가 이제 프로미스를 반환합니다.

이제 AudioContextdecodeAudioData() 메서드가 Promise를 반환하므로 Promise 기반 비동기 패턴 처리가 가능합니다. decodeAudioData() 메서드는 항상 성공 및 오류 콜백 함수를 매개변수로 사용했습니다.

context.decodeAudioData( arraybufferData, onSuccess, onError);

하지만 이제 표준 Promise 메서드를 사용하여 오디오 데이터 디코딩의 비동기 특성을 대신 처리할 수 있습니다.

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

단일 예시에서는 더 장황해 보이지만 프라미스를 사용하면 비동기 프로그래밍이 더 쉽고 일관되게 됩니다. 호환성을 위해 사양에 따라 성공 및 오류 콜백 함수가 계속 지원됩니다.

이제 OfflineAudioContext에서 suspend() 및 resume()를 지원합니다.

OfflineAudioContext에서 suspend()를 사용하는 것이 이상하게 보일 수 있습니다. 결국 suspend()는 오디오 하드웨어를 대기 모드로 전환할 수 있도록 AudioContext에 추가되었으며, 이는 버퍼에 렌더링하는 시나리오에서는 의미가 없어 보입니다 (물론 OfflineAudioContext의 용도). 그러나 이 기능의 핵심은 메모리 사용량을 최소화하기 위해 한 번에 '점수'의 일부만 구성할 수 있다는 것입니다. 렌더링 중간에 일시중지된 상태에서 노드를 더 만들 수 있습니다.

예를 들어 베토벤의 달빛 소나타에는 약 6,500개의 음표가 포함되어 있습니다. 각 '음표'는 적어도 두 개의 오디오 그래프 노드(예: AudioBuffer 및 Gain 노드)로 분해될 수 있습니다. OfflineAudioContext를 사용하여 7분 30초 전체를 버퍼에 렌더링하려는 경우 이러한 노드를 모두 한 번에 만들지는 않을 것입니다. 대신 일정 기간 동안 생성할 수 있습니다.

var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );

function scheduleNextBlock() {
    // create any notes for the next blockSize number of seconds here
    // ...

    // make sure to tell the context to suspend again after this block;
    context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );

    context.resume();
}

이렇게 하면 렌더링 시작 시 사전 생성해야 하는 노드 수를 최소화하고 메모리 요구사항을 줄일 수 있습니다.

IIRFilterNode

사양에 정확하게 지정된 자체 무한 임펄스 응답을 만들려는 오디오 애호가를 위한 노드인 IIRFilterNode가 추가되었습니다. 이 필터는 BiquadFilterNode를 보완하지만 유형, 주파수, Q 등에 관한 BiquadFilterNode의 사용하기 쉬운 AudioParams가 아닌 필터 응답 매개변수를 완전히 지정할 수 있습니다. IIRFilterNode를 사용하면 단일 순서 필터와 같이 이전에 만들 수 없었던 필터를 정확하게 지정할 수 있습니다. 그러나 IIRFilterNode를 사용하려면 IIR 필터의 작동 방식에 대한 심층적인 지식이 필요하며 BiquadFilterNode와 같이 예약할 수도 없습니다.

이전 변경사항

이전에 적용된 몇 가지 개선사항도 언급하고자 합니다. Chrome 48에서는 BiquadFilter 노드 자동화가 오디오 속도로 실행되기 시작했습니다. 이를 위해 API는 전혀 변경되지 않았지만 필터 스윕이 더 부드럽게 들릴 것입니다. 또한 Chrome 48에서는 연결할 노드를 반환하여 AudioNode.connect() 메서드에 체이닝을 추가했습니다. 이렇게 하면 다음 와 같이 노드 체인을 더 쉽게 만들 수 있습니다.

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

오늘은 여기까지입니다. 좋은 하루 보내세요.