This is next.c in view mode; [Download] [Up]
/* DAC routines and so on for the Next (system 2.0 and later) */
/* compiled via cc next.c -c -O */
#include <sound/sound.h>
#include <sound/sounddriver.h>
#include <mach/mach.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
static SNDSoundStruct *snp = NULL;
int SNDFree1(SNDSoundStruct *s)
{
SNDFree(s);
snp = NULL;
}
int startdac(char *argv, int igerr, float start, float end)
{
int err,offset,oldsize,oldloc,len;
float size;
err = SNDReadSoundfile(argv,&snp);
len = 0;
oldsize = snp->dataSize;
oldloc = snp->dataLocation;
offset = ((snp->channelCount) * 2 * (snp->samplingRate) * start);
if (offset != 0)
{
snp->dataLocation += offset;
snp->dataSize -= offset;
}
/* one would naively think that it should be possible to edit the SNDSoundStruct */
/* fields here to change the start/end times, srate and so on, but changed srate */
/* is ignored, changed size hangs, changed location works, I think (clicks?), */
/* and, of course, we can't play non-NeXT sound files. */
if ((err == 0) || (igerr != 0))
{
err = SNDStartPlaying(snp,1,5,0,0,(SNDNotificationFun)SNDFree1);
}
return err;
}
abortdac(void)
{
SNDStop(1);
if (snp != NULL) SNDFree(snp);
snp = NULL;
}
int dacisrunning(void)
{
if (snp != NULL) return 1;
return 0;
}
waitfordac(void)
{
SNDWait(0); /* i.e. wait for all, but there's only one... */
}
int sethost(char *host)
{
/* I'm not even sure what this does, but it's in the manual so what the heck. */
int i;
i = SNDSetHost(host);
return i;
}
/*
There is apparently a low pass filter on the DAC --
new documentation calls it a pre-emphasis filter.
*/
int getdacfilter (void)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
if (err == 0) err = lowpass;
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port); /* SNDAcquire holds onto the dsp until we release it explicitly */
/* see /NextLibrary/Documentation/NextDev/SndMusicDSP/Reference/03_CFunctions/SoundFunctions.rtf */
/* in 3.0 this appears to be /NextLibrary/Documentation/NextDev/GeneralRef/16_Sound/SoundFunctions/SoundFunctions.rtf */
return err;
}
int setdacfilter (int state)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
{
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
lowpass=state;
if (err == 0)
err = snddriver_set_device_parms(dev_port,speaker,lowpass,zerofill);
}
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port);
return err;
}
/* my tests indicate it's a pretty weak filter */
int getvolume (int *arr)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
if (err == 0)
{
arr[0] = speaker;
err = snddriver_get_volume(dev_port,&arr[1],&arr[2]);
}
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port);
return err;
}
int setvolume (int *arr)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
{
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
speaker = arr[0];
if (err == 0)
err = snddriver_set_device_parms(dev_port,speaker,lowpass,zerofill);
if (err == 0)
err = snddriver_set_volume(dev_port,arr[1],arr[2]);
}
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port);
return err;
}
int setramp (int rmp) /* see NextLibrary/Documentation/NextDev/SNDMusicDSP/Reference/03_CFunctions/DriverFunctions.rtf */
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
err = snddriver_set_ramp(dev_port,rmp);
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port);
return err;
}
int getdaczerofill (void)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
if (err == 0) err = zerofill;
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port); /* SNDAcquire holds onto the dsp until we release it explicitly */
/* see /NextLibrary/Documentation/NextDev/SndMusicDSP/Reference/03_CFunctions/SoundFunctions.rtf */
return err;
}
int setdaczerofill (int state)
{
int err;
port_t dev_port = 0, owner_port = 0;
boolean_t lowpass,speaker,zerofill;
err = SNDAcquire(SND_ACCESS_DSP, 0, 0, 0, NULL_NEGOTIATION_FUN, 0, &dev_port, &owner_port);
if (err == 0)
{
err = snddriver_get_device_parms(dev_port,&speaker,&lowpass,&zerofill);
zerofill=state;
if (err == 0)
err = snddriver_set_device_parms(dev_port,speaker,lowpass,zerofill);
}
SNDRelease(SND_ACCESS_DSP,dev_port,owner_port);
return err;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.