2013-08-28 38 views
5

Tôi đang cố gắng tạo trình phát media player riêng của mình bằng các tùy chọn được cung cấp bởi cả SoundManager2 và Soundcloud.Javascript: Soundmanager2 và gọi lại sự kiện Soundcloud

Đây là mã hiện tại của tôi:

SC.stream('/tracks/' + this.media.mediaId, function(audio){ 
      audio.load({ 
       onload : function(){ 
        var duration = this.duration; 

       }, 
       onfinish : function(){ 
        self.updatePlayButton(); 
        console.log('Finished'); 
       }, 
       onresume : function(){ 
        self.updatePlayButton(); 
        console.log("resumed"); 
       }, 
       onstop : function(){ 
        self.updatePlayButton(); 
        console.log("Stopped"); 
       }, 
       onpause : function() { 
        self.updatePlayButton(); 
        console.log('Paused'); 
       }, 
       whileplaying : function() 
       { 
        console.log(this.position); 
        self.updateScrubber(this.position/(this.duration/100)); 
        self.$timeLeft.text(self.formatTime(this.position/1000)); 
        console.log(totalPercent,'My position'); 
       } 

      }); 
      self.audio = audio.sID; 
      self.registerEvents(); 
     }); 

tôi chơi âm thanh sử dụng:

soundManager.getSoundById(self.audio).togglePause(); 

Vở kịch âm thanh, và tất cả các callbacks được bắn cho phù hợp. Nhưng sau khi gọi lại "onfinish", khi tôi nhấn play một lần nữa nó sẽ phát lại âm thanh, nhưng nó sẽ không cháy bất kỳ sự kiện nào.

Tôi đã làm gì sai?

Trả lời

4

Theo tài liệu cho SC.stream() "Tùy chọn" đối tượng có thể được thông qua tại như là đối số thứ hai:

SC.stream(trackPath, [options], [callback])

Các tùy chọn sẽ được liên kết với soundObject chính nó, vì vậy bạn sẽ không cần phải khai báo lại khi gọi các phương thức riêng lẻ như .load().play()

Thử thực hiện cuộc gọi như sau:

var myOptions = { 
    onload : function() { 
    var duration = this.duration; 
    }, 
    onfinish : function(){ 
    self.updatePlayButton(); 
    console.log('Finished'); 
    }, 
    onresume : function(){ 
    self.updatePlayButton(); 
    console.log("resumed"); 
    }, 
    onstop : function(){ 
    self.updatePlayButton(); 
    console.log("Stopped"); 
    }, 
    onpause : function() { 
    self.updatePlayButton(); 
    console.log('Paused'); 
    }, 
    whileplaying : function() { 
    console.log(this.position); 
    self.updateScrubber(this.position/(this.duration/100)); 
    self.$timeLeft.text(self.formatTime(this.position/1000)); 
    console.log(totalPercent,'My position'); 
    } 
} 

SC.stream('/tracks/' + this.media.mediaId, myOptions, function(audio){ 
    audio.load(); 
    self.audio = audio.sID; 
    self.registerEvents(); 
}); 

Có một số điều kỳ lạ khác về mã của bạn, chẳng hạn như không làm bất cứ điều gì với biến số duration bên trong hàm onload. Ngoài ra, bằng cách sử dụng một biến self trong khi cũng sử dụng this kết thúc lên trông giống như bạn không chắc chắn nếu bạn đang viết Python hoặc JavaScript, nhưng có thể nó có ý nghĩa với bạn.

Hy vọng rằng việc đính kèm các tùy chọn vào soundObject theo cách này sẽ giải quyết vấn đề tức thì của bạn. Chúc may mắn!

+1

Chỉ cần rõ ràng, có vẻ như @ menzo-wijmenga đang sử dụng mẫu thiết kế 'var self = this' tương đối phổ biến này. Bộ điều khiển có thể có các phương thức như 'updatePlayButton' và' updateTimeLeft' trong khi truy cập thuộc tính 'duration' hoặc' position' của tùy chọn âm thanh thông qua sự kiện ràng buộc (tức là 'self' chỉ bộ điều khiển đang gọi luồng, trong khi' this' là đối tượng âm thanh). – elreimundo

Các vấn đề liên quan