diff options
author | Thomas Grill <xovo@users.sourceforge.net> | 2003-09-23 00:21:28 +0000 |
---|---|---|
committer | Thomas Grill <xovo@users.sourceforge.net> | 2003-09-23 00:21:28 +0000 |
commit | 64fdb009695828b788fce074135b20a5e52c5fc4 (patch) | |
tree | a05144197dd339721b6d4a3a0927f7596e8872b6 /pd/src/s_sgi.c | |
parent | a30193fcd726552364de74984b200be2c30723e7 (diff) |
imported version 0.37-0
svn path=/trunk/; revision=1016
Diffstat (limited to 'pd/src/s_sgi.c')
-rw-r--r-- | pd/src/s_sgi.c | 433 |
1 files changed, 0 insertions, 433 deletions
diff --git a/pd/src/s_sgi.c b/pd/src/s_sgi.c deleted file mode 100644 index 82a23dfb..00000000 --- a/pd/src/s_sgi.c +++ /dev/null @@ -1,433 +0,0 @@ -/* Copyright (c) 1997-1999 Miller Puckette. -* For information on usage and redistribution, and for a DISCLAIMER OF ALL -* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */ - -#include "m_imp.h" -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <string.h> -#ifdef HAVE_BSTRING_H -#include <bstring.h> -#endif -#include <sys/types.h> -#include <sys/time.h> - -#include <dmedia/audio.h> -#include <sys/fpu.h> -#include <dmedia/midi.h> -int mdInit(void); /* prototype was messed up in midi.h */ -/* #include "sys/select.h" */ - -static ALport iport; -static ALport oport; -static ALconfig sgi_config; -#define DEFAULTCHANS 2 -#define SGI_MAXCH 8 -static int sys_inchannels, sys_outchannels; -static int sys_audiobufsamps; -int sys_schedadvance = 50000; /* scheduler advance in microseconds */ - /* (this is set ridiculously high until we can get the real-time - scheduling act together.) */ -int sys_hipriority = 0; -static int sgi_meters; /* true if we're metering */ -static float sgi_inmax; /* max input amplitude */ -static float sgi_outmax; /* max output amplitude */ - - - /* - 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(); - f.fc_struct.flush = 1; - set_fpc_csr(f.fc_word); -} - -static void sgi_setchsr(int inchans, int outchans, int sr) -{ - int inbytes = inchans * (DACBLKSIZE*sizeof(float)); - int outbytes = outchans * (DACBLKSIZE*sizeof(float)); - - sys_audiobufsamps = 64 * (int)(((float)sys_schedadvance)* sr / 64000000.); - sys_inchannels = inchans; - sys_outchannels = outchans; - sys_dacsr = sr; - - if (sys_soundin) - free(sys_soundin); - sys_soundin = (t_float *)malloc(inbytes); - memset(sys_soundin, 0, inbytes); - - if (sys_soundout) - free(sys_soundout); - sys_soundout = (t_float *)malloc(outbytes); - memset(sys_soundout, 0, outbytes); - - memset(sys_soundout, 0, sys_outchannels * (DACBLKSIZE*sizeof(float))); - memset(sys_soundin, 0, sys_inchannels * (DACBLKSIZE*sizeof(float))); -} - -static void sgi_open_audio(void) -{ - long pvbuf[4]; - long pvbuflen; - /* get current sample rate -- should use this to set logical SR */ - pvbuf[0] = AL_INPUT_RATE; - pvbuf[2] = AL_OUTPUT_RATE; - pvbuflen = 4; - - ALgetparams(AL_DEFAULT_DEVICE, pvbuf, pvbuflen); - - if (sys_inchannels && pvbuf[1] != sys_dacsr) - post("warning: input sample rate (%d) doesn't match mine (%f)\n", - pvbuf[1], sys_dacsr); - - if (sys_outchannels && pvbuf[3] != sys_dacsr) - post("warning: output sample rate (%d) doesn't match mine (%f)\n", - pvbuf[3], sys_dacsr); - - pvbuf[3] = pvbuf[1]; - ALsetparams(AL_DEFAULT_DEVICE, pvbuf, pvbuflen); - - sgi_config = ALnewconfig(); - - ALsetsampfmt(sgi_config, AL_SAMPFMT_FLOAT); - - if (sys_outchannels) - { - ALsetchannels(sgi_config, sys_outchannels); - ALsetqueuesize(sgi_config, sys_audiobufsamps * sys_outchannels); - oport = ALopenport("the ouput port", "w", sgi_config); - if (!oport) - fprintf(stderr,"Pd: failed to open audio write port\n"); - } - else oport = 0; - if (sys_inchannels) - { - ALsetchannels(sgi_config, sys_inchannels); - ALsetqueuesize(sgi_config, sys_audiobufsamps * sys_inchannels); - iport = ALopenport("the input port", "r", sgi_config); - if (!iport) - fprintf(stderr,"Pd: failed to open audio read port\n"); - } - else iport = 0; -} - -void sys_close_audio( void) -{ - if (iport) ALcloseport(iport); - if (oport) ALcloseport(oport); -} - -void sys_close_midi( void) -{ - /* ??? */ -} - -t_sample *sys_soundout; -t_sample *sys_soundin; -float sys_dacsr; - -int sys_send_dacs(void) -{ - float buf[SGI_MAXCH * DACBLKSIZE], *fp1, *fp2, *fp3, *fp4; - long outfill, infill; - int outchannels = sys_outchannels, inchannels = sys_inchannels; - int i, nwait = 0, channel; - int outblk = DACBLKSIZE * outchannels; - int inblk = DACBLKSIZE * inchannels; - outfill = ALgetfillable(oport); - if (sgi_meters) - { - int i, n; - float maxsamp; - for (i = 0, n = sys_inchannels * DACBLKSIZE, maxsamp = sgi_inmax; - i < n; i++) - { - float f = sys_soundin[i]; - if (f > maxsamp) maxsamp = f; - else if (-f > maxsamp) maxsamp = -f; - } - sgi_inmax = maxsamp; - for (i = 0, n = sys_outchannels * DACBLKSIZE, maxsamp = sgi_outmax; - i < n; i++) - { - float f = sys_soundout[i]; - if (f > maxsamp) maxsamp = f; - else if (-f > maxsamp) maxsamp = -f; - } - sgi_outmax = maxsamp; - } - - if (outfill <= outblk) - { - while ((infill = ALgetfilled(iport)) > 2*inblk) - { - if (sys_verbose) post("drop ADC buf"); - ALreadsamps(iport, buf, inblk); - return (0); - } - } - if (outchannels) - { - for (channel = 0, fp1 = buf, fp2 = sys_soundout; - channel < outchannels; channel++, fp1++, fp2 += DACBLKSIZE) - { - for (i = 0, fp3 = fp1, fp4 = fp2; i < DACBLKSIZE; - i++, fp3 += outchannels, fp4++) - *fp3 = *fp4, *fp4 = 0; - } - ALwritesamps(oport, buf, outchannels* DACBLKSIZE); - } - if (inchannels) - { - if (infill > inblk) - ALreadsamps(iport, buf, inchannels* DACBLKSIZE); - else - { - if (sys_verbose) post("extra ADC buf"); - memset(buf, 0, inblk*sizeof(float)); - } - for (channel = 0, fp1 = buf, fp2 = sys_soundin; - channel < inchannels; channel++, fp1++, fp2 += DACBLKSIZE) - { - for (i = 0, fp3 = fp1, fp4 = fp2; i < DACBLKSIZE; - i++, fp3 += inchannels, fp4++) - *fp4 = *fp3; - } - } - return (1); -} - -/* ------------------------- MIDI -------------------------- */ - -#define NPORT 2 - -static MDport sgi_inport[NPORT]; -static MDport sgi_outport[NPORT]; - -void sgi_open_midi(int midiin, int midiout) -{ - int i; - int sgi_nports = mdInit(); - if (sgi_nports < 0) sgi_nports = 0; - else if (sgi_nports > NPORT) sgi_nports = NPORT; - if (sys_verbose) - { - if (!sgi_nports) - { - post("no serial ports are configured for MIDI;"); - post("if you want to use MIDI, try exiting Pd, typing"); - post("'startmidi -d /dev/ttyd2' to a shell, and restarting Pd."); - } - else if (sgi_nports == 1) - post("Found one MIDI port on %s", mdGetName(0)); - else if (sgi_nports == 2) - post("Found MIDI ports on %s and %s", - mdGetName(0), mdGetName(1)); - } - if (midiin) - { - for (i = 0; i < sgi_nports; i++) - { - if (!(sgi_inport[i] = mdOpenInPort(mdGetName(i)))) - error("MIDI input port %d: open failed", i+1);; - } - } - if (midiout) - { - for (i = 0; i < sgi_nports; i++) - { - if (!(sgi_outport[i] = mdOpenOutPort(mdGetName(i)))) - error("MIDI output port %d: open failed", i+1);; - } - } - return; -} - -void sys_putmidimess(int portno, int a, int b, int c) -{ - MDevent mdv; - if (portno >= NPORT || portno < 0 || !sgi_outport[portno]) return; - mdv.msg[0] = a; - mdv.msg[1] = b; - mdv.msg[2] = c; - mdv.msg[3] = 0; - mdv.sysexmsg = 0; - mdv.stamp = 0; - mdv.msglen = 0; - if (mdSend(sgi_outport[portno], &mdv, 1) < 0) - error("MIDI output error\n"); - post("msg out %d %d %d", a, b, c); -} - -void sys_putmidibyte(int portno, int foo) -{ - error("MIDI raw byte output not available on SGI"); -} - -void inmidi_noteon(int portno, int channel, int pitch, int velo); -void inmidi_controlchange(int portno, int channel, int ctlnumber, int value); -void inmidi_programchange(int portno, int channel, int value); -void inmidi_pitchbend(int portno, int channel, int value); -void inmidi_aftertouch(int portno, int channel, int value); -void inmidi_polyaftertouch(int portno, int channel, int pitch, int value); - -void sys_poll_midi(void) -{ - int i; - MDport *mp; - for (i = 0, mp = sgi_inport; i < NPORT; i++, mp++) - { - int ret, status, b1, b2, nfds; - MDevent mdv; - fd_set inports; - struct timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = 0; - if (!*mp) continue; - FD_ZERO(&inports); - FD_SET(mdGetFd(*mp), &inports); - - if (select(mdGetFd(*mp)+1 , &inports, 0, 0, &timeout) < 0) - perror("midi select"); - if (FD_ISSET(mdGetFd(*mp),&inports)) - { - if (mdReceive(*mp, &mdv, 1) < 0) - error("failure receiving message\n"); - else if (mdv.msg[0] == MD_SYSEX) mdFree(mdv.sysexmsg); - - else - { - int status = mdv.msg[0]; - int channel = (status & 0xf) + 1; - int b1 = mdv.msg[1]; - int b2 = mdv.msg[2]; - switch(status & 0xf0) - { - case MD_NOTEOFF: - inmidi_noteon(i, channel, b1, 0); - break; - case MD_NOTEON: - inmidi_noteon(i, channel, b1, b2); - break; - case MD_POLYKEYPRESSURE: - inmidi_polyaftertouch(i, channel, b1, b2); - break; - case MD_CONTROLCHANGE: - inmidi_controlchange(i, channel, b1, b2); - break; - case MD_PITCHBENDCHANGE: - inmidi_pitchbend(i, channel, ((b2 << 7) + b1)); - break; - case MD_PROGRAMCHANGE: - inmidi_programchange(i, channel, b1); - break; - case MD_CHANNELPRESSURE: - inmidi_aftertouch(i, channel, b1); - break; - } - } - } - } -} - - /* public routines */ - -void sys_open_audio(int naudioindev, int *audioindev, int nchindev, int *chindev, - int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev, - int rate) /* IOhannes */ -{ - int inchans=0; - int outchans=0; - if (nchindev<0)inchans == -1; - else { - int i=nchindev; - int *l=chindev; - while(i--)inchans+=*l++; - } - if (nchoutdev<0)outchans == -1; - else { - int i=nchoutdev; - int *l=choutdev; - while(i--)outchans+=*l++; - } - - if (inchans < 0) inchans = DEFAULTCHANS; - if (outchans < 0) outchans = DEFAULTCHANS; - if (inchans > SGI_MAXCH) inchans = SGI_MAXCH; - if (outchans > SGI_MAXCH) outchans = SGI_MAXCH; - - sgi_setchsr(inchans, outchans, rate); - sgi_flush_all_underflows_to_zero(); - sgi_open_audio(); -} - -void sys_open_midi(int nmidiin, int *midiinvec, - int nmidiout, int *midioutvec) -{ - sgi_open_midi(nmidiin!=0, nmidiout!=0); -} - -float sys_getsr(void) -{ - return (sys_dacsr); -} - -void sys_audiobuf(int n) -{ - /* set the size, in milliseconds, of the audio FIFO */ - if (n < 5) n = 5; - else if (n > 5000) n = 5000; - fprintf(stderr, "audio buffer set to %d milliseconds\n", n); - sys_schedadvance = n * 1000; -} - -void sys_getmeters(float *inmax, float *outmax) -{ - if (inmax) - { - sgi_meters = 1; - *inmax = sgi_inmax; - *outmax = sgi_outmax; - } - else - sgi_meters = 0; - sgi_inmax = sgi_outmax = 0; -} - -void sys_reportidle(void) -{ -} - -int sys_get_inchannels(void) -{ - return (sys_inchannels); -} - -int sys_get_outchannels(void) -{ - return (sys_outchannels); -} - -void sys_set_priority(int foo) -{ - fprintf(stderr, - "warning: priority boosting in IRIX not implemented yet\n"); -} - -void sys_setblocksize(int n) -{ - fprintf(stderr, - "warning: blocksize not settable in IRIX\n"); -} |