class MIDIEye::Event

User defined callbacks for input events

Public Class Methods

new() click to toggle source
# File lib/midi-eye/event.rb, line 10
def initialize
  @event = []
  @queue = Queue.new
end

Public Instance Methods

add(options = {}, &callback) click to toggle source

Add a user-defined input callback @param [Hash] options @param [Proc] callback @return [Hash]

# File lib/midi-eye/event.rb, line 33
def add(options = {}, &callback)
  name = options[:listener_name]
  options.delete(:listener_name)
  event = {
    :conditions => options,
    :proc => callback,
    :listener_name => name
  }
  @event << event
  event
end
clear() click to toggle source

Clear the collection of events @return [Boolean]

# File lib/midi-eye/event.rb, line 23
def clear
  @event.clear
  @queue.clear
  true
end
delete(name) click to toggle source

Delete an event by name @param [String, Symbol] name

# File lib/midi-eye/event.rb, line 17
def delete(name)
  @event.delete_if { |event| event[:listener_name].to_s == name.to_s }
end
enqueue(action, message) click to toggle source

Add an event to the trigger queue @return [Hash]

# File lib/midi-eye/event.rb, line 64
def enqueue(action, message)
  event = {
    :action => action,
    :message => message
  }
  @queue << event
  event
end
enqueue_all(message) click to toggle source

Enqueue all events with the given message @return [Array<Hash>]

# File lib/midi-eye/event.rb, line 58
def enqueue_all(message)
  @event.map { |action| enqueue(action, message) }
end
trigger_enqueued() click to toggle source

Trigger all enqueued events @return [Fixnum] The number of triggered events

# File lib/midi-eye/event.rb, line 47
def trigger_enqueued
  counter = 0
  while !@queue.empty? do
    counter += 1
    trigger(@queue.shift)
  end
  counter
end

Private Instance Methods

meets_conditions?(conditions, message) click to toggle source

Does the given message meet the given conditions?

# File lib/midi-eye/event.rb, line 76
def meets_conditions?(conditions, message)
  results = conditions.map do |key, value|
    if message.respond_to?(key)
      if value.kind_of?(Array)
        value.include?(message.send(key))
      else
        value.eql?(message.send(key))
      end
    else
      false
    end
  end
  results.all?
end
trigger(event) click to toggle source

Trigger an event

# File lib/midi-eye/event.rb, line 92
def trigger(event)
  action = event[:action]
  conditions = action[:conditions]
  if conditions.nil? || meets_conditions?(conditions, event[:message][:message])
    begin
      action[:proc].call(event[:message])
    rescue Exception => exception
      Thread.main.raise(exception)
    end
  end
end