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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e8353d60b7cd257dd8f9af914af4aaa08ba8e7e
4
- data.tar.gz: 1f696d9cf2061c8075672a717b0f5bbdd36fccca
3
+ metadata.gz: 24583f1bb64dea16e2988a4ed7f4c51411000413
4
+ data.tar.gz: 3d7804e408e78313e46095ca9fa879c1c427d9e0
5
5
  SHA512:
6
- metadata.gz: 8518a427325f084f91d74c7bc99e2393b2e598318cf0d238f4ee04bf2a706569f5276b1f0f2ee03fc49677fc2aed16ce19fd3a9c4a28cc54bb1669ba05041a19
7
- data.tar.gz: 4f9240367b6fc316b9270f1520a5e15ad3cf6d1e2038e6ea0cb67cc64b5199c248233a6454ad5719cb9d0f26961575a0cc6a799d4074d0d332b7fd61f1b5cae2
6
+ metadata.gz: c8d2c2fc9c502f21710213e46ecd03937a61f58f0f6bdbc74652ab3995c5615eb1ef23ebdf79a1fe0afaa8fecdd39898ae1ad29b257de5314b2a038f2ff6f688
7
+ data.tar.gz: adbb7aa16fe70b8306cd0dd8f9740a15b1b23fd3c4b04ec61616120b3fcc3ad0e1e132c4a526d0cc682d0eb94067940c86f023654e457e01cc7e414033df57aa
@@ -22,5 +22,5 @@ require "coremidi/source"
22
22
  require "coremidi/destination"
23
23
 
24
24
  module CoreMIDI
25
- VERSION = "0.4.0"
25
+ VERSION = "0.4.1"
26
26
  end
@@ -5,7 +5,12 @@ module CoreMIDI
5
5
 
6
6
  include Endpoint
7
7
 
8
- attr_reader :buffer
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
- until queued_messages?
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 buffer
124
- # @param [Array<Integer>] bytes Message data
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
- @buffer << get_message_formatted(bytes, timestamp) if @sysex_buffer.empty?
136
- @buffer
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
- @buffer.slice(@pointer, @buffer.length - @pointer)
153
+ @queue.pop
142
154
  end
143
155
 
144
156
  # Are there new MIDI messages in the queue?
145
157
  def queued_messages?
146
- @pointer < @buffer.length
158
+ !@queue.empty?
147
159
  end
148
160
 
149
- # The callback fired by coremidi when new MIDI messages are in the buffer
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 { |message| enqueue_message(message, timestamp) }
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<Integer>>] A collection of MIDI messages
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<Integer>] data
190
- # @return [Integer]
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.0
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-02 00:00:00.000000000 Z
11
+ date: 2017-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest