diff options
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/ao_mpegpes.c | 20 | ||||
-rw-r--r-- | libao2/ao_nas.c | 50 | ||||
-rw-r--r-- | libao2/ao_oss.c | 2 |
3 files changed, 42 insertions, 30 deletions
diff --git a/libao2/ao_mpegpes.c b/libao2/ao_mpegpes.c index c6c66cd5ff..583ca44cf5 100644 --- a/libao2/ao_mpegpes.c +++ b/libao2/ao_mpegpes.c @@ -10,8 +10,8 @@ #include "config.h" -#ifdef HAVE_DVB -#include <sys/poll.h> +#ifdef CONFIG_DVB +#include <poll.h> #include <sys/ioctl.h> #endif @@ -25,8 +25,8 @@ #include "mp_msg.h" #include "help_mp.h" -#ifdef HAVE_DVB -#ifndef HAVE_DVB_HEAD +#ifdef CONFIG_DVB +#ifndef CONFIG_DVB_HEAD #include <ost/audio.h> audioMixer_t dvb_mixer={255,255}; #else @@ -45,7 +45,7 @@ int vo_mpegpes_fd2 = -1; static ao_info_t info = { -#ifdef HAVE_DVB +#ifdef CONFIG_DVB "DVB audio output", #else "MPEG-PES audio output", @@ -60,7 +60,7 @@ LIBAO_EXTERN(mpegpes) // to set/get/query special features/parameters static int control(int cmd,void *arg){ -#ifdef HAVE_DVB +#ifdef CONFIG_DVB switch(cmd){ case AOCONTROL_GET_VOLUME: if(vo_mpegpes_fd2>=0){ @@ -92,11 +92,11 @@ static int control(int cmd,void *arg){ static int freq=0; static int freq_id=0; -#ifdef HAVE_DVB +#ifdef CONFIG_DVB static int init_device(int card) { char ao_file[30]; -#ifndef HAVE_DVB_HEAD +#ifndef CONFIG_DVB_HEAD mp_msg(MSGT_VO,MSGL_INFO, "Opening /dev/ost/audio\n"); sprintf(ao_file, "/dev/ost/audio"); #else @@ -171,7 +171,7 @@ static int preinit(const char *arg) } card--; -#ifdef HAVE_DVB +#ifdef CONFIG_DVB if(!ao_file) return init_device(card); #else @@ -190,7 +190,7 @@ static int preinit(const char *arg) static int my_ao_write(const unsigned char* data,int len){ int orig_len = len; -#ifdef HAVE_DVB +#ifdef CONFIG_DVB #define NFD 1 struct pollfd pfd[NFD]; diff --git a/libao2/ao_nas.c b/libao2/ao_nas.c index 4888cfc366..5428c7489f 100644 --- a/libao2/ao_nas.c +++ b/libao2/ao_nas.c @@ -41,6 +41,7 @@ #include "audio_out_internal.h" #include "libaf/af_format.h" +/* NAS_FRAG_SIZE must be a power-of-two value */ #define NAS_FRAG_SIZE 4096 static char *nas_event_types[] = { @@ -116,8 +117,8 @@ struct ao_nas_data { unsigned int state; int expect_underrun; - void *client_buffer; - void *server_buffer; + char *client_buffer; + char *server_buffer; unsigned int client_buffer_size; unsigned int client_buffer_used; unsigned int server_buffer_size; @@ -139,7 +140,7 @@ static void nas_print_error(AuServer *aud, const char *prefix, AuStatus as) mp_msg(MSGT_AO, MSGL_ERR, "ao_nas: %s: returned status %d (%s)\n", prefix, as, s); } -static int nas_readBuffer(struct ao_nas_data *nas_data, int num) +static int nas_readBuffer(struct ao_nas_data *nas_data, unsigned int num) { AuStatus as; @@ -187,7 +188,7 @@ static int nas_readBuffer(struct ao_nas_data *nas_data, int num) return num; } -static int nas_writeBuffer(struct ao_nas_data *nas_data, void *data, int len) +static int nas_writeBuffer(struct ao_nas_data *nas_data, void *data, unsigned int len) { pthread_mutex_lock(&nas_data->buffer_mutex); mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: nas_writeBuffer(): len=%d client=%d/%d server=%d/%d\n", @@ -260,7 +261,7 @@ static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *h nas_state(event->prev_state), nas_state(event->cur_state), nas_reason(event->reason), - event->num_bytes, + (int)event->num_bytes, nas_data->expect_underrun); if (event->num_bytes > INT_MAX) { @@ -301,7 +302,7 @@ static AuBool nas_event_handler(AuServer *aud, AuEvent *ev, AuEventHandlerRec *h } mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: Can't refill buffer, stopping flow.\n"); - AuStopFlow(nas_data->aud, nas_data->flow, NULL); + AuStopFlow(aud, nas_data->flow, NULL); break; default: break; @@ -361,7 +362,7 @@ static int control(int cmd, void *arg) vol->right = (float)nas_data->gain/AU_FIXED_POINT_SCALE*50; vol->left = vol->right; - mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %08x\n", nas_data->gain); + mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_GET_VOLUME: %.2f\n", vol->right); retval = CONTROL_OK; break; @@ -372,7 +373,7 @@ static int control(int cmd, void *arg) * so i take the mean of both values. */ nas_data->gain = AU_FIXED_POINT_SCALE*((vol->left+vol->right)/2)/50; - mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %08x\n", nas_data->gain); + mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: AOCONTROL_SET_VOLUME: %.2f\n", (vol->left+vol->right)/2); aep.parameters[AuParmsMultiplyConstantConstant]=nas_data->gain; aep.flow = nas_data->flow; @@ -402,6 +403,8 @@ static int init(int rate,int channels,int format,int flags) int buffer_size; char *server; + (void)flags; /* shut up 'unused parameter' warning */ + nas_data=malloc(sizeof(struct ao_nas_data)); memset(nas_data, 0, sizeof(struct ao_nas_data)); @@ -564,7 +567,7 @@ static int get_space(void) // return: number of bytes played static int play(void* data,int len,int flags) { - int maxbursts, playbursts, writelen; + int written, maxbursts = 0, playbursts = 0; AuStatus as; mp_msg(MSGT_AO, MSGL_DBG3, @@ -574,18 +577,27 @@ static int play(void* data,int len,int flags) if (len == 0) return 0; - pthread_mutex_lock(&nas_data->buffer_mutex); - maxbursts = (nas_data->client_buffer_size - - nas_data->client_buffer_used) / ao_data.outburst; - playbursts = len / ao_data.outburst; - writelen = (playbursts > maxbursts ? maxbursts : playbursts) * - ao_data.outburst; - pthread_mutex_unlock(&nas_data->buffer_mutex); + if (!(flags & AOPLAY_FINAL_CHUNK)) { + pthread_mutex_lock(&nas_data->buffer_mutex); + maxbursts = (nas_data->client_buffer_size - + nas_data->client_buffer_used) / ao_data.outburst; + playbursts = len / ao_data.outburst; + len = (playbursts > maxbursts ? maxbursts : playbursts) * + ao_data.outburst; + pthread_mutex_unlock(&nas_data->buffer_mutex); + } - writelen = nas_writeBuffer(nas_data, data, writelen); + /* + * If AOPLAY_FINAL_CHUNK is set, we did not actually check len fits + * into the available buffer space, but mplayer.c shouldn't give us + * more to play than we report to it by get_space(), so this should be + * fine. + */ + written = nas_writeBuffer(nas_data, data, len); if (nas_data->state != AuStateStart && - maxbursts == playbursts) { + (maxbursts == playbursts || + flags & AOPLAY_FINAL_CHUNK)) { mp_msg(MSGT_AO, MSGL_DBG2, "ao_nas: play(): Starting flow.\n"); nas_data->expect_underrun = 1; AuStartFlow(nas_data->aud, nas_data->flow, &as); @@ -593,7 +605,7 @@ static int play(void* data,int len,int flags) nas_print_error(nas_data->aud, "play(): AuStartFlow", as); } - return writelen; + return written; } // return: delay in seconds between first and last sample in buffer diff --git a/libao2/ao_oss.c b/libao2/ao_oss.c index b9939de8b7..ed70152077 100644 --- a/libao2/ao_oss.c +++ b/libao2/ao_oss.c @@ -166,7 +166,7 @@ static int control(int cmd,void *arg){ { int format; if (!ioctl(audio_fd, SNDCTL_DSP_GETFMTS, &format)) - if (format & (int)arg) + if ((unsigned int)format & (unsigned long)arg) return CONTROL_TRUE; return CONTROL_FALSE; } |