aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/pipe.c28
-rw-r--r--src/pipe.h14
2 files changed, 41 insertions, 1 deletions
diff --git a/src/pipe.c b/src/pipe.c
index d94bac219..54d10dd45 100644
--- a/src/pipe.c
+++ b/src/pipe.c
@@ -19,6 +19,7 @@
#include "pipe.h"
#include "notify.h"
#include "audio_format.h"
+#include "tag.h"
#include <glib.h>
#include <assert.h>
@@ -30,12 +31,14 @@ static void
music_chunk_init(struct music_chunk *chunk)
{
chunk->length = 0;
+ chunk->tag = NULL;
}
static void
music_chunk_free(struct music_chunk *chunk)
{
- (void)chunk;
+ if (chunk->tag != NULL)
+ tag_free(chunk->tag);
}
void
@@ -263,6 +266,29 @@ size_t music_pipe_append(const void *data0, size_t datalen,
return ret;
}
+bool music_pipe_tag(const struct tag *tag)
+{
+ struct music_chunk *chunk;
+
+ chunk = music_pipe_get_chunk(music_pipe.end);
+ if (chunk->length > 0 || chunk->tag != NULL) {
+ /* this chunk is not empty; allocate a new chunk,
+ because chunk.tag refers to the beginning of the
+ chunk data */
+ unsigned next = successor(music_pipe.end);
+ if (music_pipe.begin == next)
+ /* no chunks available */
+ return false;
+
+ output_buffer_expand(next);
+ chunk = music_pipe_get_chunk(next);
+ assert(chunk->length == 0 && chunk->tag == NULL);
+ }
+
+ chunk->tag = tag_dup(tag);
+ return true;
+}
+
void music_pipe_skip(unsigned num)
{
int i = music_pipe_absolute(num);
diff --git a/src/pipe.h b/src/pipe.h
index 7d2912197..f65e12d49 100644
--- a/src/pipe.h
+++ b/src/pipe.h
@@ -42,6 +42,14 @@ struct music_chunk {
/** the time stamp within the song */
float times;
+ /**
+ * An optional tag associated with this chunk (and the
+ * following chunks); appears at song boundaries. The tag
+ * object is owned by this chunk, and must be freed when this
+ * chunk is deinitialized in music_chunk_free()
+ */
+ struct tag *tag;
+
/** the data (probably PCM) */
char data[CHUNK_SIZE];
};
@@ -148,6 +156,12 @@ size_t music_pipe_append(const void *data, size_t datalen,
const struct audio_format *audio_format,
float data_time, uint16_t bit_rate);
+/**
+ * Send a tag. This is usually called when a new song within a stream
+ * begins.
+ */
+bool music_pipe_tag(const struct tag *tag);
+
void music_pipe_skip(unsigned num);
#endif