diff options
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/ao_alsa.c | 21 | ||||
-rw-r--r-- | libao2/ao_ivtv.c | 2 | ||||
-rw-r--r-- | libao2/ao_mpegpes.c | 4 | ||||
-rw-r--r-- | libao2/ao_sdl.c | 2 | ||||
-rw-r--r-- | libao2/ao_v4l2.c | 2 | ||||
-rw-r--r-- | libao2/audio_out.c | 5 | ||||
-rw-r--r-- | libao2/audio_out.h | 3 |
7 files changed, 22 insertions, 17 deletions
diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c index f7eeb7ddd9..1ea974f6c1 100644 --- a/libao2/ao_alsa.c +++ b/libao2/ao_alsa.c @@ -70,6 +70,7 @@ static int ao_noblock = 0; static int open_mode; static int alsa_can_pause = 0; +static snd_pcm_sframes_t prepause_frames; #define ALSA_DEVICE_SIZE 256 @@ -334,6 +335,8 @@ static int init(int rate_hz, int channels, int format, int flags) mp_msg(MSGT_AO,MSGL_V,"alsa-init: compiled for ALSA-%s\n", SND_LIB_VERSION_STR); #endif + prepause_frames = 0; + snd_lib_error_set_handler(alsa_error_handler); ao_data.samplerate = rate_hz; @@ -753,6 +756,10 @@ static void audio_pause(void) } mp_msg(MSGT_AO,MSGL_V,"alsa-pause: pause supported by hardware\n"); } else { + if (snd_pcm_delay(alsa_handler, &prepause_frames) < 0 + || prepause_frames < 0) + prepause_frames = 0; + if ((err = snd_pcm_drop(alsa_handler)) < 0) { mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmDropError, snd_strerror(err)); @@ -782,6 +789,11 @@ static void audio_resume(void) mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err)); return; } + if (prepause_frames) { + void *silence = calloc(prepause_frames, bytes_per_sample); + play(silence, prepause_frames * bytes_per_sample, 0); + free(silence); + } } } @@ -790,6 +802,7 @@ static void reset(void) { int err; + prepause_frames = 0; if ((err = snd_pcm_drop(alsa_handler)) < 0) { mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_PcmPrepareError, snd_strerror(err)); @@ -865,10 +878,10 @@ static int get_space(void) return 0; } - ret = snd_pcm_status_get_avail(status) * bytes_per_sample; - if (ret > ao_data.buffersize) // Buffer underrun? - ret = ao_data.buffersize; - return ret; + unsigned space = snd_pcm_status_get_avail(status) * bytes_per_sample; + if (space > ao_data.buffersize) // Buffer underrun? + space = ao_data.buffersize; + return space; } /* delay in seconds between first and last sample in buffer */ diff --git a/libao2/ao_ivtv.c b/libao2/ao_ivtv.c index 96ea563c96..71b58c0637 100644 --- a/libao2/ao_ivtv.c +++ b/libao2/ao_ivtv.c @@ -147,7 +147,7 @@ get_space (void) static int play (void *data, int len, int flags) { - int ivtv_write (unsigned char *data, int len); + int ivtv_write (const unsigned char *data, int len); if (ao_data.format != AF_FORMAT_MPEG2) return 0; diff --git a/libao2/ao_mpegpes.c b/libao2/ao_mpegpes.c index 14918d467e..583ca44cf5 100644 --- a/libao2/ao_mpegpes.c +++ b/libao2/ao_mpegpes.c @@ -188,7 +188,7 @@ static int preinit(const char *arg) return vo_mpegpes_fd2; } -static int my_ao_write(unsigned char* data,int len){ +static int my_ao_write(const unsigned char* data,int len){ int orig_len = len; #ifdef CONFIG_DVB #define NFD 1 @@ -283,8 +283,6 @@ static void audio_resume(void) { } -void send_pes_packet(unsigned char* data,int len,int id,int timestamp); -void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id); extern int vo_pts; // return: how many bytes can be played without blocking diff --git a/libao2/ao_sdl.c b/libao2/ao_sdl.c index 97a70d4adf..645c9e9685 100644 --- a/libao2/ao_sdl.c +++ b/libao2/ao_sdl.c @@ -159,7 +159,7 @@ static int control(int cmd,void *arg){ } // SDL Callback function -void outputaudio(void *unused, Uint8 *stream, int len) { +static void outputaudio(void *unused, Uint8 *stream, int len) { //SDL_MixAudio(stream, read_buffer(buffers, len), len, SDL_MIX_MAXVOLUME); //if(!full_buffers) printf("SDL: Buffer underrun!\n"); diff --git a/libao2/ao_v4l2.c b/libao2/ao_v4l2.c index b1b510ea46..eca46f01ac 100644 --- a/libao2/ao_v4l2.c +++ b/libao2/ao_v4l2.c @@ -144,7 +144,7 @@ get_space (void) static int play (void *data, int len, int flags) { - int v4l2_write (unsigned char *data, int len); + int v4l2_write (const unsigned char *data, int len); if (ao_data.format != AF_FORMAT_MPEG2) return 0; diff --git a/libao2/audio_out.c b/libao2/audio_out.c index 38fad281be..71ebf94c82 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -7,7 +7,6 @@ #include "mp_msg.h" #include "help_mp.h" -#include "mplayer.h" /* for exit_player() */ // there are some globals: ao_data_t ao_data={0,0,0,0,OUTBURST,-1,0}; @@ -119,10 +118,6 @@ const ao_functions_t* init_best_audio_out(char** ao_list,int use_plugin,int rate while(ao_list[0][0]){ char* ao=ao_list[0]; int ao_len; - if (strncmp(ao, "alsa9", 5) == 0 || strncmp(ao, "alsa1x", 6) == 0) { - mp_msg(MSGT_AO, MSGL_FATAL, MSGTR_AO_ALSA9_1x_Removed); - exit_player(NULL); - } if (ao_subdevice) { free(ao_subdevice); ao_subdevice = NULL; diff --git a/libao2/audio_out.h b/libao2/audio_out.h index 5fad397313..59811f2754 100644 --- a/libao2/audio_out.h +++ b/libao2/audio_out.h @@ -29,8 +29,7 @@ typedef struct ao_functions_s } ao_functions_t; /* global data used by mplayer and plugins */ -typedef struct ao_data_s -{ +typedef struct ao_data { int samplerate; int channels; int format; |