diff src/app/services/audio-player/audio-player.service.ts @ 191:ea735ebeed0e

Avoid using browser specific singleton directly - despite the fact this is likely always going to be run in a browser.
author Lucas Thompson <dev@lucas.im>
date Thu, 23 Mar 2017 11:38:22 +0000
parents dd02ef0d3c93
children e4f38975c2bc
line wrap: on
line diff
--- a/src/app/services/audio-player/audio-player.service.ts	Wed Mar 22 16:20:50 2017 +0000
+++ b/src/app/services/audio-player/audio-player.service.ts	Thu Mar 23 11:38:22 2017 +0000
@@ -2,6 +2,11 @@
 import {Subject} from "rxjs/Subject";
 import {Observable} from "rxjs";
 
+export interface UrlResourceLifetimeManager {
+  createUrlToResource(resource: File | Blob): string;
+  revokeUrlToResource(url: string): void;
+}
+
 @Injectable()
 export class AudioPlayerService {
 
@@ -12,7 +17,10 @@
   seeked$: Observable<number>;
 
   constructor(@Inject(HTMLAudioElement) private audioElement: HTMLAudioElement /* TODO probably shouldn't play audio this way */,
-              @Inject('AudioContext') private audioContext: AudioContext) {
+              @Inject('AudioContext') private audioContext: AudioContext,
+              @Inject(
+                'UrlResourceLifetimeManager'
+              ) private resourceManager: UrlResourceLifetimeManager) {
     this.currentObjectUrl = '';
     this.playingStateChange = new Subject<boolean>();
     this.playingStateChange$ = this.playingStateChange.asObservable();
@@ -40,7 +48,7 @@
 
   loadAudioFromUrl(url: string): void {
     if (this.currentObjectUrl)
-      URL.revokeObjectURL(this.currentObjectUrl);
+      this.resourceManager.revokeUrlToResource(this.currentObjectUrl);
     this.currentObjectUrl = url;
     this.audioElement.pause();
     this.audioElement.src = url;