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