diff options
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/ao_coreaudio.c (renamed from libao2/ao_macosx.c) | 118 | ||||
-rw-r--r-- | libao2/ao_jack.c | 4 | ||||
-rw-r--r-- | libao2/ao_pulse.c | 17 | ||||
-rw-r--r-- | libao2/ao_sdl.c | 4 | ||||
-rw-r--r-- | libao2/audio_out.c | 4 |
5 files changed, 49 insertions, 98 deletions
diff --git a/libao2/ao_macosx.c b/libao2/ao_coreaudio.c index fb5883b3fb..3ef6d3367f 100644 --- a/libao2/ao_macosx.c +++ b/libao2/ao_coreaudio.c @@ -1,5 +1,5 @@ /* - * Mac OS X audio output driver + * CoreAudio audio output driver for Mac OS X * * original copyright (C) Timothy J. Wood - Aug 2000 * ported to MPlayer libao2 by Dan Christiansen @@ -52,21 +52,22 @@ #include "audio_out_internal.h" #include "libaf/af_format.h" #include "osdep/timer.h" +#include "libavutil/fifo.h" static const ao_info_t info = { "Darwin/Mac OS X native audio output", - "macosx", + "coreaudio", "Timothy J. Wood & Dan Christiansen & Chris Roccati", "" }; -LIBAO_EXTERN(macosx) +LIBAO_EXTERN(coreaudio) /* Prefix for all mp_msg() calls */ -#define ao_msg(a, b, c...) mp_msg(a, b, "AO: [macosx] " c) +#define ao_msg(a, b, c...) mp_msg(a, b, "AO: [coreaudio] " c) -typedef struct ao_macosx_s +typedef struct ao_coreaudio_s { AudioDeviceID i_selected_dev; /* Keeps DeviceID of the selected device. */ int b_supports_digital; /* Does the currently selected device support digital mode? */ @@ -91,87 +92,35 @@ typedef struct ao_macosx_s int paused; /* Ring-buffer */ - /* does not need explicit synchronization, but needs to allocate - * (num_chunks + 1) * chunk_size memory to store num_chunks * chunk_size - * data */ - unsigned char *buffer; - unsigned int buffer_len; ///< must always be (num_chunks + 1) * chunk_size + AVFifoBuffer *buffer; + unsigned int buffer_len; ///< must always be num_chunks * chunk_size unsigned int num_chunks; unsigned int chunk_size; - - unsigned int buf_read_pos; - unsigned int buf_write_pos; -} ao_macosx_t; +} ao_coreaudio_t; -static ao_macosx_t *ao = NULL; - -/** - * \brief return number of free bytes in the buffer - * may only be called by mplayer's thread - * \return minimum number of free bytes in buffer, value may change between - * two immediately following calls, and the real number of free bytes - * might actually be larger! - */ -static int buf_free(void) { - int free = ao->buf_read_pos - ao->buf_write_pos - ao->chunk_size; - if (free < 0) free += ao->buffer_len; - return free; -} - -/** - * \brief return number of buffered bytes - * may only be called by playback thread - * \return minimum number of buffered bytes, value may change between - * two immediately following calls, and the real number of buffered bytes - * might actually be larger! - */ -static int buf_used(void) { - int used = ao->buf_write_pos - ao->buf_read_pos; - if (used < 0) used += ao->buffer_len; - return used; -} +static ao_coreaudio_t *ao = NULL; /** * \brief add data to ringbuffer */ static int write_buffer(unsigned char* data, int len){ - int first_len = ao->buffer_len - ao->buf_write_pos; - int free = buf_free(); + int free = ao->buffer_len - av_fifo_size(ao->buffer); if (len > free) len = free; - if (first_len > len) first_len = len; - // till end of buffer - memcpy (&ao->buffer[ao->buf_write_pos], data, first_len); - if (len > first_len) { // we have to wrap around - // remaining part from beginning of buffer - memcpy (ao->buffer, &data[first_len], len - first_len); - } - ao->buf_write_pos = (ao->buf_write_pos + len) % ao->buffer_len; - return len; + return av_fifo_generic_write(ao->buffer, data, len, NULL); } /** * \brief remove data from ringbuffer */ static int read_buffer(unsigned char* data,int len){ - int first_len = ao->buffer_len - ao->buf_read_pos; - int buffered = buf_used(); + int buffered = av_fifo_size(ao->buffer); if (len > buffered) len = buffered; - if (first_len > len) first_len = len; - // till end of buffer - if (data) { - memcpy (data, &ao->buffer[ao->buf_read_pos], first_len); - if (len > first_len) { // we have to wrap around - // remaining part from beginning of buffer - memcpy (&data[first_len], ao->buffer, len - first_len); - } - } - ao->buf_read_pos = (ao->buf_read_pos + len) % ao->buffer_len; - return len; + return av_fifo_generic_read(ao->buffer, data, len, NULL); } OSStatus theRenderProc(void *inRefCon, AudioUnitRenderActionFlags *inActionFlags, const AudioTimeStamp *inTimeStamp, UInt32 inBusNumber, UInt32 inNumFrames, AudioBufferList *ioData) { -int amt=buf_used(); +int amt=av_fifo_size(ao->buffer); int req=(inNumFrames)*ao->packetSize; if(amt>req) @@ -266,7 +215,7 @@ static void print_format(int lev, const char* str, const AudioStreamBasicDescrip static int AudioDeviceSupportsDigital( AudioDeviceID i_dev_id ); static int AudioStreamSupportsDigital( AudioStreamID i_stream_id ); -static int OpenSPDIF(); +static int OpenSPDIF(void); static int AudioStreamChangeFormat( AudioStreamID i_stream_id, AudioStreamBasicDescription change_format ); static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice, const AudioTimeStamp * inNow, @@ -299,7 +248,7 @@ int b_alive; ao_msg(MSGT_AO,MSGL_V, "init([%dHz][%dch][%s][%d])\n", rate, channels, af_fmt2str_short(format), flags); - ao = calloc(1, sizeof(ao_macosx_t)); + ao = calloc(1, sizeof(ao_coreaudio_t)); ao->i_selected_dev = 0; ao->b_supports_digital = 0; @@ -493,8 +442,8 @@ int b_alive; ao_data.buffersize = ao_data.bps; ao->num_chunks = (ao_data.bps+ao->chunk_size-1)/ao->chunk_size; - ao->buffer_len = (ao->num_chunks + 1) * ao->chunk_size; - ao->buffer = calloc(ao->num_chunks + 1, ao->chunk_size); + ao->buffer_len = ao->num_chunks * ao->chunk_size; + ao->buffer = av_fifo_alloc(ao->buffer_len); ao_msg(MSGT_AO,MSGL_V, "using %5d chunks of %d bytes (buffer len %d bytes)\n", (int)ao->num_chunks, (int)ao->chunk_size, (int)ao->buffer_len); @@ -515,7 +464,7 @@ err_out2: err_out1: CloseComponent(ao->theOutputUnit); err_out: - free(ao->buffer); + av_fifo_free(ao->buffer); free(ao); ao = NULL; return CONTROL_FALSE; @@ -524,7 +473,7 @@ err_out: /***************************************************************************** * Setup a encoded digital stream (SPDIF) *****************************************************************************/ -static int OpenSPDIF() +static int OpenSPDIF(void) { OSStatus err = noErr; UInt32 i_param_size, b_mix = 0; @@ -737,8 +686,8 @@ static int OpenSPDIF() ao_data.buffersize = ao_data.bps; ao->num_chunks = (ao_data.bps+ao->chunk_size-1)/ao->chunk_size; - ao->buffer_len = (ao->num_chunks + 1) * ao->chunk_size; - ao->buffer = calloc(ao->num_chunks + 1, ao->chunk_size); + ao->buffer_len = ao->num_chunks * ao->chunk_size; + ao->buffer = av_fifo_alloc(ao->buffer_len); ao_msg(MSGT_AO,MSGL_V, "using %5d chunks of %d bytes (buffer len %d bytes)\n", (int)ao->num_chunks, (int)ao->chunk_size, (int)ao->buffer_len); @@ -782,7 +731,7 @@ err_out: ao_msg(MSGT_AO, MSGL_WARN, "Could not release hogmode: [%4.4s]\n", (char *)&err); } - free(ao->buffer); + av_fifo_free(ao->buffer); free(ao); ao = NULL; return CONTROL_FALSE; @@ -981,7 +930,7 @@ static OSStatus RenderCallbackSPDIF( AudioDeviceID inDevice, const AudioTimeStamp * inOutputTime, void * threadGlobals ) { - int amt = buf_used(); + int amt = av_fifo_size(ao->buffer); int req = outOutputData->mBuffers[ao->i_stream_index].mDataByteSize; if (amt > req) @@ -1030,27 +979,22 @@ static int play(void* output_samples,int num_bytes,int flags) static void reset(void) { audio_pause(); - /* reset ring-buffer state */ - ao->buf_read_pos=0; - ao->buf_write_pos=0; - - return; + av_fifo_reset(ao->buffer); } /* return available space */ static int get_space(void) { - return buf_free(); + return ao->buffer_len - av_fifo_size(ao->buffer); } /* return delay until audio is played */ static float get_delay(void) { - int buffered = ao->buffer_len - ao->chunk_size - buf_free(); // could be less // inaccurate, should also contain the data buffered e.g. by the OS - return (float)(buffered)/(float)ao_data.bps; + return (float)av_fifo_size(ao->buffer)/(float)ao_data.bps; } @@ -1061,8 +1005,8 @@ static void uninit(int immed) UInt32 i_param_size = 0; if (!immed) { - long long timeleft=(1000000LL*buf_used())/ao_data.bps; - ao_msg(MSGT_AO,MSGL_DBG2, "%d bytes left @%d bps (%d usec)\n", buf_used(), ao_data.bps, (int)timeleft); + long long timeleft=(1000000LL*av_fifo_size(ao->buffer))/ao_data.bps; + ao_msg(MSGT_AO,MSGL_DBG2, "%d bytes left @%d bps (%d usec)\n", av_fifo_size(ao->buffer), ao_data.bps, (int)timeleft); usec_sleep((int)timeleft); } @@ -1115,7 +1059,7 @@ static void uninit(int immed) } } - free(ao->buffer); + av_fifo_free(ao->buffer); free(ao); ao = NULL; } diff --git a/libao2/ao_jack.c b/libao2/ao_jack.c index 494d44aa19..8ee5550602 100644 --- a/libao2/ao_jack.c +++ b/libao2/ao_jack.c @@ -82,7 +82,7 @@ static AVFifoBuffer *buffer; * If there is not enough room, the buffer is filled up */ static int write_buffer(unsigned char* data, int len) { - int free = BUFFSIZE - av_fifo_size(buffer); + int free = av_fifo_space(buffer); if (len > free) len = free; return av_fifo_generic_write(buffer, data, len, NULL); } @@ -337,7 +337,7 @@ static void audio_resume(void) { } static int get_space(void) { - return BUFFSIZE - av_fifo_size(buffer); + return av_fifo_space(buffer); } /** diff --git a/libao2/ao_pulse.c b/libao2/ao_pulse.c index 2d27c85540..b2fdcbb175 100644 --- a/libao2/ao_pulse.c +++ b/libao2/ao_pulse.c @@ -102,7 +102,10 @@ static void success_cb(pa_stream *s, int success, void *userdata) { */ static int waitop(pa_operation *op) { pa_operation_state_t state; - if (!op) return 0; + if (!op) { + pa_threaded_mainloop_unlock(mainloop); + return 0; + } state = pa_operation_get_state(op); while (state == PA_OPERATION_RUNNING) { pa_threaded_mainloop_wait(mainloop); @@ -150,11 +153,11 @@ static int init(int rate_hz, int channels, int format, int flags) { } broken_pause = 0; - // not sure which versions are affected, assume 0.9.1* + // not sure which versions are affected, assume 0.9.11* to 0.9.14* // known bad: 0.9.14, 0.9.13 - // known good: 0.9.9, 0.9.10 + // known good: 0.9.9, 0.9.10, 0.9.15 // to test: pause, wait ca. 5 seconds framestep and see if MPlayer hangs somewhen - if (strncmp(version, "0.9.1", 5) == 0 && strncmp(version, "0.9.10", 6) != 0) { + if (strncmp(version, "0.9.1", 5) == 0 && version[5] >= '1' && version[5] <= '4') { mp_msg(MSGT_AO, MSGL_WARN, "[pulse] working around probably broken pause functionality,\n" " see http://www.pulseaudio.org/ticket/440\n"); broken_pause = 1; @@ -389,12 +392,16 @@ static int control(int cmd, void *arg) { volume.values[1] = (pa_volume_t)vol->right*PA_VOLUME_NORM/100; } - if (!(o = pa_context_set_sink_input_volume(context, pa_stream_get_index(stream), &volume, NULL, NULL))) { + pa_threaded_mainloop_lock(mainloop); + o = pa_context_set_sink_input_volume(context, pa_stream_get_index(stream), &volume, NULL, NULL); + if (!o) { + pa_threaded_mainloop_unlock(mainloop); GENERIC_ERR_MSG(context, "pa_context_set_sink_input_volume() failed"); return CONTROL_ERROR; } /* We don't wait for completion here */ pa_operation_unref(o); + pa_threaded_mainloop_unlock(mainloop); return CONTROL_OK; } diff --git a/libao2/ao_sdl.c b/libao2/ao_sdl.c index 63ddec6f29..df643cb62a 100644 --- a/libao2/ao_sdl.c +++ b/libao2/ao_sdl.c @@ -67,7 +67,7 @@ static unsigned char volume=SDL_MIX_MAXVOLUME; #endif static int write_buffer(unsigned char* data,int len){ - int free = BUFFSIZE - av_fifo_size(buffer); + int free = av_fifo_space(buffer); if (len > free) len = free; return av_fifo_generic_write(buffer, data, len, NULL); } @@ -280,7 +280,7 @@ static void audio_resume(void) // return: how many bytes can be played without blocking static int get_space(void){ - return BUFFSIZE - av_fifo_size(buffer); + return av_fifo_space(buffer); } // plays 'len' bytes of 'data' diff --git a/libao2/audio_out.c b/libao2/audio_out.c index 8c64abbb95..fe95ab192f 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -31,7 +31,7 @@ ao_data_t ao_data={0,0,0,0,OUTBURST,-1,0}; char *ao_subdevice = NULL; extern const ao_functions_t audio_out_oss; -extern const ao_functions_t audio_out_macosx; +extern const ao_functions_t audio_out_coreaudio; extern const ao_functions_t audio_out_arts; extern const ao_functions_t audio_out_esd; extern const ao_functions_t audio_out_pulse; @@ -67,7 +67,7 @@ const ao_functions_t* const audio_out_drivers[] = &audio_out_dart, #endif #ifdef CONFIG_COREAUDIO - &audio_out_macosx, + &audio_out_coreaudio, #endif #ifdef CONFIG_OSS_AUDIO &audio_out_oss, |