@@ -86,7 +86,15 @@ var LibraryOpenAL = {
86
86
gain . connect ( AL . currentContext . ctx . destination ) ;
87
87
}
88
88
gain . gain . value = 1 ; // work around a Firefox bug (bug 850970)
89
- AL . currentContext . src . push ( { loop : false , buffer : null , gain : gain , panner : panner } ) ;
89
+ AL . currentContext . src . push ( {
90
+ loop : false ,
91
+ buffer : null ,
92
+ gain : gain ,
93
+ panner : panner ,
94
+ paused : false ,
95
+ playTime : 0 ,
96
+ pausedTime : 0
97
+ } ) ;
90
98
{ { { makeSetValue ( 'sources' , 'i' , 'AL.currentContext.src.length' , 'i32' ) } } } ;
91
99
}
92
100
} ,
@@ -265,16 +273,23 @@ var LibraryOpenAL = {
265
273
console . error ( "alSourcePlay called with an invalid source" ) ;
266
274
return ;
267
275
}
276
+ var offset = 0 ;
268
277
if ( "src" in AL . currentContext . src [ source - 1 ] ) {
269
278
// If the source is already playing, we need to resume from beginning.
270
279
// We do that by stopping the current source and replaying it.
271
280
_alSourceStop ( source ) ;
281
+ } else if ( AL . currentContext . src [ source - 1 ] . paused ) {
282
+ // So now we have to resume playback, remember the offset here.
283
+ offset = AL . currentContext . src [ source - 1 ] . pausedTime -
284
+ AL . currentContext . src [ source - 1 ] . playTime ;
272
285
}
273
286
var src = AL . currentContext . ctx . createBufferSource ( ) ;
274
287
src . loop = AL . currentContext . src [ source - 1 ] . loop ;
275
288
src . buffer = AL . currentContext . src [ source - 1 ] . buffer ;
276
289
src . connect ( AL . currentContext . src [ source - 1 ] . gain ) ;
277
- src . start ( 0 ) ;
290
+ src . start ( 0 , offset ) ;
291
+ AL . currentContext . src [ source - 1 ] . playTime = AL . currentContext . ctx . currentTime ;
292
+ AL . currentContext . src [ source - 1 ] . paused = false ;
278
293
AL . currentContext . src [ source - 1 ] [ 'src' ] = src ;
279
294
} ,
280
295
@@ -288,7 +303,25 @@ var LibraryOpenAL = {
288
303
return ;
289
304
}
290
305
if ( "src" in AL . currentContext . src [ source - 1 ] ) {
291
- AL . currentContext . src [ source - 1 ] . src . stop ( 0 ) ;
306
+ AL . currentContext . src [ source - 1 ] [ "src" ] . stop ( 0 ) ;
307
+ delete AL . currentContext . src [ source - 1 ] [ "src" ] ;
308
+ }
309
+ } ,
310
+
311
+ alSourcePause : function ( source ) {
312
+ if ( ! AL . currentContext ) {
313
+ console . error ( "alSourcePause called without a valid context" ) ;
314
+ return ;
315
+ }
316
+ if ( source > AL . currentContext . src . length ) {
317
+ console . error ( "alSourcePause called with an invalid source" ) ;
318
+ return ;
319
+ }
320
+ if ( "src" in AL . currentContext . src [ source - 1 ] &&
321
+ ! AL . currentContext . src [ source - 1 ] . paused ) {
322
+ AL . currentContext . src [ source - 1 ] . paused = true ;
323
+ AL . currentContext . src [ source - 1 ] . pausedTime = AL . currentContext . ctx . currentTime ;
324
+ AL . currentContext . src [ source - 1 ] [ "src" ] . stop ( 0 ) ;
292
325
delete AL . currentContext . src [ source - 1 ] . src ;
293
326
}
294
327
} ,
0 commit comments