Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在WebAudio中使用AudioContext_Javascript_Html5 Audio_Web Audio Api_Smart Mobile Studio - Fatal编程技术网

Javascript 如何在WebAudio中使用AudioContext

Javascript 如何在WebAudio中使用AudioContext,javascript,html5-audio,web-audio-api,smart-mobile-studio,Javascript,Html5 Audio,Web Audio Api,Smart Mobile Studio,我正在尝试创建一种在短信中生成声音的方法。这给了我一个“不能调用null的方法'createScriptProcessor'” 是否应该创建上下文 ... AudioContext : JAudioContext; node : JScriptProcessorNode; ... procedure TForm1.W3Button1Click(Sender: TObject); var bufferSize : integer; lastOut : float;

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

是否应该创建上下文

...

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;

目前,您仍然需要一些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基本上只是W3CAPI的包装器,不包含初始化音频上下文的代码。到目前为止,这必须在代码中完成(如上所示)

对于未来,我们计划有一些更高级别的抽象

即将发布的2.1版将包含另一个关于Web音频API的特色示例和一个改进的“正弦发生器”示例。计划于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));

这是什么语言?@KevinEnnis语言是“聪明的Pascal”。对的描述会给您一个提示;-)由于Smart Mobile Studio项目被编译成HTML5+JavaScript,因此(可能)添加为标记。因此,问题的原因可能与HTML5或JavaScript有关,而不仅仅是编码语言。一些更高层次的音频使用抽象将非常棒!“AudioContext:=new JAudioContext;”可以工作,但现在我期待着更新!:-)