Mercurial > games > semicongine
comparison semiconginev2/old/platform/windows/audio.nim @ 1218:56781cc0fc7c compiletime-tests
did: renamge main package
| author | sam <sam@basx.dev> |
|---|---|
| date | Wed, 17 Jul 2024 21:01:37 +0700 |
| parents | semicongine/old/platform/windows/audio.nim@a3eb305bcac2 |
| children |
comparison
equal
deleted
inserted
replaced
| 1217:f819a874058f | 1218:56781cc0fc7c |
|---|---|
| 1 import std/os | |
| 2 | |
| 3 import ../../thirdparty/winim/winim | |
| 4 import ../../thirdparty/winim/winim/extra | |
| 5 | |
| 6 import ../../core/audiotypes | |
| 7 | |
| 8 template CheckWinMMResult*(call: untyped) = | |
| 9 let value = call | |
| 10 if value < 0: | |
| 11 raise newException(Exception, "Windows multimedia error: " & astToStr(call) & | |
| 12 " returned " & $value) | |
| 13 type | |
| 14 NativeSoundDevice* = object | |
| 15 handle: HWAVEOUT | |
| 16 buffers: seq[WAVEHDR] | |
| 17 | |
| 18 proc OpenSoundDevice*(sampleRate: uint32, buffers: seq[ptr SoundData]): NativeSoundDevice = | |
| 19 var format = WAVEFORMATEX( | |
| 20 wFormatTag: WAVE_FORMAT_PCM, | |
| 21 nChannels: 2, | |
| 22 nSamplesPerSec: DWORD(sampleRate), | |
| 23 nAvgBytesPerSec: DWORD(sampleRate) * 4, | |
| 24 nBlockAlign: 4, | |
| 25 wBitsPerSample: 16, | |
| 26 cbSize: 0, | |
| 27 ) | |
| 28 CheckWinMMResult waveOutOpen(addr result.handle, WAVE_MAPPER, addr format, DWORD_PTR(0), DWORD_PTR(0), CALLBACK_NULL) | |
| 29 | |
| 30 for i in 0 ..< buffers.len: | |
| 31 result.buffers.add WAVEHDR( | |
| 32 lpData: cast[cstring](addr buffers[i][][0]), | |
| 33 dwBufferLength: DWORD(buffers[i][].len * sizeof(Sample)), | |
| 34 dwLoops: 1, | |
| 35 ) | |
| 36 for i in 0 ..< result.buffers.len: | |
| 37 CheckWinMMResult waveOutPrepareHeader(result.handle, addr result.buffers[i], UINT(sizeof(WAVEHDR))) | |
| 38 CheckWinMMResult waveOutWrite(result.handle, addr result.buffers[i], UINT(sizeof(WAVEHDR))) | |
| 39 | |
| 40 proc WriteSoundData*(soundDevice: var NativeSoundDevice, buffer: int) = | |
| 41 while (soundDevice.buffers[buffer].dwFlags and WHDR_DONE) == 0: | |
| 42 sleep(1) | |
| 43 CheckWinMMResult waveOutWrite(soundDevice.handle, addr soundDevice.buffers[buffer], UINT(sizeof(WAVEHDR))) | |
| 44 | |
| 45 proc CloseSoundDevice*(soundDevice: var NativeSoundDevice) = | |
| 46 for i in 0 ..< soundDevice.buffers.len: | |
| 47 discard waveOutUnprepareHeader(soundDevice.handle, addr soundDevice.buffers[i], UINT(sizeof(WAVEHDR))) | |
| 48 waveOutClose(soundDevice.handle) |
