ffi-coremidi 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/coremidi.rb +1 -1
- data/lib/coremidi/source.rb +35 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24583f1bb64dea16e2988a4ed7f4c51411000413
|
4
|
+
data.tar.gz: 3d7804e408e78313e46095ca9fa879c1c427d9e0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8d2c2fc9c502f21710213e46ecd03937a61f58f0f6bdbc74652ab3995c5615eb1ef23ebdf79a1fe0afaa8fecdd39898ae1ad29b257de5314b2a038f2ff6f688
|
7
|
+
data.tar.gz: adbb7aa16fe70b8306cd0dd8f9740a15b1b23fd3c4b04ec61616120b3fcc3ad0e1e132c4a526d0cc682d0eb94067940c86f023654e457e01cc7e414033df57aa
|
data/lib/coremidi.rb
CHANGED
data/lib/coremidi/source.rb
CHANGED
@@ -5,7 +5,12 @@ module CoreMIDI
|
|
5
5
|
|
6
6
|
include Endpoint
|
7
7
|
|
8
|
-
|
8
|
+
# The buffer of received messages since instantiation
|
9
|
+
# @return [Array<Hash>]
|
10
|
+
def buffer
|
11
|
+
fill_buffer
|
12
|
+
@buffer
|
13
|
+
end
|
9
14
|
|
10
15
|
#
|
11
16
|
# An array of MIDI event hashes as such:
|
@@ -20,13 +25,7 @@ module CoreMIDI
|
|
20
25
|
#
|
21
26
|
# @return [Array<Hash>]
|
22
27
|
def gets
|
23
|
-
|
24
|
-
# per https://github.com/arirusso/unimidi/issues/20#issuecomment-44761318
|
25
|
-
sleep(0.0001) # patch to prevent 100% CPU issue with some midi controllers
|
26
|
-
end
|
27
|
-
messages = queued_messages
|
28
|
-
@pointer = @buffer.length
|
29
|
-
messages
|
28
|
+
fill_buffer
|
30
29
|
end
|
31
30
|
alias_method :read, :gets
|
32
31
|
|
@@ -103,6 +102,18 @@ module CoreMIDI
|
|
103
102
|
|
104
103
|
protected
|
105
104
|
|
105
|
+
# Migrate new received messages from the callback queue to
|
106
|
+
# the buffer
|
107
|
+
def fill_buffer
|
108
|
+
messages = []
|
109
|
+
until @queue.empty?
|
110
|
+
messages << @queue.pop
|
111
|
+
end
|
112
|
+
@buffer += messages
|
113
|
+
@pointer = @buffer.length
|
114
|
+
messages
|
115
|
+
end
|
116
|
+
|
106
117
|
# Base initialization for this endpoint -- done whether or not the endpoint is enabled to check whether
|
107
118
|
# it is truly available for use
|
108
119
|
def connect
|
@@ -111,8 +122,8 @@ module CoreMIDI
|
|
111
122
|
@resource = API.MIDIEntityGetSource(@entity.resource, @resource_id)
|
112
123
|
error = API.MIDIPortConnectSource(@handle, @resource, nil )
|
113
124
|
initialize_buffer
|
125
|
+
@queue = Queue.new
|
114
126
|
@sysex_buffer = []
|
115
|
-
@start_time = Time.now.to_f
|
116
127
|
|
117
128
|
error.zero?
|
118
129
|
end
|
@@ -120,8 +131,8 @@ module CoreMIDI
|
|
120
131
|
|
121
132
|
private
|
122
133
|
|
123
|
-
# Add a single message to the
|
124
|
-
# @param [Array<
|
134
|
+
# Add a single message to the callback queue
|
135
|
+
# @param [Array<Fixnum>] bytes Message data
|
125
136
|
# @param [Float] timestamp The system float timestamp
|
126
137
|
# @return [Array<Hash>] The resulting buffer
|
127
138
|
def enqueue_message(bytes, timestamp)
|
@@ -132,28 +143,32 @@ module CoreMIDI
|
|
132
143
|
@sysex_buffer.clear
|
133
144
|
end
|
134
145
|
end
|
135
|
-
|
136
|
-
@
|
146
|
+
message = get_message_formatted(bytes, timestamp)
|
147
|
+
@queue << message
|
148
|
+
message
|
137
149
|
end
|
138
150
|
|
139
151
|
# New MIDI messages from the queue
|
140
152
|
def queued_messages
|
141
|
-
@
|
153
|
+
@queue.pop
|
142
154
|
end
|
143
155
|
|
144
156
|
# Are there new MIDI messages in the queue?
|
145
157
|
def queued_messages?
|
146
|
-
|
158
|
+
!@queue.empty?
|
147
159
|
end
|
148
160
|
|
149
|
-
# The callback fired by coremidi when new MIDI messages are
|
161
|
+
# The callback fired by coremidi when new MIDI messages are received
|
150
162
|
def get_event_callback
|
163
|
+
Thread.abort_on_exception = true
|
151
164
|
Proc.new do |new_packets, refCon_ptr, connRefCon_ptr|
|
152
165
|
begin
|
153
166
|
# p "packets received: #{new_packets[:numPackets]}"
|
154
167
|
timestamp = Time.now.to_f
|
155
168
|
messages = get_messages(new_packets)
|
156
|
-
messages.each
|
169
|
+
messages.each do |message|
|
170
|
+
enqueue_message(message, timestamp)
|
171
|
+
end
|
157
172
|
rescue Exception => exception
|
158
173
|
Thread.main.raise(exception)
|
159
174
|
end
|
@@ -162,7 +177,7 @@ module CoreMIDI
|
|
162
177
|
|
163
178
|
# Get MIDI messages from the given CoreMIDI packet list
|
164
179
|
# @param [API::MIDIPacketList] new_packets The packet list
|
165
|
-
# @return [Array<Array<
|
180
|
+
# @return [Array<Array<Fixnum>>] A collection of MIDI messages
|
166
181
|
def get_messages(packet_list)
|
167
182
|
count = packet_list[:numPackets]
|
168
183
|
first = packet_list[:packet][0]
|
@@ -186,8 +201,8 @@ module CoreMIDI
|
|
186
201
|
end
|
187
202
|
|
188
203
|
# Get the next index for "length" from the blob of MIDI data
|
189
|
-
# @param [Array<
|
190
|
-
# @return [
|
204
|
+
# @param [Array<Fixnum>] data
|
205
|
+
# @return [Fixnum]
|
191
206
|
def find_next_length_index(data)
|
192
207
|
last_is_zero = false
|
193
208
|
data.each_with_index do |num, i|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-coremidi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ari Russo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-07-
|
11
|
+
date: 2017-07-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|