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)