win32-sound 0.6.0 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,41 +1,41 @@
1
- require 'ffi'
2
-
3
- module Windows
4
- module SoundFunctions
5
- extend FFI::Library
6
-
7
- typedef :ulong, :dword
8
- typedef :uintptr_t, :hmodule
9
- typedef :uintptr_t, :hwaveout
10
- typedef :uint, :mmresult
11
-
12
- ffi_lib :kernel32
13
-
14
- private
15
-
16
- # Make FFI functions private
17
- def self.attach_pfunc(*args)
18
- attach_function(*args)
19
- private args[0]
20
- end
21
-
22
- attach_pfunc :Beep, [:dword, :dword], :bool
23
-
24
- ffi_lib :winmm
25
-
26
- attach_pfunc :PlaySound, [:string, :hmodule, :dword], :bool
27
- attach_pfunc :waveOutSetVolume, [:hwaveout, :dword], :int
28
- attach_pfunc :waveOutGetVolume, [:hwaveout, :pointer], :int
29
- attach_pfunc :waveOutGetNumDevs, [], :int
30
- attach_pfunc :waveInGetNumDevs, [], :int
31
- attach_pfunc :midiOutGetNumDevs, [], :int
32
- attach_pfunc :midiInGetNumDevs, [], :int
33
- attach_pfunc :auxGetNumDevs, [], :int
34
- attach_pfunc :mixerGetNumDevs, [], :int
35
- attach_pfunc :waveOutOpen, [:pointer, :uint, :pointer, :dword, :dword, :dword], :mmresult
36
- attach_pfunc :waveOutPrepareHeader, [:hwaveout, :pointer, :uint], :mmresult
37
- attach_pfunc :waveOutWrite, [:hwaveout, :pointer, :uint], :mmresult
38
- attach_pfunc :waveOutUnprepareHeader, [:hwaveout, :pointer, :uint], :mmresult
39
- attach_pfunc :waveOutClose, [:hwaveout], :mmresult
40
- end
41
- end
1
+ require 'ffi'
2
+
3
+ module Windows
4
+ module SoundFunctions
5
+ extend FFI::Library
6
+
7
+ typedef :ulong, :dword
8
+ typedef :uintptr_t, :hmodule
9
+ typedef :uintptr_t, :hwaveout
10
+ typedef :uint, :mmresult
11
+
12
+ ffi_lib :kernel32
13
+
14
+ private
15
+
16
+ # Make FFI functions private
17
+ def self.attach_pfunc(*args)
18
+ attach_function(*args)
19
+ private args[0]
20
+ end
21
+
22
+ attach_pfunc :Beep, [:dword, :dword], :bool
23
+
24
+ ffi_lib :winmm
25
+
26
+ attach_pfunc :PlaySound, [:string, :hmodule, :dword], :bool
27
+ attach_pfunc :waveOutSetVolume, [:hwaveout, :dword], :int
28
+ attach_pfunc :waveOutGetVolume, [:hwaveout, :pointer], :int
29
+ attach_pfunc :waveOutGetNumDevs, [], :int
30
+ attach_pfunc :waveInGetNumDevs, [], :int
31
+ attach_pfunc :midiOutGetNumDevs, [], :int
32
+ attach_pfunc :midiInGetNumDevs, [], :int
33
+ attach_pfunc :auxGetNumDevs, [], :int
34
+ attach_pfunc :mixerGetNumDevs, [], :int
35
+ attach_pfunc :waveOutOpen, [:pointer, :uint, :pointer, :dword, :dword, :dword], :mmresult
36
+ attach_pfunc :waveOutPrepareHeader, [:hwaveout, :pointer, :uint], :mmresult
37
+ attach_pfunc :waveOutWrite, [:hwaveout, :pointer, :uint], :mmresult
38
+ attach_pfunc :waveOutUnprepareHeader, [:hwaveout, :pointer, :uint], :mmresult
39
+ attach_pfunc :waveOutClose, [:hwaveout], :mmresult
40
+ end
41
+ end
@@ -1,78 +1,78 @@
1
- require 'ffi'
2
-
3
- module Windows
4
- module SoundStructs
5
- extend FFI::Library
6
-
7
- # Define an HWAVEOUT struct for use by all the waveOut functions.
8
- # It is a handle to a waveOut stream, so starting up multiple
9
- # streams using different handles allows for simultaneous playback.
10
- # You never need to actually look at the struct, C takes care of
11
- # its value.
12
- #
13
- class HWAVEOUT < FFI::Struct
14
- layout :i, :int
15
- end
16
-
17
- # Define WAVEFORMATEX which defines the format (PCM in this case)
18
- # and various properties like sampling rate, number of channels, etc.
19
- #
20
- class WAVEFORMATEX < FFI::Struct
21
-
22
- # Initializes struct with sensible defaults for most commonly used
23
- # values. While setting these manually is possible, please be
24
- # sure you know what changes will result in, as an incorrectly
25
- # set struct will result in unpredictable behavior.
26
- #
27
- def initialize(nSamplesPerSec = 44100, wBitsPerSample = 16, nChannels = 1, cbSize = 0)
28
- self[:wFormatTag] = Win32::Sound::WAVE_FORMAT_PCM
29
- self[:nChannels] = nChannels
30
- self[:nSamplesPerSec] = nSamplesPerSec
31
- self[:wBitsPerSample] = wBitsPerSample
32
- self[:cbSize] = cbSize
33
- self[:nBlockAlign] = (self[:wBitsPerSample] >> 3) * self[:nChannels]
34
- self[:nAvgBytesPerSec] = self[:nBlockAlign] * self[:nSamplesPerSec]
35
- end
36
-
37
- layout(
38
- :wFormatTag, :ushort,
39
- :nChannels, :ushort,
40
- :nSamplesPerSec, :ulong,
41
- :nAvgBytesPerSec, :ulong,
42
- :nBlockAlign, :ushort,
43
- :wBitsPerSample, :ushort,
44
- :cbSize, :ushort
45
- )
46
- end
47
-
48
- #define WAVEHDR which is a header to a block of audio
49
- #lpData is a pointer to the block of native memory that,
50
- # in this case, is an integer array of PCM data
51
-
52
- class WAVEHDR < FFI::Struct
53
-
54
- # Initializes struct with sensible defaults for most commonly used
55
- # values. While setting these manually is possible, please be
56
- # sure you know what changes will result in, as an incorrectly
57
- # set struct will result in unpredictable behavior.
58
- #
59
- def initialize(lpData, dwBufferLength, dwFlags = 0, dwLoops = 1)
60
- self[:lpData] = lpData
61
- self[:dwBufferLength] = dwBufferLength
62
- self[:dwFlags] = dwFlags
63
- self[:dwLoops] = dwLoops
64
- end
65
-
66
- layout(
67
- :lpData, :pointer,
68
- :dwBufferLength, :ulong,
69
- :dwBytesRecorded, :ulong,
70
- :dwUser, :ulong,
71
- :dwFlags, :ulong,
72
- :dwLoops, :ulong,
73
- :lpNext, :pointer,
74
- :reserved, :ulong
75
- )
76
- end
77
- end # SoundStructs
78
- end # Windows
1
+ require 'ffi'
2
+
3
+ module Windows
4
+ module SoundStructs
5
+ extend FFI::Library
6
+
7
+ # Define an HWAVEOUT struct for use by all the waveOut functions.
8
+ # It is a handle to a waveOut stream, so starting up multiple
9
+ # streams using different handles allows for simultaneous playback.
10
+ # You never need to actually look at the struct, C takes care of
11
+ # its value.
12
+ #
13
+ class HWAVEOUT < FFI::Struct
14
+ layout :i, :int
15
+ end
16
+
17
+ # Define WAVEFORMATEX which defines the format (PCM in this case)
18
+ # and various properties like sampling rate, number of channels, etc.
19
+ #
20
+ class WAVEFORMATEX < FFI::Struct
21
+
22
+ # Initializes struct with sensible defaults for most commonly used
23
+ # values. While setting these manually is possible, please be
24
+ # sure you know what changes will result in, as an incorrectly
25
+ # set struct will result in unpredictable behavior.
26
+ #
27
+ def initialize(nSamplesPerSec = 44100, wBitsPerSample = 16, nChannels = 1, cbSize = 0)
28
+ self[:wFormatTag] = Win32::Sound::WAVE_FORMAT_PCM
29
+ self[:nChannels] = nChannels
30
+ self[:nSamplesPerSec] = nSamplesPerSec
31
+ self[:wBitsPerSample] = wBitsPerSample
32
+ self[:cbSize] = cbSize
33
+ self[:nBlockAlign] = (self[:wBitsPerSample] >> 3) * self[:nChannels]
34
+ self[:nAvgBytesPerSec] = self[:nBlockAlign] * self[:nSamplesPerSec]
35
+ end
36
+
37
+ layout(
38
+ :wFormatTag, :ushort,
39
+ :nChannels, :ushort,
40
+ :nSamplesPerSec, :ulong,
41
+ :nAvgBytesPerSec, :ulong,
42
+ :nBlockAlign, :ushort,
43
+ :wBitsPerSample, :ushort,
44
+ :cbSize, :ushort
45
+ )
46
+ end
47
+
48
+ #define WAVEHDR which is a header to a block of audio
49
+ #lpData is a pointer to the block of native memory that,
50
+ # in this case, is an integer array of PCM data
51
+
52
+ class WAVEHDR < FFI::Struct
53
+
54
+ # Initializes struct with sensible defaults for most commonly used
55
+ # values. While setting these manually is possible, please be
56
+ # sure you know what changes will result in, as an incorrectly
57
+ # set struct will result in unpredictable behavior.
58
+ #
59
+ def initialize(lpData, dwBufferLength, dwFlags = 0, dwLoops = 1)
60
+ self[:lpData] = lpData
61
+ self[:dwBufferLength] = dwBufferLength
62
+ self[:dwFlags] = dwFlags
63
+ self[:dwLoops] = dwLoops
64
+ end
65
+
66
+ layout(
67
+ :lpData, :pointer,
68
+ :dwBufferLength, :ulong,
69
+ :dwBytesRecorded, :ulong,
70
+ :dwUser, :ulong,
71
+ :dwFlags, :ulong,
72
+ :dwLoops, :ulong,
73
+ :lpNext, :pointer,
74
+ :reserved, :ulong
75
+ )
76
+ end
77
+ end # SoundStructs
78
+ end # Windows
@@ -1,141 +1,141 @@
1
- ##########################################################################
2
- # test_win32_sound.rb
3
- #
4
- # Test suite for the win32-sound library. You should run this test case
5
- # via the 'rake test' task.
6
- ##########################################################################
7
- require 'test-unit'
8
- require 'stringio'
9
- require 'win32/sound'
10
- include Win32
11
-
12
- class TC_Win32_Sound < Test::Unit::TestCase
13
- def setup
14
- @wav = "c:\\windows\\media\\chimes.wav"
15
- end
16
-
17
- test "version constant is set to expected value" do
18
- assert_equal('0.6.0', Sound::VERSION)
19
- end
20
-
21
- def test_beep
22
- assert_respond_to(Sound, :beep)
23
- assert_nothing_raised{ Sound.beep(55, 100) }
24
- end
25
-
26
- def test_beep_expected_errors
27
- assert_raises(ArgumentError){ Sound.beep(0, 100) }
28
- assert_raises(ArgumentError){ Sound.beep }
29
- assert_raises(ArgumentError){ Sound.beep(500) }
30
- assert_raises(ArgumentError){ Sound.beep(500, 500, 5) }
31
- end
32
-
33
- def test_devices
34
- assert_respond_to(Sound, :devices)
35
- assert_nothing_raised{ Sound.devices }
36
- assert_kind_of(Array,Sound.devices)
37
- end
38
-
39
- def test_stop
40
- assert_respond_to(Sound, :stop)
41
- assert_nothing_raised{ Sound.stop }
42
- assert_nothing_raised{ Sound.stop(true) }
43
- end
44
-
45
- def test_get_volume_basic
46
- assert_respond_to(Sound, :wave_volume)
47
- assert_respond_to(Sound, :get_wave_volume)
48
- assert_nothing_raised{ Sound.get_wave_volume }
49
- end
50
-
51
- def test_get_volume
52
- assert_kind_of(Array, Sound.get_wave_volume)
53
- assert_equal(2, Sound.get_wave_volume.length)
54
- end
55
-
56
- def test_set_volume
57
- assert_respond_to(Sound, :set_wave_volume)
58
- assert_nothing_raised{ Sound.set_wave_volume(30000) } # About half
59
- assert_nothing_raised{ Sound.set_wave_volume(30000, 30000) }
60
- end
61
-
62
- def test_play
63
- assert_respond_to(Sound, :play)
64
- assert_nothing_raised{ Sound.play(@wav) }
65
- end
66
-
67
- def test_play_alias
68
- assert_nothing_raised{ Sound.play('SystemAsterisk', Sound::ALIAS) }
69
- end
70
-
71
- def test_expected_errors
72
- assert_raises(ArgumentError){ Sound.beep(-1, 1) }
73
- end
74
-
75
- test "play_freq basic functionality" do
76
- assert_respond_to(Sound, :play_freq)
77
- assert_nothing_raised{ Sound.play_freq(660.0, 500) }
78
- end
79
-
80
- test "play_freq raises an error if the frequency is too high or too low" do
81
- assert_raise(ArgumentError){ Sound.play_freq(999999999, 500) }
82
- assert_raise(ArgumentError){ Sound.play_freq(1, 500) }
83
- end
84
-
85
- test "play_freq raises an error if the duration is too high or too low" do
86
- assert_raise(ArgumentError){ Sound.play_freq(660.0, 9999999) }
87
- assert_raise(ArgumentError){ Sound.play_freq(660.0, -1) }
88
- end
89
-
90
- test "play_freq displays a warning if volume is too large" do
91
- @orig_stderr = $stderr
92
- $stderr = StringIO.new
93
- Sound.play_freq(440, 200, 2)
94
- $stderr.rewind
95
- assert_equal("WARNING: Volume greater than 1 will cause audio clipping.",
96
- $stderr.string.chomp)
97
- $stderr = @orig_stderr
98
- end
99
-
100
- test "expected constants are defined" do
101
- assert_not_nil(Sound::ALIAS)
102
- assert_not_nil(Sound::APPLICATION)
103
- assert_not_nil(Sound::ASYNC)
104
- assert_not_nil(Sound::FILENAME)
105
- assert_not_nil(Sound::LOOP)
106
- assert_not_nil(Sound::MEMORY)
107
- assert_not_nil(Sound::NODEFAULT)
108
- assert_not_nil(Sound::NOSTOP)
109
- assert_not_nil(Sound::NOWAIT)
110
- assert_not_nil(Sound::PURGE)
111
- assert_not_nil(Sound::SYNC)
112
- assert_not_nil(Sound::VERSION)
113
- assert_not_nil(Sound::WAVE_FORMAT_PCM)
114
- assert_not_nil(Sound::WAVE_MAPPER)
115
- assert_not_nil(Sound::HWAVEOUT)
116
- assert_not_nil(Sound::WAVEFORMATEX)
117
- assert_not_nil(Sound::WAVEHDR)
118
- end
119
-
120
- test "ffi functions are private" do
121
- assert_not_respond_to(Sound, :Beep)
122
- assert_not_respond_to(Sound, :PlaySound)
123
- assert_not_respond_to(Sound, :waveOutSetVolume)
124
- assert_not_respond_to(Sound, :waveOutGetVolume)
125
- assert_not_respond_to(Sound, :waveOutGetNumDevs)
126
- assert_not_respond_to(Sound, :waveInGetNumDevs)
127
- assert_not_respond_to(Sound, :midiInGetNumDevs)
128
- assert_not_respond_to(Sound, :midiOutGetNumDevs)
129
- assert_not_respond_to(Sound, :auxGetNumDevs)
130
- assert_not_respond_to(Sound, :mixerGetNumDevs)
131
- assert_not_respond_to(Sound, :waveOutOpen)
132
- assert_not_respond_to(Sound, :waveOutPrepareHeader)
133
- assert_not_respond_to(Sound, :waveOutWrite)
134
- assert_not_respond_to(Sound, :waveOutUnprepareHeader)
135
- assert_not_respond_to(Sound, :waveOutClose)
136
- end
137
-
138
- def teardown
139
- @wav = nil
140
- end
141
- end
1
+ ##########################################################################
2
+ # test_win32_sound.rb
3
+ #
4
+ # Test suite for the win32-sound library. You should run this test case
5
+ # via the 'rake test' task.
6
+ ##########################################################################
7
+ require 'test-unit'
8
+ require 'stringio'
9
+ require 'win32/sound'
10
+ include Win32
11
+
12
+ class TC_Win32_Sound < Test::Unit::TestCase
13
+ def setup
14
+ @wav = "c:\\windows\\media\\chimes.wav"
15
+ end
16
+
17
+ test "version constant is set to expected value" do
18
+ assert_equal('0.6.1', Sound::VERSION)
19
+ end
20
+
21
+ def test_beep
22
+ assert_respond_to(Sound, :beep)
23
+ assert_nothing_raised{ Sound.beep(55, 100) }
24
+ end
25
+
26
+ def test_beep_expected_errors
27
+ assert_raises(ArgumentError){ Sound.beep(0, 100) }
28
+ assert_raises(ArgumentError){ Sound.beep }
29
+ assert_raises(ArgumentError){ Sound.beep(500) }
30
+ assert_raises(ArgumentError){ Sound.beep(500, 500, 5) }
31
+ end
32
+
33
+ def test_devices
34
+ assert_respond_to(Sound, :devices)
35
+ assert_nothing_raised{ Sound.devices }
36
+ assert_kind_of(Array,Sound.devices)
37
+ end
38
+
39
+ def test_stop
40
+ assert_respond_to(Sound, :stop)
41
+ assert_nothing_raised{ Sound.stop }
42
+ assert_nothing_raised{ Sound.stop(true) }
43
+ end
44
+
45
+ def test_get_volume_basic
46
+ assert_respond_to(Sound, :wave_volume)
47
+ assert_respond_to(Sound, :get_wave_volume)
48
+ assert_nothing_raised{ Sound.get_wave_volume }
49
+ end
50
+
51
+ def test_get_volume
52
+ assert_kind_of(Array, Sound.get_wave_volume)
53
+ assert_equal(2, Sound.get_wave_volume.length)
54
+ end
55
+
56
+ def test_set_volume
57
+ assert_respond_to(Sound, :set_wave_volume)
58
+ assert_nothing_raised{ Sound.set_wave_volume(30000) } # About half
59
+ assert_nothing_raised{ Sound.set_wave_volume(30000, 30000) }
60
+ end
61
+
62
+ def test_play
63
+ assert_respond_to(Sound, :play)
64
+ assert_nothing_raised{ Sound.play(@wav) }
65
+ end
66
+
67
+ def test_play_alias
68
+ assert_nothing_raised{ Sound.play('SystemAsterisk', Sound::ALIAS) }
69
+ end
70
+
71
+ def test_expected_errors
72
+ assert_raises(ArgumentError){ Sound.beep(-1, 1) }
73
+ end
74
+
75
+ test "play_freq basic functionality" do
76
+ assert_respond_to(Sound, :play_freq)
77
+ assert_nothing_raised{ Sound.play_freq(660.0, 500) }
78
+ end
79
+
80
+ test "play_freq raises an error if the frequency is too high or too low" do
81
+ assert_raise(ArgumentError){ Sound.play_freq(999999999, 500) }
82
+ assert_raise(ArgumentError){ Sound.play_freq(1, 500) }
83
+ end
84
+
85
+ test "play_freq raises an error if the duration is too high or too low" do
86
+ assert_raise(ArgumentError){ Sound.play_freq(660.0, 9999999) }
87
+ assert_raise(ArgumentError){ Sound.play_freq(660.0, -1) }
88
+ end
89
+
90
+ test "play_freq displays a warning if volume is too large" do
91
+ @orig_stderr = $stderr
92
+ $stderr = StringIO.new
93
+ Sound.play_freq(440, 200, 2)
94
+ $stderr.rewind
95
+ assert_equal("WARNING: Volume greater than 1 will cause audio clipping.",
96
+ $stderr.string.chomp)
97
+ $stderr = @orig_stderr
98
+ end
99
+
100
+ test "expected constants are defined" do
101
+ assert_not_nil(Sound::ALIAS)
102
+ assert_not_nil(Sound::APPLICATION)
103
+ assert_not_nil(Sound::ASYNC)
104
+ assert_not_nil(Sound::FILENAME)
105
+ assert_not_nil(Sound::LOOP)
106
+ assert_not_nil(Sound::MEMORY)
107
+ assert_not_nil(Sound::NODEFAULT)
108
+ assert_not_nil(Sound::NOSTOP)
109
+ assert_not_nil(Sound::NOWAIT)
110
+ assert_not_nil(Sound::PURGE)
111
+ assert_not_nil(Sound::SYNC)
112
+ assert_not_nil(Sound::VERSION)
113
+ assert_not_nil(Sound::WAVE_FORMAT_PCM)
114
+ assert_not_nil(Sound::WAVE_MAPPER)
115
+ assert_not_nil(Sound::HWAVEOUT)
116
+ assert_not_nil(Sound::WAVEFORMATEX)
117
+ assert_not_nil(Sound::WAVEHDR)
118
+ end
119
+
120
+ test "ffi functions are private" do
121
+ assert_not_respond_to(Sound, :Beep)
122
+ assert_not_respond_to(Sound, :PlaySound)
123
+ assert_not_respond_to(Sound, :waveOutSetVolume)
124
+ assert_not_respond_to(Sound, :waveOutGetVolume)
125
+ assert_not_respond_to(Sound, :waveOutGetNumDevs)
126
+ assert_not_respond_to(Sound, :waveInGetNumDevs)
127
+ assert_not_respond_to(Sound, :midiInGetNumDevs)
128
+ assert_not_respond_to(Sound, :midiOutGetNumDevs)
129
+ assert_not_respond_to(Sound, :auxGetNumDevs)
130
+ assert_not_respond_to(Sound, :mixerGetNumDevs)
131
+ assert_not_respond_to(Sound, :waveOutOpen)
132
+ assert_not_respond_to(Sound, :waveOutPrepareHeader)
133
+ assert_not_respond_to(Sound, :waveOutWrite)
134
+ assert_not_respond_to(Sound, :waveOutUnprepareHeader)
135
+ assert_not_respond_to(Sound, :waveOutClose)
136
+ end
137
+
138
+ def teardown
139
+ @wav = nil
140
+ end
141
+ end