From: Andre Noll Date: Fri, 28 Nov 2008 21:29:43 +0000 (+0100) Subject: Merge commit 'fml/master' X-Git-Tag: v0.3.3~13 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=cb4dd13c2327c13d486b6abe572f4af2398b65de;hp=288365e77a154b98e0a175be2801da5a15e2c0d3 Merge commit 'fml/master' --- diff --git a/afh.c b/afh.c index 86322422..c82d17fd 100644 --- a/afh.c +++ b/afh.c @@ -112,6 +112,8 @@ static int cat_file(void *audio_file_data, struct afh_info *afhi) return ret; } } + if (!size) + continue; PARA_INFO_LOG("writing chunk %lu\n", i); ret = write_all(STDOUT_FILENO, buf, &size); if (ret < 0) diff --git a/afh_common.c b/afh_common.c index 47104500..bec99bf4 100644 --- a/afh_common.c +++ b/afh_common.c @@ -91,7 +91,6 @@ void afh_init(void) } } - /** * Guess the audio format judging from filename. * @@ -122,11 +121,29 @@ int guess_audio_format(const char *name) return -E_AUDIO_FORMAT; } +/** + * Pretty-print the given meta-info. + * + * \param title The title of the audio file. + * \param artist The artist. + * \param album The name of the album. + * \param year Year of release. + * \param comment Further comments. + * + * This function is called by each audio format handler to produce the tag info + * status items. Usually, the audio format handlers read this info from the + * audio file (id3 tags, vorbis comments, ...). + * + * It is OK to pass \p NULL pointers for any argument in which case a suitable + * string is inserted which indicates that this information is not available. + * + * \return The status item string. It must be freed by the caller. + */ char *make_taginfo(char *title, char *artist, char *album, char *year, char *comment) { return make_message("%s: %s, by %s\n" /* taginfo1 */ - "%s: A: %s, Y: %s, C: %s\n", /* taginfo 2*/ + "%s: A: %s, Y: %s, C: %s\n", /* taginfo2 */ status_item_list[SI_TAGINFO1], (title && *title)? title : "(title tag not set)", (artist && *artist)? artist : "(artist tag not set)", @@ -196,7 +213,18 @@ const char *audio_format_name(int i) return i >= 0? afl[i].name : "(none)"; } - +/** + * Get one chunk of audio data. + * + * \param chunk_num The number of the chunk to get. + * \param afhi Describes the audio file. + * \param map The memory mapped audio file. + * \param buf Result pointer. + * \param len The length of the chunk in bytes. + * + * Upon return, \a buf will point so memory inside \a map. The returned buffer + * must therefore not be freed by the caller. + */ void afh_get_chunk(long unsigned chunk_num, struct afh_info *afhi, void *map, const char **buf, size_t *len) { diff --git a/oggdec.c b/oggdec.c index b82f12ef..6b96c505 100644 --- a/oggdec.c +++ b/oggdec.c @@ -150,7 +150,7 @@ static ssize_t ogg_convert(char *inbuffer, size_t len, struct filter_node *fn) PARA_NOTICE_LOG("%d channels, %d Hz\n", fn->fc->channels, fn->fc->samplerate); } - while (!*fn->fc->input_error && fn->loaded < fn->bufsize) { + while (fn->loaded < fn->bufsize) { int length = fn->bufsize - fn->loaded; long read_ret = ov_read(pod->vf, fn->buf + fn->loaded, length, ENDIAN, 2 /* 16 bit */, 1 /* signed */, NULL); diff --git a/write.h b/write.h index 091f8c77..02471f32 100644 --- a/write.h +++ b/write.h @@ -4,54 +4,49 @@ * Licensed under the GPL v2. For licencing details see COPYING. */ -/** \file write.h writer-related structures */ +/** \file write.h Writer-related structures. */ -/** the list of supported writers */ +/** The list of supported writers. */ enum writer_enum {WRITER_ENUM}; /** * Describes one running instance of a writer. */ struct writer_node { - /** points to the writer structure associated with this node */ - struct writer *writer; /* FIXME: Should better be only the number */ - /** writer-specific data */ + /** Points to the writer structure associated with this node. */ + struct writer *writer; /* FIXME: Should better be only the number. */ + /** Writer-specific data. */ void *private_data; - /** send that many bytes in one go */ + /** Send that many bytes in one go. */ int chunk_bytes; - /** pointer to the group this node belongs to */ + /** Pointer to the group this node belongs to. */ struct writer_node_group *wng; - /** the writer-specific configuration of this node */ + /** The writer-specific configuration of this node. */ void *conf; - /** how much of the wng's buffer is already written */ + /** How much of the wng's buffer is already written. */ size_t written; }; -/** describes one supported writer */ +/** Describes one supported writer. */ struct writer { /** - * the init function of the writer + * The init function of the writer. * * It must fill in all other function pointers of the given * writer structure. - * */ void (*init)(struct writer *w); /** - * - * - * the command line parser of the writer + * The command line parser of the writer. * * It should check whether the command line options given by \a options are * valid. On success, it should return a pointer to the writer-specific * configuration data determined by \a options. Note that this might be called * more than once with different values of \a options. - * */ - void * (*parse_config)(const char *options); + void *(*parse_config)(const char *options); /** - * - * open one instance of this writer + * Open one instance of this writer. * * This function should perform any work necessary to write the incoming * stream. If To this aim, it may allocate its private data structure and store @@ -59,8 +54,7 @@ struct writer { */ int (*open)(struct writer_node *); /** - * - * write a chunk of audio data + * Prepare the fd sets for select. * * This is called from the writer node group task's pre_select(). It * may use the sched pointer to add any file descriptors or to decrease @@ -69,64 +63,65 @@ struct writer { */ int (*pre_select)(struct sched *s, struct writer_node *wn); /** + * Write audio data. + * * Called from the post_select function of the wng task. It must keep * track of the number of bytes consumed from the wng's buffer via - * the wn->written variable (which may be modified by the wng handling + * the \p wn->written variable (which may be modified by the wng handling * functions). This function must return positive on success and * negative on errors. */ int (*post_select)(struct sched *s, struct writer_node *wn); /** - * close one instance of the writer + * Close one instance of the writer. * * This function is assumed to succeed. */ void (*close)(struct writer_node *); /** - * shutdown the writer + * Shutdown the writer * - * This is a optional function pointer used for cleaning - * up. + * This is a optional function pointer used for cleaning up. */ void (*shutdown)(struct writer_node *); }; /** - * describes a set of writer nodes that all write the same stream. + * Describes a set of writer nodes that all write the same stream. */ struct writer_node_group { - /** number of nodes belonging to this group */ + /** Number of nodes belonging to this group. */ unsigned num_writers; - /** array of pointers to the corresponding writer nodes */ + /** Array of pointers to the corresponding writer nodes. */ struct writer_node *writer_nodes; - /** the maximum of the chunk_bytes values of the writer nodes in this group */ + /** The maximum of the chunk_bytes values of the writer nodes in this group. */ size_t max_chunk_bytes; /** Non-zero if an error or end of file was encountered by the feeding task. */ int *input_error; - /** current output buffer */ + /** Current output buffer. */ char *buf; - /** number of bytes loaded in the output buffer */ + /** Number of bytes loaded in the output buffer. */ size_t *loaded; - /** number of audio channels of the current stream */ + /** Number of audio channels of the current stream. */ unsigned int *channels; - /** sample rate of the current stream */ + /** Sample rate of the current stream. */ unsigned int *samplerate; - /** the task associated to this group */ + /** The task associated to this group. */ struct task task; /** Whether the group is open, i.e. wng_open() was called. */ int open; }; -/** loop over each writer node in a writer group */ +/** Loop over each writer node in a writer group. */ #define FOR_EACH_WRITER_NODE(i, wng) for (i = 0; i < (wng)->num_writers; i++) -/** loop over each supported writer */ +/** Loop over each supported writer. */ #define FOR_EACH_WRITER(i) for (i = 0; i < NUM_SUPPORTED_WRITERS; i++) -/** declare the init functions of all supported writers */ +/** Declare the init functions of all supported writers. */ DECLARE_WRITER_INITS; -/** array containing the name of each writer */ +/** Array containing the name of each writer. */ extern const char *writer_names[]; -/** the writer structure for each supported writer */ +/** The writer structure for each supported writer. */ extern struct writer writers[NUM_SUPPORTED_WRITERS];