X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.h;h=1fb6a435fe3a5b0c3706b58138b978847df25385;hp=3f4d1d7cf6eee49b8052214ae0e52dbf5e225a09;hb=471684761a2039bbc89aa1e3c33c62de6bef86cf;hpb=f3ebfd3dcb117f1c4a91c2c9f08d8ed710ee3907 diff --git a/afs.h b/afs.h index 3f4d1d7c..1fb6a435 100644 --- a/afs.h +++ b/afs.h @@ -1,37 +1,111 @@ /* - * Copyright (C) 2005-2006 Andre Noll + * Copyright (C) 2005-2007 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. + * Licensed under the GPL v2. For licencing details see COPYING. + */ + +/** \file afs.h data structures common to all audio file selectors */ + +#include + + +int find_audio_files(const char *dirname, int (*f)(const char *, const char *)); + +/** + * describes one supported audio file selector * - * 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. + * There is one such struct for each supported selector. During the startup + * part of para_server the \a init() function of the activated selector gets + * called which fills in all other function pointers. * - * 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. */ +struct audio_file_selector { +/** + * name name of this selector + */ +const char *name; +/** + * the init routine of the selector + * + * It should check its command line options and do all necessary initialization + * like connecting to a database server. + * + * A negative return value indicates an initialization error and means that + * this selector should be ignored for now (it may later be activated again via + * the chs command). + * + * If \a init() returns success (non-negative return value), it must have + * initialized in all non-optional function pointers of the given selector + * struct. Moreover, \a cmd_list must point to a NULL-terminated array which + * holds the list of all commands that are supported by this selector. + */ +int (*init)(struct audio_file_selector *self); +/** + * list of commands supported by this selector + */ +struct server_command *cmd_list; +/** + * pointer to function returning list of at most \a num audio files to be + * streamed next + * + * \a get_audio_file_list() must return a pointer to a array of at most \a num + * char* pointers (terminated by a NULL pointer), or NULL on errors. Both the + * array and its contents must be dynamically allocated and are freed by the + * caller. + * +*/ +char **(*get_audio_file_list)(unsigned int num); +/** + * + * the update hook + * + * The \a update_audio_file pointer is optional and need not be supplied. In this + * case it is not neccessary to init this pointer from within init(). If + * \a update_audio_file is non-NULL, the function it points to gets called + * whenever a new audio file was successfully loaded and is going to be + * streamed by any of paraslash's senders. The full path of the audio file is + * passed \a update_audio_file(). + * + */ +void (*update_audio_file)(char *audio_file); +/** + * + * shutdown this selector and free all resources + * + * This gets called whenever the audio file selector changes. The reason for + * this change might be that some user sent the chs command, that para_server + * receives the HUP signal, or that para_server shuts down. It is assumed to + * succeed. + */ +void (*shutdown)(void); +/** + * + * add file descriptors to fd_sets + * + * The pre_select function of the activated selector gets called just before + * para_server enters its main select loop. The selector may add its own file + * descriptors to the \a rfds or the \a wfds set. + * + * \return The highest-numbered file descriptor which was added to either of + * the two fd sets (or -1 if no file descriptors were added). + * + * \sa select(2) + */ +int (*pre_select)(fd_set *rfds, fd_set *wfds); +/** + * handle the file descriptors which are ready for I/O + * + * If the pre_select hook added one ore more file descriptors to the read or write + * set, this is the hook to check the result and do any I/O on those descriptors + * which are ready for reading/writing. + */ +void (*post_select)(fd_set *rfds, fd_set *wfds); +/** + * each selector has its private data pointer */ +void *private_data; +}; + +int mysql_selector_init(struct audio_file_selector*); +int playlist_selector_init(struct audio_file_selector*); +int random_selector_init(struct audio_file_selector*); -/** \file afs.h exported functions from afs.c (para_server) */ -void afs_init(void); -void afs_send_chunk(void); -struct timeval *afs_preselect(void); -const char *audio_format_name(int); -unsigned int afs_playing(void); -unsigned int afs_next(void); -unsigned int afs_repos(void); -unsigned int afs_paused(void); -char *afs_get_header(int *header_len); -struct timeval *afs_chunk_time(void); -int guess_audio_format(const char *name); -const char *supported_audio_formats(void); -/* status flags */ -#define AFS_NOMORE 1 -#define AFS_NEXT 2 -#define AFS_REPOS 4 -#define AFS_PLAYING 8 -#define DBT_CHANGE 16