comparison tests/test_audio.nim @ 632:42ad7e6208e9

add: audio subsystem, windows backend still missing
author Sam <sam@basx.dev>
date Mon, 01 May 2023 23:55:07 +0700
parents a68941309f22
children 36e10cc04a33
comparison
equal deleted inserted replaced
631:2c106a77ada3 632:42ad7e6208e9
1 import std/os
1 import std/sequtils 2 import std/sequtils
2 import std/times 3 import std/times
3 4
4 import semicongine 5 import semicongine
5 6
7
6 proc test1() = 8 proc test1() =
7 var mixer = initMixer() 9 mixer[].addSound("test1", newSound(sineSoundData(1000, 2)))
8 mixer.addSound("test1", newSound(sineSoundData(1000, 2))) 10 mixer[].addSound("test2", newSound(sineSoundData(500, 2)))
9 mixer.addSound("test2", newSound(sineSoundData(500, 2)))
10 11
11 12
12 let s1 = mixer.play("test1", loop=true) 13 let s1 = mixer[].play("test1", loop=true)
13 let s2 = mixer.play("test2", loop=true) 14 let s2 = mixer[].play("test2", loop=true)
14 15
15 let t0 = now() 16 let t0 = now()
16 while true: 17 while true:
17 mixer.updateSoundBuffer()
18 let runtime = (now() - t0).inMilliseconds() 18 let runtime = (now() - t0).inMilliseconds()
19 if runtime > 1500: 19 if runtime > 1500:
20 mixer.setLevel(0.1) 20 mixer[].setLevel(0.1)
21 if runtime > 3000: 21 if runtime > 3000:
22 mixer.stop(s2) 22 mixer[].stop(s2)
23 if runtime > 6000: 23 if runtime > 6000:
24 mixer.stop("") 24 mixer[].stop("")
25 if runtime > 8000: 25 if runtime > 8000:
26 mixer.stop()
27 break 26 break
28 mixer.destroy()
29 27
30 proc test2() = 28 proc test2() =
31 let 29 let
32 # notes 30 # notes
33 c = sineSoundData(261.6256, 0.5) 31 c = sineSoundData(261.6256, 0.5)
54 c2Short, d2Short, c2Short, bbShort, a, f, 52 c2Short, d2Short, c2Short, bbShort, a, f,
55 f, c, f, f, 53 f, c, f, f,
56 f, c, f, f, 54 f, c, f, f,
57 ) 55 )
58 56
59 var mixer = initMixer() 57 mixer[].addSound("frerejaques", newSound(frerejaquesData))
60 mixer.addSound("frerejaques", newSound(frerejaquesData)) 58 discard mixer[].play("frerejaques")
61 discard mixer.play("frerejaques", loop=true)
62 59
63 let t0 = now() 60 while mixer[].isPlaying():
64 while true: 61 sleep(1)
65 mixer.updateSoundBuffer()
66 if (now() - t0).inMilliseconds() > 20000:
67 break
68 mixer.destroy()
69 62
70 proc test3() = 63 proc test3() =
71
72 var song: SoundData 64 var song: SoundData
73 var f = open("tests/audiotest.PCM.s16le.48000.2") 65 var f = open("tests/audiotest.PCM.s16le.48000.2")
74 var readLen = 999 66 var readLen = 999
75 while readLen > 0: 67 while readLen > 0:
76 var sample: Sample 68 var sample: Sample
77 readLen = f.readBuffer(addr sample, sizeof(Sample)) 69 readLen = f.readBuffer(addr sample, sizeof(Sample))
78 song.add sample 70 song.add sample
79 71
80 var mixer = initMixer() 72 mixer[].addSound("pianosong", newSound(song))
81 mixer.addSound("pianosong", newSound(song)) 73 mixer[].addSound("ping", newSound(sineSoundData(500, 0.05)))
82 discard mixer.play("pianosong", loop=true) 74 mixer[].addTrack("effects")
75 discard mixer[].play("pianosong")
83 76
84 let t0 = now() 77 let t0 = now()
85 while true: 78 while mixer[].isPlaying():
86 mixer.updateSoundBuffer() 79 discard mixer[].play("ping", track="effects", stopOtherSounds=true, level=0.5)
87 if (now() - t0).inMilliseconds() > 190_000: 80 var input = stdin.readLine()
88 break
89 mixer.destroy()
90 81
91 when isMainModule: 82 when isMainModule:
83 startMixerThread()
92 test1() 84 test1()
85 mixer[].stop()
93 test2() 86 test2()
87 mixer[].stop()
94 test3() 88 test3()
89 mixer[].stop()