Skip to content

Commit 0802970

Browse files
merongivianmeh
authored andcommitted
audio: add support for web audio API
1 parent f0e2b11 commit 0802970

File tree

2 files changed

+234
-0
lines changed

2 files changed

+234
-0
lines changed

opal/browser/audio.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
require 'browser/audio/node'
2+
3+
module Browser; module Audio
4+
5+
class Context
6+
include Native
7+
8+
alias_native :destination
9+
alias_native :listener
10+
alias_native :state
11+
12+
alias_native :sample_rate, :sampleRate
13+
alias_native :current_time, :currentTime
14+
15+
def initialize
16+
super `new AudioContext()`
17+
end
18+
19+
def gain
20+
Node::Gain.new(self)
21+
end
22+
23+
def oscillator
24+
Node::Oscillator.new(self)
25+
end
26+
27+
def delay
28+
Node::Delay.new(self)
29+
end
30+
31+
def dynamics_compressor
32+
Node::DynamicsCompressor.new(self)
33+
end
34+
35+
def biquad_filter
36+
Node::BiquadFilter.new(self)
37+
end
38+
39+
def stereo_panner
40+
Node::StereoPanner.new(self)
41+
end
42+
43+
alias_native :suspend
44+
alias_native :resume
45+
alias_native :close
46+
end
47+
48+
end; end

opal/browser/audio/node.rb

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
module Browser; module Audio; module Node;
2+
3+
module Pluggable
4+
def connect(other_node)
5+
`#@native.connect(#{Native.convert(other_node)})`
6+
end
7+
8+
def disconnect(other_node, options = {})
9+
other_node = Native.try_convert(other_node)
10+
output = options[:output] || 0
11+
input = options[:input] || 0
12+
13+
if options
14+
`#@native.disconnect(#{other_node}, #{output}, #{input}) || nil`
15+
elsif other_node
16+
`#@native.disconnect(#{other_node})`
17+
else
18+
`#@native.disconnect()`
19+
end
20+
end
21+
end
22+
23+
class Gain
24+
include Native
25+
include Pluggable
26+
27+
alias_native :value, :gain
28+
29+
def initialize(audio_context)
30+
super `#{audio_context.to_n}.createGain()`
31+
end
32+
end
33+
34+
class Oscillator
35+
TYPES = %i(sine square sawtooth triangle custom)
36+
37+
include Native
38+
include Pluggable
39+
40+
alias_native :start
41+
alias_native :stop
42+
43+
def initialize(audio_context)
44+
super `#{audio_context.to_n}.createOscillator()`
45+
end
46+
47+
def type=(type)
48+
unless TYPES.include?(type)
49+
raise ArgumentError, "type #{type} doesn't exists"
50+
end
51+
52+
`#@native.type = type`
53+
end
54+
55+
def type
56+
`#@native.type`
57+
end
58+
59+
def frequency=(frequency)
60+
`#@native.frequency.value = frequency`
61+
end
62+
63+
def frequency
64+
`#@native.frequency.value`
65+
end
66+
67+
def detune=(detune)
68+
`#@native.detune.value = detune`
69+
end
70+
71+
def detune
72+
`#@native.detune.value`
73+
end
74+
end
75+
76+
class Delay
77+
include Native
78+
include Pluggable
79+
80+
def initialize(audio_context, max_time)
81+
super `#{audio_context.to_n}.createDelay(max_time || 1)`
82+
end
83+
84+
def time=(time)
85+
`#@native.time.value = time`
86+
end
87+
88+
def time
89+
`#@native.time.value`
90+
end
91+
end
92+
93+
class DynamicsCompressor
94+
include Native
95+
include Pluggable
96+
97+
alias_native :reduction
98+
99+
def treshold=(treshold)
100+
`#@native.treshold.value = treshold`
101+
end
102+
103+
def treshold
104+
`#@native.treshold.value`
105+
end
106+
107+
def knee=(knee)
108+
`#@native.knee.value = knee`
109+
end
110+
111+
def knee
112+
`#@native.knee.value`
113+
end
114+
115+
def ratio=(ratio)
116+
`#@native.ratio.value = ratio`
117+
end
118+
119+
def ratio
120+
`#@native.ratio.value`
121+
end
122+
123+
def attack=(attack)
124+
`#@native.attack.value = attack`
125+
end
126+
127+
def attack
128+
`#@native.attack.value`
129+
end
130+
131+
def release=(release)
132+
`#@native.release.value = release`
133+
end
134+
135+
def release
136+
`#@native.release.value`
137+
end
138+
end
139+
140+
class BiquadFilter
141+
include Native
142+
include Pluggable
143+
144+
def initialize(audio_context)
145+
super `#{audio_context.to_n}.createBiquadFilter()`
146+
end
147+
148+
def detune=(detune)
149+
`#@native.detune.value = #{@detune = detune}`
150+
end
151+
152+
def q=(q)
153+
`#@native.q.value = q`
154+
end
155+
156+
def q
157+
`#@native.q.value`
158+
end
159+
160+
def gain=(gain)
161+
`#@native.gain.value = gain`
162+
end
163+
164+
def gain
165+
`#@native.gain.value`
166+
end
167+
end
168+
169+
class StereoPanner
170+
include Native
171+
include Pluggable
172+
173+
def initialize(audio_context)
174+
super `#{audio_context.to_n}.createStereoPanner()`
175+
end
176+
177+
def pan=(pan)
178+
`#@native.pan.value = pan`
179+
end
180+
181+
def pan
182+
`#@native.pan.value`
183+
end
184+
end
185+
186+
end; end; end

0 commit comments

Comments
 (0)