X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=vss.c;h=a16b006ffa0527d5d4f4301b1e13122457b1756a;hp=7892fb14656317453304b37d4c09dcb8bcc40006;hb=245b44acd4f1c16395844683f6aff10699967dc0;hpb=d3eb6494a1883dac8a59ba3c82ada0fbc8ce0971;ds=sidebyside diff --git a/vss.c b/vss.c index 7892fb14..a16b006f 100644 --- a/vss.c +++ b/vss.c @@ -495,6 +495,32 @@ again: return ret; } +static void get_chunk(long unsigned chunk_num, char **buf, size_t *len) +{ + size_t pos = mmd->afi.chunk_table[chunk_num]; + *buf = map + pos; + *len = mmd->afi.chunk_table[chunk_num + 1] - pos; +} + +/** + * Get the data of the given chunk. + * + * \param chunk_num The number of the desired chunk. + * \param buf Chunk data. + * \param len Chunk length in bytes. + * + * \return Positive on success, negative on errors. + */ +int vss_get_chunk(long unsigned chunk_num, char **buf, size_t *len) +{ + if (mmd->audio_format < 0 || !map || !vss_playing()) + return -E_CHUNK; + if (chunk_num >= mmd->afi.chunks_total) + return -E_CHUNK; + get_chunk(chunk_num, buf, len); + return 1; +} + /** * main sending function * @@ -508,8 +534,6 @@ void vss_send_chunk(void) { int i; struct audio_format_handler *af; - ssize_t pos; - size_t len; struct timeval now, due; if (mmd->audio_format < 0 || !map || !vss_playing()) @@ -529,8 +553,6 @@ void vss_send_chunk(void) mmd->new_vss_status_flags |= VSS_NEXT; return vss_eof(); } - pos = mmd->afi.chunk_table[mmd->current_chunk]; - len = mmd->afi.chunk_table[mmd->current_chunk + 1] - pos; /* * We call the send function also in case of empty chunks as they * might have still some data queued which can be sent in this case. @@ -542,9 +564,12 @@ void vss_send_chunk(void) mmd->offset = tv2ms(&tmp); mmd->events++; } - for (i = 0; senders[i].name; i++) - senders[i].send(mmd->current_chunk, mmd->chunks_sent, - map + pos, len); + for (i = 0; senders[i].name; i++) { + char *buf; + size_t len; + get_chunk(mmd->current_chunk, &buf, &len); + senders[i].send(mmd->current_chunk, mmd->chunks_sent, buf, len); + } mmd->new_vss_status_flags |= VSS_PLAYING; mmd->chunks_sent++; mmd->current_chunk++;