Module: RawMIDI::API::Device
- Defined in:
- lib/rawmidi/api.rb
Class Method Summary collapse
- .close(midi_p) ⇒ Object
- .each(card) ⇒ Object
- .open(handle_name, direction, mode) ⇒ Object
- .subdevice_info(ctl_p, device, subdevice = 0) ⇒ Object
- .write(midi_p, buffer) ⇒ Object
Class Method Details
.close(midi_p) ⇒ Object
213 214 215 216 217 218 219 |
# File 'lib/rawmidi/api.rb', line 213 def self.close(midi_p) status = API.snd_rawmidi_close(midi_p) if status < 0 fail Error, "cannot close device: #{API.snd_strerror(status)}" end true end |
.each(card) ⇒ Object
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/rawmidi/api.rb', line 145 def self.each(card) return enum_for(__method__, card) unless block_given? Card.with_control(card) do |ctl_p| device_p = FFI::MemoryPointer.new(:int).write_int(-1) loop do status = API.snd_ctl_rawmidi_next_device(ctl_p, device_p) if status < 0 API.snd_ctl_close(ctl_p) fail Error, "cannot determine device number: #{API.snd_strerror(status)}" end device = device_p.read_int break if device < 0 info = subdevice_info(ctl_p, device) yield device, info end end end |
.open(handle_name, direction, mode) ⇒ Object
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
# File 'lib/rawmidi/api.rb', line 187 def self.open(handle_name, direction, mode) midi_pp = FFI::MemoryPointer.new(:pointer) mode_n = API::MODE_FLAGS[mode] status = case direction when :output API.snd_rawmidi_open(nil, midi_pp, handle_name, mode_n) when :input API.snd_rawmidi_open(midi_pp, nil, handle_name, mode_n) else fail Error, 'invalid direction' end if status < 0 fail Error, "cannot open device: #{API.snd_strerror(status)}" end midi_pp.read_pointer end |
.subdevice_info(ctl_p, device, subdevice = 0) ⇒ Object
168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
# File 'lib/rawmidi/api.rb', line 168 def self.subdevice_info(ctl_p, device, subdevice=0) info_p = FFI::MemoryPointer.new(:char, SndRawMIDIInfo.size, true) API.snd_rawmidi_info_set_device(info_p, device) API.snd_rawmidi_info_set_subdevice(info_p, subdevice) API.snd_rawmidi_info_set_stream(info_p, :input) status = API.snd_ctl_rawmidi_info(ctl_p, info_p) is_input = status >= 0 API.snd_rawmidi_info_set_stream(info_p, :output) status = API.snd_ctl_rawmidi_info(ctl_p, info_p) is_output = status >= 0 name = API.snd_rawmidi_info_get_name(info_p) {name: name, input: is_input, output: is_output} end |
.write(midi_p, buffer) ⇒ Object
207 208 209 210 211 |
# File 'lib/rawmidi/api.rb', line 207 def self.write(midi_p, buffer) buf_p = FFI::MemoryPointer.new(:char, buffer.size) buf_p.write_array_of_char(buffer) API.snd_rawmidi_write(midi_p, buf_p, buffer.size) end |