2
audio_sgi.c: audio output on sgi boxen
4
copyright ?-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
5
see COPYING and AUTHORS files in distribution or http://mpg123.de
6
initially written (as it seems) by Thomas Woerner
11
#include <sys/types.h>
17
/* #include <audio.h> */
18
#include <dmedia/audio.h>
24
/* Analog output constant */
25
static const char analog_output_res_name[] = ".AnalogOut";
28
static int audio_set_rate(struct audio_info_struct *ai, ALconfig config)
30
int dev = alGetDevice(config);
33
/* Make sure the device is OK */
36
fprintf(stderr,"audio_set_rate : %s\n",alGetErrorString(oserror()));
40
params[0].param = AL_OUTPUT_RATE;
41
params[0].value.ll = alDoubleToFixed(ai->rate);
43
if (alSetParams(dev, params,1) < 0)
44
fprintf(stderr,"audio_set_rate : %s\n",alGetErrorString(oserror()));
49
static int audio_set_channels(struct audio_info_struct *ai, ALconfig config)
54
ret = alSetChannels(config, AL_STEREO);
56
ret = alSetChannels(config, AL_MONO);
59
fprintf(stderr,"audio_set_channels : %s\n",alGetErrorString(oserror()));
64
static int audio_set_format(struct audio_info_struct *ai, ALconfig config)
66
if (alSetSampFmt(config,AL_SAMPFMT_TWOSCOMP) < 0)
67
fprintf(stderr,"audio_set_format : %s\n",alGetErrorString(oserror()));
69
if (alSetWidth(config,AL_SAMPLE_16) < 0)
70
fprintf(stderr,"audio_set_format : %s\n",alGetErrorString(oserror()));
76
int audio_open(struct audio_info_struct *ai)
78
int dev = AL_DEFAULT_OUTPUT;
79
ALconfig config = alNewConfig();
82
/* Test for correct completion */
84
fprintf(stderr,"audio_open : %s\n",alGetErrorString(oserror()));
88
/* Set port parameters */
90
alSetChannels(config, AL_STEREO);
92
alSetChannels(config, AL_MONO);
94
alSetWidth(config, AL_SAMPLE_16);
95
alSetSampFmt(config,AL_SAMPFMT_TWOSCOMP);
96
alSetQueueSize(config, 131069);
98
/* Setup output device to specified module. If there is no module
99
specified in ai structure, use the default four output */
100
if ((ai->device) != NULL) {
104
dev_name=malloc((strlen(ai->device) + strlen(analog_output_res_name) + 1) *
107
strcpy(dev_name,ai->device);
108
strcat(dev_name,analog_output_res_name);
110
/* Find the asked device resource */
111
dev=alGetResourceByName(AL_SYSTEM,dev_name,AL_DEVICE_TYPE);
113
/* Free allocated space */
117
fprintf(stderr,"Invalid audio resource: %s (%s)\n",dev_name,
118
alGetErrorString(oserror()));
124
if (alSetDevice(config,dev) < 0)
126
fprintf(stderr,"audio_open : %s\n",alGetErrorString(oserror()));
130
/* Open the audio port */
131
port = alOpenPort("mpg123-VSC", "w", config);
133
fprintf(stderr, "Unable to open audio channel: %s\n",
134
alGetErrorString(oserror()));
138
ai->handle = (void*)port;
141
audio_set_format(ai, config);
142
audio_set_channels(ai, config);
143
audio_set_rate(ai, config);
146
alFreeConfig(config);
152
int audio_get_formats(struct audio_info_struct *ai)
154
return AUDIO_FORMAT_SIGNED_16;
158
int audio_play_samples(struct audio_info_struct *ai,unsigned char *buf,int len)
160
ALport port = (ALport)ai->handle;
162
if(ai->format == AUDIO_FORMAT_SIGNED_8)
163
alWriteFrames(port, buf, len>>1);
165
alWriteFrames(port, buf, len>>2);
170
int audio_close(struct audio_info_struct *ai)
172
ALport port = (ALport)ai->handle;
175
while(alGetFilled(port) > 0)
184
void audio_queueflush(struct audio_info_struct *ai)