【问题标题】:How do i use AudioContext in WebAudio我如何在 WebAudio 中使用 AudioContext
【发布时间】:2014-04-01 19:31:40
【问题描述】:

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

应该创建 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;

【问题讨论】:

  • 这是什么语言?
  • @KevinEnnis 语言是“Smart Pascal”。 smart-mobile-studio 的描述会给你一个提示 ;-)
  • javascript (可能)被添加为标签,因为 Smart-Mobile-Studio 项目被编译成 HTML5+JavaScript。因此,问题的原因可能与 HTML5 或 JavaScript 有关,而不仅仅是编码语言。

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


【解决方案1】:

目前您仍需要一些 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 的特色示例和一个改进的“正弦发生器”示例。计划在四月/五月发布。

更新 1:

您也可以使用以下代码实例化您的上下文:

AudioContext := new JAudioContext;

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

在这种情况下是这样的:

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

AudioContext := new JWebkitAudioContext;

会起作用的。

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

更新 2:

Eric 刚刚给我写了一封关于如何在 Pascal 代码中进行检查的电子邮件。虽然还是有点难看,但还是避开了 asm 部分。

先声明webkitAudioContext,然后检查是否赋值:

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

【讨论】:

  • 一些更高层次的音频使用抽象会很棒!
  • “AudioContext := new JAudioContext;”有效,但现在我期待更新! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多