Class: Webmidi::Port::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/webmidi/port/base.rb

Direct Known Subclasses

Input, Output

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, name:, manufacturer:, version:, type:, transport_handle:, sysex_enabled: false) ⇒ Base

Returns a new instance of Base.



10
11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/webmidi/port/base.rb', line 10

def initialize(id:, name:, manufacturer:, version:, type:, transport_handle:, sysex_enabled: false)
  @id = id
  @name = name
  @manufacturer = manufacturer
  @version = version
  @type = type
  @transport_handle = transport_handle
  @sysex_enabled = sysex_enabled
  @state = :connected
  @connection = :closed
  @state_change_callbacks = []
  @mutex = Mutex.new
end

Instance Attribute Details

#idObject (readonly)

Returns the value of attribute id.



8
9
10
# File 'lib/webmidi/port/base.rb', line 8

def id
  @id
end

#manufacturerObject (readonly)

Returns the value of attribute manufacturer.



8
9
10
# File 'lib/webmidi/port/base.rb', line 8

def manufacturer
  @manufacturer
end

#nameObject (readonly)

Returns the value of attribute name.



8
9
10
# File 'lib/webmidi/port/base.rb', line 8

def name
  @name
end

#typeObject (readonly)

Returns the value of attribute type.



8
9
10
# File 'lib/webmidi/port/base.rb', line 8

def type
  @type
end

#versionObject (readonly)

Returns the value of attribute version.



8
9
10
# File 'lib/webmidi/port/base.rb', line 8

def version
  @version
end

Instance Method Details

#closeObject



48
49
50
51
52
53
54
55
56
# File 'lib/webmidi/port/base.rb', line 48

def close
  callbacks = @mutex.synchronize do
    was_open = @connection == :open
    @connection = :closed
    was_open ? @state_change_callbacks.dup : []
  end
  callbacks.each { |cb| cb.call(self) }
  self
end

#connected?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'lib/webmidi/port/base.rb', line 62

def connected?
  state == :connected
end

#connectionObject



32
33
34
# File 'lib/webmidi/port/base.rb', line 32

def connection
  @mutex.synchronize { @connection }
end

#disconnectObject



75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/webmidi/port/base.rb', line 75

def disconnect
  callbacks = @mutex.synchronize do
    return self if @state == :disconnected

    @state = :disconnected
    @connection = :closed
    @transport_handle&.close
    @state_change_callbacks.dup
  end
  callbacks.each { |cb| cb.call(self) }
  self
end

#on_state_change(&block) ⇒ Object

Raises:

  • (ArgumentError)


66
67
68
69
70
71
72
73
# File 'lib/webmidi/port/base.rb', line 66

def on_state_change(&block)
  raise ArgumentError, "on_state_change requires a block" unless block

  @mutex.synchronize { @state_change_callbacks << block }
  CallbackSubscription.new do
    @mutex.synchronize { @state_change_callbacks.delete(block) }
  end
end

#openObject



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/webmidi/port/base.rb', line 36

def open
  callbacks = @mutex.synchronize do
    raise PortClosedError, "Port is disconnected" if @state == :disconnected
    return self if @connection == :open

    @connection = :open
    @state_change_callbacks.dup
  end
  callbacks.each { |cb| cb.call(self) }
  self
end

#open?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/webmidi/port/base.rb', line 58

def open?
  connection == :open
end

#stateObject



28
29
30
# File 'lib/webmidi/port/base.rb', line 28

def state
  @mutex.synchronize { @state }
end

#sysex_enabled?Boolean

Returns:

  • (Boolean)


24
25
26
# File 'lib/webmidi/port/base.rb', line 24

def sysex_enabled?
  @mutex.synchronize { @sysex_enabled }
end