我如何在WebAudio中使用AudioContext

时间:2014-03-31 17:18:15

标签: javascript html5-audio web-audio smart-mobile-studio

我正在尝试创建一种在短信中生成声音的方法。这给了我一个“无法调用方法'createScriptProcessor'的null”?

是否应该创建JAudioContext?

...

AudioContext  : JAudioContext;
node          : JScriptProcessorNode;

...

procedure TForm1.W3Button1Click(Sender: TObject);
var bufferSize : integer;
    lastOut : float;
    input,output : JFloat32Array;
begin
  bufferSize := 4096;
  lastOut := 0;
  node := AudioContext.createScriptProcessor(bufferSize, 1, 1);
  node.onaudioprocess := procedure (e: JAudioProcessingEvent)
  var i : integer;
  begin
    input := e.inputBuffer.getChannelData(0);
    output := e.outputBuffer.getChannelData(0);
    for i := 0 to bufferSize-1 do
    begin
      output[i] := (input[i] + lastOut) / 2.0;
      lastOut := output[i];
    end;
  end;
end;

1 个答案:

答案 0 :(得分:7)

目前,您仍需要一些JavaScript解决方法来创建音频上下文。

这样的东西
var AudioContext: JAudioContext;

procedure InitializeAudioContext;
begin 
  asm
    // Fix up for prefixing
    window.AudioContext = window.AudioContext||window.webkitAudioContext;

    if('webkitAudioContext' in window) {
      @AudioContext = new webkitAudioContext();
     }
  end;
end;

注意:w3c.WebAudio单元基本上只是W3C API的包装器,不包含用于初始化音频上下文的代码。到目前为止,必须在代码中完成此操作(如上所示)。

对于未来,我们计划进行更高级别的抽象。

即将推出的2.1版将包含另一个关于Web Audio API和改进的“Sine Generator”示例的特色示例。计划于4月/ 5月发布。

更新1:

或者,您可以使用以下代码实例化您的上下文:

AudioContext := new JAudioContext;

但是,它不适用于较旧的基于webkit的浏览器。这些需要额外的webkit前缀。

在这种情况下,例如:

type
       JWebkitAudioContext = class external 'webkitAudioContext' (JAudioContext);

AudioContext := new JWebkitAudioContext;

会起作用。

出于兼容性原因,您可能需要检查前缀是否必要。或者只使用上面发布的“asm”片段。

更新2:

Eric刚给我发了一封关于如何检查Pascal代码的电子邮件。虽然它仍然有点难看,但它避免了asm部分。

首先声明webkitAudioContext,然后检查它是否已分配:

var webkitAudioContext external 'webkitAudioContext' : JwebkitAudioContext;
var hasWebkitAudio := Boolean(Variant(webkitAudioContext));