ftp.nice.ch/pub/next/unix/music/clm.d.tar.gz#/next.c

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.