Module: Sound::DeviceLibrary::MMLib

Extended by:
FFI::Library, MMLib
Included in:
MMLib
Defined in:
lib/sound/device_library/mmlib.rb

Defined Under Namespace

Classes: Handle, WAVEFORMATEX, WAVEHDR

Constant Summary collapse

WaveOutProc =
Proc.new do |hwo, uMsg, dwInstance, dwParam1, dwParam2|
  # explicit returns in this callback will result in an error

  case uMsg
  when WOM_OPEN
    puts "haha"
    sleep 3
  when WOM_DONE
    block_mutex.lock
    dwInstance.write_int(dwInstance.read_int + 1)
    block_mutex.unlock
  when WOM_CLOSE
  end
end
WAVE_MAPPER =
-1
DEFAULT_DEVICE_ID =
WAVE_MAPPER
WOM_OPEN =
0x3BB
WOM_CLOSE =
0x3BC
WOM_DONE =
0x3BD
CALLBACK_FUNCTION =
0x30000

Instance Method Summary collapse

Instance Method Details

#block_mutexObject



166
167
168
# File 'lib/sound/device_library/mmlib.rb', line 166

def block_mutex
  Thread.current[:block_mutex] ||= Mutex.new
end

#buffer_lengthObject



158
159
160
# 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_deviceObject



138
139
140
# File 'lib/sound/device_library/mmlib.rb', line 138

def close_device
  waveOutClose(handle.id)
end

#dataObject



146
147
148
# File 'lib/sound/device_library/mmlib.rb', line 146

def data
  Thread.current[:data] ||= Sound::Data.new
end

#data_bufferObject



150
151
152
# 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_blocksObject



162
163
164
# File 'lib/sound/device_library/mmlib.rb', line 162

def free_blocks
  Thread.current[:free_blocks] ||= FFI::MemoryPointer.new(:ulong)
end

#handleObject



142
143
144
# File 'lib/sound/device_library/mmlib.rb', line 142

def handle
  Thread.current[:handle] ||= Handle.new
end

#headerObject



154
155
156
# File 'lib/sound/device_library/mmlib.rb', line 154

def header
  Thread.current[:header] ||= WAVEHDR.new(data_buffer, buffer_length)
end

#open_device(device) ⇒ Object



120
121
122
# 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_notesObject



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# 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) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# 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

#pointerObject



170
171
172
# File 'lib/sound/device_library/mmlib.rb', line 170

def pointer
  self.wfx.pointer
end

#prepare_bufferObject



124
125
126
# File 'lib/sound/device_library/mmlib.rb', line 124

def prepare_buffer
  waveOutPrepareHeader(handle.id, header.pointer, header.size)
end

#unprepare_bufferObject



132
133
134
135
136
# 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_deviceObject



128
129
130
# File 'lib/sound/device_library/mmlib.rb', line 128

def write_to_device
  waveOutWrite(handle.id, header.pointer, header.size)
end