Я пытаюсь понять аспект воспроизведения примеров JavaScript Web Web API.В частности, я использую API-интерфейс Web Audio для воспроизведения очень короткого сэмпла (на самом деле «метка клика» для метронома).
Вот что я делаю:
let sample = this.setupSample(this.audioContext, click1);
sample.start(time);
sample.stop(time + this.noteLength);
Этот фрагмент кода работает, если я запускаю приложение с рабочего стола (мой компьютер), но когда я пытаюсь запустить приложение с мобильного телефона, как только я нажимаю кнопку «Пуск» для воспроизведения метронома, я получаю следующую ошибку:
InvalidStateError: Объект находится в недопустимом состоянии.
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;
}