IonDen/ion.sound

how can i play music in ready_callback?

hiphome opened this issue · 8 comments

i need to start playing 2 files in one time. if i could start playing in callback, when files ready to play, it will be done, but when i playing files in callback i get error "Uncaught TypeError: Cannot read property 'play' of undefined"

Hi, show me some code.

ion.sound({
    sounds: [
        {
            name: "click",
            volume: 0.4
        },
        {
            name: "music",
            volume: 0.5,
            loop: true
        },
        {
            name: "music2",
            volume: 0.0,
            loop: true
        }
    ],
    volume: 0.5,
    path: "/themes/sound-design/assets/sounds/",
    preload: true,
    ready_callback: myReadyCallback
});
function myReadyCallback(obj){
  ion.sound.play(obj.name);
}

after adding some delay, its working

function myReadyCallback(obj){
  if (obj.name == "music2") {
    setTimeout(function(){
    ion.sound.play("music");
    ion.sound.play("music2");
    }, 100);
  }
}

but not every time

a u russian?

в общем смысл такой что при запуске сайта должно играть 2 файла, один из которых на нулевой громкости, громкость прибавляется и убавляется во время движения мыши, в общем всё реализовано, кроме момента что надо запускать файлы строго одновременно когда они оба будут готовы, с последним кодом работает, но через раз, если раньше загружается первый файл, то всё нормально, если второй файл, то первый не запускается тк он еще не успел подгрузиться

Понятно. Смотри, реди_коллбэк будет вызван несколько раз, по разу для каждого подключенного звука. Эти вызовы будут, логично, в разное время.

Что тебе нужно:

  1. Создать внешнюю переменную, скажем counter = 0
  2. При каждом вызове ready_callback прибавлять counter++
  3. Как только каунтер достингет нужной цифры (в твоем случае 2), это будет значить что оба звука загружены и можно запускать.
let counter = 0;
let num_of_sounds = 2;

function myReadyCallback () {
    counter++;

    if (counter === num_of_sounds) {
        play();
    }
}

function play() {
    ion.sound.play("music");
    ion.sound.play("music2");
}

отлично! спасибо) только без тайм аута всё равно выдаёт ошибку "Uncaught TypeError: Cannot read property 'play' of undefined", ставлю тайм аут небольшой и всё работает! в общем можно оставлять так, но если это какой-то баг, присмотритесь.

function play() { setTimeout(function(){ ion.sound.play("music"); ion.sound.play("music2"); }, 100); }