Corona: звук не начинает воспроизводиться снова после воссоздания сцены

Я пытаюсь воспроизвести фоновый звук, только во время одной сцены. Когда эта сцена разрушена, звук должен исчезнуть, а затем остановиться. Затем, когда сцена воссоздается, звук должен начать воспроизводиться снова.

Вот что я пытаюсь:

local backgroundMusic
local backgroundMusicChannel

local function stopSound(event)
    audio.stop(event.channel)
    audio.dispose(event.handle)
    backgroundMusic = nil
end

function scene:create(event)
    backgroundMusic = audio.loadSound("music/intro.mp3")
    backgroundMusicChannel = audio.play(backgroundMusic, {loops = -1, fadein = 3000, onComplete = stopSound})
end

function scene:destroy(event)
    audio.fadeOut({channel = backgroundMusicChannel, time=2000})
end

Звук воспроизводится при первоначальном создании сцены и правильно затухает, но не воспроизводится снова при повторном создании сцены.

Когда я изменяю функцию уничтожения на:

function scene:destroy(event)
    audio.fadeOut({channel = backgroundMusicChannel, time=2000})
    audio.stop(backgroundMusicChannel)
end

звук не исчезает, потому что он немедленно останавливается, но он запускается снова правильно при следующем создании сцены.

Я также пробовал использовать audio.stopWithDelay, который правильно затухает, но точно так же не начинает воспроизводиться снова, когда сцена создается еще раз.

Если у кого-то есть какие-либо идеи о том, что здесь происходит, пожалуйста, дайте мне знать!


person Sarah    schedule 09.02.2016    source источник


Ответы (1)


Может ли проблема заключаться в том, что вы не можете (повторно) воспроизвести звук, если он еще не остановлен? Вы также никогда не избавляетесь от звука, когда сцена заканчивается. Внутри create остановите предыдущий звук, если он уже существует.

Лучше создать звук один раз и повторно использовать его при необходимости. Если вы используете loadStream, вам придется использовать audio.rewind() после его воспроизведения.

В документации по этому вопросу также указано, что вам, вероятно, следует использовать loadStream: https://docs.coronalabs.com/guide/media/audioSystem/index.html

person EinsteinK    schedule 09.02.2016
comment
Спасибо за ответ, но я останавливаю звук и избавляюсь от него. Вот что происходит в функции stopSound — она вызывается в onComplete аудиоканала. Я проверил, что эта функция вызывается. Я также пытался использовать loadStream без каких-либо результатов. - person Sarah; 09.02.2016
comment
Функция вызывается до или после загрузки новой сцены? - person EinsteinK; 09.02.2016
comment
После, так как это конец затухания. - person Sarah; 09.02.2016
comment
Я так и предполагал. Я думал, что проблема в том, что предыдущее аудио еще не было остановлено. - person EinsteinK; 10.02.2016
comment
Я дважды проверил, что звук на самом деле останавливается до того, как сцена будет воссоздана, и это так, так что проблема не в этом. Но на всякий случай я попробовал ваше предложение: вместо этого я приостанавливаю звук в методе onComplete и перематываю, возобновляю и затухаю в методе create. Звук по-прежнему не начинает воспроизводиться во второй раз. :( - person Sarah; 11.02.2016
comment
Вы уничтожили свою сцену после того, как перешли на второй экран. Потому что, если вы загрузили сцену, после уничтожения будет вызвана только сцена: функция создания. Проверьте второй раз, когда вызывается сцена: создание. - person AndroidUser; 12.02.2016