midi-eye 0.3.1 → 0.3.3

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: 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