aboutsummaryrefslogtreecommitdiffstats
path: root/src/decode.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/decode.c')
-rw-r--r--src/decode.c122
1 files changed, 73 insertions, 49 deletions
diff --git a/src/decode.c b/src/decode.c
index decc313ae..99a4bd784 100644
--- a/src/decode.c
+++ b/src/decode.c
@@ -112,17 +112,6 @@ int calculateCrossFadeChunks(PlayerControl * pc, AudioFormat * af) {
quitDecode(pc,dc); \
return; \
} \
- if(pc->metadataState == PLAYER_METADATA_STATE_WRITE && \
- dc->metadataSet) \
- { \
- memcpy(pc->metadata, dc->metadata, \
- DECODE_METADATA_LENGTH); \
- pc->metadata[DECODE_METADATA_LENGTH-1] = '\0'; \
- pc->title = dc->title; \
- pc->artist = dc->artist; \
- pc->album = dc->album; \
- } \
- pc->metadataState = PLAYER_METADATA_STATE_READ; \
pc->totalTime = dc->totalTime; \
pc->sampleRate = dc->audioFormat.sampleRate; \
pc->bits = dc->audioFormat.bits; \
@@ -271,11 +260,12 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
return;
}
- dc->metadataSet = 0;
- memset(dc->metadata, 0, DECODE_METADATA_LENGTH);
- dc->title = -1;
- dc->album = -1;
- dc->artist = -1;
+ cb->metadataSet = 0;
+ memset(cb->metadata, 0, DECODE_METADATA_LENGTH);
+ cb->name = -1;
+ cb->title = -1;
+ cb->album = -1;
+ cb->artist = -1;
strncpy(dc->utf8url, pc->utf8url, MAXPATHLEN);
dc->utf8url[MAXPATHLEN] = '\0';
@@ -302,15 +292,17 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
return;
}
- if(inStream.metaTitle) {
- strncpy(dc->metadata, inStream.metaTitle,
+ /*if(inStream.metaTitle) {
+ strncpy(cb->metadata, inStream.metaTitle,
DECODE_METADATA_LENGTH-1);
- dc->title = 0;
- dc->metadataSet = 1;
- }
+ cb->name = 0;
+ cb->metaChunk = cb->end;
+ cb->metadataSet = 1;
+ }*/
ret = DECODE_ERROR_UNKTYPE;
if(isRemoteUrl(dc->utf8url)) {
+ cb->acceptMetadata = 1;
plugin = getInputPluginFromMimeType(inStream.mime);
if(plugin == NULL) {
plugin = getInputPluginFromSuffix(
@@ -328,6 +320,7 @@ void decodeStart(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
}
}
else {
+ cb->acceptMetadata = 0;
plugin = getInputPluginFromSuffix(getSuffix(dc->utf8url));
if(plugin && (plugin->streamTypes && INPUT_PLUGIN_STREAM_FILE))
{
@@ -399,6 +392,55 @@ int decoderInit(PlayerControl * pc, OutputBuffer * cb, DecoderControl * dc) {
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); \
+}
+
+/* do some fancier shit here, like put metadata in a linked list metadata
+buffer, and assign it to current and whether current is written */
+#define handleMetadata() { \
+ if(cb->metadataSet) {\
+ gotMetadata = 1;\
+ memcpy(metadata, cb->metadata, DECODE_METADATA_LENGTH); \
+ artist = cb->artist; \
+ name = cb->name; \
+ title = cb->title; \
+ album = cb->album; \
+ metaChunk = cb->metaChunk; \
+ cb->metadataSet = 0; \
+ } \
+ if(gotMetadata) { \
+ int end = cb->end; \
+ if(end > cb->begin && (metaChunk < cb->begin || \
+ metaChunk > end)) \
+ { \
+ gotMetadata = 0; \
+ } \
+ else if(cb->begin > end && (metaChunk > cb->begin && \
+ metaChunk < end)) \
+ { \
+ gotMetadata = 0; \
+ } \
+ else if(pc->metadataState == PLAYER_METADATA_STATE_WRITE) { \
+ if(end > metaChunk && metaChunk <= cb->begin ) { \
+ copyMetadata(); \
+ } \
+ else if(metaChunk >= end && (cb->begin >= metaChunk || \
+ cb->begin < end)) \
+ { \
+ copyMetadata(); \
+ } \
+ } \
+ } \
+}
+
void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
int pause = 0;
int quit = 0;
@@ -411,6 +453,13 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
int decodeWaitedOn = 0;
char silence[CHUNK_SIZE];
double sizeToTime = 0.0;
+ char metadata[DECODE_METADATA_LENGTH];
+ mpd_sint16 name = -1;
+ mpd_sint16 title = -1;
+ mpd_sint16 artist = -1;
+ mpd_sint16 album = -1;
+ mpd_sint16 metaChunk = -1;
+ int gotMetadata = 0;
memset(silence,0,CHUNK_SIZE);
@@ -424,12 +473,14 @@ void decodeParent(PlayerControl * pc, DecoderControl * dc, OutputBuffer * cb) {
dc->state!=DECODE_STATE_STOP)
{
processDecodeInput();
+ handleMetadata();
if(quit) return;
my_usleep(10000);
}
while(!quit) {
processDecodeInput();
+ handleMetadata();
handleDecodeStart();
if(dc->state==DECODE_STATE_STOP &&
pc->queueState==PLAYER_QUEUE_FULL &&
@@ -592,6 +643,7 @@ void decode() {
cb->begin = 0;
cb->end = 0;
cb->wrap = 0;
+ cb->metadataSet = 0;
pc = &(getPlayerData()->playerControl);
dc = &(getPlayerData()->decoderControl);
dc->error = 0;
@@ -606,31 +658,3 @@ void decode() {
decodeParent(pc, dc, cb);
}
-
-/* this is stuff for inputPlugins to use! */
-#define copyStringToMetadata(string, element) { \
- if(string && (slen = strlen(string)) && \
- pos < DECODE_METADATA_LENGTH-1) \
- { \
- strncpy(dc->metadata+pos, string, \
- DECODE_METADATA_LENGTH-1-pos); \
- element = pos; \
- pos += slen+1; \
- } \
-}
-
-void copyMpdTagToDecoderControlMetadata(DecoderControl * dc, MpdTag * tag) {
- int pos = 0;
- int slen;
-
- if(dc->metadataSet) return;
- if(!tag) return;
-
- memset(dc->metadata, 0, DECODE_METADATA_LENGTH);
-
- copyStringToMetadata(tag->title, dc->title);
- copyStringToMetadata(tag->artist, dc->artist);
- copyStringToMetadata(tag->album, dc->album);
-
- dc->metadataSet = 1;
-}