summaryrefslogtreecommitdiff
path: root/include/xine/audio_out.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/xine/audio_out.h')
-rw-r--r--include/xine/audio_out.h360
1 files changed, 360 insertions, 0 deletions
diff --git a/include/xine/audio_out.h b/include/xine/audio_out.h
new file mode 100644
index 000000000..dd7d16a0d
--- /dev/null
+++ b/include/xine/audio_out.h
@@ -0,0 +1,360 @@
+/*
+ * Copyright (C) 2000-2004 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ */
+#ifndef HAVE_AUDIO_OUT_H
+#define HAVE_AUDIO_OUT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <xine/os_types.h>
+#include <xine/metronom.h>
+#include <xine/configfile.h>
+#include <xine/xineutils.h>
+
+#ifdef XINE_COMPILE
+# include <xine/plugin_catalog.h>
+#endif
+
+#define AUDIO_OUT_IFACE_VERSION 9
+
+/*
+ * ao_driver_s contains the driver every audio output
+ * driver plugin has to implement.
+ */
+
+typedef struct ao_driver_s ao_driver_t;
+
+struct ao_driver_s {
+
+ /*
+ *
+ * find out what output modes + capatilities are supported by
+ * this plugin (constants for the bit vector to return see above)
+ *
+ * See AO_CAP_* bellow.
+ */
+ uint32_t (*get_capabilities) (ao_driver_t *);
+
+ /*
+ * open the driver and make it ready to receive audio data
+ * buffers may be flushed(!)
+ *
+ * return value: 0 : failure, >0 : output sample rate
+ */
+ int (*open)(ao_driver_t *, uint32_t bits, uint32_t rate, int mode);
+
+ /* return the number of audio channels
+ */
+ int (*num_channels)(ao_driver_t *self_gen);
+
+ /* return the number of bytes per frame.
+ * A frame is equivalent to one sample being output on every audio channel.
+ */
+ int (*bytes_per_frame)(ao_driver_t *self_gen);
+
+ /* return the delay is frames measured by
+ * looking at pending samples in the audio output device
+ */
+ int (*delay)(ao_driver_t *self_gen);
+
+ /*
+ * return gap tolerance (in pts) needed for this driver
+ */
+ int (*get_gap_tolerance) (ao_driver_t *self_gen);
+
+ /*
+ * write audio data to audio output device
+ * return value:
+ * >0 => audio samples were processed ok
+ * 0 => audio samples were not yet processed,
+ * call write_audio_data with the _same_ samples again
+ */
+ int (*write)(ao_driver_t *,
+ int16_t* audio_data, uint32_t num_samples);
+
+ /*
+ * this is called when the decoder no longer uses the audio
+ * output driver - the driver should get ready to get opened() again
+ */
+ void (*close)(ao_driver_t *);
+
+ /*
+ * shut down this audio output driver plugin and
+ * free all resources allocated
+ */
+ void (*exit) (ao_driver_t *);
+
+ /*
+ * Get, Set a property of audio driver.
+ *
+ * get_property() return 1 in success, 0 on failure.
+ * set_property() return value on success, ~value on failure.
+ *
+ * See AO_PROP_* below for available properties.
+ */
+ int (*get_property) (ao_driver_t *, int property);
+
+ int (*set_property) (ao_driver_t *, int property, int value);
+
+
+ /*
+ * misc control operations on the audio device.
+ *
+ * See AO_CTRL_* below.
+ */
+ int (*control) (ao_driver_t *, int cmd, /* arg */ ...);
+
+ /**
+ * @brief Pointer to the loaded plugin node.
+ *
+ * Used by the plugins loader. It's an opaque type when using the
+ * structure outside of xine's build.
+ */
+#ifdef XINE_COMPILE
+ plugin_node_t *node;
+#else
+ void *node;
+#endif
+};
+
+typedef struct ao_format_s ao_format_t;
+
+struct ao_format_s {
+ uint32_t bits;
+ uint32_t rate;
+ int mode;
+};
+
+typedef struct audio_fifo_s audio_fifo_t;
+
+typedef struct audio_buffer_s audio_buffer_t;
+
+struct audio_buffer_s {
+
+ audio_buffer_t *next;
+
+ int16_t *mem;
+ int mem_size;
+ int num_frames;
+
+ int64_t vpts;
+ uint32_t frame_header_count;
+ uint32_t first_access_unit;
+
+ /* extra info coming from input or demuxers */
+ extra_info_t *extra_info;
+
+ xine_stream_t *stream; /* stream that send that buffer */
+
+ ao_format_t format; /* let each buffer carry it's own format info */
+};
+
+/*
+ * xine_audio_port_s contains the port every audio decoder talks to
+ *
+ * Remember that adding new functions to this structure requires
+ * adaption of the post plugin decoration layer. Be sure to look into
+ * src/xine-engine/post.[ch].
+ */
+
+struct xine_audio_port_s {
+ uint32_t (*get_capabilities) (xine_audio_port_t *); /* for constants see below */
+
+ /* * Get/Set audio property
+ *
+ * See AO_PROP_* bellow
+ */
+ int (*get_property) (xine_audio_port_t *, int property);
+ int (*set_property) (xine_audio_port_t *, int property, int value);
+
+ /* open audio driver for audio output
+ * return value: 0:failure, >0:output sample rate
+ */
+ /* when you are not a full-blown stream, but still need to open the port
+ * (e.g. you are a post plugin) it is legal to pass an anonymous stream */
+ int (*open) (xine_audio_port_t *, xine_stream_t *stream,
+ uint32_t bits, uint32_t rate, int mode);
+
+ /*
+ * get a piece of memory for audio data
+ */
+ audio_buffer_t * (*get_buffer) (xine_audio_port_t *);
+
+ /*
+ * append a buffer filled with audio data to the audio fifo
+ * for output
+ */
+ /* when the frame does not originate from a stream, it is legal to pass an anonymous stream */
+ void (*put_buffer) (xine_audio_port_t *, audio_buffer_t *buf, xine_stream_t *stream);
+
+ /* audio driver is no longer used by decoder => close */
+ /* when you are not a full-blown stream, but still need to close the port
+ * (e.g. you are a post plugin) it is legal to pass an anonymous stream */
+ void (*close) (xine_audio_port_t *self, xine_stream_t *stream);
+
+ /* called on xine exit */
+ void (*exit) (xine_audio_port_t *);
+
+ /*
+ * misc control operations on the audio device.
+ *
+ * See AO_CTRL_* below.
+ */
+ int (*control) (xine_audio_port_t *, int cmd, /* arg */ ...);
+
+ /*
+ * Flush audio_out fifo.
+ */
+ void (*flush) (xine_audio_port_t *);
+
+ /*
+ * Check if port is opened for this stream and get parameters.
+ * The stream can be anonymous.
+ */
+ int (*status) (xine_audio_port_t *, xine_stream_t *stream,
+ uint32_t *bits, uint32_t *rate, int *mode);
+
+};
+
+typedef struct audio_driver_class_s audio_driver_class_t;
+
+struct audio_driver_class_s {
+
+ /*
+ * open a new instance of this plugin class
+ */
+ ao_driver_t* (*open_plugin) (audio_driver_class_t *, const void *data);
+
+ /**
+ * @brief short human readable identifier for this plugin class
+ */
+ const char *identifier;
+
+ /**
+ * @brief human readable (verbose = 1 line) description for this plugin class
+ *
+ * The description is passed to gettext() to internationalise.
+ */
+ const char *description;
+
+ /**
+ * @brief Optional non-standard catalog to use with dgettext() for description.
+ */
+ const char *text_domain;
+
+ /*
+ * free all class-related resources
+ */
+
+ void (*dispose) (audio_driver_class_t *);
+};
+
+#define default_audio_driver_class_dispose (void (*) (audio_driver_class_t *this))free
+
+/**
+ * @brief Initialise the audio_out sync routines
+ *
+ * @internal
+ */
+xine_audio_port_t *_x_ao_new_port (xine_t *xine, ao_driver_t *driver, int grab_only) XINE_MALLOC;
+
+/*
+ * audio output modes + capabilities
+ */
+
+#define AO_CAP_NOCAP 0x00000000 /* driver has no capabilities */
+#define AO_CAP_MODE_A52 0x00000001 /* driver supports A/52 output */
+#define AO_CAP_MODE_AC5 0x00000002 /* driver supports AC5 output */
+/* 1 sample == 2 bytes (C) */
+#define AO_CAP_MODE_MONO 0x00000004 /* driver supports mono output */
+/* 1 sample == 4 bytes (L,R) */
+#define AO_CAP_MODE_STEREO 0x00000008 /* driver supports stereo output */
+/* 1 sample == 8 bytes (L,R,LR,RR) */
+#define AO_CAP_MODE_4CHANNEL 0x00000010 /* driver supports 4 channels */
+/*
+ * Sound cards generally support, 1,2,4,6 channels, but rarely 5.
+ * So xine will take 4.1, 5 and 6 channel a52 streams and
+ * down or upmix it correctly to fill the 6 output channels.
+ * Are there any requests for 2.1 out there?
+ */
+/* 1 sample == 12 bytes (L,R,LR,RR,Null,LFE) */
+#define AO_CAP_MODE_4_1CHANNEL 0x00000020 /* driver supports 4.1 channels */
+/* 1 sample == 12 bytes (L,R,LR,RR,C, Null) */
+#define AO_CAP_MODE_5CHANNEL 0x00000040 /* driver supports 5 channels */
+/* 1 sample == 12 bytes (L,R,LR,RR,C,LFE) */
+#define AO_CAP_MODE_5_1CHANNEL 0x00000080 /* driver supports 5.1 channels */
+
+/*
+ * converts the audio output mode into the number of channels
+ */
+int _x_ao_mode2channels( int mode ) XINE_PROTECTED;
+/*
+ * converts the number of channels into the audio output mode
+ */
+int _x_ao_channels2mode( int channels ) XINE_PROTECTED;
+
+#define AO_CAP_MIXER_VOL 0x00000100 /* driver supports mixer control */
+#define AO_CAP_PCM_VOL 0x00000200 /* driver supports pcm control */
+#define AO_CAP_MUTE_VOL 0x00000400 /* driver can mute volume */
+#define AO_CAP_8BITS 0x00000800 /* driver support 8-bit samples */
+#define AO_CAP_16BITS 0x00001000 /* driver support 16-bit samples */
+#define AO_CAP_24BITS 0x00002000 /* driver support 24-bit samples */
+#define AO_CAP_FLOAT32 0x00004000 /* driver support 32-bit samples. i.e. Floats */
+
+/* properties supported by get/set_property() */
+#define AO_PROP_MIXER_VOL 0
+#define AO_PROP_PCM_VOL 1
+#define AO_PROP_MUTE_VOL 2
+#define AO_PROP_COMPRESSOR 3
+#define AO_PROP_DISCARD_BUFFERS 4
+#define AO_PROP_BUFS_IN_FIFO 5 /* read-only */
+#define AO_PROP_AMP 6 /* amplifier */
+#define AO_PROP_EQ_30HZ 7 /* equalizer */
+#define AO_PROP_EQ_60HZ 8 /* equalizer */
+#define AO_PROP_EQ_125HZ 9 /* equalizer */
+#define AO_PROP_EQ_250HZ 10 /* equalizer */
+#define AO_PROP_EQ_500HZ 11 /* equalizer */
+#define AO_PROP_EQ_1000HZ 12 /* equalizer */
+#define AO_PROP_EQ_2000HZ 13 /* equalizer */
+#define AO_PROP_EQ_4000HZ 14 /* equalizer */
+#define AO_PROP_EQ_8000HZ 15 /* equalizer */
+#define AO_PROP_EQ_16000HZ 16 /* equalizer */
+#define AO_PROP_CLOSE_DEVICE 17 /* force closing audio device */
+#define AO_PROP_AMP_MUTE 18 /* amplifier mute */
+#define AO_PROP_NUM_STREAMS 19 /* read-only */
+#define AO_PROP_CLOCK_SPEED 20 /* inform audio_out that speed has changed */
+#define AO_PROP_BUFS_TOTAL 21 /* read-only */
+#define AO_PROP_BUFS_FREE 22 /* read-only */
+#define AO_NUM_PROPERTIES 23
+
+/* audio device control ops */
+#define AO_CTRL_PLAY_PAUSE 0
+#define AO_CTRL_PLAY_RESUME 1
+#define AO_CTRL_FLUSH_BUFFERS 2
+
+/* above that value audio frames are discarded */
+#define AO_MAX_GAP 15000
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif