midi-eye 0.3.1 → 0.3.3

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: 2944fec81520048f22479d8fa72484928e3dcf65
4
- data.tar.gz: bcab4013133af07447f36d6731e8840e9023b0d2
3
+ metadata.gz: 524bf91e8dbac58feee07b0f696a61ac76d7fb4b
4
+ data.tar.gz: 7441878d91eedc9e9ebaa08a53667e4e58c9d8cf
5
5
  SHA512:
6
- metadata.gz: 4b91db15538087d57aa6ab1d7fd250f69ff5f09d12ebfd5c7200813fc6e6db38815d45563cc5d5c5b50ddf7a22ce3b6b17990b398c255f19b53eaa9fce270ccb
7
- data.tar.gz: 1c4f0fa96f717e7f179ad4fbdf9608d8ccb76e17d30d08f96d4a75590a7e2f409ff8d29598424bcc853dd17983f570c67aecc979d248f763c89190f38b9bb994
6
+ metadata.gz: 9ec47d24161b7c87e59f54bb0250a288e93cff135fcfc5e0dd958c21aacdd618b5f462be17c50835c51491053b2e9a2dedf6108b7c3c5f00c07d7e7e77c7e055
7
+ data.tar.gz: e33ed2441cc4bebef9e79695345d313d222f8f152a8cad368654383c2e02f84d0c8334624d896308aea36b33d69718cbee8dbcc4db9c805a9aa930c8afa40aa9
data/lib/midi-eye.rb CHANGED
@@ -7,16 +7,17 @@
7
7
  #
8
8
 
9
9
  # libs
10
- require 'midi-message'
11
- require 'nibbler'
12
- require 'unimidi'
10
+ require "midi-message"
11
+ require "nibbler"
12
+ require "unimidi"
13
13
 
14
14
  # classes
15
- require 'midi-eye/listener'
16
- require 'midi-eye/source'
15
+ require "midi-eye/event"
16
+ require "midi-eye/listener"
17
+ require "midi-eye/source"
17
18
 
18
19
  module MIDIEye
19
20
 
20
- VERSION = "0.3.1"
21
+ VERSION = "0.3.3"
21
22
 
22
23
  end
@@ -0,0 +1,93 @@
1
+ module MIDIEye
2
+
3
+ class Event
4
+
5
+ def initialize
6
+ @event = []
7
+ @queue = []
8
+ end
9
+
10
+ # Delete an event by name
11
+ # @param [String, Symbol] name
12
+ def delete(name)
13
+ @event.delete_if { |event| event[:listener_name].to_s == name.to_s }
14
+ end
15
+
16
+ def clear
17
+ @event.clear
18
+ @queue.clear
19
+ end
20
+
21
+ def add(options = {}, &callback)
22
+ name = options[:listener_name]
23
+ options.delete(:listener_name)
24
+ event = {
25
+ :conditions => options,
26
+ :proc => callback,
27
+ :listener_name => name
28
+ }
29
+ @event << event
30
+ event
31
+ end
32
+
33
+ # Trigger all enqueued events
34
+ def trigger_enqueued
35
+ counter = 0
36
+ while !@queue.empty? do
37
+ counter += 1
38
+ trigger(@queue.shift)
39
+ end
40
+ counter
41
+ end
42
+
43
+ def enqueue_all(message)
44
+ @event.each { |name| enqueue(name, message) }
45
+ end
46
+
47
+ # Add an event to the trigger queue
48
+ def enqueue(action, message)
49
+ event = {
50
+ :action => action,
51
+ :message => message
52
+ }
53
+ @queue << event
54
+ end
55
+
56
+ def count
57
+ @event.count
58
+ end
59
+
60
+ private
61
+
62
+ # Does the given message meet the given conditions?
63
+ def meets_conditions?(conditions, message)
64
+ results = conditions.map do |key, value|
65
+ if message.respond_to?(key)
66
+ if value.kind_of?(Array)
67
+ value.include?(message.send(key))
68
+ else
69
+ value.eql?(message.send(key))
70
+ end
71
+ else
72
+ false
73
+ end
74
+ end
75
+ results.all?
76
+ end
77
+
78
+ # Trigger an event
79
+ def trigger(event)
80
+ action = event[:action]
81
+ conditions = action[:conditions]
82
+ if conditions.nil? || meets_conditions?(conditions, event[:message][:message])
83
+ begin
84
+ action[:proc].call(event[:message])
85
+ rescue Exception => exception
86
+ Thread.main.raise exception
87
+ end
88
+ end
89
+ end
90
+
91
+ end
92
+
93
+ end
@@ -2,14 +2,13 @@ module MIDIEye
2
2
 
3
3
  class Listener
4
4
 
5
- attr_reader :events
5
+ attr_reader :event
6
6
  attr_accessor :sources
7
7
 
8
8
  # @param [Array<UniMIDI::Input>, UniMIDI::Input] inputs Input(s) to add to the list of sources for this listener
9
9
  def initialize(inputs)
10
10
  @sources = []
11
- @event_queue = []
12
- @events = []
11
+ @event = Event.new
13
12
 
14
13
  add_input(inputs)
15
14
  end
@@ -45,12 +44,7 @@ module MIDIEye
45
44
  @sources
46
45
  end
47
46
  alias_method :remove_inputs, :remove_input
48
-
49
- # @param [Symbol] name
50
- def delete_event(name)
51
- @events.delete_if { |event| event[:listener_name] == name }
52
- end
53
-
47
+
54
48
  # Start listening for MIDI messages
55
49
  # @params [Hash] options
56
50
  # @option options [Boolean] :background Run in a background thread
@@ -65,39 +59,44 @@ module MIDIEye
65
59
  # Stop listening for MIDI messages.
66
60
  # @return [MIDIEye::Listener] self
67
61
  def close
68
- @listener.kill unless @listener.nil?
69
- @events.clear
62
+ @listener.kill if running?
63
+ @event.clear
70
64
  @sources.clear
71
- @event_queue.clear
72
65
  self
73
66
  end
74
67
  alias_method :stop, :close
68
+
69
+ # Is the listener running?
70
+ # @return [Boolean]
71
+ def running?
72
+ !@listener.nil?
73
+ end
75
74
 
76
75
  # Join the listener if it's being run in the background.
77
76
  # @return [MIDIEye::Listener] self
78
77
  def join
79
78
  begin
80
79
  @listener.join
81
- rescue SystemExit, Interrupt
80
+ rescue Exception => exception
82
81
  @listener.kill
83
- raise
82
+ raise exception
84
83
  end
85
84
  self
86
85
  end
86
+
87
+ # Deletes the event with the given name (for backwards compat)
88
+ # @param [String, Symbol] event_name
89
+ # @return [Boolean]
90
+ def delete_event(event_name)
91
+ !@event.delete(event_name).nil?
92
+ end
87
93
 
88
94
  # Add an event to listen for
89
95
  # @param [Hash] options
90
96
  # @return [MIDIEye::Listener] self
91
97
  def listen_for(options = {}, &callback)
92
98
  raise "Listener must have a block" if callback.nil?
93
- name = options[:listener_name]
94
- options.delete(:listener_name)
95
- event = {
96
- :conditions => options,
97
- :proc => callback,
98
- :listener_name => name
99
- }
100
- @events << event
99
+ @event.add(options, &callback)
101
100
  self
102
101
  end
103
102
  alias_method :on_message, :listen_for
@@ -112,7 +111,7 @@ module MIDIEye
112
111
  messages.each do |message|
113
112
  unless message.nil?
114
113
  data = { :message => message, :timestamp => batch[:timestamp] }
115
- @events.each { |name| queue_event(name, data) }
114
+ @event.enqueue_all(data)
116
115
  end
117
116
  end
118
117
  end
@@ -127,61 +126,18 @@ module MIDIEye
127
126
  interval = 1.0/1000
128
127
  loop do
129
128
  poll
130
- trigger_queued_events unless @event_queue.empty?
129
+ @event.trigger_enqueued
131
130
  sleep(interval)
132
131
  end
133
132
  end
134
133
 
135
134
  # Start the background listener thread
136
135
  def listen
137
- @listener = Thread.new { listen_loop }
136
+ @listener = Thread.new { listen_loop }
138
137
  @listener.abort_on_exception = true
139
138
  true
140
139
  end
141
-
142
- # Trigger all queued events
143
- def trigger_queued_events
144
- @event_queue.length.times { trigger_event(@event_queue.shift) }
145
- end
146
-
147
- # Does the given message meet the given conditions?
148
- def meets_conditions?(conditions, message)
149
- results = conditions.map do |key, value|
150
- if message.respond_to?(key)
151
- if value.kind_of?(Array)
152
- value.include?(message.send(key))
153
- else
154
- value.eql?(message.send(key))
155
- end
156
- else
157
- false
158
- end
159
- end
160
- results.all?
161
- end
162
-
163
- # Trigger an event
164
- def trigger_event(event)
165
- action = event[:action]
166
- conditions = action[:conditions]
167
- if conditions.nil? || meets_conditions?(conditions, event[:message][:message])
168
- begin
169
- action[:proc].call(event[:message])
170
- rescue
171
- # help
172
- end
173
- end
174
- end
175
-
176
- # Add an event to the trigger queue
177
- def queue_event(action, message)
178
- event = {
179
- :action => action,
180
- :message => message
181
- }
182
- @event_queue << event
183
- end
184
-
140
+
185
141
  end
186
142
 
187
143
  end
@@ -53,9 +53,9 @@ class ListenerTest < Test::Unit::TestCase
53
53
  input = $test_device[:input]
54
54
  listener = Listener.new(input)
55
55
  listener.listen_for(:listener_name => :test) do |event|
56
- assert_equal(1, listener.events.size)
56
+ assert_equal(1, listener.event.count)
57
57
  listener.delete_event(:test)
58
- assert_equal(0, listener.events.size)
58
+ assert_equal(0, listener.event.count)
59
59
  close_all(input, output, listener)
60
60
  end
61
61
  listener.start(:background => true)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: midi-eye
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Russo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-30 00:00:00.000000000 Z
11
+ date: 2014-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: midi-message
@@ -62,6 +62,7 @@ files:
62
62
  - LICENSE
63
63
  - README.md
64
64
  - lib/midi-eye.rb
65
+ - lib/midi-eye/event.rb
65
66
  - lib/midi-eye/listener.rb
66
67
  - lib/midi-eye/source.rb
67
68
  - test/helper.rb