Я знаю, что это не тот ответ, который вы хотите услышать, но остановить это невозможно, независимо от того, написали ли вы свою собственную флеш-библиотеку для воспроизведения звука или нет.
Для всех, кто сказал: "У меня это работает нормально!" попробуйте изменить размер или переместить окно браузера, когда демонстрация плаката закончится. Вы услышите больше, чем просто небольшую задержку. Это наиболее заметно в Firefox и IE, но даже Chrome это почувствует.
Что еще хуже, если вы нажмете и будете удерживать мышь в поле закрытия окна браузера, звук полностью остановится, пока вы не отпустите кнопку мыши (вы можете отпустить ее за пределами окна закрытия и фактически не закрывать окно, к вашему сведению ).
Что здесь происходит?
Оказывается, что когда вы начинаете изменять размер или перемещаться по окну браузера, браузер пытается выполнить несколько задач, связанных с изменением свойств окна, с тем, чтобы не отставать от сценария JavaScript, происходящего в окне. Он сокращает окно, когда это необходимо.
Когда вы удерживаете мышь над окном закрытия в окне браузера, время полностью останавливается. Это то, что происходит с меньшими приращениями, когда вы изменяете размер или перемещаете окно: время в мире javascript стоит на месте небольшими, единичными частями (или большими частями, в зависимости от того, насколько медленна ваша машина).
Теперь вы можете сказать: «Конечно, изменение размера браузера или удерживание кнопки закрытия приводит к приостановке работы браузера, но обычно этого не происходит». К сожалению, вы были бы не правы.
Это происходит постоянно, на самом деле. Я запустил тесты, и оказалось, что даже если оставить окно браузера полностью неподвижным, не касаясь мыши и не касаясь клавиатуры, фоновые процессы на компьютере могут все еще вызывать «икоты», что означает, что в течение коротких периодов времени (возможно, всего несколько миллисекунд) время в браузере «стоит на месте» с совершенно случайными интервалами вне вашего контроля.
Что я подразумеваю под "стоять на месте"? Допустим, у вас есть вызов setInterval () (это относится и к setTimeout), который выполняется каждые 33 миллисекунды (около 30 кадров в секунду). Теперь вы ожидаете, что через каждые 33 миллисекунды "реального мира" будет вызываться ваша функция. И в большинстве случаев это правда.
Но когда начинают происходить «икоты», ваш вызов setInterval может произойти за 43 миллисекунды. Что произошло за 10 мс? Ничего такого. Время остановилось. В браузере ничего не обновлялось. Если у вас воспроизводился звук, он продолжит воспроизведение, но никакие НОВЫЕ звуковые вызовы не начнут воспроизводиться, потому что JavaScript вообще не выполняется. Если бы у вас было 5 запущенных функций setInterval (), все они были бы приостановлены на 10 мсек в какой-то момент.
Единственный способ сказать, что «время остановилось» - это опросить реальное время в ваших обратных вызовах функции setInterval. Вы сможете увидеть, что браузер пытается поддерживать большую часть времени, но когда вы начнете изменять размер окна или делать что-то стрессовое, интервалы будут длиннее, чем обычно, но весь ваш код останется синхронизированным (Я создаю игры, используя эту технику, так что вы увидите, что все ваши обновления игр происходят синхронно, но только слегка заикаются).
Обычно я должен отметить, что эти заикания совершенно незаметны, и если вы не напишите функцию для записи реального времени во время setInterval (как я делал в моем собственном тестировании), вы даже не узнаете об этом. Но это становится проблемой, если вы пытаетесь создать некоторый тип повторяющегося звука (например, звуковой сигнал на фоне Астериодов), используя повторяющиеся вызовы play ().
Мое предложение? Если у вас есть звук, который, как вы знаете, будет зацикливаться, дайте ему большую длительность, может быть, 10 секунд, и вы с меньшей вероятностью заметите икоту (теперь графика на экране все еще может сбиваться, но вы облажались) ).
Если вы пишете игру и у главного героя стреляют из пулемета, не делайте 10 быстрых вызовов последовательности к playSound ('singleShot'), не делайте один вызов playSound ('machineGunFire10Rounds') или что-то вдоль этих линий.
Чтобы обойти это, вам придется проделать некоторую хитрость, но в большинстве случаев все будет в порядке.
Похоже, что апплеты Flash выполняются в процессе, который как-то менее подвержен влиянию всего этого «замораживания времени», происходящего в обычной среде браузера / javascript, но я все еще могу добиться этого даже по вашей ссылке на ToneMatrix Например, изменив размер или переместив окно браузера.
Но Flash все еще выглядит намного лучше, чем javascript. Когда я оставлю браузер в покое, я буду готов поспорить, что Flash не зависает в течение какого-то времени и интервалы всегда работают вовремя.
ТЛ; др:
- вы ввернуты в то, что вы надеетесь достичь
- попробуйте разобраться с этим, используя некоторые обходные пути
- переписать ваш проект на чистом flash (без JavaScript)
- ждите, пока браузеры станут лучше (Firefox 4 получает новый движок javascript под названием JaegerMonkey , который будет интересно посмотреть)
- откуда мне все это знать? Я провел много тестов и логов с аудио-вызовами javascript, setInterval и soundManager / html5