This is hpuxplay.c in view mode; [Download] [Up]
#include <config.h> /*****************************************************************/ /*** ***/ /*** Play out a file on an HP ***/ /*** ***/ /*** accesses audio device directly, ***/ /*** should use Aserver & Alib instead ***/ /*** ***/ /*** Markus.Gyger@itr.ch 23 Jul 94 ***/ /*** ***/ /*****************************************************************/ #include <useconfig.h> #include <stdio.h> #include <fcntl.h> /* Force this on as otherwise <sys/ioctl.h> may not expand enough for <sys/audio.h> to work as expected, and that is after all the *whole* point of this file. */ #define _INCLUDE_HPUX_SOURCE #include <sys/ioctl.h> #include <sys/audio.h> #include <errno.h> #include <limits.h> #include "proto.h" #include "getargs.h" #include "hplay.h" #include "getargs.h" #define AUDIO_DEVICE "/dev/audio" #define SAMP_RATE 10000 /* desired, will be 11025 or 8000 */ long samp_rate = SAMP_RATE; static int audioDescriptor = -1; int audio_init(argc, argv) int argc; char *argv[]; { int i, sr, headphone = 2, speaker = 2, waitidle = 0; struct audio_describe audioInfo; struct audio_gain audioGain; audioGain.cgain[0].transmit_gain = INT_MIN; /* never used value */ /* options g/h/s aren't needed if AudioCP or acontrol is used */ argc = getargs("HP-UX Audio",argc, argv, "r", "%ld", &samp_rate, "Sample rate", "g", "%d", &audioGain.cgain[0].transmit_gain, "Gain -128..127", "h", NULL, &headphone, "Headphones", "s", NULL, &speaker, "Speaker", "W", NULL, &waitidle, "Wait until idle (not implemented)", NULL); if (help_only) return argc; /* open audio device */ audioDescriptor = open(AUDIO_DEVICE, O_WRONLY); if (audioDescriptor == -1) { perror("open"); exit(1); } /* get list of available sample rates */ if (ioctl(audioDescriptor, AUDIO_DESCRIBE, &audioInfo) == -1) { perror("AUDIO_DESCRIBE"); exit(1); } /* set output gain */ if (audioGain.cgain[0].transmit_gain != INT_MIN) { if (audioGain.cgain[0].transmit_gain < AUDIO_OFF_GAIN) audioGain.cgain[0].transmit_gain = AUDIO_OFF_GAIN; if (audioGain.cgain[0].transmit_gain > AUDIO_MAX_GAIN) audioGain.cgain[0].transmit_gain = AUDIO_MAX_GAIN; audioGain.channel_mask = AUDIO_CHANNEL_0; audioGain.cgain[0].receive_gain = AUDIO_OFF_GAIN; audioGain.cgain[0].monitor_gain = AUDIO_OFF_GAIN; if (ioctl(audioDescriptor, AUDIO_SET_GAINS, &audioGain) == -1) { perror("AUDIO_SET_GAINS"); exit(1); } } /* select output */ if (headphone != 2 || speaker != 2) { int outSel; if (ioctl(audioDescriptor, AUDIO_GET_OUTPUT, &outSel) == -1) { perror("AUDIO_GET_OUTPUT"); exit(1); } if (headphone != 2) if (headphone) outSel |= AUDIO_OUT_EXTERNAL; else outSel &= ~AUDIO_OUT_EXTERNAL; if (speaker != 2) /* internal and external speakers */ if (speaker) outSel |= (AUDIO_OUT_INTERNAL | AUDIO_OUT_LINE); else outSel &= ~(AUDIO_OUT_INTERNAL | AUDIO_OUT_LINE); if (ioctl(audioDescriptor, AUDIO_SET_OUTPUT, outSel) == -1) { perror("AUDIO_SET_OUTPUT"); exit(1); } } /* switch to 16 bit samples (710 converts to u-law) */ if (ioctl(audioDescriptor, AUDIO_SET_DATA_FORMAT, AUDIO_FORMAT_LINEAR16BIT) == -1) { perror("AUDIO_SET_DATA_FORMAT"); exit(1); } /* choose nearest available sample rate (710 has 8 kHz only) */ sr = audioInfo.sample_rate[0]; for (i = 1; i < audioInfo.nrates; i++) if (abs(audioInfo.sample_rate[i] - samp_rate) < abs(sr - samp_rate)) sr = audioInfo.sample_rate[i]; samp_rate = sr; /* set sampling rate */ if (ioctl(audioDescriptor, AUDIO_SET_SAMPLE_RATE, (int) samp_rate) == -1) { perror("AUDIO_SET_SAMPLE_RATE"); exit(1); } /* switch to mono */ if (ioctl(audioDescriptor, AUDIO_SET_CHANNELS, 1) == -1) { perror("AUDIO_SET_CHANNELS"); exit(1); } return argc; } void audio_term() { if (audioDescriptor >= 0) { if (ioctl(audioDescriptor, AUDIO_DRAIN) == -1) { perror("AUDIO_DRAIN"); exit(1); } if (close(audioDescriptor) == -1) { perror("close"); exit(1); } audioDescriptor = -1; } } void audio_play(n, data) int n; short *data; { if (n > 0) { unsigned size = n * sizeof(*data); if (write(audioDescriptor, data, size) != size) perror("write"); } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.