summaryrefslogtreecommitdiffstats
path: root/libao2/ao_sgi.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-24 14:06:36 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-10-24 14:06:36 +0000
commitc51f7cb391ace1af6b56c93b6f85ab82cb7aa49a (patch)
treeaf8595d2129b92d0d626e2d1abf535b85cd7a119 /libao2/ao_sgi.c
parentb842217f07d9666bec4f7320fb8536de389107a2 (diff)
downloadmpv-c51f7cb391ace1af6b56c93b6f85ab82cb7aa49a.tar.bz2
mpv-c51f7cb391ace1af6b56c93b6f85ab82cb7aa49a.tar.xz
SGI audio driver by oliver.schoenbrunner@jku.at
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@2452 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libao2/ao_sgi.c')
-rw-r--r--libao2/ao_sgi.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/libao2/ao_sgi.c b/libao2/ao_sgi.c
new file mode 100644
index 0000000000..74430955af
--- /dev/null
+++ b/libao2/ao_sgi.c
@@ -0,0 +1,199 @@
+/*
+ ao_sgi - sgi/irix output plugin for MPlayer
+
+ 22oct2001 oliver.schoenbrunner@jku.at
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <dmedia/audio.h>
+
+#include "audio_out.h"
+#include "audio_out_internal.h"
+
+static ao_info_t info =
+{
+ "sgi audio output",
+ "sgi",
+ "kopflos",
+ ""
+};
+
+LIBAO_EXTERN(sgi)
+
+// there are some globals:
+// ao_samplerate
+// ao_channels
+// ao_format
+// ao_bps
+// ao_outburst
+// ao_buffersize
+
+static ALconfig ao_config;
+static ALport ao_port;
+
+// to set/get/query special features/parameters
+static int control(int cmd, int arg){
+
+ printf("ao_sgi, control\n");
+
+ return -1;
+}
+
+// open & setup audio device
+// return: 1=success 0=fail
+static int init(int rate, int channels, int format, int flags) {
+
+ printf("ao_sgi, init: Samplerate: %iHz Channels: %s Format %s\n", rate, (channels > 1) ? "Stereo" : "Mono", audio_out_format_name(format));
+
+ { /* from /usr/share/src/dmedia/audio/setrate.c */
+
+ int fd;
+ int rv;
+ double frate;
+ ALpv x[2];
+
+ rv = alGetResourceByName(AL_SYSTEM, "out.analog", AL_DEVICE_TYPE);
+ if (!rv) {
+ printf("ao_sgi, play: invalid device\n");
+ return 0;
+ }
+
+ frate = rate;
+
+ x[0].param = AL_RATE;
+ x[0].value.ll = alDoubleToFixed(rate);
+ x[1].param = AL_MASTER_CLOCK;
+ x[1].value.i = AL_CRYSTAL_MCLK_TYPE;
+
+ if (alSetParams(rv,x, 2)<0) {
+ printf("ao_sgi, init: setparams failed: %s\n", alGetErrorString(oserror()));
+ printf("ao_sgi, init: could not set desired samplerate\n");
+ }
+
+ if (x[0].sizeOut < 0) {
+ printf("ao_sgi, init: AL_RATE was not accepted on the given resource\n");
+ }
+
+ if (alGetParams(rv,x, 1)<0) {
+ printf("ao_sgi, init: getparams failed: %s\n", alGetErrorString(oserror()));
+ }
+
+ if (frate != alFixedToDouble(x[0].value.ll)) {
+ printf("ao_sgi, init: samplerate is now %lf (desired rate is %lf)\n", alFixedToDouble(x[0].value.ll), frate);
+ }
+
+ }
+
+ ao_buffersize=131072;
+ ao_outburst = ao_buffersize/16;
+ ao_channels = channels;
+
+ ao_config = alNewConfig();
+
+ if (!ao_config) {
+ printf("ao_sgi, init: %s\n", alGetErrorString(oserror()));
+ return 0;
+ }
+
+ if(channels == 2) alSetChannels(ao_config, AL_STEREO);
+ else alSetChannels(ao_config, AL_MONO);
+
+ alSetWidth(ao_config, AL_SAMPLE_16);
+ alSetSampFmt(ao_config, AL_SAMPFMT_TWOSCOMP);
+ alSetQueueSize(ao_config, 48000);
+
+ if (alSetDevice(ao_config, AL_DEFAULT_OUTPUT) < 0) {
+ printf("ao_sgi, init: %s\n", alGetErrorString(oserror()));
+ return 0;
+ }
+
+ ao_port = alOpenPort("mplayer", "w", ao_config);
+
+ if (!ao_port) {
+ printf("ao_sgi, init: Unable to open audio channel: %s\n", alGetErrorString(oserror()));
+ return 0;
+ }
+
+ // printf("ao_sgi, init: port %d config %d\n", ao_port, ao_config);
+
+ return 1;
+
+}
+
+// close audio device
+static void uninit() {
+
+ /* TODO: samplerate should be set back to the value before mplayer was started! */
+
+ printf("ao_sgi, uninit: ...\n");
+
+ if (ao_port) {
+ while(alGetFilled(ao_port) > 0) sginap(1);
+ alClosePort(ao_port);
+ alFreeConfig(ao_config);
+ }
+
+}
+
+// stop playing and empty buffers (for seeking/pause)
+static void reset() {
+
+ printf("ao_sgi, reset: ...\n");
+
+}
+
+// stop playing, keep buffers (for pause)
+static void audio_pause() {
+
+ printf("ao_sgi, audio_pause: ...\n");
+
+}
+
+// resume playing, after audio_pause()
+static void audio_resume() {
+
+ printf("ao_sgi, audio_resume: ...\n");
+
+}
+
+// return: how many bytes can be played without blocking
+static int get_space() {
+
+ // printf("ao_sgi, get_space: (ao_outburst %d)\n", ao_outburst);
+ // printf("ao_sgi, get_space: alGetFillable [%d] \n", alGetFillable(ao_port));
+
+ return alGetFillable(ao_port)*(2*ao_channels);
+
+}
+
+
+// plays 'len' bytes of 'data'
+// it should round it down to outburst*n
+// return: number of bytes played
+static int play(void* data, int len, int flags) {
+
+ // printf("ao_sgi, play: len %d flags %d (%d %d)\n", len, flags, ao_port, ao_config);
+ // printf("channels %d\n", ao_channels);
+
+ alWriteFrames(ao_port, data, len/(2*ao_channels));
+
+ return len;
+
+}
+
+// return: how many unplayed bytes are in the buffer
+static int get_delay(){
+
+ // printf("ao_sgi, get_delay: (ao_buffersize %d)\n", ao_buffersize);
+
+ return 0;
+
+}
+
+
+
+
+
+