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