Как я могу использовать AudioContext в WebAudio

Я пытаюсь создать способ генерировать звуки в смс. Это дает мне "Не удается вызвать метод '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;

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 будет содержать еще один показанный пример об API Web Audio и улучшенный пример 'Sine Generator'. Выход планируется на апрель / май.

Обновление 1:

В качестве альтернативы вы можете создать свой контекст, используя этот код:

AudioContext := new JAudioContext;

Тем не менее, он не работает для старых браузеров на основе webkit. Для этого нужен дополнительный префикс webkit.

В этом случае что-то вроде:

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

AudioContext := new JWebkitAudioContext;

должно сработать.

Из соображений совместимости вам может потребоваться проверить, нужен ли префикс или нет. Или просто используйте фрагмент "asm", размещенный выше.

Обновление 2:

Эрик только что написал мне письмо о том, как выполнить проверку в коде Паскаля. Хотя это все еще немного некрасиво, оно избегает раздела asm.

Сначала объявите webkitAudioContext, а затем проверьте, назначен ли он:

var webkitAudioContext external 'webkitAudioContext' : JwebkitAudioContext;
var hasWebkitAudio := Boolean(Variant(webkitAudioContext));
Другие вопросы по тегам