несколько вызовов audioCtx addModule () замораживают Chrome при загрузке с открытым инспектором - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю над загрузкой процессоров AudioWorklet из объектов OfflineAudioContext.Мой пример использования заключается в том, что я пытаюсь предварительно сгенерировать и отобразить визуальные данные о звуках, которые затем воспроизводю для пользователя.

Я пытаюсь использовать OfflineAudioContext с идеей записи processor.js для кеширования сгенерированного аудио, но у нас есть выход из этого.

Я использую Chrome и пока не нашел способа использовать AudioContext с FF или Safari.

// in Sound object #1
const offlineCtx1 = new OfflineAudioContext(2, 44100, 44100);
offlineCtx1.audioWorklet.addModule("processor.js")
     .then(() => log("first context loaded the processor"));

// ...
// in Sound object #2
const offlineCtx2 = new OfflineAudioContext(2, 44100, 44100);
offlineCtx2.audioWorklet.addModule("processor.js")
    .then(() => log("second context loaded the processor"));

Когда я пытаюсь добавить модуль в два разных контекста, происходит нечто забавное.Если инспектор закрыт, страница загружается нормально.Однако, если инспектор открыт, вкладка браузера до некоторой степени зависает.Вы не можете взаимодействовать со страницей или закрывать вкладку, но вы можете делать некоторые ограниченные действия в инспекторе.

Кажется, это какая-то проблема с синхронизацией: если вы ждете 1000 мс или для пользователявзаимодействие, чтобы инициировать второй addModule() вызов, затем он работает нормально.

На самом деле, лучший способ, который я нашел, это обойти: выстроить цепочку обещаний из звонка на .addModule() и подождать, пока первый ответ вернется, прежде чем запустить следующий.

Тем не менее, на практике для этого требуется, чтобы Обещания проходили через объекты очень глупо, просто чтобы убедиться, что отдельных объектов аудиоконтекста не просят добавить модуль нав то же время.Я имею в виду, что этот маленький код выглядит хорошо, но гораздо сложнее убедиться, что только один звуковой контекст добавляет модуль в приложение:

const offlineCtx1 = new OfflineAudioContext(2, 44100, 44100);
offlineCtx1.audioWorklet.addModule("processor.js")
    .then(() => log("first context loaded the processor") )
    .then(() => {
        const offlineCtx2 = new OfflineAudioContext(2, 44100, 44100);
        return offlineCtx2.audioWorklet.addModule("processor.js")
    })
    .then(() => log("second context loaded the processor") );

Очевидно, это какая-то проблема синхронизации, котораярешается путем обеспечения того, что это происходит последовательно.Я нахожусь на Chrome v 69.0.3497.100 (Официальная сборка) (64-разрядная версия)

Кто-нибудь имеет какие-либо идеи, почему это происходит?Или предложения по дальнейшей отладке?Инспектор Chrome не выводит никакой полезной информации нигде после того, как его запрограммировали.

Примеры:

1 Ответ

0 голосов
/ 02 октября 2018

Обновление (18.10.2008): эта проблема не воспроизводится в последней версии.(72.0.3584.0) См. Дополнительную информацию в записи о проблеме .

. Это явно похоже на ошибку.Я подал один через crbug.com, чтобы его можно было обработать.Для обнаружения виновного может потребоваться некоторое время, поскольку проблема связана с Web Audio, Worker и DevTools.

Тем временем, возможно, вы сможете заменить цепочку обещаний на async / await.По крайней мере, это даст вам лучшую читаемость в этом случае.

...