From cc8359e4e8e5f5f66c9c5b13d8a0cf878b0bc7a4 Mon Sep 17 00:00:00 2001 From: cladisch <cladisch@b3059339-0415-0410-9bf9-f77b7e298cf2> Date: Mon, 13 Feb 2006 11:15:25 +0000 Subject: [PATCH] This patch removes mmap support because it doesn't have any benefit. Directly accessing the sample buffer makes sense only when the samples can be constructed in-place. When the samples are just copied from another buffer (as is the case with libao2 drivers), the code to copy those samples is just a reimplementation of snd_pcm_writei(), so we could as well use that function. Besides, the current mmap code does not work except in the most simple cases: it claims to support non-interleaved and complex sample formats, but treats them the same as interleaved formats and writes to the wrong memory location. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17617 b3059339-0415-0410-9bf9-f77b7e298cf2 --- ChangeLog | 1 + DOCS/man/en/mplayer.1 | 6 +- libao2/ao_alsa.c | 159 +++--------------------------------------- 3 files changed, 11 insertions(+), 155 deletions(-) diff --git a/ChangeLog b/ChangeLog index 95012f93a8..e1c1c56b8c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -39,6 +39,7 @@ MPlayer (1.0) * improved XvMC library detection (disabled by default) * DPI (Print-Resolution) and Pixel-Aspect support in vo_jpeg * ALSA audio output: several small fixes and improvements + * removed experimental mmap suboption from the ALSA driver Decoders: * Indeo2 (RT21) support via lavc diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index 69e5019a79..4624189a77 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -2045,8 +2045,8 @@ See \-ao help for a list of compiled-in audio output drivers. .RSs .IPs "\-ao alsa,oss," Try the ALSA driver, then the OSS driver, then others. -.IPs "\-ao alsa:mmap:noblock:device=hw=0.3" -Sets noblock-mode, mmap-mode and the device-name as first card, fourth device. +.IPs "\-ao alsa:noblock:device=hw=0.3" +Sets noblock-mode and the device-name as first card, fourth device. .RE .PD 1 .sp 1 @@ -2057,8 +2057,6 @@ Available audio output drivers are: ALSA 0.9/1.x audio output driver .PD 0 .RSs -.IPs mmap\ \ \ -Sets experimental mmap-mode (does not work for more than 2 channels). .IPs noblock Sets noblock-mode. .IPs device=<device> diff --git a/libao2/ao_alsa.c b/libao2/ao_alsa.c index d0660819f2..182a792fd7 100644 --- a/libao2/ao_alsa.c +++ b/libao2/ao_alsa.c @@ -17,7 +17,6 @@ #include <stdlib.h> #include <math.h> #include <string.h> -#include <sys/poll.h> #include "config.h" #include "subopt-helper.h" @@ -66,7 +65,6 @@ static size_t chunk_bytes; static int ao_mmap = 0; static int ao_noblock = 0; -static int first = 1; static int open_mode; static int set_block_mode; @@ -76,7 +74,6 @@ static int alsa_can_pause = 0; #undef BUFFERTIME #define SET_CHUNKSIZE -#undef USE_POLL /* to set/get/query special features/parameters */ static int control(int cmd, void *arg) @@ -236,11 +233,9 @@ static void print_help (void) { mp_msg (MSGT_AO, MSGL_FATAL, "\n-ao alsa commandline help:\n" - "Example: mplayer -ao alsa:mmap:device=hw=0.3\n" - " sets mmap-mode and first card fourth device\n" + "Example: mplayer -ao alsa:device=hw=0.3\n" + " sets first card fourth hardware device\n" "\nOptions:\n" - " mmap\n" - " Set memory-mapped mode, experimental\n" " noblock\n" " Sets non-blocking mode\n" " device=<device-name>\n" @@ -409,6 +404,8 @@ static int init(int rate_hz, int channels, int format, int flags) print_help(); return 0; } + if (ao_mmap) + mp_msg(MSGT_AO,MSGL_WARN,"alsa-init: mmap option is obsolete and has no effect"); ao_noblock = !block; parse_device(alsa_device, device.str, device.len); @@ -456,10 +453,7 @@ static int init(int rate_hz, int channels, int format, int flags) break; default: alsa_fragcount = 16; - if (ao_mmap) - chunk_size = 512; - else - chunk_size = 1024; + chunk_size = 1024; break; } } @@ -500,18 +494,8 @@ static int init(int rate_hz, int channels, int format, int flags) return(0); } - if (ao_mmap) { - snd_pcm_access_mask_t *mask = alloca(snd_pcm_access_mask_sizeof()); - snd_pcm_access_mask_none(mask); - snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_INTERLEAVED); - snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_NONINTERLEAVED); - snd_pcm_access_mask_set(mask, SND_PCM_ACCESS_MMAP_COMPLEX); - err = snd_pcm_hw_params_set_access_mask(alsa_handler, alsa_hwparams, mask); - mp_msg(MSGT_AO,MSGL_INFO,"alsa-init: mmap set\n"); - } else { - err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams, - SND_PCM_ACCESS_RW_INTERLEAVED); - } + err = snd_pcm_hw_params_set_access(alsa_handler, alsa_hwparams, + SND_PCM_ACCESS_RW_INTERLEAVED); if (err < 0) { mp_msg(MSGT_AO,MSGL_ERR,"alsa-init: unable to set access type: %s\n", snd_strerror(err)); @@ -749,22 +733,6 @@ static void reset(void) return; } -#ifdef USE_POLL -static int wait_for_poll(snd_pcm_t *handle, struct pollfd *ufds, unsigned int count) -{ - unsigned short revents; - - while (1) { - poll(ufds, count, -1); - snd_pcm_poll_descriptors_revents(handle, ufds, count, &revents); - if (revents & POLLERR) - return -EIO; - if (revents & POLLOUT) - return 0; - } -} -#endif - #ifndef timersub #define timersub(a, b, result) \ do { \ @@ -809,15 +777,11 @@ static int xrun(u_char *str_mode) } static int play_normal(void* data, int len); -static int play_mmap(void* data, int len); static int play(void* data, int len, int flags) { int result; - if (ao_mmap) - result = play_mmap(data, len); - else - result = play_normal(data, len); + result = play_normal(data, len); return result; } @@ -888,113 +852,6 @@ static int play_normal(void* data, int len) return len - len % bytes_per_sample; } -/* mmap-mode mainly based on descriptions by Joshua Haberman <joshua@haberman.com> - * 'An overview of the ALSA API' http://people.debian.org/~joshua/x66.html - * and some help by Paul Davis <pbd@op.net> */ - -static int play_mmap(void* data, int len) -{ - snd_pcm_sframes_t commitres, frames_available; - snd_pcm_uframes_t frames_transmit, size, offset; - const snd_pcm_channel_area_t *area; - void *outbuffer; - int result; - -#ifdef USE_POLL //seems not really be needed - struct pollfd *ufds; - int count; - - count = snd_pcm_poll_descriptors_count (alsa_handler); - ufds = malloc(sizeof(struct pollfd) * count); - snd_pcm_poll_descriptors(alsa_handler, ufds, count); - - //first wait_for_poll - if (err = (wait_for_poll(alsa_handler, ufds, count) < 0)) { - if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN || - snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) { - xrun("play"); - } - } -#endif - - outbuffer = alloca(ao_data.buffersize); - - //don't trust get_space() ;) - frames_available = snd_pcm_avail_update(alsa_handler) * bytes_per_sample; - if (frames_available < 0) - xrun("play"); - - if (frames_available < 4) { - if (first) { - first = 0; - snd_pcm_start(alsa_handler); - } - else { //FIXME should break and return 0? - snd_pcm_wait(alsa_handler, -1); - first = 1; - } - } - - /* len is simply the available bufferspace got by get_space() - * but real avail_buffer in frames is ab/bytes_per_sample */ - size = len / bytes_per_sample; - - //mp_msg(MSGT_AO,MSGL_V,"len: %i size %i, f_avail %i, bps %i ...\n", len, size, frames_available, bytes_per_sample); - - frames_transmit = size; - - /* prepare areas and set sw-pointers - * frames_transmit returns the real available buffer-size - * sometimes != frames_available cause of ringbuffer 'emulation' */ - snd_pcm_mmap_begin(alsa_handler, &area, &offset, &frames_transmit); - - /* this is specific to interleaved streams (or non-interleaved - * streams with only one channel) */ - outbuffer = ((char *) area->addr + (area->first + area->step * offset) / 8); //8 - - //write data - memcpy(outbuffer, data, (frames_transmit * bytes_per_sample)); - - commitres = snd_pcm_mmap_commit(alsa_handler, offset, frames_transmit); - - if (commitres < 0 || commitres != frames_transmit) { - if (snd_pcm_state(alsa_handler) == SND_PCM_STATE_XRUN || - snd_pcm_state(alsa_handler) == SND_PCM_STATE_SUSPENDED) { - xrun("play"); - } - } - - //mp_msg(MSGT_AO,MSGL_V,"mmap ft: %i, cres: %i\n", frames_transmit, commitres); - - /* err = snd_pcm_area_copy(&area, offset, &data, offset, len, alsa_format); */ - /* if (err < 0) { */ - /* mp_msg(MSGT_AO,MSGL_ERR,"area-copy-error\n"); */ - /* return 0; */ - /* } */ - - - //calculate written frames! - result = commitres * bytes_per_sample; - - - /* if (verbose) { */ - /* if (len == result) */ - /* mp_msg(MSGT_AO,MSGL_V,"result: %i, frames written: %i ...\n", result, frames_transmit); */ - /* else */ - /* mp_msg(MSGT_AO,MSGL_V,"result: %i, frames written: %i, result != len ...\n", result, frames_transmit); */ - /* } */ - - //mplayer doesn't like -result - if (result < 0) - result = 0; - -#ifdef USE_POLL - free(ufds); -#endif - - return result; -} - /* how many byes are free in the buffer */ static int get_space(void) {