diff options
Diffstat (limited to 'src/xine-engine/audio_out.c')
-rw-r--r-- | src/xine-engine/audio_out.c | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/src/xine-engine/audio_out.c b/src/xine-engine/audio_out.c index b9738595b..4b2398bef 100644 --- a/src/xine-engine/audio_out.c +++ b/src/xine-engine/audio_out.c @@ -16,14 +16,18 @@ * You should have received a copy of the GNU General Public License * along with self program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA - * - * 22-8-2001 James imported some useful AC3 sections from the previous alsa driver. - * (c) 2001 Andy Lo A Foe <andy@alsaplayer.org> - * 20-8-2001 First implementation of Audio sync and Audio driver separation. - * (c) 2001 James Courtier-Dutton James@superbug.demon.co.uk */ -/* +/** + * @file + * @brief xine-lib audio output implementation + * + * @date 2001-08-20 First implementation of Audio sync and Audio driver separation. + * (c) 2001 James Courtier-Dutton <james@superbug.demon.co.uk> + * @date 2001-08-22 James imported some useful AC3 sections from the previous + * ALSA driver. (c) 2001 Andy Lo A Foe <andy@alsaplayer.org> + * + * * General Programming Guidelines: - * New concept of an "audio_frame". * An audio_frame consists of all the samples required to fill every @@ -85,11 +89,11 @@ #define LOG_RESAMPLE_SYNC 0 -#include "xine_internal.h" -#include "xineutils.h" -#include "audio_out.h" -#include "resample.h" -#include "metronom.h" +#include <xine/xine_internal.h> +#include <xine/xineutils.h> +#include <xine/audio_out.h> +#include <xine/resample.h> +#include <xine/metronom.h> #define NUM_AUDIO_BUFFERS 32 @@ -287,6 +291,7 @@ struct audio_fifo_s { pthread_cond_t empty; int num_buffers; + int num_buffers_max; }; static int ao_get_property (xine_audio_port_t *this_gen, int property); @@ -301,9 +306,10 @@ static audio_fifo_t *XINE_MALLOC fifo_new (xine_t *xine) { if (!fifo) return NULL; - fifo->first = NULL; - fifo->last = NULL; - fifo->num_buffers = 0; + fifo->first = NULL; + fifo->last = NULL; + fifo->num_buffers = 0; + fifo->num_buffers_max = 0; pthread_mutex_init (&fifo->mutex, NULL); pthread_cond_init (&fifo->not_empty, NULL); pthread_cond_init (&fifo->empty, NULL); @@ -330,6 +336,10 @@ static void fifo_append_int (audio_fifo_t *fifo, fifo->num_buffers++; } + + if (fifo->num_buffers_max < fifo->num_buffers) + fifo->num_buffers_max = fifo->num_buffers; + pthread_cond_signal (&fifo->not_empty); } @@ -589,18 +599,16 @@ static void audio_filter_compress (aos_t *this, int16_t *mem, int num_frames) { } static void audio_filter_amp (aos_t *this, void *buf, int num_frames) { - - int i; - int num_channels; double amp_factor; + int i; + const int total_frames = num_frames * _x_ao_mode2channels (this->input.mode); - num_channels = _x_ao_mode2channels (this->input.mode); - if (!num_channels) + if (!total_frames) return; amp_factor=this->amp_factor; if (this->amp_mute || amp_factor == 0) { - memset (buf, 0, num_frames * num_channels * (this->input.bits / 8)); + memset (buf, 0, total_frames * (this->input.bits / 8)); return; } @@ -608,7 +616,7 @@ static void audio_filter_amp (aos_t *this, void *buf, int num_frames) { int16_t test; int8_t *mem = (int8_t *) buf; - for (i=0; i<num_frames*num_channels; i++) { + for (i=0; i<total_frames; i++) { test = mem[i] * amp_factor; /* Force limit on amp_factor to prevent clipping */ if (test < INT8_MIN) { @@ -625,7 +633,7 @@ static void audio_filter_amp (aos_t *this, void *buf, int num_frames) { int32_t test; int16_t *mem = (int16_t *) buf; - for (i=0; i<num_frames*num_channels; i++) { + for (i=0; i<total_frames; i++) { test = mem[i] * amp_factor; /* Force limit on amp_factor to prevent clipping */ if (test < INT16_MIN) { @@ -1777,6 +1785,14 @@ static int ao_get_property (xine_audio_port_t *this_gen, int property) { ret = this->audio_loop_running ? this->out_fifo->num_buffers : -1; break; + case AO_PROP_BUFS_FREE: + ret = this->audio_loop_running ? this->free_fifo->num_buffers : -1; + break; + + case AO_PROP_BUFS_TOTAL: + ret = this->audio_loop_running ? this->free_fifo->num_buffers_max : -1; + break; + case AO_PROP_NUM_STREAMS: pthread_mutex_lock(&this->streams_lock); ret = xine_list_size(this->streams); @@ -2077,8 +2093,8 @@ xine_audio_port_t *_x_ao_new_port (xine_t *xine, ao_driver_t *driver, int i, err; pthread_attr_t pth_attrs; pthread_mutexattr_t attr; - static const char* resample_modes[] = {"auto", "off", "on", NULL}; - static const char* av_sync_methods[] = {"metronom feedback", "resample", NULL}; + static const char *const resample_modes[] = {"auto", "off", "on", NULL}; + static const char *const av_sync_methods[] = {"metronom feedback", "resample", NULL}; this = calloc(1, sizeof(aos_t)) ; |