Module: RawMIDI::API::Device

Defined in:
lib/rawmidi/api.rb

Class Method Summary collapse

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