slider and volume ctrl
This commit is contained in:
parent
35a9abc7d7
commit
d2e3aa0880
5 changed files with 206 additions and 104 deletions
|
@ -22,9 +22,12 @@ var Player = Controller.inherit({
|
|||
this.views = Object.create(null);
|
||||
this.mode = PlayerMode.straight.playback;
|
||||
this.progress = new ProgressModel();
|
||||
this.volume = new Slider();
|
||||
this.volume.setValue(1);
|
||||
this.progress.on("seekingStart", this._onSeekingStart, this);
|
||||
this.progress.on("seekingEnd", this._onSeekingEnd, this);
|
||||
this.progress.on("seek", this._onSeek, this);
|
||||
this.progress.enable(false);
|
||||
this.volume.on("value", this._onVolume, this);
|
||||
this._audio = null;
|
||||
this._createStateMachine();
|
||||
this._createPlayingInfrastructure();
|
||||
|
@ -123,6 +126,8 @@ var Player = Controller.inherit({
|
|||
_createPlayingInfrastructure: function() {
|
||||
this._ctx = new AudioContext();
|
||||
this._decoder = new Mp3Decoder();
|
||||
this._gainNode = this._ctx.createGain();
|
||||
this._gainNode.connect(this._ctx.destination);
|
||||
this._currentTime = 0;
|
||||
this._seekingTime = 0;
|
||||
this._buffers = [];
|
||||
|
@ -212,14 +217,14 @@ var Player = Controller.inherit({
|
|||
if (offset > 0) {
|
||||
var src = this._ctx.createBufferSource();
|
||||
src.buffer = sb;
|
||||
src.connect(this._ctx.destination);
|
||||
src.connect(this._gainNode);
|
||||
src.start(0, Math.abs(startTime - this._ctx.currentTime));
|
||||
this._sources.push(src);
|
||||
}
|
||||
} else {
|
||||
var src = this._ctx.createBufferSource();
|
||||
src.buffer = sb;
|
||||
src.connect(this._ctx.destination);
|
||||
src.connect(this._gainNode);
|
||||
src.start(startTime);
|
||||
this._sources.push(src);
|
||||
}
|
||||
|
@ -243,10 +248,10 @@ var Player = Controller.inherit({
|
|||
_onInterval: function() {
|
||||
if (this._audio && this._audio.initialized && seekingStates.indexOf(this._fsm.state()) === -1) {
|
||||
var duration = this._audio.getDuration();
|
||||
this.progress.setPlayback(this.getCurrentPlaybackTime() / duration);
|
||||
this.progress.setValue(this.getCurrentPlaybackTime() / duration);
|
||||
this._checkIfEnough();
|
||||
|
||||
if (this.progress.playback >= 0.9999) {
|
||||
if (this.progress.value >= 0.9999) {
|
||||
var next = this.controls[ItemType.straight.next];
|
||||
if (next && next.enabled) {
|
||||
next.activate();
|
||||
|
@ -289,11 +294,6 @@ var Player = Controller.inherit({
|
|||
this._audio = null;
|
||||
}
|
||||
},
|
||||
_onSeek: function(progress) {
|
||||
if (seekingStates.indexOf(this._fsm.state()) !== -1) {
|
||||
this.progress.setPlayback(progress);
|
||||
}
|
||||
},
|
||||
_onSeekingStart: function() {
|
||||
this._fsm.manipulation("startSeeking");
|
||||
},
|
||||
|
@ -319,14 +319,14 @@ var Player = Controller.inherit({
|
|||
if (offset > 0) {
|
||||
var src = this._ctx.createBufferSource();
|
||||
src.buffer = buffer;
|
||||
src.connect(this._ctx.destination);
|
||||
src.connect(this._gainNode);
|
||||
src.start(0, Math.abs(startTime));
|
||||
this._sources.push(src);
|
||||
}
|
||||
} else {
|
||||
var src = this._ctx.createBufferSource();
|
||||
src.buffer = buffer;
|
||||
src.connect(this._ctx.destination);
|
||||
src.connect(this._gainNode);
|
||||
src.start(this._ctx.currentTime + startTime);
|
||||
this._sources.push(src);
|
||||
}
|
||||
|
@ -340,7 +340,7 @@ var Player = Controller.inherit({
|
|||
switch (e.newState) {
|
||||
case "initial":
|
||||
if (e.manipulation === "noController") {
|
||||
|
||||
this.progress.enable(false);
|
||||
this.removeForeignController(this._audio);
|
||||
this._audio.destructor();
|
||||
this._audio = null;
|
||||
|
@ -350,6 +350,7 @@ var Player = Controller.inherit({
|
|||
break;
|
||||
case "initialPlaying":
|
||||
if (e.manipulation === "noController") {
|
||||
this.progress.enable(false);
|
||||
this._ctx.suspend();
|
||||
|
||||
this.removeForeignController(this._audio);
|
||||
|
@ -373,10 +374,15 @@ var Player = Controller.inherit({
|
|||
}
|
||||
break;
|
||||
case "buffering":
|
||||
if (e.oldState === "hasController") {
|
||||
this.progress.enable(true);
|
||||
}
|
||||
break;
|
||||
case "bufferingPlaying":
|
||||
if (e.oldState === "playing") {
|
||||
this._ctx.suspend();
|
||||
} else if (e.oldState === "hasControllerPlaying") {
|
||||
this.progress.enable(true);
|
||||
}
|
||||
break;
|
||||
case "seeking":
|
||||
|
@ -421,6 +427,10 @@ var Player = Controller.inherit({
|
|||
break;
|
||||
}
|
||||
},
|
||||
_onVolume: function(volume) {
|
||||
this._gainNode.gain.cancelScheduledValues(this._ctx.currentTime);
|
||||
this._gainNode.gain.exponentialRampToValueAtTime(volume, this._ctx.currentTime + 0.01);
|
||||
},
|
||||
_removeControl: function(type) {
|
||||
var ctrl = this.controls[type];
|
||||
if (ctrl !== undefined) {
|
||||
|
@ -553,26 +563,41 @@ var audioPortion = 1024 * 50; //bytes to download for each portion
|
|||
var threshold = 2; //seconds to buffer before playing
|
||||
var intervalPrecision = 100; //millisecond of how often to check the playback
|
||||
|
||||
var ProgressModel = Model.inherit({
|
||||
className: "ProgressModel",
|
||||
var Slider = Model.inherit({
|
||||
className: "Slider",
|
||||
constructor: function(properties) {
|
||||
Model.fn.constructor.call(this, properties);
|
||||
|
||||
this.load = 0;
|
||||
this.playback = 0;
|
||||
this.enabled = true;
|
||||
this.value = 0;
|
||||
this.initialized = true;
|
||||
},
|
||||
enable: function(en) {
|
||||
if (en !== this.enabled) {
|
||||
this.enabled = en;
|
||||
this.trigger("enabled", en);
|
||||
}
|
||||
},
|
||||
setValue: function(p) {
|
||||
if (p !== this.value) {
|
||||
this.value = p;
|
||||
this.trigger("value", p);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var ProgressModel = Slider.inherit({
|
||||
className: "ProgressModel",
|
||||
constructor: function(properties) {
|
||||
Slider.fn.constructor.call(this, properties);
|
||||
|
||||
this.value = 0;
|
||||
},
|
||||
setLoad: function(l) {
|
||||
if (l !== this.load) {
|
||||
this.load = l;
|
||||
this.trigger("load", l);
|
||||
}
|
||||
},
|
||||
setPlayback: function(p) {
|
||||
if (p !== this.playback) {
|
||||
this.playback = p;
|
||||
this.trigger("playback", p);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue