module Sound::DeviceLibrary::MMLib
Constants
- CALLBACK_FUNCTION
- DEFAULT_DEVICE_ID
- WAVE_MAPPER
- WOM_CLOSE
- WOM_DONE
- WOM_OPEN
- WaveOutProc
Public Instance Methods
block_mutex()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 166 def block_mutex Thread.current[:block_mutex] ||= Mutex.new end
buffer_length()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 158 def buffer_length Thread.current[:buffer_length] ||= data.format.avg_bps*data.duration/1000 end
close_device()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 138 def close_device waveOutClose(handle.id) end
data()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 146 def data Thread.current[:data] ||= Sound::Data.new end
data_buffer()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 150 def data_buffer Thread.current[:data_buffer] ||= FFI::MemoryPointer.new(:int, data.pcm_data.size).write_array_of_int data.pcm_data end
free_blocks()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 162 def free_blocks Thread.current[:free_blocks] ||= FFI::MemoryPointer.new(:ulong) end
handle()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 142 def handle Thread.current[:handle] ||= Handle.new end
header()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 154 def header Thread.current[:header] ||= WAVEHDR.new(data_buffer, buffer_length) end
open_device(device)
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 120 def open_device(device) waveOutOpen(handle.pointer, device.id, data.format.pointer, 0, 0, 0) end
play_midi_notes()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 62 def play_midi_notes handle = FFI::MemoryPointer.new(:pointer) midiOutOpen(handle, -1, 0, 0, 0) midiOutShortMsg(handle.read_int, 0x007F3C90) sleep 0.3 midiOutShortMsg(handle.read_int, 0x007F4090) sleep 0.3 midiOutShortMsg(handle.read_int, 0x007F4390) sleep 2 midiOutShortMsg(handle.read_int, 0x00003C90) midiOutShortMsg(handle.read_int, 0x00004090) midiOutShortMsg(handle.read_int, 0x00004390) midiOutClose(handle.read_int) end
play_with_multiple_buffers(buffer_count = 2)
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 77 def play_with_multiple_buffers(buffer_count = 2) data = Sound::Data.new.sine_wave(440, 200, 1) free_blocks.write_int buffer_count waveOutOpen(handle, id, data.format.pointer, WaveOutProc, free_blocks.address, CALLBACK_FUNCTION) data = data.data data1 = data[0...(data.length/2)] data_buffer = FFI::MemoryPointer.new(:int, data1.size) data_buffer.write_array_of_int data1 buffer_length = wfx[:nAvgBytesPerSec]*100/1000 header = WAVEHDR.new(data_buffer, buffer_length) waveOutPrepareHeader(handle.id, header.pointer, header.size) block_mutex.lock free_blocks.write_int(free_blocks.read_int - 1) block_mutex.unlock data2 = data[(data.length/2)..-1] data_buffer = FFI::MemoryPointer.new(:int, data2.size) data_buffer.write_array_of_int data2 buffer_length = wfx[:nAvgBytesPerSec]*100/1000 header = WAVEHDR.new(data_buffer, buffer_length) waveOutPrepareHeader(handle.id, header2.pointer, header2.size) block_mutex.lock free_blocks.write_int(free_blocks.read_int - 1) block_mutex.unlock waveOutWrite(handle.id, header.pointer, header.size) waveOutWrite(handle.id, header2.pointer, header2.size) until free_blocks.read_int == 2 sleep 0.01 end waveOutUnprepareHeader(handle.id, header.pointer, header.size) waveOutUnprepareHeader(handle.id, header2.pointer, header2.size) waveOutClose(handle.id) end
pointer()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 170 def pointer self.wfx.pointer end
prepare_buffer()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 124 def prepare_buffer waveOutPrepareHeader(handle.id, header.pointer, header.size) end
unprepare_buffer()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 132 def unprepare_buffer while waveOutUnprepareHeader(handle.id, header.pointer, header.size) == 33 sleep 0.001 end end
write_to_device()
click to toggle source
# File lib/sound/device_library/mmlib.rb, line 128 def write_to_device waveOutWrite(handle.id, header.pointer, header.size) end