diff options
author | Warren Dukes <warren.dukes@gmail.com> | 2004-06-06 22:13:23 +0000 |
---|---|---|
committer | Warren Dukes <warren.dukes@gmail.com> | 2004-06-06 22:13:23 +0000 |
commit | 62f32ccb010070501ed2d518d31cb788e37f7b3d (patch) | |
tree | 213f3085001e6c7c878e657bac0f2ab098b96770 /src | |
parent | 33f21b9374d3f57210e5e58881bf67662eaaec3f (diff) | |
download | mpd-62f32ccb010070501ed2d518d31cb788e37f7b3d.tar.gz mpd-62f32ccb010070501ed2d518d31cb788e37f7b3d.tar.xz mpd-62f32ccb010070501ed2d518d31cb788e37f7b3d.zip |
harden metadatabuffer
git-svn-id: https://svn.musicpd.org/mpd/trunk@1362 09075e82-0dd4-0310-85a5-a0d7c8717e4f
Diffstat (limited to '')
-rw-r--r-- | src/decode.c | 5 | ||||
-rw-r--r-- | src/outputBuffer.c | 29 | ||||
-rw-r--r-- | src/outputBuffer.h | 6 |
3 files changed, 33 insertions, 7 deletions
diff --git a/src/decode.c b/src/decode.c index 8053f44fa..ea41aef31 100644 --- a/src/decode.c +++ b/src/decode.c @@ -406,7 +406,8 @@ void handleMetadata(OutputBuffer * cb, PlayerControl * pc) { int meta = cb->metaChunk[cb->begin]; if( meta != previous ) { if( meta >= 0 && pc->metadataState == - PLAYER_METADATA_STATE_WRITE) + PLAYER_METADATA_STATE_WRITE && + cb->metaChunkSet[meta]) { printf("METADATA!, copying it.\n"); memcpy(&(pc->metadataChunk), @@ -414,6 +415,7 @@ void handleMetadata(OutputBuffer * cb, PlayerControl * pc) { sizeof(MetadataChunk)); pc->metadataState = PLAYER_METADATA_STATE_READ; + cb->metaChunkSet[meta] = 0; previous = meta; } } @@ -621,6 +623,7 @@ void decode() { dc->seek = 0; dc->stop = 0; dc->start = 1; + clearAllMetaChunkSets(cb); if(decode_pid==NULL || *decode_pid<=0) { if(decoderInit(pc,cb,dc)<0) return; diff --git a/src/outputBuffer.c b/src/outputBuffer.c index 660067c27..a62d97778 100644 --- a/src/outputBuffer.c +++ b/src/outputBuffer.c @@ -29,10 +29,25 @@ static mpd_sint16 currentChunk = -1; static mpd_sint8 currentMetaChunk = -1; static mpd_sint8 sendMetaChunk = 0; +void clearAllMetaChunkSets(OutputBuffer * cb) { + int i; + + for(i=0; i<BUFFERED_METACHUNKS; i++) { + cb->metaChunkSet[i] = 0; + } +} + void clearOutputBuffer(OutputBuffer * cb) { currentChunk = -1; cb->end = cb->begin; cb->wrap = 0; + + if(cb->acceptMetadata) { + clearAllMetaChunkSets(cb); + if(sendMetaChunk == 0 && currentMetaChunk >= 0) { + cb->metaChunkSet[currentChunk] = 1; + } + } } void flushOutputBuffer(OutputBuffer * cb) { @@ -126,20 +141,28 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream, } int copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag) { + int nextChunk; + printf("copyMpdTagToOB called\n"); if(!cb->acceptMetadata || !tag) { sendMetaChunk = 0; - return -1; + return 0; } sendMetaChunk = 1; - currentMetaChunk++; - if(currentMetaChunk >= BUFFERED_METACHUNKS) currentMetaChunk = 0; + nextChunk = currentMetaChunk+1; + if(nextChunk >= BUFFERED_METACHUNKS) nextChunk = 0; + + if(cb->metaChunkSet[nextChunk]) return -1; + + currentMetaChunk = nextChunk; printMpdTag(stdout, tag); copyMpdTagToMetadataChunk(tag, &(cb->metadataChunks[currentMetaChunk])); + cb->metaChunkSet[nextChunk] = 1; + return 0; } diff --git a/src/outputBuffer.h b/src/outputBuffer.h index 421035c1e..225ca54ca 100644 --- a/src/outputBuffer.h +++ b/src/outputBuffer.h @@ -41,7 +41,7 @@ typedef struct _OutputBuffer { mpd_sint8 volatile wrap; AudioFormat audioFormat; MetadataChunk metadataChunks[BUFFERED_METACHUNKS]; - mpd_sint8 metdataChunkSet[BUFFERED_METACHUNKS]; + mpd_sint8 metaChunkSet[BUFFERED_METACHUNKS]; mpd_sint8 * volatile metaChunk; volatile mpd_sint8 acceptMetadata; } OutputBuffer; @@ -56,8 +56,8 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream, DecoderControl * dc, int seekable, char * data, long datalen, float time, mpd_uint16 bitRate); -void copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag); +int copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag); -void zeroMetadataChunkSets(OutputBuffer * cb, int begin, int end, int wrap); +void clearAllMetaChunkSets(OutputBuffer * cb); #endif |