1
1
'use strict' ;
2
2
angular . module ( 'ngAudio' , [ ] )
3
+ . constant ( 'ngAudioDomUid' , ( function ( ) {
4
+ var domUid = '' ;
5
+ for ( var i = 0 ; i < 8 ; i ++ )
6
+ {
7
+ domUid = domUid + Math . floor ( ( 1 + Math . random ( ) ) * 0x10000 ) . toString ( 16 ) . substring ( 1 ) ;
8
+ }
9
+ return domUid ; //unique id persisting through module life
10
+ } ) ( ) )
3
11
. directive ( 'ngAudio' , [ '$compile' , '$q' , 'ngAudio' , function ( $compile , $q , ngAudio ) {
4
12
return {
5
13
restrict : 'AEC' ,
@@ -100,24 +108,33 @@ angular.module('ngAudio', [])
100
108
} ;
101
109
} ] )
102
110
103
- . service ( 'remoteAudioFindingService' , [ '$q' , function ( $q ) {
111
+ . service ( 'remoteAudioFindingService' , [ '$q' , 'ngAudioDomUid' , function ( $q , ngAudioDomUid ) {
104
112
105
113
this . find = function ( url ) {
106
114
var deferred = $q . defer ( ) ;
107
- var audio = new Audio ( ) ;
108
-
109
- audio . addEventListener ( 'error' , function ( ) {
110
- deferred . reject ( ) ;
111
- } ) ;
112
-
113
- audio . addEventListener ( 'loadstart' , function ( ) {
114
- deferred . resolve ( audio ) ;
115
- } ) ;
115
+ var $sound = document . getElementById ( ngAudioDomUid ) ;
116
+ if ( ! $sound )
117
+ {
118
+ var audioTag = document . createElement ( 'audio' ) ;
119
+ audioTag . style . display = 'none' ;
120
+ audioTag . id = ngAudioDomUid ;
121
+ audioTag . src = url ;
122
+ document . body . appendChild ( audioTag ) ;
123
+ $sound = document . getElementById ( ngAudioDomUid ) ;
124
+ $sound . load ( ) ;
125
+ }
126
+ else
127
+ {
128
+ $sound . pause ( ) ;
129
+ $sound . src = url ;
130
+ $sound . load ( ) ;
131
+ }
116
132
117
- // bugfix for chrome...
118
- setTimeout ( function ( ) {
119
- audio . src = url ;
120
- } , 1 ) ;
133
+ if ( $sound ) {
134
+ deferred . resolve ( $sound ) ;
135
+ } else {
136
+ deferred . reject ( id ) ;
137
+ }
121
138
122
139
return deferred . promise ;
123
140
@@ -151,8 +168,10 @@ angular.module('ngAudio', [])
151
168
return function ( id , scope ) {
152
169
153
170
function twiddle ( ) {
154
- audio . play ( ) ;
155
- audio . pause ( ) ;
171
+ try {
172
+ audio . play ( ) ;
173
+ audio . pause ( ) ;
174
+ } catch ( e ) { }
156
175
window . removeEventListener ( "click" , twiddle ) ;
157
176
}
158
177
@@ -188,7 +207,12 @@ angular.module('ngAudio', [])
188
207
var completeListeners = [ ] ;
189
208
this . complete = function ( callback ) {
190
209
completeListeners . push ( callback ) ;
191
- }
210
+ } ;
211
+
212
+ var toFinishListeners = [ ] ;
213
+ this . toFinish = function ( secs , callback ) {
214
+ toFinishListeners . push ( { 'secs' : secs , 'callback' : callback } ) ;
215
+ } ;
192
216
193
217
this . pause = function ( ) {
194
218
$willPause = true ;
@@ -248,6 +272,10 @@ angular.module('ngAudio', [])
248
272
}
249
273
}
250
274
275
+ this . destroyed = function ( ) {
276
+ return $destroyed ;
277
+ } ;
278
+
251
279
function $setWatch ( ) {
252
280
if ( $destroyed ) {
253
281
return ;
@@ -298,6 +326,10 @@ angular.module('ngAudio', [])
298
326
} , true ) ;
299
327
}
300
328
329
+ function audioLoadError ( ) {
330
+ audioObject . error = true ;
331
+ }
332
+
301
333
cleverAudioFindingService . find ( id )
302
334
. then ( function ( nativeAudio ) {
303
335
audio = nativeAudio ;
@@ -311,14 +343,13 @@ angular.module('ngAudio', [])
311
343
312
344
}
313
345
346
+ audio . addEventListener ( 'error' , audioLoadError ) ;
347
+
314
348
audio . addEventListener ( 'canplay' , function ( ) {
315
349
audioObject . canPlay = true ;
316
350
} ) ;
317
351
318
- } , function ( error ) {
319
- audioObject . error = true ;
320
- console . warn ( error ) ;
321
- } ) ;
352
+ } , audioLoadError ) ;
322
353
323
354
324
355
var interval = $interval ( checkWatchers , ngAudioGlobals . performance ) ;
@@ -327,7 +358,7 @@ angular.module('ngAudio', [])
327
358
} , function ( ) {
328
359
$interval . cancel ( interval ) ;
329
360
interval = $interval ( checkWatchers , ngAudioGlobals . performance ) ;
330
- } )
361
+ } ) ;
331
362
332
363
function checkWatchers ( ) {
333
364
if ( $audioWatch ) {
@@ -347,7 +378,8 @@ angular.module('ngAudio', [])
347
378
}
348
379
349
380
if ( $willRestart ) {
350
- audio . src = 'about:blank' ;
381
+ audio . pause ( ) ;
382
+ audio . currentTime = 0 ;
351
383
$willRestart = false ;
352
384
}
353
385
@@ -375,7 +407,7 @@ angular.module('ngAudio', [])
375
407
audioObject . src = audio . src ;
376
408
377
409
//After we check if progress is bigger than 0, and we set
378
- var tempProgress = ( audio . currentTime / audio . duration ) ;
410
+ var tempProgress = ( audio . currentTime / audio . duration ) . toPrecision ( ) ;
379
411
if ( tempProgress > 0 ) {
380
412
audioObject . progress = tempProgress ;
381
413
}
@@ -386,6 +418,13 @@ angular.module('ngAudio', [])
386
418
} )
387
419
}
388
420
421
+ toFinishListeners . forEach ( function ( listener ) {
422
+ if ( ( audioObject . duration - audioObject . currentTime ) <= listener . secs ) {
423
+ listener . callback ( audioObject ) ;
424
+ toFinishListeners . shift ( ) ;
425
+ }
426
+ } ) ;
427
+
389
428
if ( $looping && audioObject . currentTime >= audioObject . duration ) {
390
429
if ( $looping !== true ) {
391
430
$looping -- ;
0 commit comments