5

SMSで音を生成する方法を作成しようとしています。これにより、「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;
4

1 に答える 1

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));
于 2014-03-31T19:24:35.040 に答える