Module: CoreMIDI::API
- Extended by:
- FFI::Library
- Defined in:
- lib/coremidi/api.rb
Overview
Defined Under Namespace
Modules: CF, HostTime
Classes: MIDIPacket, MIDIPacketList, MIDISysexSendRequest
Constant Summary
collapse
- X86_64 =
if osx is 10.6 or higher, there are some differences with 32 vs 64 bit handling
`uname -r`.scan(/\d*\.\d*/).first.to_f >= 10.6
Class Method Summary
collapse
-
.create_midi_client(resource_id, name) ⇒ Object
-
.create_midi_input_port(client, resource_id, name, callback) ⇒ Object
-
.create_midi_output_port(client, resource_id, name) ⇒ Object
-
.get_callback(*args, &block) ⇒ Object
-
.get_int(resource, name) ⇒ Integer
-
.get_midi_packet(data) ⇒ Object
Pack the given data into a coremidi MIDI packet (used by Destination).
-
.get_midi_packet_list(bytes, size) ⇒ Object
-
.get_string(resource, name) ⇒ String
Class Method Details
.create_midi_client(resource_id, name) ⇒ Object
64
65
66
67
68
69
70
71
72
73
|
# 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
|
75
76
77
78
79
80
81
82
83
84
|
# 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) ⇒ Object
86
87
88
89
90
91
92
93
94
95
|
# 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) ⇒ Object
50
51
52
|
# File 'lib/coremidi/api.rb', line 50
def self.get_callback(*args, &block)
FFI::Function.new(:void, *args, &block)
end
|
.get_int(resource, name) ⇒ Integer
114
115
116
117
118
119
|
# 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) ⇒ Object
Pack the given data into a coremidi MIDI packet (used by Destination)
55
56
57
58
59
60
61
62
|
# 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) ⇒ Object
98
99
100
101
102
103
104
105
106
107
108
109
|
# 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
time1 = API.MIDIPacketListAdd(packet_list, 256, packet_ptr, time >> 32, time & 0xFFFFFFFF, size, bytes)
end
packet_list
end
|
.get_string(resource, name) ⇒ String
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# 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
|