From 871cf3077ae6aa4ca01627137dcd68fc139a7f12 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Thu, 28 May 2009 00:59:00 +0000 Subject: reformat svn path=/trunk/; revision=11538 --- desiredata/src/s_audio_mmio.c | 283 ++++++++++++++++++++---------------------- 1 file changed, 137 insertions(+), 146 deletions(-) (limited to 'desiredata') diff --git a/desiredata/src/s_audio_mmio.c b/desiredata/src/s_audio_mmio.c index 9db21683..c1d70442 100644 --- a/desiredata/src/s_audio_mmio.c +++ b/desiredata/src/s_audio_mmio.c @@ -27,10 +27,9 @@ int nt_realdacblksize; #define MAXBUFFER 100 /* number of buffers in use at maximum advance */ #define DEFBUFFER 30 /* default is about 30x6 = 180 msec! */ static int nt_naudiobuffer = DEFBUFFER; - -static int nt_meters; /* true if we're metering */ -static float nt_inmax, nt_outmax; /* max amplitude */ -static int nt_nwavein, nt_nwaveout; /* number of WAVE devices */ +static int nt_meters; /* true if we're metering */ +static float mmi_max, mmo_max; /* max amplitude */ +static int mmi_nwave, mmo_nwave; /* number of WAVE devices */ typedef struct _sbuf { HANDLE hData; @@ -39,15 +38,16 @@ typedef struct _sbuf { WAVEHDR *lpWaveHdr; // pointer to header structure } t_sbuf; -t_sbuf ntsnd_outvec[NAPORTS][MAXBUFFER]; /* circular buffer array */ -t_sbuf ntsnd_invec [NAPORTS][MAXBUFFER]; /* circular buffer array */ -HWAVEOUT ntsnd_outdev[NAPORTS]; /* output device */ -HWAVEIN ntsnd_indev [NAPORTS]; /* input device */ -static int ntsnd_outphase[NAPORTS]; /* index of next buffer to send */ -static int ntsnd_inphase [NAPORTS]; /* index of next buffer to read */ +t_sbuf mmo_vec[NAPORTS][MAXBUFFER]; /* circular buffer array */ +t_sbuf mmi_vec[NAPORTS][MAXBUFFER]; /* circular buffer array */ +HWAVEOUT mmo_dev[NAPORTS]; /* output device */ +HWAVEIN mmi_dev[NAPORTS]; /* input device */ +static int mmo_phase[NAPORTS]; /* index of next buffer to send */ +static int mmi_phase[NAPORTS]; /* index of next buffer to read */ +static UINT nt_whichdac = WAVE_MAPPER, nt_whichadc = WAVE_MAPPER; -static void nt_waveinerror( const char *s, int err) {char t[256]; waveInGetErrorText(err, t, 256); error(s,t);} -static void nt_waveouterror(const char *s, int err) {char t[256]; waveOutGetErrorText(err, t, 256); error(s,t);} +static void mmi_waveerror(const char *s, int err) {char t[256]; waveInGetErrorText(err, t, 256); error(s,t);} +static void mmo_waveerror(const char *s, int err) {char t[256]; waveOutGetErrorText(err, t, 256); error(s,t);} static void wave_prep(t_sbuf *bp, int setdone) { WAVEHDR *wh; @@ -74,61 +74,59 @@ static void wave_prep(t_sbuf *bp, int setdone) { if (setdone) wh->dwFlags = WHDR_DONE; } -static UINT nt_whichdac = WAVE_MAPPER, nt_whichadc = WAVE_MAPPER; - int mmio_do_open_audio() { PCMWAVEFORMAT form; - UINT mmresult; + UINT r; static int naudioprepped = 0, nindevsprepped = 0, noutdevsprepped = 0; - if (sys_verbose) post("%d devices in, %d devices out", nt_nwavein, nt_nwaveout); + if (sys_verbose) post("%d devices in, %d devices out", mmi_nwave, mmo_nwave); form.wf.wFormatTag = WAVE_FORMAT_PCM; form.wf.nChannels = CHANNELS_PER_DEVICE; form.wf.nSamplesPerSec = sys_dacsr; form.wf.nAvgBytesPerSec = sys_dacsr * (CHANNELS_PER_DEVICE * SAMPSIZE); form.wf.nBlockAlign = CHANNELS_PER_DEVICE * SAMPSIZE; form.wBitsPerSample = 8 * SAMPSIZE; - if (nt_nwavein <= 1 && nt_nwaveout <= 1) nt_noresync(); - if (nindevsprepped < nt_nwavein) { - for (int i=nindevsprepped; idwFlags & WHDR_DONE); - int donenext = (ntsnd_invec[n][phase3].lpWaveHdr->dwFlags & WHDR_DONE); + int donethis = (mmi_vec[n][phase2].lpWaveHdr->dwFlags & WHDR_DONE); + int donenext = (mmi_vec[n][phase3].lpWaveHdr->dwFlags & WHDR_DONE); if (donethis && !donenext) {if (firstphasebusy >= 0) goto multipleadc; else firstphasebusy = count;} if (!donethis && donenext) {if (firstphasedone >= 0) goto multipleadc; else firstphasedone = count;} phase2 = phase3; @@ -208,31 +206,31 @@ static void nt_printaudiostatus() { startpost("nad %d phase %d: oops:", n, phase); for (int count=0; countdwFlags & WHDR_DONE)); + sprintf(buf, " %d", (mmi_vec[n][count].lpWaveHdr->dwFlags & WHDR_DONE)); poststring(buf); } endpost(); } - for (int n=0; ndwFlags & WHDR_DONE); - int donenext = (ntsnd_outvec[n][phase3].lpWaveHdr->dwFlags & WHDR_DONE); + int donethis = (mmo_vec[n][phase2].lpWaveHdr->dwFlags & WHDR_DONE); + int donenext = (mmo_vec[n][phase3].lpWaveHdr->dwFlags & WHDR_DONE); if (donethis && !donenext) {if (firstphasebusy >= 0) goto multipledac; else firstphasebusy = count;} if (!donethis && donenext) {if (firstphasedone >= 0) goto multipledac; else firstphasedone = count;} phase2 = phase3; phase3 = WRAPFWD(phase2 + 1); } - if (firstphasebusy < 0) post("nda %d phase %d all %d", n, phase, (ntsnd_outvec[n][0].lpWaveHdr->dwFlags & WHDR_DONE)); + if (firstphasebusy < 0) post("nda %d phase %d all %d", n, phase, (mmo_vec[n][0].lpWaveHdr->dwFlags & WHDR_DONE)); else post("nda %d phase %d busy %d done %d", n, phase, firstphasebusy, firstphasedone); continue; multipledac: startpost("nda %d phase %d: oops:", n, phase); for (count = 0; count < nt_naudiobuffer; count++) { char buf[80]; - sprintf(buf, " %d", (ntsnd_outvec[n][count].lpWaveHdr->dwFlags & WHDR_DONE)); + sprintf(buf, " %d", (mmo_vec[n][count].lpWaveHdr->dwFlags & WHDR_DONE)); poststring(buf); } endpost(); @@ -246,37 +244,37 @@ static int nt_resync_cancelled; static void nt_noresync() {nt_resync_cancelled = 1;} static void nt_resyncaudio() { - UINT mmresult; + UINT r; if (nt_resync_cancelled) return; /* for each open input device, eat all buffers which are marked ready. The next one will thus be "busy". */ post("resyncing audio"); - for (int n=0; ndwFlags & WHDR_DONE)) break; - if (h->dwFlags & WHDR_PREPARED) waveInUnprepareHeader(ntsnd_indev[n], h, sizeof(WAVEHDR)); + if (h->dwFlags & WHDR_PREPARED) waveInUnprepareHeader(mmi_dev[n], h, sizeof(WAVEHDR)); h->dwFlags = 0L; - waveInPrepareHeader(ntsnd_indev[n], h, sizeof(WAVEHDR)); - mmresult = waveInAddBuffer(ntsnd_indev[n], h, sizeof(WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) nt_waveinerror("waveInAddBuffer: %s", mmresult); - ntsnd_inphase[n] = phase = WRAPFWD(phase+1); + waveInPrepareHeader(mmi_dev[n], h, sizeof(WAVEHDR)); + r = waveInAddBuffer(mmi_dev[n], h, sizeof(WAVEHDR)); + if (r != MMSYSERR_NOERROR) mmi_waveerror("waveInAddBuffer: %s", r); + mmi_phase[n] = phase = WRAPFWD(phase+1); } if (count == MAXRESYNC) post("resync error at input"); } /* Each output buffer which is "ready" is filled with zeros and queued. */ - for (int n=0; ndwFlags & WHDR_DONE)) break; - if (h->dwFlags & WHDR_PREPARED) waveOutUnprepareHeader(ntsnd_outdev[n], h, sizeof(WAVEHDR)); + if (h->dwFlags & WHDR_PREPARED) waveOutUnprepareHeader(mmo_dev[n], h, sizeof(WAVEHDR)); h->dwFlags = 0L; - memset((char *)(ntsnd_outvec[n][phase].lpData), 0, (CHANNELS_PER_DEVICE * SAMPSIZE * nt_realdacblksize)); - waveOutPrepareHeader( ntsnd_outdev[n], h, sizeof(WAVEHDR)); - mmresult = waveOutWrite(ntsnd_outdev[n], h, sizeof(WAVEHDR)); - if (mmresult != MMSYSERR_NOERROR) nt_waveouterror("waveOutAddBuffer: %s", mmresult); - ntsnd_outphase[n] = phase = WRAPFWD(phase+1); + memset((char *)(mmo_vec[n][phase].lpData), 0, (CHANNELS_PER_DEVICE * SAMPSIZE * nt_realdacblksize)); + waveOutPrepareHeader(mmo_dev[n], h, sizeof(WAVEHDR)); + r = waveOutWrite(mmo_dev[n], h, sizeof(WAVEHDR)); + if (r != MMSYSERR_NOERROR) mmo_waveerror("waveOutAddBuffer: %s", r); + mmo_phase[n] = phase = WRAPFWD(phase+1); } if (count == MAXRESYNC) post("resync error at output"); } @@ -304,50 +302,45 @@ void nt_logerror(int which) { } static int mmio_send_dacs() { - UINT mmresult; - if (!nt_nwavein && !nt_nwaveout) return 0; + UINT r; + if (!mmi_nwave && !mmo_nwave) return 0; if (nt_meters) { - float maxsamp = nt_inmax; - for (int i=0, n=2*nt_nwavein*sys_dacblocksize; i maxsamp) maxsamp = f; else if (-f > maxsamp) maxsamp = -f; } - nt_inmax = maxsamp; - maxsamp = nt_outmax; - for (int i=0, n=2*nt_nwaveout*sys_dacblocksize; i maxsamp) maxsamp = f; else if (-f > maxsamp) maxsamp = -f; } - nt_outmax = maxsamp; + mmo_max = maxsamp; } /* the "fill pointer" nt_fill controls where in the next I/O buffers we will write and/or read. If it's zero, we first check whether the buffers are marked "done". */ if (!nt_fill) { - for (int n=0; ndwFlags & WHDR_DONE)) goto idle; + for (int n=0; ndwFlags & WHDR_DONE)) goto idle; } - for (int n=0; ndwFlags & WHDR_DONE)) goto idle; + for (int n=0; ndwFlags & WHDR_DONE)) goto idle; } - for (int n=0; ndwFlags & WHDR_PREPARED) waveInUnprepareHeader(ntsnd_indev[n], h, sizeof(WAVEHDR)); + for (int n=0; ndwFlags & WHDR_PREPARED) waveInUnprepareHeader(mmi_dev[n],h,sizeof(WAVEHDR)); } - for (int n=0; ndwFlags & WHDR_PREPARED) waveOutUnprepareHeader(ntsnd_outdev[n], h, sizeof(WAVEHDR)); + for (int n=0; ndwFlags & WHDR_PREPARED) waveOutUnprepareHeader(mmo_dev[n],h,sizeof(WAVEHDR)); } } /* Convert audio output to fixed-point and put it in the output buffer. */ - int i, j; short *sp1, *sp2; float *fp1, *fp2; fp1 = sys_soundout; - for (int n=0; ndwFlags & WHDR_DONE) goto late; } - for (int n=0; ndwFlags & WHDR_DONE) goto late; } } @@ -404,16 +397,14 @@ late: return 1; idle: /* If more than nt_adcjitterbufsallowed ADC buffers are ready on any input device, resynchronize */ - for (int n=0; ndwFlags & WHDR_DONE) {nt_resyncaudio(); return 0;} + for (int n=0; ndwFlags & WHDR_DONE) {nt_resyncaudio(); return 0;} } /* test dac sync the same way */ - for (int n=0; ndwFlags & WHDR_DONE) {nt_resyncaudio(); return 0;} + for (int n=0; ndwFlags & WHDR_DONE) {nt_resyncaudio(); return 0;} } #ifdef MIDI_TIMESTAMP nt_midisync(); @@ -424,8 +415,8 @@ idle: /* ------------------- public routines -------------------------- */ static int mmio_open_audio( - int naudioindev, int *audioindev, int nchindev, int *chindev, - int naudiooutdev, int *audiooutdev, int nchoutdev, int *choutdev, int rate, int dummy) /* IOhannes */ { + int naudioidev, int *audioidev, int nchidev, int *chidev, + int naudioodev, int *audioodev, int nchodev, int *chodev, int rate, int dummy) /* IOhannes */ { nt_realdacblksize = (sys_blocksize ? sys_blocksize : DEFREALDACBLKSIZE); int nbuf = sys_advance_samples/nt_realdacblksize; if (nbuf >= MAXBUFFER) { @@ -436,11 +427,11 @@ static int mmio_open_audio( nt_naudiobuffer = nbuf; if (nt_adcjitterbufsallowed > nbuf-2) nt_adcjitterbufsallowed = nbuf-2; if (nt_dacjitterbufsallowed > nbuf-2) nt_dacjitterbufsallowed = nbuf-2; - nt_nwavein = sys_inchannels / 2; - nt_nwaveout = sys_outchannels / 2; - nt_whichadc = (naudioindev < 1 ? (nt_nwavein > 1 ? WAVE_MAPPER : -1) : audioindev[0]); - nt_whichdac = (naudiooutdev < 1 ? (nt_nwaveout > 1 ? WAVE_MAPPER : -1) : audiooutdev[0]); - if (naudiooutdev>1 || naudioindev>1) post("separate audio device choice not supported; using sequential devices."); + mmi_nwave = sys_inchannels / 2; + mmo_nwave = sys_outchannels / 2; + nt_whichadc = (naudioidev < 1 ? (mmi_nwave > 1 ? WAVE_MAPPER : -1) : audioidev[0]); + nt_whichdac = (naudioodev < 1 ? (mmo_nwave > 1 ? WAVE_MAPPER : -1) : audioodev[0]); + if (naudioodev>1 || naudioidev>1) post("separate audio device choice not supported; using sequential devices."); mmio_do_open_audio(); return 0; } @@ -450,13 +441,13 @@ static int mmio_open_audio( void mmio_listdevs() { UINT ndevices = waveInGetNumDevs(); for (unsigned i=0; i