remove "wrap" from buffering control, its not needed, and could potentially
create a race condition (but hasn't happened in the last 10 months since this code was written) git-svn-id: https://svn.musicpd.org/mpd/trunk@1397 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
c274d7d62f
commit
6f4a55ea7c
19
TODO
19
TODO
|
@ -1,21 +1,16 @@
|
||||||
1) remove wrap from ring buffer code, its not 100% safe
|
1) put some sort of error reporting for streaming/inputStream!
|
||||||
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
|
|
||||||
|
|
||||||
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
|
7) in libmpdclient, buffer all stuff going out for playlist command,
|
||||||
|
|
||||||
8) in libmpdclient, buffer all stuff going out for playlist command,
|
|
||||||
should make it much faster
|
should make it much faster
|
||||||
|
|
||||||
|
|
||||||
|
|
17
src/decode.c
17
src/decode.c
|
@ -173,7 +173,6 @@ int decodeSeek(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb,
|
||||||
stopDecode(dc);
|
stopDecode(dc);
|
||||||
cb->begin = 0;
|
cb->begin = 0;
|
||||||
cb->end = 0;
|
cb->end = 0;
|
||||||
cb->wrap = 0;
|
|
||||||
dc->error = 0;
|
dc->error = 0;
|
||||||
dc->start = 1;
|
dc->start = 1;
|
||||||
waitOnDecode(pc,dc,cb,decodeWaitedOn);
|
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,
|
void handleMetadata(OutputBuffer * cb, PlayerControl * pc, int * previous,
|
||||||
int * currentChunkSent, MetadataChunk * currentChunk)
|
int * currentChunkSent, MetadataChunk * currentChunk)
|
||||||
{
|
{
|
||||||
if(cb->begin!=cb->end || cb->wrap) {
|
if(cb->begin!=cb->end) {
|
||||||
int meta = cb->metaChunk[cb->begin];
|
int meta = cb->metaChunk[cb->begin];
|
||||||
if( meta != *previous ) {
|
if( meta != *previous ) {
|
||||||
if( meta >= 0 && cb->metaChunkSet[meta]) {
|
if( meta >= 0 && cb->metaChunkSet[meta]) {
|
||||||
|
@ -425,7 +424,6 @@ void advanceOutputBufferTo(OutputBuffer * cb, PlayerControl * pc,
|
||||||
cb->begin++;
|
cb->begin++;
|
||||||
if(cb->begin>=buffered_chunks) {
|
if(cb->begin>=buffered_chunks) {
|
||||||
cb->begin = 0;
|
cb->begin = 0;
|
||||||
cb->wrap = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -454,7 +452,8 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
|
||||||
pc->play = 0;
|
pc->play = 0;
|
||||||
kill(getppid(),SIGUSR1);
|
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)
|
dc->state!=DECODE_STATE_STOP)
|
||||||
{
|
{
|
||||||
processDecodeInput();
|
processDecodeInput();
|
||||||
|
@ -492,9 +491,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
|
||||||
else doCrossFade = -1;
|
else doCrossFade = -1;
|
||||||
}
|
}
|
||||||
if(pause) my_usleep(10000);
|
if(pause) my_usleep(10000);
|
||||||
else if((cb->begin!=cb->end || cb->wrap) &&
|
else if(cb->begin!=cb->end && cb->begin!=cb->next) {
|
||||||
cb->begin!=cb->next)
|
|
||||||
{
|
|
||||||
if(doCrossFade==1 && cb->next>=0 &&
|
if(doCrossFade==1 && cb->next>=0 &&
|
||||||
((cb->next>cb->begin &&
|
((cb->next>cb->begin &&
|
||||||
(fadePosition=cb->next-cb->begin)
|
(fadePosition=cb->next-cb->begin)
|
||||||
|
@ -507,7 +504,7 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
|
||||||
crossFadeChunks = fadePosition;
|
crossFadeChunks = fadePosition;
|
||||||
}
|
}
|
||||||
test = cb->end;
|
test = cb->end;
|
||||||
if(cb->wrap) test+=buffered_chunks;
|
if(cb->end < cb->begin) test+=buffered_chunks;
|
||||||
nextChunk = cb->begin+crossFadeChunks;
|
nextChunk = cb->begin+crossFadeChunks;
|
||||||
if(nextChunk<test) {
|
if(nextChunk<test) {
|
||||||
if(nextChunk>=buffered_chunks)
|
if(nextChunk>=buffered_chunks)
|
||||||
|
@ -557,14 +554,13 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
|
||||||
cb->begin++;
|
cb->begin++;
|
||||||
if(cb->begin>=buffered_chunks) {
|
if(cb->begin>=buffered_chunks) {
|
||||||
cb->begin = 0;
|
cb->begin = 0;
|
||||||
cb->wrap = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(cb->next==cb->begin) {
|
else if(cb->next==cb->begin) {
|
||||||
if(doCrossFade==1 && nextChunk>=0) {
|
if(doCrossFade==1 && nextChunk>=0) {
|
||||||
nextChunk = cb->begin+crossFadeChunks;
|
nextChunk = cb->begin+crossFadeChunks;
|
||||||
test = cb->end;
|
test = cb->end;
|
||||||
if(cb->wrap) test+=buffered_chunks;
|
if(cb->end < cb->begin) test+=buffered_chunks;
|
||||||
if(nextChunk<test) {
|
if(nextChunk<test) {
|
||||||
if(nextChunk>=buffered_chunks)
|
if(nextChunk>=buffered_chunks)
|
||||||
{
|
{
|
||||||
|
@ -631,7 +627,6 @@ void decode() {
|
||||||
|
|
||||||
cb->begin = 0;
|
cb->begin = 0;
|
||||||
cb->end = 0;
|
cb->end = 0;
|
||||||
cb->wrap = 0;
|
|
||||||
pc = &(getPlayerData()->playerControl);
|
pc = &(getPlayerData()->playerControl);
|
||||||
dc = &(getPlayerData()->decoderControl);
|
dc = &(getPlayerData()->decoderControl);
|
||||||
dc->error = 0;
|
dc->error = 0;
|
||||||
|
|
|
@ -42,7 +42,6 @@ void clearOutputBuffer(OutputBuffer * cb) {
|
||||||
|
|
||||||
currentChunk = -1;
|
currentChunk = -1;
|
||||||
cb->end = cb->begin;
|
cb->end = cb->begin;
|
||||||
cb->wrap = 0;
|
|
||||||
|
|
||||||
/* be sure to reset metaChunkSets cause we are skipping over audio
|
/* be sure to reset metaChunkSets cause we are skipping over audio
|
||||||
* audio chunks, and thus skipping over metadata */
|
* audio chunks, and thus skipping over metadata */
|
||||||
|
@ -60,7 +59,6 @@ void flushOutputBuffer(OutputBuffer * cb) {
|
||||||
cb->end++;
|
cb->end++;
|
||||||
if(cb->end>=buffered_chunks) {
|
if(cb->end>=buffered_chunks) {
|
||||||
cb->end = 0;
|
cb->end = 0;
|
||||||
cb->wrap = 1;
|
|
||||||
}
|
}
|
||||||
currentChunk = -1;
|
currentChunk = -1;
|
||||||
}
|
}
|
||||||
|
@ -97,8 +95,11 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
|
||||||
|
|
||||||
while(datalen) {
|
while(datalen) {
|
||||||
if(currentChunk != cb->end) {
|
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(dc->seek) {
|
||||||
if(seekable) {
|
if(seekable) {
|
||||||
return OUTPUT_BUFFER_DC_SEEK;
|
return OUTPUT_BUFFER_DC_SEEK;
|
||||||
|
|
|
@ -38,7 +38,6 @@ typedef struct _OutputBuffer {
|
||||||
mpd_sint16 volatile begin;
|
mpd_sint16 volatile begin;
|
||||||
mpd_sint16 volatile end;
|
mpd_sint16 volatile end;
|
||||||
mpd_sint16 volatile next;
|
mpd_sint16 volatile next;
|
||||||
mpd_sint8 volatile wrap;
|
|
||||||
AudioFormat audioFormat;
|
AudioFormat audioFormat;
|
||||||
MetadataChunk metadataChunks[BUFFERED_METACHUNKS];
|
MetadataChunk metadataChunks[BUFFERED_METACHUNKS];
|
||||||
mpd_sint8 metaChunkSet[BUFFERED_METACHUNKS];
|
mpd_sint8 metaChunkSet[BUFFERED_METACHUNKS];
|
||||||
|
|
Loading…
Reference in New Issue