aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--TODO19
-rw-r--r--src/decode.c17
-rw-r--r--src/outputBuffer.c9
-rw-r--r--src/outputBuffer.h1
4 files changed, 18 insertions, 28 deletions
diff --git a/TODO b/TODO
index a2d385c70..a44c5f211 100644
--- a/TODO
+++ b/TODO
@@ -1,21 +1,16 @@
-1) remove wrap from ring buffer code, its not 100% safe
- a) player, just ensure that begin != end
- b) decoder: compute what the next chunk needs to be
- and wait till begin is no longer that
+1) put some sort of error reporting for streaming/inputStream!
-2) put some sort of error reporting for streaming/inputStream!
+2) Fix charset errors so they don't goto stderr/out
-3) Fix charset errors so they don't goto stderr/out
+3) Add a timeout for streams (how long? 1 minutes?)
-4) Add a timeout for streams (how long? 1 minutes?)
+4) compute time of vorbis from actual number of samples played
-5) compute time of vorbis from actual number of samples played
+5) remove previous hack for streams
-6) remove previous hack for streams
+6) add "plversion" and "currentsong" commands
-7) add "plversion" and "currentsong" commands
-
-8) in libmpdclient, buffer all stuff going out for playlist command,
+7) in libmpdclient, buffer all stuff going out for playlist command,
should make it much faster
diff --git a/src/decode.c b/src/decode.c
index 267616f91..88208670d 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -173,7 +173,6 @@ int decodeSeek(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb,
stopDecode(dc);
cb->begin = 0;
cb->end = 0;
- cb->wrap = 0;
dc->error = 0;
dc->start = 1;
waitOnDecode(pc,dc,cb,decodeWaitedOn);
@@ -391,7 +390,7 @@ int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
void handleMetadata(OutputBuffer * cb, PlayerControl * pc, int * previous,
int * currentChunkSent, MetadataChunk * currentChunk)
{
- if(cb->begin!=cb->end || cb->wrap) {
+ if(cb->begin!=cb->end) {
int meta = cb->metaChunk[cb->begin];
if( meta != *previous ) {
if( meta >= 0 && cb->metaChunkSet[meta]) {
@@ -425,7 +424,6 @@ void advanceOutputBufferTo(OutputBuffer * cb, PlayerControl * pc,
cb->begin++;
if(cb->begin>=buffered_chunks) {
cb->begin = 0;
- cb->wrap = 0;
}
}
}
@@ -454,7 +452,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
pc->play = 0;
kill(getppid(),SIGUSR1);
- while(*decode_pid>0 && !cb->wrap && cb->end-cb->begin<bbp &&
+ while(*decode_pid>0 && cb->end-cb->begin<bbp &&
+ cb->end!=buffered_chunks-1 &&
dc->state!=DECODE_STATE_STOP)
{
processDecodeInput();
@@ -492,9 +491,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
else doCrossFade = -1;
}
if(pause) my_usleep(10000);
- else if((cb->begin!=cb->end || cb->wrap) &&
- cb->begin!=cb->next)
- {
+ else if(cb->begin!=cb->end && cb->begin!=cb->next) {
if(doCrossFade==1 && cb->next>=0 &&
((cb->next>cb->begin &&
(fadePosition=cb->next-cb->begin)
@@ -507,7 +504,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
crossFadeChunks = fadePosition;
}
test = cb->end;
- if(cb->wrap) test+=buffered_chunks;
+ if(cb->end < cb->begin) test+=buffered_chunks;
nextChunk = cb->begin+crossFadeChunks;
if(nextChunk<test) {
if(nextChunk>=buffered_chunks)
@@ -557,14 +554,13 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
cb->begin++;
if(cb->begin>=buffered_chunks) {
cb->begin = 0;
- cb->wrap = 0;
}
}
else if(cb->next==cb->begin) {
if(doCrossFade==1 && nextChunk>=0) {
nextChunk = cb->begin+crossFadeChunks;
test = cb->end;
- if(cb->wrap) test+=buffered_chunks;
+ if(cb->end < cb->begin) test+=buffered_chunks;
if(nextChunk<test) {
if(nextChunk>=buffered_chunks)
{
@@ -631,7 +627,6 @@ void decode() {
cb->begin = 0;
cb->end = 0;
- cb->wrap = 0;
pc = &(getPlayerData()->playerControl);
dc = &(getPlayerData()->decoderControl);
dc->error = 0;
diff --git a/src/outputBuffer.c b/src/outputBuffer.c
index 40777db3b..39d9b66af 100644
--- a/src/outputBuffer.c
+++ b/src/outputBuffer.c
@@ -42,7 +42,6 @@ void clearOutputBuffer(OutputBuffer * cb) {
currentChunk = -1;
cb->end = cb->begin;
- cb->wrap = 0;
/* be sure to reset metaChunkSets cause we are skipping over audio
* audio chunks, and thus skipping over metadata */
@@ -60,7 +59,6 @@ void flushOutputBuffer(OutputBuffer * cb) {
cb->end++;
if(cb->end>=buffered_chunks) {
cb->end = 0;
- cb->wrap = 1;
}
currentChunk = -1;
}
@@ -97,8 +95,11 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
while(datalen) {
if(currentChunk != cb->end) {
- while(cb->begin==cb->end && cb->wrap && !dc->stop)
- {
+ int next = cb->end+1;
+ if(next>=buffered_chunks) {
+ next = 0;
+ }
+ while(cb->begin==next && !dc->stop) {
if(dc->seek) {
if(seekable) {
return OUTPUT_BUFFER_DC_SEEK;
diff --git a/src/outputBuffer.h b/src/outputBuffer.h
index 225ca54ca..57ba33739 100644
--- a/src/outputBuffer.h
+++ b/src/outputBuffer.h
@@ -38,7 +38,6 @@ typedef struct _OutputBuffer {
mpd_sint16 volatile begin;
mpd_sint16 volatile end;
mpd_sint16 volatile next;
- mpd_sint8 volatile wrap;
AudioFormat audioFormat;
MetadataChunk metadataChunks[BUFFERED_METACHUNKS];
mpd_sint8 metaChunkSet[BUFFERED_METACHUNKS];