Module: Rtmidi::Native

Extended by:
FFI::Library
Defined in:
lib/rtmidi/native.rb

Defined Under Namespace

Classes: Wrapper

Constant Summary collapse

LOAD_ERROR_MESSAGE =
"librtmidi \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\nmacOS:         brew install rtmidi\nUbuntu/Debian: sudo apt install librtmidi-dev\n\u74B0\u5883\u5909\u6570 RTMIDI_LIB_PATH \u3067\u30D1\u30B9\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u3082\u3067\u304D\u307E\u3059\u3002\n".freeze
DEFAULT_LIBRARIES =
[
  "rtmidi",
  "librtmidi",
  "librtmidi.so.7",
  "librtmidi.so",
  "librtmidi.dylib",
  "/opt/homebrew/lib/librtmidi.dylib",
  "/usr/local/lib/librtmidi.dylib",
  "rtmidi.dll",
  "librtmidi.dll"
].freeze
FUNCTION_SIGNATURES =
{
  rtmidi_get_version: [[], :string],
  rtmidi_get_compiled_api: [[:pointer, :uint], :int],
  rtmidi_api_name: [[:rtmidi_api], :string],
  rtmidi_api_display_name: [[:rtmidi_api], :string],
  rtmidi_compiled_api_by_name: [[:string], :rtmidi_api],
  rtmidi_open_port: [[:pointer, :uint, :string], :void],
  rtmidi_open_virtual_port: [[:pointer, :string], :void],
  rtmidi_close_port: [[:pointer], :void],
  rtmidi_get_port_count: [[:pointer], :uint],
  rtmidi_get_port_name: [[:pointer, :uint, :pointer, :pointer], :int],
  rtmidi_set_error_callback: [[:pointer, :rtmidi_error_c_callback, :pointer], :void],
  rtmidi_in_create_default: [[], :pointer],
  rtmidi_in_create: [[:rtmidi_api, :string, :uint], :pointer],
  rtmidi_in_free: [[:pointer], :void],
  rtmidi_in_get_current_api: [[:pointer], :rtmidi_api],
  rtmidi_in_set_callback: [[:pointer, :rtmidi_c_callback, :pointer], :void],
  rtmidi_in_cancel_callback: [[:pointer], :void],
  rtmidi_in_ignore_types: [[:pointer, :bool, :bool, :bool], :void],
  rtmidi_in_get_message: [[:pointer, :pointer, :pointer], :double],
  rtmidi_out_create_default: [[], :pointer],
  rtmidi_out_create: [[:rtmidi_api, :string], :pointer],
  rtmidi_out_free: [[:pointer], :void],
  rtmidi_out_get_current_api: [[:pointer], :rtmidi_api],
  rtmidi_out_send_message: [[:pointer, :pointer, :int], :int]
}.freeze
OPTIONAL_FUNCTIONS =
[
  :rtmidi_set_error_callback
].freeze

Class Method Summary collapse

Class Method Details

.check_error(device_ptr) ⇒ Object

Raises:



127
128
129
130
131
132
133
134
135
136
137
# File 'lib/rtmidi/native.rb', line 127

def check_error(device_ptr)
  ensure_loaded!
  return if device_ptr.nil? || device_ptr.null?

  wrapper = Wrapper.new(device_ptr)
  return if wrapper[:ok]

  msg_ptr = wrapper[:msg]
  message = msg_ptr.nil? || msg_ptr.null? ? "Unknown RtMidi error" : msg_ptr.read_string
  raise Rtmidi::Error, message
end

.ensure_loaded!Object

Raises:

  • (@load_error || LoadError)


105
106
107
108
109
# File 'lib/rtmidi/native.rb', line 105

def ensure_loaded!
  return if loaded?

  raise @load_error || LoadError, LOAD_ERROR_MESSAGE
end

.function_available?(name) ⇒ Boolean

Returns:

  • (Boolean)


139
140
141
# File 'lib/rtmidi/native.rb', line 139

def function_available?(name)
  @available_functions.include?(name.to_sym)
end

.loaded?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'lib/rtmidi/native.rb', line 101

def loaded?
  @loaded
end

.read_size_t(pointer) ⇒ Object



111
112
113
114
115
116
117
# File 'lib/rtmidi/native.rb', line 111

def read_size_t(pointer)
  if FFI::Platform::ADDRESS_SIZE == 64
    pointer.get_uint64(0)
  else
    pointer.get_uint32(0)
  end
end

.write_size_t(pointer, value) ⇒ Object



119
120
121
122
123
124
125
# File 'lib/rtmidi/native.rb', line 119

def write_size_t(pointer, value)
  if FFI::Platform::ADDRESS_SIZE == 64
    pointer.put_uint64(0, value)
  else
    pointer.put_uint32(0, value)
  end
end