#define WIN32_LEAN_AND_MEAN #define WIN32_EXTRA_LEAN #include "mmreg.h" #include "4klang.h" #define USE_SOUND_THREAD #pragma bss_seg(".synthnothing") static float lpSoundBuffer[MAX_SAMPLES]; static HWAVEOUT hWaveOut; #pragma data_seg(".wavefmt") WAVEFORMATEX WaveFMT = { #ifdef FLOAT_32BIT WAVE_FORMAT_IEEE_FLOAT, #else WAVE_FORMAT_PCM, #endif 2, // channels SAMPLE_RATE, // samples per sec SAMPLE_RATE*sizeof(SAMPLE_TYPE)*2, // bytes per sec sizeof(SAMPLE_TYPE)*2, // block alignment; sizeof(SAMPLE_TYPE)*8, // bits per sample 0 // extension not needed }; #pragma data_seg(".wavehdr") WAVEHDR WaveHDR = { (LPSTR)lpSoundBuffer, MAX_SAMPLES*sizeof(SAMPLE_TYPE)*2, // MAX_SAMPLES*sizeof(float)*2(stereo) 0, 0, 0, 0, 0, 0 }; #pragma data_seg(".mmtime") MMTIME MMTime = { TIME_SAMPLES, 0 }; #ifdef USE_SOUND_THREAD #pragma code_seg(".sndthrd") DWORD WINAPI SoundThread( LPVOID lpParam ) { _4klang_render(lpSoundBuffer); return 0; } #endif #pragma code_seg(".initsnd") extern "C" void InitSound() { #ifdef USE_SOUND_THREAD CreateThread(0, 0, SoundThread, 0, 0, 0); #else _4klang_render(lpSoundBuffer); #endif _asm { push esi push esi push esi push offset WaveFMT push 0FFFFFFFFh push offset hWaveOut call dword ptr [waveOutOpen] push 20h push offset WaveHDR push dword ptr [hWaveOut] push 20h push offset WaveHDR push dword ptr [hWaveOut] call dword ptr [waveOutPrepareHeader] call dword ptr [waveOutWrite] } } #pragma code_seg(".time") extern "C" float get_Time() { waveOutGetPosition(hWaveOut, &MMTime, sizeof(MMTIME)); return float(MMTime.u.sample) / SAMPLE_RATE; }