|
@@ -63,91 +63,127 @@ edlp_vars = {
|
|
this.fid;
|
|
this.fid;
|
|
this.audio = new Audio();
|
|
this.audio = new Audio();
|
|
// audio events
|
|
// audio events
|
|
- this.audio_events = ["loadedmetadata","progress","canplay","timeupdate","ended"];
|
|
|
|
|
|
+ this.audio_events = ["loadedmetadata","canplay","playing","pause","timeupdate","ended"];
|
|
|
|
|
|
// UI dom objects
|
|
// UI dom objects
|
|
- this.$container = $('<div id="audio-player">')
|
|
|
|
- .appendTo('header[role="banner"] .region-header');
|
|
|
|
- this.$timeline = $('<div>').addClass('time-line').appendTo(this.$container);
|
|
|
|
- this.$loader = $('<div>').addClass('loader').appendTo(this.$timeline);
|
|
|
|
- this.$cursor = $('<div>').addClass('cursor').appendTo(this.$timeline);
|
|
|
|
- this.$duration = $('<div>').addClass('duration').appendTo(this.$container);
|
|
|
|
- this.$currentTime = $('<div>').addClass('current-time').appendTo(this.$container);
|
|
|
|
-
|
|
|
|
- if (typeof AudioPlayer.initialized == "undefined") {
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.init = function(){
|
|
|
|
- // init audio events
|
|
|
|
- var fn = '';
|
|
|
|
- for (var i = 0; i < this.audio_events.length; i++) {
|
|
|
|
- fn = this.audio_events[i];
|
|
|
|
- // capitalize first letter of event (only cosmetic :p )
|
|
|
|
- fn = 'on'+fn.charAt(0).toUpperCase()+fn.slice(1);
|
|
|
|
- this.audio.addEventListener(
|
|
|
|
- this.audio_events[i],
|
|
|
|
- this[fn].bind(this),
|
|
|
|
- true);
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.loadSound = function(url){
|
|
|
|
- console.log('AudioPlayer loadSound : url', url);
|
|
|
|
- this.audio.src = url;
|
|
|
|
- // this.play();
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.play = function(){
|
|
|
|
- console.log('AudioPlayer play()');
|
|
|
|
|
|
+ this.$container = $('<div id="audio-player">');
|
|
|
|
+ // btns
|
|
|
|
+ this.$btns = $('<div>').addClass('btns').appendTo(this.$container);
|
|
|
|
+ this.$previous = $('<div>').addClass('previous').appendTo(this.$btns);
|
|
|
|
+ this.$playpause = $('<div>').addClass('play-pause').appendTo(this.$btns);
|
|
|
|
+ this.$next = $('<div>').addClass('next').appendTo(this.$btns);
|
|
|
|
+ // timeline
|
|
|
|
+ this.$timelinecont= $('<div>').addClass('time-line-container').appendTo(this.$container);
|
|
|
|
+ this.$timeline = $('<div>').addClass('time-line').appendTo(this.$timelinecont);
|
|
|
|
+ this.$loader = $('<div>').addClass('loader').appendTo(this.$timeline);
|
|
|
|
+ this.$cursor = $('<div>').addClass('cursor').appendTo(this.$timeline);
|
|
|
|
+ // time
|
|
|
|
+ this.$time = $('<div>').addClass('time').appendTo(this.$container);
|
|
|
|
+ this.$currentTime = $('<div>').addClass('current-time').html('00:00').appendTo(this.$time);
|
|
|
|
+ this.$duration = $('<div>').addClass('duration').html('00:00').appendTo(this.$time);
|
|
|
|
+
|
|
|
|
+ // hiding
|
|
|
|
+ this.hideTimer = false;
|
|
|
|
+ this.hideTimeMS = 10000;
|
|
|
|
+
|
|
|
|
+ this.init();
|
|
|
|
+ };
|
|
|
|
+ AudioPlayer.prototype = {
|
|
|
|
+ init(){
|
|
|
|
+ // append ui to document
|
|
|
|
+ this.$container.appendTo('header[role="banner"] .region-header');
|
|
|
|
+ // record timeline width
|
|
|
|
+ this.timeline_w = parseInt(this.$timeline.width());
|
|
|
|
+ // init audio events
|
|
|
|
+ var fn = '';
|
|
|
|
+ for (var i = 0; i < this.audio_events.length; i++) {
|
|
|
|
+ fn = this.audio_events[i];
|
|
|
|
+ // capitalize first letter of event (only cosmetic :p )
|
|
|
|
+ fn = 'on'+fn.charAt(0).toUpperCase()+fn.slice(1);
|
|
|
|
+ this.audio.addEventListener(
|
|
|
|
+ this.audio_events[i],
|
|
|
|
+ this[fn].bind(this),
|
|
|
|
+ true);
|
|
|
|
+ }
|
|
|
|
+ // init btns events
|
|
|
|
+ this.$playpause.on('click', this.togglePlayPause.bind(this));
|
|
|
|
+ // TODO: previous and next btns
|
|
|
|
+ },
|
|
|
|
+ setSRC(url){
|
|
|
|
+ console.log('AudioPlayer setSRC : url', url);
|
|
|
|
+ this.clearTimeOutToHide();
|
|
|
|
+ this.audio.src = url;
|
|
|
|
+ this.show();
|
|
|
|
+ },
|
|
|
|
+ onLoadedmetadata(){
|
|
|
|
+ var rem = parseInt(this.audio.duration, 10),
|
|
|
|
+ mins = Math.floor(rem/60,10),
|
|
|
|
+ secs = rem - mins*60;
|
|
|
|
+ this.$duration.html('<span>'+(mins<10 ? '0':'')+mins+':'+(secs<10 ? '0':'')+secs+'</span>');
|
|
|
|
+ this.updateLoadingBar();
|
|
|
|
+ },
|
|
|
|
+ updateLoadingBar(){
|
|
|
|
+ this.$loader.css({
|
|
|
|
+ 'width':parseInt((100 * this.audio.buffered.end(0) / this.audio.duration), 10)+'%'
|
|
|
|
+ });
|
|
|
|
+ if( this.audio.buffered.end(0) < this.audio.duration ){
|
|
|
|
+ // loop through this function until file is fully loaded
|
|
|
|
+ var that = this;
|
|
|
|
+ window.requestAnimationFrame(that.updateLoadingBar.bind(that));
|
|
|
|
+ }else{
|
|
|
|
+ console.log('Audio fully loaded');
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ onCanplay(){
|
|
|
|
+ this.play();
|
|
|
|
+ },
|
|
|
|
+ play(){
|
|
|
|
+ this.audio.play();
|
|
|
|
+ },
|
|
|
|
+ togglePlayPause(){
|
|
|
|
+ if(this.audio.paused){
|
|
this.audio.play();
|
|
this.audio.play();
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.onLoadedmetadata = function(){
|
|
|
|
- var rem = parseInt(this.audio.duration, 10),
|
|
|
|
- mins = Math.floor(rem/60,10),
|
|
|
|
- secs = rem - mins*60;
|
|
|
|
- this.$duration.html('<span>'+(mins<10 ? '0':'')+mins+':'+(secs<10 ? '0':'')+secs+'</span>');
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.onProgress = function(){
|
|
|
|
- // var myBuffered = this.audio.buffered;
|
|
|
|
- // var mySeekable = this.audio.seekable;
|
|
|
|
- if( this.audio.buffered.length ){
|
|
|
|
- // var fromPercent = this.fromPercent;
|
|
|
|
- // var value = percentLoad - fromPercent;
|
|
|
|
- // if( value<0 ) value = 0;
|
|
|
|
- // this.$loadingBar.css({width: value + '%',marginLeft:fromPercent + '%'});
|
|
|
|
- this.$loader.css({
|
|
|
|
- 'width':parseInt(((this.audio.buffered.end(0) / this.audio.duration) * 100), 10)+'%'
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.onCanplay = function(){
|
|
|
|
- this.play();
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.onTimeupdate = function(){
|
|
|
|
- // console.log('Audio update()', this.audio.currentTime);
|
|
|
|
-
|
|
|
|
- this.$cursor.css({
|
|
|
|
- 'left':(this.audio.currentTime/this.audio.duration * 50)+"px"
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- var rem = parseInt(this.audio.currentTime, 10),
|
|
|
|
- mins = Math.floor(rem/60,10),
|
|
|
|
- secs = rem - mins*60;
|
|
|
|
- this.$currentTime.html('<span>'+(mins<10 ? '0':'')+mins+':'+(secs<10 ? '0':'')+secs+'</span>');
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.prototype.onEnded = function(){
|
|
|
|
- console.log('AudioPlayer onEnded');
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- AudioPlayer.initialized = true;
|
|
|
|
- this.init();
|
|
|
|
|
|
+ }else{
|
|
|
|
+ this.audio.pause();
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ onPlaying(){
|
|
|
|
+ this.$container.addClass('is-playing');
|
|
|
|
+ },
|
|
|
|
+ onPause(){
|
|
|
|
+ this.$container.removeClass('is-playing');
|
|
|
|
+ },
|
|
|
|
+ onTimeupdate(){
|
|
|
|
+ // move cursor
|
|
|
|
+ this.$cursor.css({
|
|
|
|
+ 'left':(this.audio.currentTime/this.audio.duration * this.timeline_w)+"px"
|
|
|
|
+ });
|
|
|
|
+ // update time text display
|
|
|
|
+ var rem = parseInt(this.audio.currentTime, 10),
|
|
|
|
+ mins = Math.floor(rem/60,10),
|
|
|
|
+ secs = rem - mins*60;
|
|
|
|
+ this.$currentTime.html('<span>'+(mins<10 ? '0':'')+mins+':'+(secs<10 ? '0':'')+secs+'</span>');
|
|
|
|
+ },
|
|
|
|
+ onEnded(){
|
|
|
|
+ this.$container.removeClass('is-playing');
|
|
|
|
+ this.timeOutToHide();
|
|
|
|
+ },
|
|
|
|
+ show(){
|
|
|
|
+ this.$container.addClass('visible');
|
|
|
|
+ },
|
|
|
|
+ timeOutToHide(){
|
|
|
|
+ this.clearTimeOutToHide();
|
|
|
|
+ this.hideTimer = setTimeout(this.hide.bind(this), this.hideTimeMS);
|
|
|
|
+ },
|
|
|
|
+ clearTimeOutToHide(){
|
|
|
|
+ if(this.hideTimer){
|
|
|
|
+ clearTimeout(this.hideTimer);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ hide(){
|
|
|
|
+ this.$container.removeClass('visible');
|
|
}
|
|
}
|
|
- };
|
|
|
|
-
|
|
|
|
|
|
+ }
|
|
// ___ _ _ ___
|
|
// ___ _ _ ___
|
|
// / __| __ _ _ ___| | | _ ) __ _ _ _ ___
|
|
// / __| __ _ _ ___| | | _ ) __ _ _ _ ___
|
|
// \__ \/ _| '_/ _ \ | | _ \/ _` | '_(_-<
|
|
// \__ \/ _| '_/ _ \ | | _ \/ _` | '_(_-<
|
|
@@ -275,7 +311,7 @@ edlp_vars = {
|
|
})
|
|
})
|
|
.on('corpus-cliked-on-node', function(e) {
|
|
.on('corpus-cliked-on-node', function(e) {
|
|
console.log('theme : corpus-cliked-on-node', e);
|
|
console.log('theme : corpus-cliked-on-node', e);
|
|
- _audio_player.loadSound(e.target_node.audio_url);
|
|
|
|
|
|
+ _audio_player.setSRC(e.target_node.audio_url);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|