derping around. ugh

This commit is contained in:
Andrew Kelley 2014-04-01 23:28:07 -07:00
parent 1631fdd10f
commit 091a24ee9d

View file

@ -318,7 +318,7 @@ function startEncoderDetach(self, cb) {
Player.prototype.refreshManualTimeInterval = function() {
var self = this;
var wantManualTime = !self.hardwarePlayback;
var wantManualTime = !self.hardwarePlayback && !self.desiredEncoderAttachState;
if (wantManualTime && !self.manualTimeInterval) {
self.manualTimeInterval = setInterval(checkNowPlaying, 100);
} else if (!wantManualTime && self.manualTimeInterval) {
@ -341,14 +341,6 @@ Player.prototype.refreshManualTimeInterval = function() {
}
};
Player.prototype.getBufferedByteCount = function() {
var total = 0;
for (var i = 0; i < this.recentBuffers.length; i += 1) {
total += this.recentBuffers[i].buffer.length;
}
return total;
};
Player.prototype.getBufferedSeconds = function() {
if (this.recentBuffers.length < 2) return 0;
var curBuf = this.recentBuffers[0];
@ -366,7 +358,6 @@ Player.prototype.getBufferedSeconds = function() {
prevBuf = buf;
}
totalTime += prevBuf.pos - curBuf.pos;
console.log("bufferedSeconds", totalTime);
return totalTime;
};
@ -378,33 +369,51 @@ Player.prototype.attachEncoder = function(cb) {
if (self.flushEncodedInterval) return cb();
console.info("first streamer connected - attaching encoder");
self.flushEncodedInterval = setInterval(flushEncoded, 10);
self.flushEncodedInterval = setInterval(flushEncoded, 20);
self.grooveEncoder.on('buffer', onBuffer);
self.refreshManualTimeInterval();
startEncoderAttach(self, cb);
function onBuffer() {
if (!self.desiredEncoderAttachState) return;
if (self.hardwarePlayback) return;
var encodeHead = self.grooveEncoder.position();
var decodeHead = self.groovePlaylist.position();
var prevCurrentTrack = self.currentTrack;
if (encodeHead.item) {
var nowMs = (new Date()).getTime();
var posMs = encodeHead.pos * 1000;
self.trackStartDate = new Date(nowMs - posMs);
self.currentTrack = self.grooveItems[encodeHead.item.id];
} else if (!decodeHead.item) {
// both play head and decode head are null. end of playlist.
console.log("encoder: end of playlist");
self.currentTrack = null;
}
if (prevCurrentTrack !== self.currentTrack) {
playlistChanged(self);
self.emit('currentTrack');
}
}
function flushEncoded() {
// get rid of old items
var buf;
var delCount = 0;
while (buf = self.recentBuffers[0]) {
var thisBufTrack = self.grooveItems[buf.item.id];
if (!thisBufTrack) throw new Error("expected item to exist");
if (!thisBufTrack) return;
if (thisBufTrack !== self.currentTrack || self.getCurPos() > buf.pos) {
delCount += 1;
self.recentBuffers.shift();
}
}
console.log("deleted", delCount, "old buffers");
// poll the encoder for more buffers until either there are no buffers
// available or we get enough buffered
var nowPlayingChanged = false;
while (self.getBufferedSeconds() < ENCODE_QUEUE_DURATION) {
buf = self.grooveEncoder.getBuffer();
if (!buf) {
console.log("libgroove encoder ran out of buffers. byte count:", self.getBufferedByteCount());
} else {
break;
}
}
// poll the encoder for more buffers until either there are no buffers
// available or we get enough buffered
while (self.getBufferedSeconds() < ENCODE_QUEUE_DURATION) {
buf = self.grooveEncoder.getBuffer();
if (!buf) break;
if (buf.buffer) {
if (buf.item) {
if (self.expectHeaders) {
@ -414,7 +423,6 @@ Player.prototype.attachEncoder = function(cb) {
self.expectHeaders = false;
}
self.recentBuffers.push(buf);
nowPlayingChanged = true;
for (var i = 0; i < self.openStreamers.length; i += 1) {
self.openStreamers[i].write(buf.buffer);
}
@ -449,6 +457,7 @@ Player.prototype.detachEncoder = function(cb) {
this.flushEncodedInterval = null;
startEncoderDetach(this, cb);
this.refreshManualTimeInterval();
this.grooveEncoder.removeAllListeners();
function logIfError(err) {
if (err) {
@ -1548,6 +1557,26 @@ function lazyReplayGainScanPlaylist(self) {
}
function playlistChanged(self) {
if (self.desiredEncoderAttachState && !self.pendingEncoderAttachDetach && !self.hardwarePlayback) {
var encodeHead = self.grooveEncoder.position();
var decodeHead = self.groovePlaylist.position();
var prevCurrentTrack = self.currentTrack;
if (encodeHead.item) {
var nowMs = (new Date()).getTime();
var posMs = encodeHead.pos * 1000;
self.trackStartDate = new Date(nowMs - posMs);
self.currentTrack = self.grooveItems[encodeHead.item.id];
} else if (!decodeHead.item) {
// both play head and decode head are null. end of playlist.
console.log("encoder: end of playlist");
self.currentTrack = null;
}
if (prevCurrentTrack !== self.currentTrack) {
playlistChanged(self);
self.emit('currentTrack');
}
}
cacheTracksArray(self);
disambiguateSortKeys(self);
@ -1615,7 +1644,6 @@ function checkUpdateGroovePlaylist(self) {
grooveItem = groovePlaylist[groovePlIndex];
if (grooveItem.id === playHeadItemId) break;
// this groove playlist item is before the current playhead. delete it!
console.log("groovePlaylist remove", grooveItem.file.filename);
self.groovePlaylist.remove(grooveItem);
delete self.grooveItems[grooveItem.id];
groovePlIndex += 1;
@ -1643,7 +1671,6 @@ function checkUpdateGroovePlaylist(self) {
}
// this groove track is wrong. delete it.
console.log("groovePlaylist remove", grooveItem.file.filename);
self.groovePlaylist.remove(grooveItem);
delete self.grooveItems[grooveItem.id];
groovePlIndex += 1;
@ -1657,7 +1684,6 @@ function checkUpdateGroovePlaylist(self) {
}
// compute the gain adjustment
grooveItem = self.groovePlaylist.insert(plTrack.grooveFile, calcGain(plTrack));
console.log("groovePlaylist insert", grooveItem.file.filename);
self.grooveItems[grooveItem.id] = plTrack;
currentGrooveItem = currentGrooveItem || grooveItem;
incrementPlIndex();