From f17ed524321ce1e29016b0e50cb3147c22bb0705 Mon Sep 17 00:00:00 2001 From: cladisch Date: Mon, 24 Aug 2009 07:32:25 +0000 Subject: Use a buffer of about half a second, instead of sizing it to have a constant number of frames. This improves the behaviour at very small or large sample rates, and gets rid of lots of obsolete code. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29549 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libao2/ao_alsa.c | 83 ++------------------------------------------------------ 1 file changed, 3 insertions(+), 80 deletions(-) (limited to 'libao2/ao_alsa.c') diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c index 491a5861c6..e13e641d05 100644 --- a/libao2/ao_alsa.c +++ b/libao2/ao_alsa.c @@ -72,11 +72,8 @@ static snd_pcm_format_t alsa_format; static snd_pcm_hw_params_t *alsa_hwparams; static snd_pcm_sw_params_t *alsa_swparams; -/* 16 sets buffersize to 16 * chunksize is as default 1024 - * which seems to be good avarge for most situations - * so buffersize is 16384 frames by default */ -static int alsa_fragcount = 16; -static snd_pcm_uframes_t chunk_size = 1024; +static unsigned int alsa_buffer_time = 500000; /* 0.5 s */ +static unsigned int alsa_fragcount = 16; static size_t bytes_per_sample; @@ -87,9 +84,6 @@ static int alsa_can_pause = 0; #define ALSA_DEVICE_SIZE 256 -#undef BUFFERTIME -#define SET_CHUNKSIZE - static void alsa_error_handler(const char *file, int line, const char *function, int err, const char *format, ...) { @@ -329,6 +323,7 @@ static int init(int rate_hz, int channels, int format, int flags) int err; int block; strarg_t device; + snd_pcm_uframes_t chunk_size; snd_pcm_uframes_t bufsize; snd_pcm_uframes_t boundary; opt_t subopts[] = { @@ -484,41 +479,6 @@ static int init(int rate_hz, int channels, int format, int flags) open_mode = 0; } - //sets buff/chunksize if its set manually - if (ao_data.buffersize) { - switch (ao_data.buffersize) - { - case 1: - alsa_fragcount = 16; - chunk_size = 512; - mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 8192\n"); - mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 512\n"); - break; - case 2: - alsa_fragcount = 8; - chunk_size = 1024; - mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 8192\n"); - mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 1024\n"); - break; - case 3: - alsa_fragcount = 32; - chunk_size = 512; - mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 16384\n"); - mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 512\n"); - break; - case 4: - alsa_fragcount = 16; - chunk_size = 1024; - mp_msg(MSGT_AO,MSGL_V,"alsa-init: buffersize set manually to 16384\n"); - mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set manually to 1024\n"); - break; - default: - alsa_fragcount = 16; - chunk_size = 1024; - break; - } - } - if (!alsa_handler) { //modes = 0, SND_PCM_NONBLOCK, SND_PCM_ASYNC if ((err = try_open_device(alsa_device, open_mode, format == AF_FORMAT_AC3)) < 0) @@ -611,57 +571,20 @@ static int init(int rate_hz, int channels, int format, int flags) bytes_per_sample *= ao_data.channels; ao_data.bps = ao_data.samplerate * bytes_per_sample; -#ifdef BUFFERTIME - { - int alsa_buffer_time = 500000; /* original 60 */ - int alsa_period_time; - alsa_period_time = alsa_buffer_time/4; if ((err = snd_pcm_hw_params_set_buffer_time_near(alsa_handler, alsa_hwparams, &alsa_buffer_time, NULL)) < 0) { mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetBufferTimeNear, snd_strerror(err)); return 0; - } else - alsa_buffer_time = err; - - if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams, - &alsa_period_time, NULL)) < 0) - /* original: alsa_buffer_time/ao_data.bps */ - { - mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriodTime, - snd_strerror(err)); - return 0; } - mp_msg(MSGT_AO,MSGL_INFO,MSGTR_AO_ALSA_BufferTimePeriodTime, - alsa_buffer_time, err); - } -#endif//end SET_BUFFERTIME -#ifdef SET_CHUNKSIZE - { - //set chunksize - if ((err = snd_pcm_hw_params_set_period_size_near(alsa_handler, alsa_hwparams, - &chunk_size, NULL)) < 0) - { - mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriodSize, - chunk_size, snd_strerror(err)); - return 0; - } - else { - mp_msg(MSGT_AO,MSGL_V,"alsa-init: chunksize set to %li\n", chunk_size); - } if ((err = snd_pcm_hw_params_set_periods_near(alsa_handler, alsa_hwparams, &alsa_fragcount, NULL)) < 0) { mp_msg(MSGT_AO,MSGL_ERR,MSGTR_AO_ALSA_UnableToSetPeriods, snd_strerror(err)); return 0; } - else { - mp_msg(MSGT_AO,MSGL_V,"alsa-init: fragcount=%i\n", alsa_fragcount); - } - } -#endif//end SET_CHUNKSIZE /* finally install hardware parameters */ if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0) -- cgit v1.2.3 From 790e41cf8f8e047942231a062d3a937bbc3e3d14 Mon Sep 17 00:00:00 2001 From: reimar Date: Wed, 2 Sep 2009 11:33:37 +0000 Subject: The suboption parser now takes a const options list, so mark them all const. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@29628 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libao2/ao_alsa.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libao2/ao_alsa.c') diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c index e13e641d05..5c4c5c585b 100644 --- a/libao2/ao_alsa.c +++ b/libao2/ao_alsa.c @@ -326,7 +326,7 @@ static int init(int rate_hz, int channels, int format, int flags) snd_pcm_uframes_t chunk_size; snd_pcm_uframes_t bufsize; snd_pcm_uframes_t boundary; - opt_t subopts[] = { + const opt_t subopts[] = { {"block", OPT_ARG_BOOL, &block, NULL}, {"device", OPT_ARG_STR, &device, (opt_test_f)str_maxlen}, {NULL} -- cgit v1.2.3