Как я могу использовать 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));