1
1
/* global BaseAudioContext, AudioContext, webkitAudioContext, AudioParam */
2
2
3
- import { isEmpty , prop , compose , complement , clamp , isNil , reject , append , equals , lt , __ , gte , either , filter , both , reduce , max , pluck , unless , find , propEq , min , gt , last , has , all , props , add , length , head , without , sortBy , any } from 'ramda'
4
- import { getLinearRampToValueAtTime , getExponentialRampToValueAtTime , getTargetValueAtTime , getValueCurveAtTime } from 'pseudo-audio-param/lib/expr.js'
3
+ import {
4
+ isEmpty ,
5
+ prop ,
6
+ compose ,
7
+ complement ,
8
+ clamp ,
9
+ isNil ,
10
+ reject ,
11
+ append ,
12
+ equals ,
13
+ lt ,
14
+ __ ,
15
+ gte ,
16
+ either ,
17
+ filter ,
18
+ both ,
19
+ reduce ,
20
+ max ,
21
+ pluck ,
22
+ unless ,
23
+ find ,
24
+ propEq ,
25
+ min ,
26
+ gt ,
27
+ last ,
28
+ has ,
29
+ all ,
30
+ props ,
31
+ length ,
32
+ head ,
33
+ without ,
34
+ sortBy ,
35
+ any ,
36
+ sum
37
+ } from 'ramda'
38
+ import {
39
+ getLinearRampToValueAtTime ,
40
+ getExponentialRampToValueAtTime ,
41
+ getTargetValueAtTime ,
42
+ getValueCurveAtTime
43
+ } from 'pseudo-audio-param/lib/expr.js'
5
44
6
- const AudioContextClass = isNil ( window . BaseAudioContext ) ? ( isNil ( window . AudioContext ) ? webkitAudioContext : AudioContext ) : BaseAudioContext
45
+ const AudioContextClass = isNil ( window . BaseAudioContext )
46
+ ? isNil ( window . AudioContext )
47
+ ? webkitAudioContext
48
+ : AudioContext
49
+ : BaseAudioContext
7
50
8
51
const maxAll = reduce ( max , - Infinity )
9
52
const minAll = reduce ( min , Infinity )
@@ -46,16 +89,39 @@ const evaluateSchedulement = (scheduledChanges, initialValue, initialTime, endTi
46
89
const endTimeOfLastChange = isNil ( lastChangeBeforeTime ) ? initialTime : lastChangeBeforeTime . targetTime
47
90
switch ( firstChangeAfterTime . method ) {
48
91
case 'linearRampToValueAtTime' :
49
- value = getLinearRampToValueAtTime ( endTime , value , getTargetValueOfChange ( firstChangeAfterTime ) , endTimeOfLastChange , firstChangeAfterTime . targetTime )
92
+ value = getLinearRampToValueAtTime (
93
+ endTime ,
94
+ value ,
95
+ getTargetValueOfChange ( firstChangeAfterTime ) ,
96
+ endTimeOfLastChange ,
97
+ firstChangeAfterTime . targetTime
98
+ )
50
99
break
51
100
case 'exponentialRampToValueAtTime' :
52
- value = getExponentialRampToValueAtTime ( endTime , value , getTargetValueOfChange ( firstChangeAfterTime ) , endTimeOfLastChange , firstChangeAfterTime . targetTime )
101
+ value = getExponentialRampToValueAtTime (
102
+ endTime ,
103
+ value ,
104
+ getTargetValueOfChange ( firstChangeAfterTime ) ,
105
+ endTimeOfLastChange ,
106
+ firstChangeAfterTime . targetTime
107
+ )
53
108
break
54
109
case 'setTargetAtTime' :
55
- value = getTargetValueAtTime ( endTime , value , firstChangeAfterTime . params [ 0 ] , firstChangeAfterTime . params [ 1 ] , firstChangeAfterTime . params [ 2 ] )
110
+ value = getTargetValueAtTime (
111
+ endTime ,
112
+ value ,
113
+ firstChangeAfterTime . params [ 0 ] ,
114
+ firstChangeAfterTime . params [ 1 ] ,
115
+ firstChangeAfterTime . params [ 2 ]
116
+ )
56
117
break
57
118
case 'setValueCurveAtTime' :
58
- value = getValueCurveAtTime ( endTime , firstChangeAfterTime . params [ 0 ] , firstChangeAfterTime . params [ 1 ] , firstChangeAfterTime . params [ 2 ] )
119
+ value = getValueCurveAtTime (
120
+ endTime ,
121
+ firstChangeAfterTime . params [ 0 ] ,
122
+ firstChangeAfterTime . params [ 1 ] ,
123
+ firstChangeAfterTime . params [ 2 ]
124
+ )
59
125
break
60
126
}
61
127
}
@@ -66,13 +132,12 @@ const evaluateSchedulement = (scheduledChanges, initialValue, initialTime, endTi
66
132
const scheduleChange = ( audioParam , method , params , targetTime ) => {
67
133
const now = audioParam . _ctx . currentTime
68
134
69
- const outdatedSchedulements = filter ( compose (
70
- both (
71
- gte ( __ , audioParam . _valueWasLastSetAt ) ,
72
- lt ( __ , now )
73
- ) ,
74
- prop ( 'targetTime' )
75
- ) ) ( audioParam . _scheduledChanges )
135
+ const outdatedSchedulements = filter (
136
+ compose (
137
+ both ( gte ( __ , audioParam . _valueWasLastSetAt ) , lt ( __ , now ) ) ,
138
+ prop ( 'targetTime' )
139
+ )
140
+ ) ( audioParam . _scheduledChanges )
76
141
77
142
if ( ! isEmpty ( outdatedSchedulements ) ) {
78
143
audioParam . _valueWasLastSetAt = compose (
@@ -91,17 +156,22 @@ const scheduleChange = (audioParam, method, params, targetTime) => {
91
156
targetTime : clamp ( now , Infinity , targetTime )
92
157
} )
93
158
) ,
94
- reject ( compose (
95
- either (
96
- ( method === 'cancelScheduledValues' ? gte ( __ , targetTime ) : equals ( __ , targetTime ) ) ,
97
- lt ( __ , now )
98
- ) ,
99
- prop ( 'targetTime' )
100
- ) )
159
+ reject (
160
+ compose (
161
+ either ( method === 'cancelScheduledValues' ? gte ( __ , targetTime ) : equals ( __ , targetTime ) , lt ( __ , now ) ) ,
162
+ prop ( 'targetTime' )
163
+ )
164
+ )
101
165
) ( audioParam . _scheduledChanges )
102
166
103
167
if ( method === 'cancelAndHoldAtTime' ) {
104
- const events = filter ( compose ( gte ( __ , targetTime ) , prop ( 'targetTime' ) ) , audioParam . _scheduledChanges )
168
+ const events = filter (
169
+ compose (
170
+ gte ( __ , targetTime ) ,
171
+ prop ( 'targetTime' )
172
+ ) ,
173
+ audioParam . _scheduledChanges
174
+ )
105
175
106
176
if ( ! isEmpty ( events ) ) {
107
177
let event
@@ -118,18 +188,37 @@ const scheduleChange = (audioParam, method, params, targetTime) => {
118
188
event . targetTime = targetTime
119
189
switch ( event . method ) {
120
190
case 'linearRampToValueAtTime' :
121
- event . params = [ getLinearRampToValueAtTime ( targetTime , audioParam . _value , event . params [ 0 ] , audioParam . _valueWasLastSetAt , event . params [ 1 ] ) , targetTime ]
191
+ event . params = [
192
+ getLinearRampToValueAtTime (
193
+ targetTime ,
194
+ audioParam . _value ,
195
+ event . params [ 0 ] ,
196
+ audioParam . _valueWasLastSetAt ,
197
+ event . params [ 1 ]
198
+ ) ,
199
+ targetTime
200
+ ]
122
201
break
123
202
case 'exponentialRampToValueAtTime' :
124
- event . params = [ getExponentialRampToValueAtTime ( targetTime , audioParam . _value , event . params [ 0 ] , audioParam . _valueWasLastSetAt , event . params [ 1 ] ) , targetTime ]
203
+ event . params = [
204
+ getExponentialRampToValueAtTime (
205
+ targetTime ,
206
+ audioParam . _value ,
207
+ event . params [ 0 ] ,
208
+ audioParam . _valueWasLastSetAt ,
209
+ event . params [ 1 ]
210
+ ) ,
211
+ targetTime
212
+ ]
125
213
break
126
- case 'setValueCurveAtTime' : {
127
- // const [values, startTime, duration] = event.params
128
- const [ values , startTime ] = event . params
129
- const newDuration = targetTime - startTime
130
- const newValues = values // TODO
131
- event . params = [ newValues , startTime , newDuration ]
132
- }
214
+ case 'setValueCurveAtTime' :
215
+ {
216
+ // const [values, startTime, duration] = event.params
217
+ const [ values , startTime ] = event . params
218
+ const newDuration = targetTime - startTime
219
+ const newValues = values // TODO
220
+ event . params = [ newValues , startTime , newDuration ]
221
+ }
133
222
break
134
223
}
135
224
}
@@ -149,7 +238,13 @@ const hasScheduledChanges = compose(
149
238
)
150
239
151
240
const hasScheduledChangesAtTime = ( audioParam , time ) => {
152
- return any ( compose ( gt ( __ , time ) , prop ( 'targetTime' ) ) , audioParam . _scheduledChanges )
241
+ return any (
242
+ compose (
243
+ gte ( __ , time ) ,
244
+ prop ( 'targetTime' )
245
+ ) ,
246
+ audioParam . _scheduledChanges
247
+ )
153
248
}
154
249
155
250
const getValueAtTime = ( audioParam , time ) => {
@@ -169,7 +264,7 @@ const getValueAtTime = (audioParam, time) => {
169
264
const bindContextToParams = ( creatorName , params ) => {
170
265
const originalFn = AudioContextClass . prototype [ creatorName ]
171
266
if ( ! isNil ( originalFn ) ) {
172
- AudioContextClass . prototype [ creatorName ] = function ( ...args ) {
267
+ AudioContextClass . prototype [ creatorName ] = function ( ...args ) {
173
268
const ctx = this
174
269
const node = originalFn . apply ( ctx , args )
175
270
params . forEach ( param => {
@@ -190,11 +285,11 @@ const bindContextToParams = (creatorName, params) => {
190
285
const bindSchedulerToParamMethod = ( methodName , timeArgIndexes = [ ] ) => {
191
286
const originalFn = AudioParam . prototype [ methodName ]
192
287
if ( ! isNil ( originalFn ) ) {
193
- AudioParam . prototype [ methodName ] = function ( ...args ) {
288
+ AudioParam . prototype [ methodName ] = function ( ...args ) {
194
289
const audioParam = this
195
290
let targetTime = Infinity
196
291
if ( ! isEmpty ( timeArgIndexes ) && all ( has ( __ , args ) , timeArgIndexes ) ) {
197
- targetTime = reduce ( add , 0 , props ( timeArgIndexes , args ) )
292
+ targetTime = sum ( props ( timeArgIndexes , args ) )
198
293
}
199
294
scheduleChange ( audioParam , methodName , args , targetTime )
200
295
originalFn . apply ( audioParam , args )
@@ -208,7 +303,7 @@ const bindSchedulerToParamMethod = (methodName, timeArgIndexes = []) => {
208
303
const hijackParamValueSetter = ( ) => {
209
304
const descriptor = Object . getOwnPropertyDescriptor ( AudioParam . prototype , 'value' )
210
305
const originalSetter = descriptor . set
211
- descriptor . set = function ( newValue ) {
306
+ descriptor . set = function ( newValue ) {
212
307
const audioParam = this
213
308
// value change gets ignored in Firefox and Safari, if there are changes scheduled
214
309
if ( ! hasScheduledChanges ( audioParam ) ) {
0 commit comments