some fixes to metadata stuff
git-svn-id: https://svn.musicpd.org/mpd/trunk@1370 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
		
							
								
								
									
										11
									
								
								src/decode.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								src/decode.c
									
									
									
									
									
								
							@@ -388,17 +388,6 @@ int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define copyMetadata() { \
 | 
					 | 
				
			||||||
	memcpy(pc->metadata, metadata, DECODE_METADATA_LENGTH); \
 | 
					 | 
				
			||||||
	pc->name = name; \
 | 
					 | 
				
			||||||
	pc->title = title; \
 | 
					 | 
				
			||||||
	pc->artist = artist; \
 | 
					 | 
				
			||||||
	pc->album = album; \
 | 
					 | 
				
			||||||
	gotMetadata = 0; \
 | 
					 | 
				
			||||||
	pc->metadataState = PLAYER_METADATA_STATE_READ; \
 | 
					 | 
				
			||||||
	kill(getppid(), SIGUSR1); \
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void handleMetadata(OutputBuffer * cb, PlayerControl * pc, int * previous,
 | 
					void handleMetadata(OutputBuffer * cb, PlayerControl * pc, int * previous,
 | 
				
			||||||
		int * currentChunkSent, MetadataChunk * currentChunk) 
 | 
							int * currentChunkSent, MetadataChunk * currentChunk) 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,11 +147,19 @@ int sendDataToOutputBuffer(OutputBuffer * cb, InputStream * inStream,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag) {
 | 
					int copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag) {
 | 
				
			||||||
	int nextChunk;
 | 
						int nextChunk;
 | 
				
			||||||
 | 
						static MpdTag * last = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("copyMpdTagToOB called\n");
 | 
						printf("copyMpdTagToOB called\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(!cb->acceptMetadata || !tag) {
 | 
					        if(!cb->acceptMetadata || !tag) {
 | 
				
			||||||
		sendMetaChunk = 0;
 | 
							sendMetaChunk = 0;
 | 
				
			||||||
 | 
							if(last) free(last);
 | 
				
			||||||
 | 
							last = NULL;
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(last && mpdTagsAreEqual(last, tag)) {
 | 
				
			||||||
 | 
							printf("same as last\n");
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -165,6 +173,9 @@ int copyMpdTagToOutputBuffer(OutputBuffer * cb, MpdTag * tag) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	printMpdTag(stdout, tag);
 | 
						printMpdTag(stdout, tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(last) freeMpdTag(last);
 | 
				
			||||||
 | 
						last = mpdTagDup(tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	copyMpdTagToMetadataChunk(tag, &(cb->metadataChunks[currentMetaChunk]));
 | 
						copyMpdTagToMetadataChunk(tag, &(cb->metadataChunks[currentMetaChunk]));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cb->metaChunkSet[nextChunk] = 1;
 | 
						cb->metaChunkSet[nextChunk] = 1;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -470,6 +470,7 @@ void playerCycleLogFiles() {
 | 
				
			|||||||
Song * playerCurrentDecodeSong() {
 | 
					Song * playerCurrentDecodeSong() {
 | 
				
			||||||
        static Song * song = NULL;
 | 
					        static Song * song = NULL;
 | 
				
			||||||
        static MetadataChunk * prev = NULL;
 | 
					        static MetadataChunk * prev = NULL;
 | 
				
			||||||
 | 
						Song * ret = NULL;
 | 
				
			||||||
	PlayerControl * pc = &(getPlayerData()->playerControl);
 | 
						PlayerControl * pc = &(getPlayerData()->playerControl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(pc->metadataState == PLAYER_METADATA_STATE_READ && 
 | 
					        if(pc->metadataState == PLAYER_METADATA_STATE_READ && 
 | 
				
			||||||
@@ -477,19 +478,19 @@ Song * playerCurrentDecodeSong() {
 | 
				
			|||||||
                        || (!prev || memcmp(prev, &(pc->metadataChunk), 
 | 
					                        || (!prev || memcmp(prev, &(pc->metadataChunk), 
 | 
				
			||||||
			sizeof(MetadataChunk))))) 
 | 
								sizeof(MetadataChunk))))) 
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
		printf("metadata in the PLAYER!\n");
 | 
					 | 
				
			||||||
                if(prev) free(prev);
 | 
					                if(prev) free(prev);
 | 
				
			||||||
                prev = malloc(sizeof(MetadataChunk));
 | 
					                prev = malloc(sizeof(MetadataChunk));
 | 
				
			||||||
		memcpy(prev, &(pc->metadataChunk), sizeof(MetadataChunk));
 | 
							memcpy(prev, &(pc->metadataChunk), sizeof(MetadataChunk));
 | 
				
			||||||
                resetPlayerMetadata();
 | 
					 | 
				
			||||||
                if(song) freeJustSong(song);
 | 
					                if(song) freeJustSong(song);
 | 
				
			||||||
                song = newNullSong();
 | 
					                song = newNullSong();
 | 
				
			||||||
                if(song->utf8url) free(song->utf8url);
 | 
					                if(song->utf8url) free(song->utf8url);
 | 
				
			||||||
                song->utf8url = strdup(pc->currentUrl);
 | 
					                song->utf8url = strdup(pc->currentUrl);
 | 
				
			||||||
		song->tag = metadataChunkToMpdTagDup(prev);
 | 
							song->tag = metadataChunkToMpdTagDup(prev);
 | 
				
			||||||
                validateUtf8Tag(song->tag);
 | 
					                validateUtf8Tag(song->tag);
 | 
				
			||||||
                return song;
 | 
					                ret =  song;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return NULL;
 | 
					        resetPlayerMetadata();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user