X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afh.h;h=35cc7ef102644f1c394db52cd6cd21af51395c21;hp=daac3279729ab5f9001a2f4e15366b21943c2d1e;hb=4e3d8370476eee8537d8dc325d588fca43928098;hpb=77aa550660c490ef33bc42f7185516708908d022 diff --git a/afh.h b/afh.h index daac3279..35cc7ef1 100644 --- a/afh.h +++ b/afh.h @@ -1,19 +1,7 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2009 Andre Noll * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file afh.h structures for audio format handling (para_server) */ @@ -21,93 +9,100 @@ /** \cond */ #ifdef HAVE_OGGVORBIS #define OV_AUDIO_FORMAT " ogg" -#define OV_AUDIO_FORMAT_ARRAY , "ogg" #else #define OV_AUDIO_FORMAT "" -#define OV_AUDIO_FORMAT_ARRAY #endif #ifdef HAVE_FAAD #define AAC_AUDIO_FORMAT " aac" -#define AAC_AUDIO_FORMAT_ARRAY , "aac" #else #define AAC_AUDIO_FORMAT "" -#define AAC_AUDIO_FORMAT_ARRAY #endif #define SUPPORTED_AUDIO_FORMATS "mp3" OV_AUDIO_FORMAT AAC_AUDIO_FORMAT -#define SUPPORTED_AUDIO_FORMATS_ARRAY "mp3" OV_AUDIO_FORMAT_ARRAY \ - AAC_AUDIO_FORMAT_ARRAY, NULL /** \endcond */ -/** size of the audio_file info string */ -#define AUDIO_FILE_INFO_SIZE 16384 - -struct audio_format_info { - /** the number of chunks this audio file contains */ +/** Audio format dependent information. */ +struct afh_info { + /** The number of chunks this audio file contains. */ long unsigned chunks_total; - /** the length of the audio file in seconds */ - int seconds_total; - /** a string that gets filled in by the audio format handler */ - char info_string[AUDIO_FILE_INFO_SIZE]; + /** The length of the audio file in seconds. */ + long unsigned seconds_total; + /** A string that gets filled in by the audio format handler. */ + char *info_string; /** - * the table that specifies the offset of the individual pieces in + * The table that specifies the offset of the individual pieces in * the current audio file. */ - size_t *chunk_table; - /** period of time between sending data chunks */ + uint32_t *chunk_table; + /** Period of time between sending data chunks. */ struct timeval chunk_tv; - /** end of file timeout - do not load new audio file until this time */ + /** End of file timeout - Do not load new audio file until this time. */ struct timeval eof_tv; /** - * optional audio file header - * - * This is read from a sender in case a new client connects in the - * middle of the stream. The audio format handler does not need to set - * this if the audio format does not need any special header treatment. - * If non-NULL, it must point to a buffer holding the current audio - * file header. + * The position of the header within the audio file. Ignored if \a + * header_len equals zero. */ - char *header; - /** the length of the header, ignored if \a header is \p NULL */ - unsigned header_len; + uint32_t header_offset; + /** + * The header is needed by senders in case a new client connects in the + * middle of the stream. The length of the header defaults to zero + * which means that this audio format does not need any special header + * treatment. The audio format handler does not need to set this to + * zero in this case. + */ + uint32_t header_len; + /** The number of channels. */ + uint8_t channels; + /** Frequency in Hz. */ + uint16_t frequency; + /** Exact meaning depends on audio format. */ + uint16_t bitrate; }; /** - * structure for audio format handling + * Structure for audio format handling. * - * There's exactly one such struct for each supported audio format. Initially, - * only \a name and \a init are defined. During the startup process, - * para_server calls the \a init function of each audio format handler which is - * expected to fill in all the other function pointers. + * There's one such struct for each supported audio format. Initially, only \a + * name and \a init are defined. During the startup process, para_server calls + * the \a init function of each audio format handler which is expected to fill + * in the other part of this struct. */ struct audio_format_handler { - /** - * name of the audio format - */ + /** Name of the audio format. */ const char *name; /** - * typical file endings for files that can be handled by this afh. - */ - const char **suffixes; - /** - * pointer to the audio format handler's init function + * Pointer to the audio format handler's init function. * * Must initialize all function pointers and is assumed to succeed. */ void (*init)(struct audio_format_handler*); + /** Typical file endings for files that can be handled by this afh. */ + const char **suffixes; /** - * check if this audio format handler can handle the file + * Check if this audio format handler can handle the file. * * This is a pointer to a function returning whether a given file is * valid for this audio format. A negative return value indicates that - * this audio format handler did not recognize the given file. On + * this audio format handler is unable to decode the given file. On * success, the function must return a positive value and fill in the - * given struct audio_format_info. + * given struct afh_info. * - * \sa struct audio_format_info - */ - int (*get_file_info)(FILE *audio_file, struct audio_format_info *afi); + * \sa struct afh_info + */ + int (*get_file_info)(char *map, size_t numbytes, int fd, + struct afh_info *afi); }; +void afh_init(void); +int guess_audio_format(const char *name); +int compute_afhi(const char *path, char *data, size_t size, + int fd, struct afh_info *afhi); +const char *audio_format_name(int); +void afh_get_chunk(long unsigned chunk_num, struct afh_info *afhi, + void *map, const char **buf, size_t *len); +uint32_t afh_get_largest_chunk_size(struct afh_info *afhi); +void afh_get_header(struct afh_info *afhi, void *map, const char **buf, size_t *len); +char *make_taginfo(char *title, char *artist, char *album, char *year, + char *comment);