int GMSynthDLL::ThreadProc() { if (live) { if (seqMode & seqPlay) ldTm = 0.02; else ldTm = 0.20; OpenWaveDevice(); inmgr.SetWaveOut(&wvd); } else { if (wvf.OpenWaveFile(outFileName, 2)) { OnEvent(SEQEVT_SEQSTOP, NULL); return GMSYNTH_ERR_FILEOPEN; } inmgr.SetWaveOut(&wvf); } inmgr.Reset(); seq.SequenceMulti(inmgr, stTime, endTime, seqMode); if (live) { bsInt32 drain = (bsInt32) (synthParams.sampleRate * (ldTm * 4)); while (--drain > 0) inmgr.Tick(); CloseWaveDevice(); } else wvf.CloseWaveFile(); return GMSYNTH_NOERROR; }
BOOL SetupWave(PVOID TransferAddress) { DWORD SampleRate; UINT rc; /* * Make sure we've got a device - we may have one which does * not match the current sampling rate. */ if (TimeConstant != 0xFFFF) { SampleRate = GetSamplingRate(); if (SampleRate != WaveFormat.wf.nSamplesPerSec) { /* * Search for a suitable format */ if (!TestWaveFormat(SampleRate)) { /* * If this did not work it may be too fast * or slow so move it into our compass */ if (SampleRate > 22050) { SampleRate = 22050; } else { if (SampleRate < 11025) { SampleRate = 11025; } } /* * Device may only support discrete rates */ if (!TestWaveFormat(SampleRate)) { if (SampleRate > (11025 + 22050) / 2) { SampleRate == 22050; } else { SampleRate = 11025; } } } /* * Open the device with the new format if it's changed */ if (SampleRate != WaveFormat.wf.nSamplesPerSec) { dprintf3(("Format changed")); CloseWaveDevice(); WaveFormat.wf.nSamplesPerSec = SampleRate; WaveFormat.wf.nAvgBytesPerSec = SampleRate; dprintf2(("Setting %d samples per second", SampleRate)); } } TimeConstant = 0xFFFF; } if (hWave == NULL) { dprintf3(("Opening wave device")); OpenWaveDevice(); } else { dprintf3(("Resetting wave device prior to play")); (Input ? waveInReset : waveOutReset)(hWave); } /* * Set up any wave buffers etc if necessary */ if (hWave) { if (WaveHdr[0].lpData != (LPSTR)TransferAddress || BlockSize != WaveHdr[0].dwBufferLength) { (Input ? waveInUnprepareHeader : waveOutUnprepareHeader) (hWave, &WaveHdr[0], sizeof(WAVEHDR)); if (WaveHdr[1].dwFlags & WHDR_PREPARED) { (Input ? waveInUnprepareHeader : waveOutUnprepareHeader) (hWave, &WaveHdr[1], sizeof(WAVEHDR)); } } WaveHdr[0].lpData = (LPSTR)TransferAddress; WaveHdr[0].dwBufferLength = BlockSize; WaveHdr[1].lpData = (LPSTR)TransferAddress + BlockSize; WaveHdr[1].dwBufferLength = BlockSize; if (Auto && AutoThread == NULL) { dprintf3(("Creating event")); if (AutoEvent == NULL) { AutoEvent = CreateEvent(NULL, 0, 0, NULL); if (AutoEvent != NULL) { DWORD Id; dprintf2(("Creating thread")); AutoThread = CreateThread(NULL, 300, AutoThreadEntry, NULL, 0, &Id); if (AutoThread == NULL) { dprintf2(("Create thread failed code %d", GetLastError())); } } else { dprintf2(("Create event failed code %d", GetLastError())); } } } if (!(WaveHdr[0].dwFlags & WHDR_PREPARED)) { (Input ? waveInPrepareHeader : waveOutPrepareHeader) (hWave, &WaveHdr[0], sizeof(WAVEHDR)); } if (Auto) { if (!(WaveHdr[1].dwFlags & WHDR_PREPARED)) { (Input ? waveInPrepareHeader : waveOutPrepareHeader) (hWave, &WaveHdr[1], sizeof(WAVEHDR)); } } /* * Actually do it! */ dprintf2(("Writing %d bytes to wave device", WaveHdr[0].dwBufferLength)); rc = (Input ? waveInAddBuffer : waveOutWrite) (hWave, &WaveHdr[0], sizeof(WAVEHDR)); if (rc != MMSYSERR_NOERROR) { dprintf1(("Failed to write to /read from wave device - %d", rc)); } if (Auto) { (Input ? waveInAddBuffer : waveOutWrite) (hWave, &WaveHdr[1], sizeof(WAVEHDR)); } if (Input) { waveInStart(hWave); } } return TRUE; }