diff options
author | Daniel Caujolle-Bert <f1rmb@users.sourceforge.net> | 2002-01-20 12:33:45 +0000 |
---|---|---|
committer | Daniel Caujolle-Bert <f1rmb@users.sourceforge.net> | 2002-01-20 12:33:45 +0000 |
commit | 651322385c8c57754a02d4b06a0978ab9613006f (patch) | |
tree | 4b2efc83656eba2c71fcb77bf75a1ab06846853a /src | |
parent | 611f706e0ee57cac90db03a24e6b23b695df1b95 (diff) | |
download | xine-lib-651322385c8c57754a02d4b06a0978ab9613006f.tar.gz xine-lib-651322385c8c57754a02d4b06a0978ab9613006f.tar.bz2 |
alsa 05 support: terminated.
CVS patchset: 1428
CVS date: 2002/01/20 12:33:45
Diffstat (limited to 'src')
-rw-r--r-- | src/audio_out/Makefile.am | 13 | ||||
-rw-r--r-- | src/audio_out/audio_alsa05_out.c | 660 |
2 files changed, 3 insertions, 670 deletions
diff --git a/src/audio_out/Makefile.am b/src/audio_out/Makefile.am index 0a2324b00..777710993 100644 --- a/src/audio_out/Makefile.am +++ b/src/audio_out/Makefile.am @@ -1,6 +1,6 @@ CFLAGS = @GLOBAL_CFLAGS@ -DXINE_COMPILE $(ALSA_CFLAGS) $(ESD_CFLAGS) $(IRIXAL_CFLAGS) $(ARTS_CFLAGS) -EXTRA_DIST = audio_alsa_out.c audio_alsa05_out.c audio_esd_out.c \ +EXTRA_DIST = audio_alsa_out.c audio_esd_out.c \ audio_sun_out.c audio_arts_out.c audio_irixal_out.c LIBTOOL = $(SHELL) $(top_builddir)/libtool-nofpic @@ -16,9 +16,6 @@ endif # on the alsa project side # if HAVE_ALSA -if HAVE_ALSA05 -alsa05_module = xineplug_ao_out_alsa05.la -endif if HAVE_ALSA09 alsa_module = xineplug_ao_out_alsa.la endif @@ -46,19 +43,15 @@ endif # All of xine audio out plugins should be named like the # scheme "xineplug_ao_out_" # -#lib_LTLIBRARIES = $(oss_module) $(alsa05_module) $(alsa_module) $(sun_module) \ +#lib_LTLIBRARIES = $(oss_module) $(alsa_module) $(sun_module) \ # $(arts_module) $(esd_module) lib_LTLIBRARIES = $(oss_module) $(alsa_module) $(esd_module) $(sun_module) $(arts_module) \ - $(alsa05_module) $(irixal_module) + $(irixal_module) xineplug_ao_out_oss_la_SOURCES = audio_oss_out.c xineplug_ao_out_oss_la_LDFLAGS = -avoid-version -module -xineplug_ao_out_alsa05_la_SOURCES = audio_alsa05_out.c -xineplug_ao_out_alsa05_la_LIBADD = $(ALSA_LIBS) -xineplug_ao_out_alsa05_la_LDFLAGS = -avoid-version -module - xineplug_ao_out_alsa_la_SOURCES = audio_alsa_out.c xineplug_ao_out_alsa_la_LIBADD = $(ALSA_LIBS) xineplug_ao_out_alsa_la_LDFLAGS = -avoid-version -module diff --git a/src/audio_out/audio_alsa05_out.c b/src/audio_out/audio_alsa05_out.c deleted file mode 100644 index d369a90ec..000000000 --- a/src/audio_out/audio_alsa05_out.c +++ /dev/null @@ -1,660 +0,0 @@ -/* - * Copyright (C) 2000, 2001 the xine project - * - * This file is part of xine, a free video player. - * - * xine is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * xine is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - * - * - * Plugin for ALSA Version 0.5.x - * - * Credits go - * for the SPDIF A52 sync part - * (c) 2000 Andy Lo A Foe <andy@alsaplayer.org> - * - * $Id: audio_alsa05_out.c,v 1.12 2001/11/19 13:55:03 hrm Exp $ - */ - -/* required for swab() */ -#define _XOPEN_SOURCE 500 - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <string.h> -#include <errno.h> -#include <inttypes.h> -#include <unistd.h> -#include <sys/asoundlib.h> - -#include "xine_internal.h" -#include "audio_out.h" -#include "metronom.h" -#include "resample.h" -#include "xineutils.h" - -#define AO_ALSA_IFACE_VERSION 2 - -#define AUDIO_NUM_FRAGMENTS 6 -#define AUDIO_FRAGMENT_SIZE 1536 - -#define GAP_TOLERANCE 5000 - -#define MAX_GAP 90000 - -extern uint32_t xine_debug; - - -typedef struct alsa_driver_s { - - ao_driver_t ao_driver; - - snd_pcm_t *front_handle; - - int32_t output_sample_rate, input_sample_rate; - uint32_t num_channels; - - uint32_t bytes_in_buffer; /* number of bytes written to audio hardware */ - uint32_t bytes_per_frame; - - int pcm_default_card; - int pcm_default_device; - - int direction; - int mode; - int start_mode; - int stop_mode; - int format; - int rate; - int voices; - int interleave; - int frag_size; - int frag_count; - int pcm_len; - int ao_mode; - - int capabilities; - -} alsa_driver_t; - - -static void alsa_set_frag(alsa_driver_t *this, int fragment_size, int fragment_count) { - snd_pcm_channel_params_t params; - snd_pcm_channel_setup_t setup; - snd_pcm_format_t format; - int err; - - memset(¶ms, 0, sizeof(params)); - - params.mode = this->mode; - params.channel = this->direction; - params.start_mode = this->start_mode; - params.stop_mode = this->stop_mode; - params.buf.block.frag_size = fragment_size; - params.buf.block.frags_max = fragment_count; - params.buf.block.frags_min = 1; - - memset(&format, 0, sizeof(format)); - format.format = this->format; - format.rate = this->rate; - format.voices = this->voices; - format.interleave = this->interleave; - memcpy(¶ms.format, &format, sizeof(format)); - - snd_pcm_playback_flush(this->front_handle); - - if((err = snd_pcm_channel_params(this->front_handle, ¶ms)) < 0) { - perr("snd_pcm_channel_params() failed: %s\n", snd_strerror(err)); - return; - } - if((err = snd_pcm_playback_prepare(this->front_handle)) < 0) { - perr("snd_pcm_channel_prepare() failed: %s\n", snd_strerror(err)); - return; - } - - memset(&setup, 0, sizeof(setup)); - setup.mode = this->mode; - setup.channel = this->direction; - if((err = snd_pcm_channel_setup(this->front_handle, &setup)) < 0) { - perr("snd_pcm_channel_setup() failed: %s\n", snd_strerror(err)); - return; - } - - this->frag_size = fragment_size; - this->frag_count = fragment_count; - - /* this->pcm_len = fragment_size * - (snd_pcm_format_width(this->format) / 8) * - this->voices; - - perr("PCM len = %d\n", this->pcm_len); - if(this->zero_space) - free(this->zero_space); - - this->zero_space = (int16_t *) malloc(this->frag_size); - memset(this->zero_space, - (int16_t) snd_pcm_format_silence(this->format), - this->frag_size); - */ -} - -/* - * open the audio device for writing to - */ -static int ao_alsa_open(ao_driver_t *this_gen,uint32_t bits, uint32_t rate, int ao_mode) { - - int channels; - int subdevice = 0; - int direction = SND_PCM_OPEN_PLAYBACK; - snd_pcm_format_t pcm_format; - snd_pcm_channel_setup_t pcm_chan_setup; - snd_pcm_channel_params_t pcm_chan_params; - snd_pcm_channel_info_t pcm_chan_info; - int err; - int mode; - alsa_driver_t *this = (alsa_driver_t *) this_gen; - - switch (ao_mode) { - - case AO_CAP_MODE_STEREO: - case AO_CAP_MODE_A52: - case AO_CAP_MODE_AC5: - channels = 2; - break; - - case AO_CAP_MODE_MONO: - channels = 1; - break; - - default: - return 0; - break; - } - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "bits = %d, rate = %d, channels = %d\n", - bits, rate, channels); -#endif - - if(!rate) - return 0; - - if(this->front_handle != NULL) { - - if(rate == this->input_sample_rate) - return this->output_sample_rate; - - snd_pcm_close(this->front_handle); - } - - this->input_sample_rate = rate; - this->bytes_in_buffer = 0; - this->direction = SND_PCM_CHANNEL_PLAYBACK; - - if ((ao_mode == AO_CAP_MODE_A52) || (mode == AO_CAP_MODE_AC5)) { - this->pcm_default_device = 2; - mode = SND_PCM_MODE_BLOCK; - } - else { - mode = SND_PCM_MODE_BLOCK; - } - - this->mode = mode; - - if((err = snd_pcm_open_subdevice(&this->front_handle, - this->pcm_default_card, - this->pcm_default_device, - subdevice, direction - /* | SND_PCM_OPEN_NONBLOCK)) < 0) { */ - )) < 0) { - perr("snd_pcm_open_subdevice() failed: %s\n", snd_strerror(err)); - return 0; - } - - memset(&pcm_chan_info, 0, sizeof(snd_pcm_channel_info_t)); - if((err = snd_pcm_channel_info(this->front_handle, - &pcm_chan_info)) < 0) { - perr("snd_pcm_channel_info() failed: %s\n", snd_strerror(err)); - return 0; - } - - memset(&pcm_chan_params, 0, sizeof(snd_pcm_channel_params_t)); - memset(&pcm_format, 0, sizeof(snd_pcm_format_t)); - /* set sample size */ - switch(bits) { - case 8: - pcm_format.format = SND_PCM_SFMT_S8; - break; - - case 16: - pcm_format.format = SND_PCM_SFMT_S16; - break; - - case 24: - pcm_format.format = SND_PCM_SFMT_S24; - break; - - case 32: - pcm_format.format = SND_PCM_SFMT_S32; - break; - - default: - perr("sample format %d unsupported\n", bits); - break; - } - this->format = pcm_format.format; - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "format name = '%s'\n", - snd_pcm_get_format_name(pcm_format.format)); -#endif - - pcm_format.voices = this->voices = channels; - pcm_format.rate = this->rate = rate; - pcm_format.interleave = this->interleave = 1; - - this->num_channels = channels; - this->bytes_per_frame = (bits*this->num_channels)/8; - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "audio channels = %d ao_mode = %d\n", - this->num_channels,ao_mode); -#endif - - if(rate > pcm_chan_info.max_rate) - this->output_sample_rate = pcm_chan_info.max_rate; - else - this->output_sample_rate = this->input_sample_rate; - - - memcpy(&pcm_chan_params.format, &pcm_format, sizeof(snd_pcm_format_t)); - - pcm_chan_params.mode = mode; - pcm_chan_params.channel = this->direction; - - pcm_chan_params.start_mode = SND_PCM_START_FULL; - /* - pcm_chan_params.start_mode = SND_PCM_START_DATA; - pcm_chan_params.stop_mode = SND_PCM_STOP_STOP; - */ - pcm_chan_params.stop_mode = SND_PCM_STOP_ROLLOVER; - - this->start_mode = pcm_chan_params.start_mode; - this->stop_mode = pcm_chan_params.stop_mode; - this->ao_mode = ao_mode; - - if ((ao_mode == AO_CAP_MODE_A52) || (mode == AO_CAP_MODE_AC5)) { - pcm_chan_params.digital.dig_valid = 1; - pcm_chan_params.digital.dig_status[0] = SND_PCM_DIG0_NONAUDIO; - pcm_chan_params.digital.dig_status[0] |= SND_PCM_DIG0_PROFESSIONAL; - pcm_chan_params.digital.dig_status[0] |= SND_PCM_DIG0_PRO_FS_48000; - pcm_chan_params.digital.dig_status[3] = SND_PCM_DIG3_CON_FS_48000; - } - - snd_pcm_playback_flush(this->front_handle); - if((err = snd_pcm_channel_params(this->front_handle, - &pcm_chan_params)) < 0) { - perr("snd_pcm_channel_params() failed: %s\n", snd_strerror(err)); - return 0; - } - if((err = snd_pcm_playback_prepare(this->front_handle)) < 0) { - perr("snd_pcm_channel_prepare() failed: %s\n", snd_strerror(err)); - return 0; - } - - pcm_chan_setup.mode = mode; - pcm_chan_setup.channel = this->direction; - - if((err = snd_pcm_channel_setup(this->front_handle, - &pcm_chan_setup)) < 0) { - perr("snd_pcm_channel_setup() failed: %s\n", snd_strerror(err)); - return 0; - } - - printf ("actual rate: %d\n", pcm_chan_setup.format.rate); - - alsa_set_frag(this, 1536, 6); - alsa_set_frag(this,AUDIO_FRAGMENT_SIZE, AUDIO_NUM_FRAGMENTS); - - this->bytes_in_buffer = 0; - - return this->output_sample_rate; -} - -static int ao_alsa_num_channels(ao_driver_t *this_gen) { - - alsa_driver_t *this = (alsa_driver_t *) this_gen; - return this->num_channels; - -} - -static int ao_alsa_bytes_per_frame(ao_driver_t *this_gen) { - - alsa_driver_t *this = (alsa_driver_t *) this_gen; - return this->bytes_per_frame; - -} - -static int ao_alsa_get_gap_tolerance (ao_driver_t *this_gen) { - return GAP_TOLERANCE; -} - -static int ao_alsa_delay(ao_driver_t *this_gen) { - - alsa_driver_t *this = (alsa_driver_t *) this_gen; - int bytes_left; - snd_pcm_channel_status_t pcm_stat; - int err; - - - memset(&pcm_stat, 0, sizeof(snd_pcm_channel_status_t)); - pcm_stat.channel = SND_PCM_CHANNEL_PLAYBACK; - if((err = snd_pcm_channel_status(this->front_handle, - &pcm_stat)) < 0) { - /* Hide error report */ - perr("snd_pcm_channel_status() failed: %s\n", snd_strerror(err)); - return 0; - } - - /* calc delay */ - - bytes_left = this->bytes_in_buffer - pcm_stat.scount; - - if (bytes_left<=0) { /* buffer ran dry */ - bytes_left = 0; - this->bytes_in_buffer = pcm_stat.scount; - } - - return bytes_left / this->bytes_per_frame; -} - - -static int ao_alsa_write (ao_driver_t *this_gen, - int16_t* frame_buffer, uint32_t num_frames) { - - - alsa_driver_t *this = (alsa_driver_t *) this_gen; - - this->bytes_in_buffer += num_frames * this->bytes_per_frame; - - snd_pcm_write(this->front_handle, frame_buffer, - num_frames * this->bytes_per_frame); - return 1; -} - -static void ao_alsa_close(ao_driver_t *this_gen) { - int err; - alsa_driver_t *this = (alsa_driver_t *) this_gen; - - if(this->front_handle) { - if((err = snd_pcm_playback_flush(this->front_handle)) < 0) { - perr("snd_pcm_channel_flush() failed: %s\n", snd_strerror(err)); - } - - if((err = snd_pcm_close(this->front_handle)) < 0) { - perr("snd_pcm_close() failed: %s\n", snd_strerror(err)); - } - - this->front_handle = NULL; - } -} - -static int ao_alsa_get_property (ao_driver_t *this_gen, int property) { - /* alsa_driver_t *this = (alsa_driver_t *) this_gen; */ - - /* FIXME: implement some properties - switch(property) { - case AO_PROP_MIXER_VOL: - break; - case AO_PROP_PCM_VOL: - break; - case AO_PROP_MUTE_VOL: - break; - } - */ - return 0; -} - -static int ao_alsa_set_property (ao_driver_t *this_gen, int property, int value) { - /* alsa_driver_t *this = (alsa_driver_t *) this_gen; */ - - /* FIXME: Implement property support. - switch(property) { - case AO_PROP_MIXER_VOL: - break; - case AO_PROP_PCM_VOL: - break; - case AO_PROP_MUTE_VOL: - break; - } - */ - - return ~value; -} - -static uint32_t ao_alsa_get_capabilities (ao_driver_t *this_gen) { - alsa_driver_t *this = (alsa_driver_t *) this_gen; - return this->capabilities; -} - - -static void ao_alsa_exit(ao_driver_t *this_gen) { - /* alsa_driver_t *this = (alsa_driver_t *) this_gen; */ -} - - -static ao_info_t ao_info_alsa = { - AO_ALSA_IFACE_VERSION, - "alsa05", - "xine audio output plugin using alsa-compliant audio devices/drivers", - 10 -}; - -ao_info_t *get_audio_out_plugin_info() { - return &ao_info_alsa; -} - -static void sighandler(int signum) { -} - -ao_driver_t *init_audio_out_plugin(config_values_t *config) { - alsa_driver_t *this; - int best_rate; - int devnum; - int err; - int direction = SND_PCM_OPEN_PLAYBACK; - int snd_default_card; - int snd_default_mixer_card; - int snd_default_mixer_device; - snd_pcm_info_t pcm_info; - snd_pcm_channel_info_t pcm_chan_info; - struct sigaction action; - - this = (alsa_driver_t *) malloc (sizeof (alsa_driver_t)); - - /* Check if, at least, one card is installed */ - if((devnum = snd_cards()) == 0) { - return NULL; - } - else { - snd_default_card = snd_defaults_card(); - if((err = snd_card_load(snd_default_card)) < 0) { - perr("snd_card_load() failed: %s\n", snd_strerror(err)); - } -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "%d card(s) installed. Default = %d\n", - devnum, snd_default_card); -#endif - - if((snd_default_mixer_card = snd_defaults_mixer_card()) < 0) { - perr("snd_defaults_mixer_card() failed: %s\n", - snd_strerror(snd_default_mixer_card)); - } -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "default mixer card = %d\n", - snd_default_mixer_card); -#endif - - if((snd_default_mixer_device = snd_defaults_mixer_device()) < 0) { - perr("snd_defaults_mixer_device() failed: %s\n", - snd_strerror(snd_default_mixer_device)); - } -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "default mixer device = %d\n", - snd_default_mixer_device); -#endif - } - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "Opening audio device..."); -#endif - - if((this->pcm_default_card = snd_defaults_pcm_card()) < 0) { - perr("There is no default pcm card.\n"); - exit(1); - } -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "snd_defaults_pcm_card() return %d\n", - this->pcm_default_card); -#endif - - if((this->pcm_default_device = snd_defaults_pcm_device()) < 0) { - perr("There is no default pcm device.\n"); - exit(1); - } -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "snd_defaults_pcm_device() return %d\n", - this->pcm_default_device); -#endif - - this->capabilities = AO_CAP_MODE_STEREO; - if (config->register_bool (config, - "audio.a52_pass_through", - 0, - "used to inform xine about what the sound card can do", - NULL, - NULL, - NULL) ) { - this->capabilities |= AO_CAP_MODE_A52; - this->capabilities |= AO_CAP_MODE_AC5; - } - - this->ao_driver.get_capabilities = ao_alsa_get_capabilities; - this->ao_driver.get_property = ao_alsa_get_property; - this->ao_driver.set_property = ao_alsa_set_property; - this->ao_driver.open = ao_alsa_open; - this->ao_driver.num_channels = ao_alsa_num_channels; - this->ao_driver.bytes_per_frame = ao_alsa_bytes_per_frame; - this->ao_driver.delay = ao_alsa_delay; - this->ao_driver.write = ao_alsa_write; - this->ao_driver.close = ao_alsa_close; - this->ao_driver.exit = ao_alsa_exit; - this->ao_driver.get_gap_tolerance = ao_alsa_get_gap_tolerance; - - - action.sa_handler = sighandler; - sigemptyset(&(action.sa_mask)); - action.sa_flags = 0; - if(sigaction(SIGALRM, &action, NULL) != 0) { - perr("sigaction(SIGALRM) failed: %s\n", strerror(errno)); - } - alarm(2); - - if((err = snd_pcm_open(&this->front_handle, this->pcm_default_card, - this->pcm_default_device, direction)) < 0) { - perr("snd_pcm_open() failed: %s\n", snd_strerror(err)); - perr(">>> Check if another program don't already use PCM <<<\n"); - return NULL; - } - - memset(&pcm_info, 0, sizeof(snd_pcm_info_t)); - if((err = snd_pcm_info(this->front_handle, &pcm_info)) < 0) { - perr("snd_pcm_info() failed: %s\n", snd_strerror(err)); - exit(1); - } - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "snd_pcm_info():\n"); - xprintf (VERBOSE|AUDIO, "---------------\n"); - xprintf (VERBOSE|AUDIO, "type = 0x%x\n", pcm_info.type); - xprintf (VERBOSE|AUDIO, "flags = 0x%x\n", pcm_info.flags); - xprintf (VERBOSE|AUDIO, "id = '%s'\n", pcm_info.id); - xprintf (VERBOSE|AUDIO, "name = '%s'\n", pcm_info.name); - xprintf (VERBOSE|AUDIO, "playback = %d\n", pcm_info.playback); - xprintf (VERBOSE|AUDIO, "capture = %d\n", pcm_info.capture); -#endif - - memset(&pcm_chan_info, 0, sizeof(snd_pcm_channel_info_t)); - pcm_chan_info.channel = SND_PCM_CHANNEL_PLAYBACK; - if((err = snd_pcm_channel_info(this->front_handle, - &pcm_chan_info)) < 0) { - perr("snd_pcm_channel_info() failed: %s\n", snd_strerror(err)); - exit(1); - } - - best_rate = pcm_chan_info.rates; - -#ifdef LOG_DEBUG - xprintf (VERBOSE|AUDIO, "best_rate = %d\n", best_rate); - xprintf (VERBOSE|AUDIO, "snd_pcm_channel_info(PLAYBACK):\n"); - xprintf (VERBOSE|AUDIO, "-------------------------------\n"); - xprintf (VERBOSE|AUDIO, "subdevice = %d\n", - pcm_chan_info.subdevice); - xprintf (VERBOSE|AUDIO, "subname = %s\n", - pcm_chan_info.subname); - xprintf (VERBOSE|AUDIO, "channel = %d\n", - pcm_chan_info.channel); - xprintf (VERBOSE|AUDIO, "mode = %d\n", - pcm_chan_info.mode); - xprintf (VERBOSE|AUDIO, "flags = 0x%x\n", - pcm_chan_info.flags); - xprintf (VERBOSE|AUDIO, "formats = %d\n", - pcm_chan_info.formats); - xprintf (VERBOSE|AUDIO, "rates = %d\n", - pcm_chan_info.rates); - xprintf (VERBOSE|AUDIO, "min_rate = %d\n", - pcm_chan_info.min_rate); - xprintf (VERBOSE|AUDIO, "max_rate = %d\n", - pcm_chan_info.max_rate); - xprintf (VERBOSE|AUDIO, "min_voices = %d\n", - pcm_chan_info.min_voices); - xprintf (VERBOSE|AUDIO, "max_voices = %d\n", - pcm_chan_info.max_voices); - xprintf (VERBOSE|AUDIO, "buffer_size = %d\n", - pcm_chan_info.buffer_size); - xprintf (VERBOSE|AUDIO, "min_fragment_size = %d\n", - pcm_chan_info.min_fragment_size); - xprintf (VERBOSE|AUDIO, "max_fragment_size = %d\n", - pcm_chan_info.max_fragment_size); - xprintf (VERBOSE|AUDIO, "fragment_align = %d\n", - pcm_chan_info.fragment_align); - xprintf (VERBOSE|AUDIO, "fifo_size = %d\n", - pcm_chan_info.fifo_size); - xprintf (VERBOSE|AUDIO, "transfer_block_size = %d\n", - pcm_chan_info.transfer_block_size); - xprintf (VERBOSE|AUDIO, "mmap_size = %ld\n", - pcm_chan_info.mmap_size); - xprintf (VERBOSE|AUDIO, "mixer_device = %d\n", - pcm_chan_info.mixer_device); -#endif - snd_pcm_close (this->front_handle); - this->front_handle = NULL; - - return &this->ao_driver; -} |