Class: Webmidi::Transport::Virtual::VirtualInputHandle

Inherits:
Object
  • Object
show all
Includes:
InputHandle
Defined in:
lib/webmidi/transport/virtual.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(device_info, on_close: nil) ⇒ VirtualInputHandle

Returns a new instance of VirtualInputHandle.



86
87
88
89
90
91
92
93
# File 'lib/webmidi/transport/virtual.rb', line 86

def initialize(device_info, on_close: nil)
  @device_info = device_info
  @on_close = on_close
  @queue = Thread::Queue.new
  @callbacks = []
  @mutex = Mutex.new
  @closed = false
end

Instance Attribute Details

#device_infoObject (readonly)

Returns the value of attribute device_info.



84
85
86
# File 'lib/webmidi/transport/virtual.rb', line 84

def device_info
  @device_info
end

Instance Method Details

#closeObject



120
121
122
123
124
125
126
# File 'lib/webmidi/transport/virtual.rb', line 120

def close
  return if @closed

  @closed = true
  @queue.close
  @on_close&.call
end

#closed?Boolean

Returns:

  • (Boolean)


128
129
130
# File 'lib/webmidi/transport/virtual.rb', line 128

def closed?
  @closed
end

#on_data(&block) ⇒ Object



109
110
111
# File 'lib/webmidi/transport/virtual.rb', line 109

def on_data(&block)
  @mutex.synchronize { @callbacks << block }
end

#read(timeout: nil) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/webmidi/transport/virtual.rb', line 95

def read(timeout: nil)
  return nil if @closed

  if timeout
    @queue.pop(timeout: timeout)
  else
    begin
      @queue.pop(true)
    rescue
      nil
    end
  end
end

#receive(bytes) ⇒ Object



113
114
115
116
117
118
# File 'lib/webmidi/transport/virtual.rb', line 113

def receive(bytes)
  return if @closed

  @queue.push(bytes)
  @mutex.synchronize { @callbacks.dup }.each { |cb| cb.call(bytes) }
end