ffi-coremidi 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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