Class: Webmidi::Transport::Virtual

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

Defined Under Namespace

Classes: VirtualInputHandle, VirtualOutputHandle

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


11
12
13
# File 'lib/webmidi/transport/virtual.rb', line 11

def self.available?
  true
end

.create_loopback(name) ⇒ Object



51
52
53
54
55
56
# File 'lib/webmidi/transport/virtual.rb', line 51

def self.create_loopback(name)
  input = create_virtual_input(name)
  output = create_virtual_output(name)
  output.connect(input)
  [input, output]
end

.create_virtual_input(name) ⇒ Object



23
24
25
26
27
28
# File 'lib/webmidi/transport/virtual.rb', line 23

def self.create_virtual_input(name)
  info = DeviceInfo.new(id: generate_id, name: name, manufacturer: "Webmidi Virtual", version: "1.0")
  handle = VirtualInputHandle.new(info, on_close: -> { unregister(info.id) })
  @mutex.synchronize { @ports[info.id] = handle }
  handle
end

.create_virtual_output(name) ⇒ Object



30
31
32
33
34
35
# File 'lib/webmidi/transport/virtual.rb', line 30

def self.create_virtual_output(name)
  info = DeviceInfo.new(id: generate_id, name: name, manufacturer: "Webmidi Virtual", version: "1.0")
  handle = VirtualOutputHandle.new(info, on_close: -> { unregister(info.id) })
  @mutex.synchronize { @ports[info.id] = handle }
  handle
end

.list_inputsObject



15
16
17
# File 'lib/webmidi/transport/virtual.rb', line 15

def self.list_inputs
  @mutex.synchronize { @ports.values.select { |p| p.is_a?(VirtualInputHandle) && !p.closed? }.map(&:device_info) }
end

.list_outputsObject



19
20
21
# File 'lib/webmidi/transport/virtual.rb', line 19

def self.list_outputs
  @mutex.synchronize { @ports.values.select { |p| p.is_a?(VirtualOutputHandle) && !p.closed? }.map(&:device_info) }
end

.open_input(device_info) ⇒ Object

Raises:



37
38
39
40
41
42
# File 'lib/webmidi/transport/virtual.rb', line 37

def self.open_input(device_info)
  handle = find_handle(device_info.id, VirtualInputHandle)
  return handle if handle

  raise PortNotFoundError, "Virtual input not found: #{device_info.id}"
end

.open_output(device_info) ⇒ Object

Raises:



44
45
46
47
48
49
# File 'lib/webmidi/transport/virtual.rb', line 44

def self.open_output(device_info)
  handle = find_handle(device_info.id, VirtualOutputHandle)
  return handle if handle

  raise PortNotFoundError, "Virtual output not found: #{device_info.id}"
end

.reset!Object



58
59
60
61
62
# File 'lib/webmidi/transport/virtual.rb', line 58

def self.reset!
  handles = @mutex.synchronize { @ports.values.dup }
  handles.each(&:close)
  @mutex.synchronize { @ports.clear }
end

.unregister(id) ⇒ Object



68
69
70
# File 'lib/webmidi/transport/virtual.rb', line 68

def self.unregister(id)
  @mutex.synchronize { @ports.delete(id) }
end