JavaScript Web Audio API и примеры остановки

Я пытаюсь понять аспект воспроизведения образцов JavaScript Web Audio API. В частности, я использую API веб-аудио для воспроизведения очень короткого семпла (на самом деле семпл «щелчок» для метронома).

Вот что я делаю:

let sample = this.setupSample(this.audioContext, click1);
sample.start(time);
sample.stop(time + this.noteLength);

Этот фрагмент кода работает, если я запускаю приложение с настольного компьютера (моего компьютера), но когда я пытаюсь запустить приложение с мобильного устройства, как только я нажимаю кнопку «Пуск» для воспроизведения метронома, я получаю следующую ошибку:

InvalidStateError: The object is in an invalid state.

93|   sample.stop(time + this.noteLength);

Первое, что я попробовал, - это прокомментировать эту строку:

let sample = this.setupSample(this.audioContext, click1);
sample.start(time);
// sample.stop(time + this.noteLength);

Таким образом, приложение корректно работает как с настольных компьютеров, так и с мобильных.

Итак, мне кажется, что вызывать stop () для уже завершившейся выборки не нужно, а может быть, и неправильно. Отсюда мой вопрос: неправильно ли вызывать stop () для уже завершенного образца? Должен ли я считать, что он неявно вызывается, если образец остановился (закончился) сам по себе? Кроме того, почему я не получаю эту ошибку InvalidStateError с рабочего стола?

Спасибо.

Обновлено: для большей ясности вот что делает setupSample:

setupSample = (audioContext, samplePath) => {
    const source = audioContext.createBufferSource();
    const myRequest = new Request(samplePath);

    fetch(myRequest).then(function(response) {
      return response.arrayBuffer();
      }).then(function(buffer) {
           audioContext.decodeAudioData(buffer, function(decodedData) {
             source.buffer = decodedData;
             source.connect(audioContext.destination);
           })
        })
     return source;
}

Насколько я могу судить, stop не является методом, определенным в API веб-аудио. Что возвращает setupSample?

Boaz 09.12.2018 12:02

Он возвращает источник, подключенный к месту назначения AudioContext. Я добавил все определение метода в свой вопрос.

Zeno 09.12.2018 12:20

Когда time присваивается значение? Возможно ли, что вы устанавливаете время остановки как время в прошлом? Я всегда стараюсь использовать context.currentTime вместо того, чтобы назначать его переменной, где могу. ИЛИ Возможно, буфер не полностью инициализирован данными, которые вы ему передаете. Поэтому вы каким-то образом запускаете / останавливаете неполный буфер.

Stuart Memo 09.12.2018 23:13
time - это переменная, изначально установленная на 0, затем после каждой доли она увеличивается на значение secondsPerBeat (то есть сколько секунд длится каждый удар). Так что не должно быть проблем с установкой времени остановки в прошлом. Кроме того, я провел тест с использованием осциллятора вместо образца, и у меня не было ошибки на stop(). Следовательно, я думаю, что ошибка вызывает stop() на уже законченном семпле. Тем не менее, я не могу понять, почему я получаю ошибку только на мобильном телефоне.
Zeno 11.12.2018 21:37

@ Boaz-ReinstateMonica, stop унаследован от родительского класса AudioScheduledSourceNode. MDN указывает Multiple calls to stop() are allowed., но не упоминает о вызове stop на не воспроизводящемся источнике

junvar 03.04.2020 22:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
205
0

Другие вопросы по теме