Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6969
Modified Files: Tag: desiredata s_audio_sgi.c Log Message: cleanup
Index: s_audio_sgi.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/s_audio_sgi.c,v retrieving revision 1.1.4.1.4.1 retrieving revision 1.1.4.1.4.2 diff -C2 -d -r1.1.4.1.4.1 -r1.1.4.1.4.2 *** s_audio_sgi.c 30 Jun 2007 20:30:19 -0000 1.1.4.1.4.1 --- s_audio_sgi.c 30 Jul 2007 22:32:02 -0000 1.1.4.1.4.2 *************** *** 1,5 **** - /* ----------------------- Experimental routines for SGI -------------- */ - /* written by Olaf Matthes olaf.matthes@gmx.de */
--- 1,3 ---- *************** *** 26,42 **** static int sgi_ninchans[SGI_MAXDEV], sgi_noutchans[SGI_MAXDEV];
! ! /* ! set the special "flush zero" but (FS, bit 24) in the ! Control Status Register of the FPU of R4k and beyond ! so that the result of any underflowing operation will ! be clamped to zero, and no exception of any kind will ! be generated on the CPU. ! ! thanks to cpirazzi@cp.esd.sgi.com (Chris Pirazzi). ! */ ! ! static void sgi_flush_all_underflows_to_zero(void) ! { union fpc_csr f; f.fc_word = get_fpc_csr(); --- 24,31 ---- static int sgi_ninchans[SGI_MAXDEV], sgi_noutchans[SGI_MAXDEV];
! /* set the special "flush zero" but (FS, bit 24) in the Control Status Register of the FPU of R4k and beyond ! so that the result of any underflowing operation will be clamped to zero, and no exception of any kind will ! be generated on the CPU. thanks to cpirazzi@cp.esd.sgi.com (Chris Pirazzi). */ ! static void sgi_flush_all_underflows_to_zero () { union fpc_csr f; f.fc_word = get_fpc_csr(); *************** *** 45,275 **** }
! ! /* convert the most common errors into readable strings */ ! static char *sgi_get_error_message(int err) ! { ! switch (err) ! { ! case AL_BAD_CONFIG: ! return "Invalid config"; ! ! case AL_BAD_DIRECTION: ! return "Invalid direction (neither "r" nor "w")"; ! ! case AL_BAD_OUT_OF_MEM: ! return "Not enough memory"; ! ! case AL_BAD_DEVICE_ACCESS: ! return "Audio hardware is not available or is improperly configured"; ! ! case AL_BAD_DEVICE: ! return "Invalid device"; ! ! case AL_BAD_NO_PORTS: ! return "No audio ports available"; ! ! case AL_BAD_QSIZE: ! return "Invalid fifo size"; ! ! case AL_BAD_SAMPFMT: ! return "Invalid sample format"; ! ! case AL_BAD_FLOATMAX: ! return "Invalid float maximum"; ! ! case AL_BAD_WIDTH: ! return "Invalid sample width"; ! ! default: ! return "Unknown error"; } }
- int sgi_open_audio(int nindev, int *indev, int nchin, int *chin, ! int noutdev, int *outdev, int nchout, int *chout, int rate/*, int dummy*/) ! { ALpv pvbuf[2]; int num_devs = 0; int in_dev = 0; int out_dev = 0; ! int inchans = 0; ! int outchans = 0; ! int err, n, gotchannels; ! char *indevnames[4] = {"DefaultIn", "AnalogIn", "AESIn", "ADATIn"}; ! char *outdevnames[4] = {"DefaultOut", "AnalogOut", "AESOut", "ADATOut"}; ! ! sgi_flush_all_underflows_to_zero(); ! ! if (sys_verbose) ! post("opening sound input..."); ! ! for (n = 0; n < nindev; n++) ! { ! int gotchannels = 0; ! ! if (indev[n] >= 0 && indev[n] < SGI_MAXDEV) /* open specified defice by name */ ! { ! if (sys_verbose) ! post("opening %s", indevnames[indev[n]]); ! in_dev = alGetResourceByName(AL_SYSTEM, ! indevnames[indev[n]], AL_DEVICE_TYPE); ! } ! else /* open default device */ ! { ! if(sys_verbose)post("opening %s", indevnames[0]); ! in_dev = AL_DEFAULT_INPUT; ! } ! if (!in_dev) ! { ! error("%s\n", sgi_get_error_message(in_dev)); ! continue; /* try next device, if any */ ! } ! ! sgi_inconfig = alNewConfig(); ! alSetSampFmt(sgi_inconfig, AL_SAMPFMT_FLOAT); ! alSetFloatMax(sgi_outconfig, 1.1f); alSetChannels(sgi_outconfig, chin[n]); alSetQueueSize(sgi_inconfig, sys_advance_samples * chin[n]); alSetDevice(sgi_inconfig, in_dev); sgi_iport[n] = alOpenPort("Pd input port", "r", sgi_inconfig); ! if (!sgi_iport[n]) ! fprintf(stderr,"Pd: failed to open audio read port\n"); ! ! /* try to set samplerate */ ! pvbuf[0].param = AL_RATE; ! pvbuf[0].value.ll = alDoubleToFixed(rate); ! if ((err = alSetParams(in_dev, pvbuf, 1)) < 0) ! { ! post("could not set specified sample rate for input (%s)\n", ! sgi_get_error_message(err)); ! if(pvbuf[0].sizeOut < 0) ! post("rate was invalid\n"); ! } ! /* check how many channels we actually got */ ! pvbuf[0].param = AL_CHANNELS; ! if (alGetParams(in_dev, pvbuf, 1) < 0) ! { ! post("could not figure out how many input channels we got"); ! gotchannels = chin[n]; /* assume we got them all */ ! } ! else ! { ! gotchannels = pvbuf[0].value.i; ! } ! inchans += gotchannels; /* count total number of channels */ ! sgi_ninchans[n] = gotchannels; /* remember channels for this device */ } ! ! if (sys_verbose) ! post("opening sound output..."); ! ! for (n = 0; n < noutdev; n++) ! { ! if (outdev[n] >= 0 && outdev[n] < SGI_MAXDEV) /* open specified defice by name */ ! { ! if(sys_verbose)post("opening %s", outdevnames[outdev[n]]); ! out_dev = alGetResourceByName(AL_SYSTEM, ! outdevnames[outdev[n]], AL_DEVICE_TYPE); ! } ! else /* open default device */ ! { ! if (sys_verbose) ! post("opening %s", outdevnames[0]); ! out_dev = AL_DEFAULT_OUTPUT; ! } ! if (!out_dev) ! { ! error("%s\n", sgi_get_error_message(out_dev)); ! continue; /* try next device, if any */ ! } ! ! /* configure the port before opening it */ ! sgi_outconfig = alNewConfig(); ! alSetSampFmt(sgi_outconfig, AL_SAMPFMT_FLOAT); ! alSetFloatMax(sgi_outconfig, 1.1f); alSetChannels(sgi_outconfig, chout[n]); alSetQueueSize(sgi_outconfig, sys_advance_samples * chout[n]); alSetDevice(sgi_outconfig, out_dev); ! ! /* open the port */ sgi_oport[n] = alOpenPort("Pd ouput port", "w", sgi_outconfig); ! if (!sgi_oport[n]) ! fprintf(stderr,"Pd: failed to open audio write port\n"); ! ! /* now try to set sample rate */ ! pvbuf[0].param = AL_RATE; ! pvbuf[0].value.ll = alDoubleToFixed(rate); ! if ((err = alSetParams(out_dev, pvbuf, 1)) < 0) ! { ! post("could not set specified sample rate for output (%s)\n", ! sgi_get_error_message(err)); ! if(pvbuf[0].sizeOut < 0) ! post("rate was invalid\n"); ! } ! /* check how many channels we actually got */ ! pvbuf[0].param = AL_CHANNELS; ! if (alGetParams(out_dev, pvbuf, 1) < 0) ! { ! post("could not figure out how many output channels we got"); ! gotchannels = chout[n]; ! } ! else ! { ! gotchannels = pvbuf[0].value.i; ! } ! outchans += gotchannels; ! sgi_noutchans[n] = gotchannels; } ! ! sgi_noutdevs = noutdev; ! sgi_nindevs = nindev; ! ! sgi_inchannels = inchans; ! sgi_outchannels = outchans; ! ! return (!(inchans || outchans)); }
! ! void sgi_close_audio(void) ! { int err, n; ! for (n = 0; n < sgi_nindevs; n++) ! { ! if (sgi_iport[n]) ! { ! err = alClosePort(sgi_iport[n]); ! if (err < 0) ! error("closing input %d: %s (%d)", n + 1, ! alGetErrorString(oserror()), err); ! } } ! for (n = 0; n < sgi_noutdevs; n++) ! { ! if (sgi_oport[n]) ! { ! err = alClosePort(sgi_oport[n]); ! if (err < 0) ! error("closing output %d: %s (%d)", n + 1, ! alGetErrorString(oserror()), err); ! } } }
! ! /* call this only if both input and output are open */ ! static void sgi_checkiosync(void) ! { ! int i, result, checkit = 1, giveup = 1000, alreadylogged = 0; ! long indelay, outdelay, defect; ! ! if (!(sgi_outchannels && sgi_inchannels)) ! return; }
! ! int sgi_send_dacs(void) ! { float buf[SGI_MAXCH * sys_dacblocksize], *fp1, *fp2, *fp3, *fp4; static int xferno = 0; --- 34,178 ---- }
! /* convert the most common errors into readable strings */ ! static char *sgi_get_error_message(int err) { ! switch (err) { ! case AL_BAD_CONFIG: return "Invalid config"; ! case AL_BAD_DIRECTION: return "Invalid direction (neither "r" nor "w")"; ! case AL_BAD_OUT_OF_MEM: return "Not enough memory"; ! case AL_BAD_DEVICE_ACCESS: return "Audio hardware is not available or is improperly configured"; ! case AL_BAD_DEVICE: return "Invalid device"; ! case AL_BAD_NO_PORTS: return "No audio ports available"; ! case AL_BAD_QSIZE: return "Invalid fifo size"; ! case AL_BAD_SAMPFMT: return "Invalid sample format"; ! case AL_BAD_FLOATMAX: return "Invalid float maximum"; ! case AL_BAD_WIDTH: return "Invalid sample width"; ! default: return "Unknown error"; } }
int sgi_open_audio(int nindev, int *indev, int nchin, int *chin, ! int noutdev, int *outdev, int nchout, int *chout, int rate/*, int dummy*/) { ALpv pvbuf[2]; int num_devs = 0; int in_dev = 0; int out_dev = 0; ! int inchans = 0; ! int outchans = 0; ! int err, n, gotchannels; ! char *indevnames[4] = {"DefaultIn", "AnalogIn", "AESIn", "ADATIn"}; ! char *outdevnames[4] = {"DefaultOut", "AnalogOut", "AESOut", "ADATOut"}; ! sgi_flush_all_underflows_to_zero(); ! if (sys_verbose) post("opening sound input..."); ! for (n = 0; n < nindev; n++) { ! int gotchannels = 0; ! if (indev[n] >= 0 && indev[n] < SGI_MAXDEV) { ! if (sys_verbose) post("opening %s", indevnames[indev[n]]); ! in_dev = alGetResourceByName(AL_SYSTEM, indevnames[indev[n]], AL_DEVICE_TYPE); ! } else { ! if(sys_verbose)post("opening %s", indevnames[0]); ! in_dev = AL_DEFAULT_INPUT; ! } ! if (!in_dev) { ! error("%s\n", sgi_get_error_message(in_dev)); ! continue; /* try next device, if any */ ! } ! sgi_inconfig = alNewConfig(); ! alSetSampFmt(sgi_inconfig, AL_SAMPFMT_FLOAT); ! alSetFloatMax(sgi_outconfig, 1.1f); alSetChannels(sgi_outconfig, chin[n]); alSetQueueSize(sgi_inconfig, sys_advance_samples * chin[n]); alSetDevice(sgi_inconfig, in_dev); sgi_iport[n] = alOpenPort("Pd input port", "r", sgi_inconfig); ! if (!sgi_iport[n]) fprintf(stderr,"Pd: failed to open audio read port\n"); ! /* try to set samplerate */ ! pvbuf[0].param = AL_RATE; ! pvbuf[0].value.ll = alDoubleToFixed(rate); ! if ((err = alSetParams(in_dev, pvbuf, 1)) < 0) { ! post("could not set specified sample rate for input (%s)\n", sgi_get_error_message(err)); ! if(pvbuf[0].sizeOut < 0) post("rate was invalid\n"); } ! /* check how many channels we actually got */ ! pvbuf[0].param = AL_CHANNELS; ! if (alGetParams(in_dev, pvbuf, 1) < 0) { ! post("could not figure out how many input channels we got"); ! gotchannels = chin[n]; /* assume we got them all */ ! } else { ! gotchannels = pvbuf[0].value.i; ! } ! inchans += gotchannels; /* count total number of channels */ ! sgi_ninchans[n] = gotchannels; /* remember channels for this device */ ! } ! if (sys_verbose) post("opening sound output..."); ! for (n = 0; n < noutdev; n++) { ! if (outdev[n] >= 0 && outdev[n] < SGI_MAXDEV) { ! if(sys_verbose)post("opening %s", outdevnames[outdev[n]]); ! out_dev = alGetResourceByName(AL_SYSTEM, outdevnames[outdev[n]], AL_DEVICE_TYPE); ! } else { ! if (sys_verbose) post("opening %s", outdevnames[0]); ! out_dev = AL_DEFAULT_OUTPUT; ! } ! if (!out_dev) { ! error("%s\n", sgi_get_error_message(out_dev)); ! continue; /* try next device, if any */ ! } ! /* configure the port before opening it */ ! sgi_outconfig = alNewConfig(); ! alSetSampFmt(sgi_outconfig, AL_SAMPFMT_FLOAT); ! alSetFloatMax(sgi_outconfig, 1.1f); alSetChannels(sgi_outconfig, chout[n]); alSetQueueSize(sgi_outconfig, sys_advance_samples * chout[n]); alSetDevice(sgi_outconfig, out_dev); ! /* open the port */ sgi_oport[n] = alOpenPort("Pd ouput port", "w", sgi_outconfig); ! if (!sgi_oport[n]) fprintf(stderr,"Pd: failed to open audio write port\n"); ! /* now try to set sample rate */ ! pvbuf[0].param = AL_RATE; ! pvbuf[0].value.ll = alDoubleToFixed(rate); ! if ((err = alSetParams(out_dev, pvbuf, 1)) < 0) { ! post("could not set specified sample rate for output (%s)\n", sgi_get_error_message(err)); ! if(pvbuf[0].sizeOut < 0) post("rate was invalid\n"); } ! /* check how many channels we actually got */ ! pvbuf[0].param = AL_CHANNELS; ! if (alGetParams(out_dev, pvbuf, 1) < 0) { ! post("could not figure out how many output channels we got"); ! gotchannels = chout[n]; ! } else { ! gotchannels = pvbuf[0].value.i; ! } ! outchans += gotchannels; ! sgi_noutchans[n] = gotchannels; ! } ! sgi_noutdevs = noutdev; ! sgi_nindevs = nindev; ! sgi_inchannels = inchans; ! sgi_outchannels = outchans; ! return !(inchans || outchans); }
! void sgi_close_audio() { int err, n; ! for (n = 0; n < sgi_nindevs; n++) { ! if (sgi_iport[n]) { ! err = alClosePort(sgi_iport[n]); ! if (err < 0) error("closing input %d: %s (%d)", n + 1, alGetErrorString(oserror()), err); } ! } ! for (n = 0; n < sgi_noutdevs; n++) { ! if (sgi_oport[n]) { ! err = alClosePort(sgi_oport[n]); ! if (err < 0) error("closing output %d: %s (%d)", n + 1, alGetErrorString(oserror()), err); } + } }
! /* call this only if both input and output are open */ ! static void sgi_checkiosync() { ! // int i, result, checkit = 1, giveup = 1000, alreadylogged = 0; ! // long indelay, outdelay, defect; ! // if (!(sgi_outchannels && sgi_inchannels)) return; }
! int sgi_send_dacs() { float buf[SGI_MAXCH * sys_dacblocksize], *fp1, *fp2, *fp3, *fp4; static int xferno = 0; *************** *** 277,288 **** static double timenow; double timelast; ! int inchannels = (sys_inchannels > sgi_inchannels ? ! sgi_inchannels : sys_inchannels); ! int outchannels = (sys_outchannels > sgi_outchannels ? ! sgi_outchannels : sys_outchannels); long outfill[SGI_MAXDEV], infill[SGI_MAXDEV]; ! int outdevchannels, indevchannels; int i, n, channel; ! int result; unsigned int outtransfersize = sys_dacblocksize; unsigned int intransfersize = sys_dacblocksize; --- 180,189 ---- static double timenow; double timelast; ! int inchannels = min(sys_inchannels, sgi_inchannels); ! int outchannels = min(sys_outchannels,sgi_outchannels); long outfill[SGI_MAXDEV], infill[SGI_MAXDEV]; ! int outdevchannels, indevchannels; int i, n, channel; ! int result; unsigned int outtransfersize = sys_dacblocksize; unsigned int intransfersize = sys_dacblocksize;