X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/disorder/blobdiff_plain/6d2d327ca57fefaddceba10eb323451f8150e95d..e7eb3a2744aa45179daea235800753d3d1955338:/server/speaker.h diff --git a/server/speaker.h b/server/speaker.h index 9a48ca6..0cc0cb8 100644 --- a/server/speaker.h +++ b/server/speaker.h @@ -1,21 +1,19 @@ /* * This file is part of DisOrder - * Copyright (C) 2005, 2006, 2007 Richard Kettlewell + * Copyright (C) 2005-2008 Richard Kettlewell * - * This program is free software; you can redistribute it and/or modify + * 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 + * the Free Software Foundation, either version 3 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. - * + * 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-1307 - * USA + * along with this program. If not, see . */ /** @file server/speaker.h * @brief Speaker process @@ -46,13 +44,14 @@ #define FRAMES 4096 /** @brief Bytes to send per network packet + * + * This is the maximum number of bytes we pass to write(2); to determine actual + * packet sizes, add a UDP header and an IP header (and a link layer header if + * it's the link layer size you care about). * * Don't make this too big or arithmetic will start to overflow. */ -#define NETWORK_BYTES (1024+sizeof(struct rtp_header)) - -/** @brief Maximum RTP playahead (ms) */ -#define RTP_AHEAD_MS 1000 +#define NETWORK_BYTES (1500-8/*UDP*/-40/*IP*/-8/*conservatism*/) /** @brief Maximum number of FDs to poll for */ #define NFDS 256 @@ -87,6 +86,14 @@ struct track { /** @brief Slot in @ref fds */ int slot; + /** @brief Set when playable + * + * A track becomes playable whenever it fills its buffer or reaches EOF; it + * stops being playable when it entirely empties its buffer. Tracks start + * out life not playable. + */ + int playable; + /** @brief Input buffer * * 1Mbyte is enough for nearly 6s of 44100Hz 16-bit stereo @@ -135,11 +142,9 @@ struct speaker_backend { * If it is @ref device_closed then the device should be opened with * the right sample format. * - * Some devices are effectively always open and have no error state, - * in which case this callback can be NULL. In this case @ref - * FIXED_FORMAT must be set. Note that @ref device_state still - * switches between @ref device_open and @ref device_closed in this - * case. + * Some devices are effectively always open and have no error state, in which + * case this callback can be NULL. Note that @ref device_state still + * switches between @ref device_open and @ref device_closed in this case. */ void (*activate)(void); @@ -165,12 +170,20 @@ struct speaker_backend { void (*deactivate)(void); /** @brief Called before poll() + * @param timeoutp Pointer to timeout + * + * Called before the call to poll(). + * + * If desirable, should call addfd() to update the FD array and stash the + * slot number somewhere safe. This will only be called if @ref device_state + * is @ref device_open. + * + * @p timeoutp points to the poll timeout value in milliseconds. It may be + * reduced, but never increased. * - * Called before the call to poll(). Should call addfd() to update - * the FD array and stash the slot number somewhere safe. This will - * only be called if @ref device_state = @ref device_open. + * NB you can NOT assume that @c beforepoll is always called before @c play. */ - void (*beforepoll)(void); + void (*beforepoll)(int *timeoutp); /** @brief Called after poll() * @return 1 if output device ready for play, 0 otherwise @@ -214,6 +227,8 @@ extern struct track *playing; extern const struct speaker_backend network_backend; extern const struct speaker_backend alsa_backend; extern const struct speaker_backend command_backend; +extern const struct speaker_backend coreaudio_backend; +extern const struct speaker_backend oss_backend; extern struct pollfd fds[NFDS]; extern int fdno;