diff options
author | Max Kellermann <max@duempel.org> | 2009-03-05 17:37:11 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-03-05 17:37:11 +0100 |
commit | 74a2813d781ec2bc2c0f5e4534552d4d8e99557b (patch) | |
tree | 21b7e5088d540b9974290ae2ad9a1544553d534e /src/chunk.c | |
parent | c655f804a92d82416b62d541c528b615e2ce27f6 (diff) | |
download | mpd-74a2813d781ec2bc2c0f5e4534552d4d8e99557b.tar.gz mpd-74a2813d781ec2bc2c0f5e4534552d4d8e99557b.tar.xz mpd-74a2813d781ec2bc2c0f5e4534552d4d8e99557b.zip |
music_chunk: added music_chunk_write(), music_chunk_expand()
Moved some code from music_pipe_write() and music_pipe_expand(). Only
music_chunk.c should access the music_chunk internals.
Diffstat (limited to 'src/chunk.c')
-rw-r--r-- | src/chunk.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/chunk.c b/src/chunk.c index 8a91a1d11..65894f733 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -17,8 +17,11 @@ */ #include "chunk.h" +#include "audio_format.h" #include "tag.h" +#include <assert.h> + void music_chunk_init(struct music_chunk *chunk) { @@ -32,3 +35,42 @@ music_chunk_free(struct music_chunk *chunk) if (chunk->tag != NULL) tag_free(chunk->tag); } + +void * +music_chunk_write(struct music_chunk *chunk, + const struct audio_format *audio_format, + float data_time, uint16_t bit_rate, + size_t *max_length_r) +{ + const size_t frame_size = audio_format_frame_size(audio_format); + size_t num_frames; + + if (chunk->length == 0) { + /* if the chunk is empty, nobody has set bitRate and + times yet */ + + chunk->bit_rate = bit_rate; + chunk->times = data_time; + } + + num_frames = (sizeof(chunk->data) - chunk->length) / frame_size; + if (num_frames == 0) + return NULL; + + *max_length_r = num_frames * frame_size; + return chunk->data + chunk->length; +} + +bool +music_chunk_expand(struct music_chunk *chunk, + const struct audio_format *audio_format, size_t length) +{ + const size_t frame_size = audio_format_frame_size(audio_format); + + assert(chunk != NULL); + assert(chunk->length + length <= sizeof(chunk->data)); + + chunk->length += length; + + return chunk->length + frame_size > sizeof(chunk->data); +} |