X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afh.h;h=35cc7ef102644f1c394db52cd6cd21af51395c21;hp=403b7a55e2e62ade3b8a97a1cb2ec2c1bdc06fa4;hb=4e3d8370476eee8537d8dc325d588fca43928098;hpb=f3ebfd3dcb117f1c4a91c2c9f08d8ed710ee3907 diff --git a/afh.h b/afh.h index 403b7a55..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,105 +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 */ +/** 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. */ + 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 current audio file. + */ + 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. */ + struct timeval eof_tv; + /** + * The position of the header within the audio file. Ignored if \a + * header_len equals zero. + */ + 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; /** - * period of time between sending data chunks - */ - struct timeval chunk_tv; /* length of one chunk of data */ - /** - * end of file timeout - do not load new audio file until this time - * - */ - struct timeval eof_tv; /* timeout on eof */ - /** - * Pointer to the optional get-header function. - * - * This is called from a sender in case a new client connects in the middle of - * the stream. The audio format handler may set this to NULL to indicate that - * this audio format does not need any special header treatment. If non-NULL, - * the function it points to must return a pointer to a buffer holding the - * current audio file header, together with the header length. - */ - char *(*get_header_info)(int *header_len); - /** - * 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 success, the function is - * expected to return a positive value and to fill in \arg info_str, \arg - * chunks and \arg seconds appropriately. - */ - int (*get_file_info)(FILE *audio_file, char *info_str, - long unsigned *chunks, int *seconds); - /** - * cleanup function of this audio format handler - * - * This close function should deallocate any resources - * associated with the current audio file. In particular, it is responsible - * for closing the file handle. It is assumed to succeed. - */ - void (*close_audio_file)(void); - /** - * jump to another position in the current audio file - * - * This is called if a client issued the ff or jmp command with \a request - * being the number of the next chunk that should be sent out. Must return a - * positive value on success and a negative value on errors. - */ - int (*reposition_stream)(long unsigned request); - /** - * function responsible for reading one data chunk. + * Check if this audio format handler can handle the file. * - * \a read_chunk() must return a pointer to the next chunk of data that should - * be sent out, or \p NULL on errors or if the end of the file was encountered. + * 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 is unable to decode the given file. On + * success, the function must return a positive value and fill in the + * given struct afh_info. * - * If it returns non-NULL, \a len must contain the length of the returned - * buffer (which may be zero if nothing has to be sent for some reason). - * Otherwise, \a len is used to distinguish between the eof and the error case: - * It must be zero in the eof case, or negative if an error occcured. - */ - char * (*read_chunk)(long unsigned chunk_num, ssize_t *len); + * \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);