2015-06-23 9 views
5

Próbuję użyć zdarzenia onfinish dla metody Soundcloud Javascript SDK Stream. Mam następujący kod, który działa, z wyjątkiem tego, że zdarzenie onfinish nigdy się nie uruchamia. Wszelkie pomysły byłyby bardzo pomocne.Soundcloud Javascript SDK 2.0 - Zdarzenie stream onfinish nie jest wykonywane

var soundPlayer; 
var smOptions = { 
    useHTML5Audio: true, 
    preferFlash: false, 
    onfinish: function() { 
     console.log('Finished playing'); 
    } 
}; 

SC.initialize({ 
    client_id: "..." 
}); 

SC.stream("/tracks/12345", smOptions, function(sound) { 
    soundPlayer = sound; 
}); 

Z góry dziękuję!

Aktualizacja:

Od onfinish nie działa Używam metody getstate() na obiekcie SoundPlayer który jest zwracany w SC.stream(). Na szczęście istnieje unikalny stan o nazwie "zakończony" po zakończeniu transmisji. To jest to, co zaimplementowałem:

setInterval(function() { 
    if (soundPlayer != null && soundPlayer.getState() == "ended") { 
     soundPlayer.play(); 
    } 
}, 250); 

Nie jestem z tego zadowolony, ale daje mi to doświadczone pragnienie i spełnia wymagania. Naprawdę mam nadzieję, że ktoś może pomóc rzucić trochę światła na to, dlaczego udokumentowana metoda onfinish nie jest zwalniana.

Ktoś ma jakieś pomysły?

Odpowiedz

2

Oto obejście z wywołania zwrotne zamiast odpytywania. Działa poprzez kierowanie dynamicznego elementu odtwarzacza audio html5, który sam rejestruje wydarzenie natywne. Nie oczekuję, że będzie działać w trybie awaryjnym, ale wymuszenie html5 może zakończyć rozwiązanie, dopóki SDK v2 nie zwróci obiektu dźwiękowego.

var soundPlayer; 
var smOptions = { 
    useHTML5Audio: true, 
    preferFlash: false 
}; 

SC.initialize({ 
    client_id: "..." 
}); 

SC.stream("/tracks/12345", smOptions, function(sound) { 
    soundPlayer = sound; 
    html5Audio = sound._player._html5Audio; 
    html5Audio.addEventListener('ended', function(){ console.log('event fired: ended'); }); 
}); 
+0

Dzięki, że działa dobrze. Czy jest jakiś pomysł, dlaczego metoda stream nie zwraca obiektu dźwiękowego w wywołaniu zwrotnym, jak mówi dokumentacja? https://developers.soundcloud.com/docs/api/sdks#streaming – Mike

+0

Bez problemu. Nie mam więcej informacji o SDK, ale zaktualizuję ten wątek, jeśli dowiem się więcej. Zrób to samo, jeśli chcesz. –

+0

Działa to dla SDK 2, ale ponieważ SDK 3 jest wydany (październik '15), to już nie działa. jakieś pomysły? –

0

Mam ten sam problem, nie mogę wywołać żadnego z wywołań zwrotnych. Oto prosty przykład, działający poza callbackami. (Powinno być komentarz zamiast odpowiedź, ale nie mam SO reputację, aby to zrobić.)

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
<h1>Sound Cloud API callback test</h1> 
<script src="//connect.soundcloud.com/sdk-2.0.0.js"></script> 
<script type="text/javascript"> 
    SC.initialize({ 
     client_id: "YOUR_CLIENT_ID" 
    }); 

    SC.stream(
      '/tracks/293', 
      { 
       onload: function() { console.log("Does not fire."); }, 
       onplay: function() { console.log("Does not fire."); }, 
       onfinish: function() { console.log("Does not fire."); } 
      }, 
      function(sound) { sound.play(); }); 
</script> 
</body> 
</html> 
+0

Dzięki za komentarz to dobrze wiedzieć, że nie wariuję. :) Mam nadzieję, że możemy tutaj z zespołu Soundcloud lub kogoś, kto jest zaznajomiony z tym problemem. Nie mogę znaleźć innych osób mających ten problem. A cały kod jaki widzę na SO używa onfinish, jak go zaimplementowałem. Skrzyżowane palce! – Mike

+0

Mogę przynajmniej zweryfikować, że jeśli zwariowałeś, ja też! Dziękujemy za opublikowanie tego obejścia. Mam nadzieję, że nie będziemy go potrzebować na stałe, ale miło wiedzieć, że tam jest. – Catcher

1

Działa to doskonale z SDK w wersji 3

SC.stream('/tracks/293', function(player) { 
    player.on('finish', function() { 
    stopPlayer(); 
    }); 
}); 
+0

Czy SDK wersji 3 nie zwraca obiektu Obietnicy? Nie sądzę, żeby to rozwiązanie działało. Testowałem wersję 3.1.2, a wywołanie zwrotne nigdy nie jest wywoływane. Zamiast tego użyty zostanie '.then (fn)'. –

Powiązane problemy