module RawMIDI::API::Device

Public Class Methods

close(midi_p) click to toggle source
# 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) { |device, info| ... } click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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