You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdemultimedia/mpeglib/lib/util/audio/audioIO_IRIX.cpp

158 lines
3.6 KiB

/* this file is a part of amp software, (C) tomislav uzelac 1996,1997
Origional code by: Karl Anders Oygard
Modified by:
* Andrew Richards - moved code from audio.c
*/
#include <assert.h>
#include <unistd.h>
#include <stdio.h>
#include <dmedia/audio.h>
#include "audioIO.h"
/* declare these static to effectively isolate the audio device */
static ALport audioport;
static ALconfig audioconfig;
/* audioOpen() */
/* should open the audio device, perform any special initialization */
/* Set the frequency, no of channels and volume. Volume is only set if */
/* it is not -1 */
void audioOpen() {
printf("sorry. The audio part for irix must be fixed. \n");
}
void
audioInit(int sampleSize,int frequency, int stereo)
{
ALconfig audioconfig;
audioconfig = ALnewconfig();
if (!audioconfig)
die("out of memory\n");
else {
long pvbuf[] = { AL_OUTPUT_COUNT, 0, AL_MONITOR_CTL, 0, AL_OUTPUT_RATE, 0};
if (ALgetparams(AL_DEFAULT_DEVICE, pvbuf, 6) < 0)
if (oserror() == AL_BAD_DEVICE_ACCESS)
die("couldn't access audio device\n");
if (pvbuf[1] == 0 && pvbuf[3] == AL_MONITOR_OFF) {
long al_params[] = { AL_OUTPUT_RATE, 0};
al_params[1] = frequency;
ALsetparams(AL_DEFAULT_DEVICE, al_params, 2);
} else
if (pvbuf[5] != frequency)
die("audio device is already in use with wrong sample output rate\n");
/* ALsetsampfmt(audioconfig, AL_SAMPFMT_TWOSCOMP); this is the default */
/* ALsetwidth(audioconfig, AL_SAMPLE_16); this is the default */
if (!stereo) ALsetchannels(audioconfig, AL_MONO);
/* else ALsetchannels(audioconfig, AL_STEREO); this is the default */
ALsetqueuesize(audioconfig, AUSIZ * 2);
audioport = ALopenport("amp", "w", audioconfig);
if (audioport == (ALport) 0) {
switch (oserror()) {
case AL_BAD_NO_PORTS:
die("system is out of ports\n");
case AL_BAD_DEVICE_ACCESS:
die("couldn't access audio device\n");
case AL_BAD_OUT_OF_MEM:
die("out of memory\n");
}
exit(-1);
}
ALsetfillpoint(audioport, AUSIZ);
}
}
/* audioSetVolume - only code this if your system can change the volume while */
/* playing. sets the output volume 0-100 */
void
audioSetVolume(int volume)
{
long al_params[] = { AL_LEFT_SPEAKER_GAIN, 0, AL_RIGHT_SPEAKER_GAIN, 0};
al_params[1] = al_params[3] = volume * 100 / 255;
ALsetparams(AL_DEFAULT_DEVICE, al_params, 4);
}
/* audioFlush() */
/* should flush the audio device */
void
audioFlush()
{
DB(audio, msg("audio: flush %d\n",audio_fd) );
}
/* audioClose() */
/* should close the audio device and perform any special shutdown */
void
audioClose()
{
int write_fd;
/* wait for all samples to be played */
write_fd = ALgetfd(audioport);
if (write_fd >= 0) {
fd_set write_fds;
FD_ZERO(&write_fds);
FD_SET(write_fd, &write_fds);
ALsetfillpoint(audioport, AUSIZ * 2);
select(write_fd + 1, NULL, &write_fds, NULL, NULL);
}
/* now close it */
ALcloseport(audioport);
DB(audio, msg("audio: closed %d\n",audio_fd) );
}
/* audioWrite */
/* writes count bytes from buffer to the audio device */
/* returns the number of bytes actually written */
int audioWrite(char *buffer, int count)
{
if (ALwritesamps(audioport, buffer, count / 2) == 0) {
ALsetfillpoint(audioport, AUSIZ);
return(count);
} else
return 0;
}
/* Let buffer.c have the audio descriptor so it can select on it. This
means that the program is dependent on an file descriptor to
work. Should really move the select's etc (with inlines of course) in
here so that this is the ONLY file which has hardware dependent audio
stuff in it. */
int
getAudioFd()
{
return ALgetfd(audioport);
}