aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorWarren Dukes <warren.dukes@gmail.com>2004-06-06 22:13:23 +0000
committerWarren Dukes <warren.dukes@gmail.com>2004-06-06 22:13:23 +0000
commit62f32ccb010070501ed2d518d31cb788e37f7b3d (patch)
tree213f3085001e6c7c878e657bac0f2ab098b96770 /src
parent33f21b9374d3f57210e5e58881bf67662eaaec3f (diff)
downloadmpd-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 'src')
-rw-r--r--src/decode.c5
-rw-r--r--src/outputBuffer.c29
-rw-r--r--src/outputBuffer.h6
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