mmplayer 0.0.9 → 0.0.10

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: 3f14f476af4864cb82c33c1b2096380155d7cc66
4
- data.tar.gz: 72cadd99a43d83aa6d326b95e3f07ad40ac26066
3
+ metadata.gz: 7506ea91a4204c4c6a54de79d645e80315559b98
4
+ data.tar.gz: 531967ac3622fc501eab6162d1e63afae815cb69
5
5
  SHA512:
6
- metadata.gz: d07078cd8a53754fdbc07b82e0ee29966e86adfc14beadd2338e6a53470b770db656202111d320127a18c7003435fa4d4effba4f8da7542e6615e7a739b31de7
7
- data.tar.gz: 9ba11777b930ccfc08c0c189e6cf5dee7081f8cdfc7ac86bb4113a56b1c2a5961b154a636f7ad2fefcf75a844c1e71b275d27af3d5f35e1fa1968567705c3270
6
+ metadata.gz: 737adfeadb792fb1ea7643530635556dd12efe935a047701186c40b43bfdd608ad8b47124c742f1fc33dd4421117c3b506f13d69644499a770498452dad79569
7
+ data.tar.gz: b6d88d0809f7b443f136b07ba242f22368fdf14f37ed23ec4581f49d4b05c2c83124867201908c91161e7d003ec0a9f5adc99855f8f25849dbba8261c30df9ca
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2015 Ari Russo
1
+ Copyright 2015-2017 Ari Russo
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License");
4
4
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -63,4 +63,4 @@ All MPlayer runtime commands enabled by the [mplayer-ruby](https://rubygems.org/
63
63
 
64
64
  Apache 2.0, See LICENSE file
65
65
 
66
- Copyright (c) 2015 [Ari Russo](http://arirusso.com)
66
+ Copyright (c) 2015-2017 [Ari Russo](http://arirusso.com)
@@ -1,7 +1,7 @@
1
1
  # MMPlayer
2
2
  # Control MPlayer with MIDI
3
3
  #
4
- # (c)2015 Ari Russo
4
+ # (c)2015-2017 Ari Russo
5
5
  # Apache 2.0 License
6
6
 
7
7
  # libs
@@ -24,7 +24,7 @@ require "mmplayer/context"
24
24
 
25
25
  module MMPlayer
26
26
 
27
- VERSION = "0.0.9"
27
+ VERSION = "0.0.10"
28
28
 
29
29
  # Shortcut to Context constructor
30
30
  def self.new(*args, &block)
@@ -11,11 +11,16 @@ module MMPlayer
11
11
 
12
12
  # @param [UniMIDI::Input, Array<UniMIDI::Input>] midi_input
13
13
  # @param [Hash] options
14
+ # @option options [Fixnum] :midi_buffer_length Length of MIDI message buffer in seconds
14
15
  # @option options [String] :mplayer_flags The command-line flags to invoke MPlayer with
15
16
  # @option options [Fixnum] :receive_channel (also: :rx_channel) A MIDI channel to subscribe to. By default, responds to all
16
17
  # @yield
17
18
  def initialize(midi_input, options = {}, &block)
18
- @midi = MIDI.new(midi_input, :receive_channel => options[:receive_channel] || options[:rx_channel])
19
+ midi_options = {
20
+ :buffer_length => options[:midi_buffer_length],
21
+ :receive_channel => options[:receive_channel] || options[:rx_channel]
22
+ }
23
+ @midi = MIDI.new(midi_input, midi_options)
19
24
  @player = Player.new(:flags => options[:mplayer_flags])
20
25
  instance_eval(&block) if block_given?
21
26
  end
@@ -1,7 +1,7 @@
1
1
  module MMPlayer
2
2
 
3
3
  module MIDI
4
-
4
+
5
5
  # Wrapper for MIDI functionality
6
6
  class Wrapper
7
7
 
@@ -9,9 +9,12 @@ module MMPlayer
9
9
 
10
10
  # @param [UniMIDI::Input, Array<UniMIDI::Input>] input
11
11
  # @param [Hash] options
12
+ # @option options [Fixnum] :buffer_length Length of MIDI message buffer in seconds
12
13
  # @option options [Fixnum] :receive_channel A MIDI channel to subscribe to. By default, responds to all
13
14
  def initialize(input, options = {})
15
+ @buffer_length = options[:buffer_length]
14
16
  @channel = options[:receive_channel]
17
+
15
18
  @message_handler = MessageHandler.new
16
19
  @listener = MIDIEye::Listener.new(input)
17
20
  end
@@ -52,14 +55,14 @@ module MMPlayer
52
55
  def channel=(channel)
53
56
  @listener.event.clear
54
57
  @channel = channel
55
- populate_listener if @listener.running?
58
+ initialize_listener if @listener.running?
56
59
  @channel
57
60
  end
58
61
 
59
62
  # Start the MIDI listener
60
63
  # @return [Boolean]
61
64
  def start
62
- populate_listener
65
+ initialize_listener
63
66
  @listener.start(:background => true)
64
67
  true
65
68
  end
@@ -72,14 +75,24 @@ module MMPlayer
72
75
 
73
76
  private
74
77
 
75
- # Populate the MIDI listener callback
76
- def populate_listener
77
- @listener.on_message do |event|
78
+ # Handle a new MIDI event received
79
+ # @param [Hash] event
80
+ # @return [Hash]
81
+ def handle_new_event(event)
82
+ if @buffer_length.nil? || event[:timestamp].nil? || event[:timestamp] >= Time.now.to_i - @buffer_length
78
83
  message = event[:message]
79
84
  @message_handler.process(@channel, message)
85
+ event
80
86
  end
81
87
  end
82
88
 
89
+ # Populate the MIDI listener callback
90
+ # @return [MIDIEye::Listener]
91
+ def initialize_listener
92
+ @listener.on_message { |event| handle_new_event(event) }
93
+ @listener
94
+ end
95
+
83
96
  end
84
97
 
85
98
  end
@@ -9,6 +9,98 @@ class MMPlayer::MIDI::WrapperTest < Minitest::Test
9
9
  @midi = MMPlayer::MIDI::Wrapper.new(@input)
10
10
  end
11
11
 
12
+ context "#handle_new_event" do
13
+
14
+ context "with no buffer length" do
15
+
16
+ setup do
17
+ @midi.message_handler.expects(:process).once
18
+ @event = {
19
+ :message => MIDIMessage::NoteOn.new(0, 64, 120),
20
+ :timestamp=> 9266.395330429077
21
+ }
22
+ @result = @midi.send(:handle_new_event, @event)
23
+ end
24
+
25
+ teardown do
26
+ @midi.message_handler.unstub(:process)
27
+ end
28
+
29
+ should "return event" do
30
+ refute_nil @result
31
+ assert_equal @event, @result
32
+ end
33
+
34
+ end
35
+
36
+ context "with buffer length" do
37
+
38
+ context "recent message" do
39
+
40
+ setup do
41
+ @midi.message_handler.expects(:process).once
42
+ @event = {
43
+ :message => MIDIMessage::NoteOn.new(0, 64, 120),
44
+ :timestamp=> 9266.395330429077
45
+ }
46
+ @result = @midi.send(:handle_new_event, @event)
47
+ end
48
+
49
+ teardown do
50
+ @midi.message_handler.unstub(:process)
51
+ end
52
+
53
+ should "return event" do
54
+ refute_nil @result
55
+ assert_equal @event, @result
56
+ end
57
+
58
+ end
59
+
60
+ context "with too-old message" do
61
+
62
+ setup do
63
+ @midi.instance_variable_set("@buffer_length", 1)
64
+ @midi.message_handler.expects(:process).never
65
+ @event = {
66
+ :message => MIDIMessage::NoteOn.new(0, 64, 120),
67
+ :timestamp=> 4.395330429077
68
+ }
69
+ @result = @midi.send(:handle_new_event, @event)
70
+ end
71
+
72
+ teardown do
73
+ @midi.message_handler.unstub(:process)
74
+ end
75
+
76
+ should "not return event" do
77
+ assert_nil @result
78
+ end
79
+
80
+ end
81
+
82
+ end
83
+
84
+ end
85
+
86
+ context "#initialize_listener" do
87
+
88
+ setup do
89
+ @midi.listener.expects(:on_message).once
90
+ @result = @midi.send(:initialize_listener)
91
+ end
92
+
93
+ teardown do
94
+ @midi.listener.unstub(:on_message)
95
+ end
96
+
97
+ should "return listener" do
98
+ refute_nil @result
99
+ assert_equal MIDIEye::Listener, @result.class
100
+ end
101
+
102
+ end
103
+
12
104
  context "#start" do
13
105
 
14
106
  setup do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mmplayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ari Russo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-14 00:00:00.000000000 Z
11
+ date: 2017-03-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest