module CoreMIDI::API

Coremidi C binding

Constants

X86_64

if osx is 10.6 or higher, there are some differences with 32 vs 64 bit handling

Public Class Methods

create_midi_client(resource_id, name) click to toggle source
# File lib/coremidi/api.rb, line 64
def self.create_midi_client(resource_id, name)
  client_name = API::CF.CFStringCreateWithCString(nil, "Client #{resource_id} #{name}", 0)
  client_pointer = FFI::MemoryPointer.new(:pointer)
  error = API.MIDIClientCreate(client_name, nil, nil, client_pointer)
  client = client_pointer.read_pointer
  {
    :error => error,
    :resource => client
  }
end
create_midi_input_port(client, resource_id, name, callback) click to toggle source
# File lib/coremidi/api.rb, line 75
def self.create_midi_input_port(client, resource_id, name, callback)
  port_name = API::CF.CFStringCreateWithCString(nil, "Port #{resource_id}: #{name}", 0)
  handle_ptr = FFI::MemoryPointer.new(:pointer)
  error = API.MIDIInputPortCreate(client, port_name, callback, nil, handle_ptr)
  handle = handle_ptr.read_pointer
  {
    :error => error,
    :handle => handle
  }
end
create_midi_output_port(client, resource_id, name) click to toggle source
# File lib/coremidi/api.rb, line 86
def self.create_midi_output_port(client, resource_id, name)
  port_name = CF.CFStringCreateWithCString(nil, "Port #{resource_id}: #{name}", 0)
  port_pointer = FFI::MemoryPointer.new(:pointer)
  error = API.MIDIOutputPortCreate(client, port_name, port_pointer)
  handle = port_pointer.read_pointer
  {
    :error => error,
    :handle => handle
  }
end
get_callback(*args, &block) click to toggle source
# File lib/coremidi/api.rb, line 50
def self.get_callback(*args, &block)
  FFI::Function.new(:void, *args, &block)
end
get_int(resource, name) click to toggle source

@param [FFI::Pointer] resource A pointer to an underlying struct @param [String, Symbol] name The property name to get @return [Integer]

# File lib/coremidi/api.rb, line 114
def self.get_int(resource, name)
  property = API::CF.CFStringCreateWithCString(nil, name.to_s, 0)
  value = FFI::MemoryPointer.new(:pointer, 32)
  API::MIDIObjectGetIntegerProperty(resource, property, value)
  value.read_int
end
get_midi_packet(data) click to toggle source

Pack the given data into a coremidi MIDI packet (used by Destination)

# File lib/coremidi/api.rb, line 55
def self.get_midi_packet(data)
  format = "C" * data.size
  packed_data = data.pack(format)
  char_size = FFI.type_size(:char) * data.size
  bytes = FFI::MemoryPointer.new(char_size)
  bytes.write_string(packed_data)
  bytes
end
get_midi_packet_list(bytes, size) click to toggle source

(used by Destination)

# File lib/coremidi/api.rb, line 98
def self.get_midi_packet_list(bytes, size)
  packet_list = FFI::MemoryPointer.new(256)
  packet_ptr = API.MIDIPacketListInit(packet_list)
  time = HostTime.AudioGetCurrentHostTime
  packet_ptr = if X86_64
    API.MIDIPacketListAdd(packet_list, 256, packet_ptr, time, size, bytes)
  else
    # Pass in two 32-bit 0s for the 64 bit time
    time1 = API.MIDIPacketListAdd(packet_list, 256, packet_ptr, time >> 32, time & 0xFFFFFFFF, size, bytes)
  end
  packet_list
end
get_string(resource, name) click to toggle source

@param [FFI::Pointer] resource A pointer to an underlying struct @param [String, Symbol] name The property name to get @return [String]

# File lib/coremidi/api.rb, line 124
def self.get_string(resource, name)
  property = CF.CFStringCreateWithCString(nil, name.to_s, 0)
  begin
    pointer = FFI::MemoryPointer.new(:pointer)
    MIDIObjectGetStringProperty(resource, property, pointer)
    string = pointer.read_pointer
    length = CF.CFStringGetMaximumSizeForEncoding(CF.CFStringGetLength(string), :kCFStringEncodingUTF8)

    bytes = FFI::MemoryPointer.new(length + 1)

    if CF.CFStringGetCString(string, bytes, length + 1, :kCFStringEncodingUTF8)
      bytes.read_string.force_encoding("utf-8")
    end
  ensure
    CF.CFRelease(string) unless string.nil? || string.null?
    CF.CFRelease(property) unless property.null?
  end
end