mirror of
https://github.com/fergalmoran/dss.web.git
synced 2026-02-15 20:44:34 +00:00
130 lines
4.5 KiB
JavaScript
130 lines
4.5 KiB
JavaScript
'use strict';
|
|
|
|
angular.module('dssWebApp')
|
|
.service('AudioService', function AudioService($rootScope, $interval, $q, logger, AUDIO_EVENTS, AUDIO_CONSTANTS) {
|
|
// AngularJS will instantiate a singleton by calling "new" on this function
|
|
var _currentMix;
|
|
var _currentSound;
|
|
var _soundId;
|
|
|
|
soundManager.setup({
|
|
html5PollingInterval: 50,
|
|
flashVersion: 9,
|
|
debugMode: false,
|
|
defaultOptions: {
|
|
volume: _getStoredVolume()
|
|
}
|
|
});
|
|
|
|
function _getStoredVolume() {
|
|
return Math.round(localStorage.getItem(AUDIO_CONSTANTS.volume) || 50);
|
|
}
|
|
|
|
function _setStoredVolume(volume) {
|
|
localStorage.setItem(AUDIO_CONSTANTS.volume, Math.round(volume));
|
|
}
|
|
|
|
function makeSound(url) {
|
|
var sound = soundManager.createSound({
|
|
url: url,
|
|
whileplaying: function () {
|
|
if (this.duration) {
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioProgress, this.durationEstimate, this.position, this.elapsed);
|
|
}
|
|
},
|
|
onplay: function () {
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioStart, _currentMix, _soundId, this.duration);
|
|
$rootScope.isPlaying = true;
|
|
},
|
|
onstop: function () {
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioStop, _soundId);
|
|
},
|
|
onfinish: function () {
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioFinish, _soundId);
|
|
}
|
|
|
|
});
|
|
return sound;
|
|
}
|
|
|
|
this.playLive = function (url, title) {
|
|
var _this = this;
|
|
return $q(function (resolve, reject) {
|
|
if ($rootScope.radioPlaying) {
|
|
_this.stop();
|
|
$rootScope.radioPlaying = false;
|
|
$rootScope.radioLoading = false;
|
|
resolve(true);
|
|
} else {
|
|
$rootScope.safeApply();
|
|
_this.stop();
|
|
_currentSound = soundManager.createSound({
|
|
url: url,
|
|
onload: function () {
|
|
resolve();
|
|
}
|
|
});
|
|
_currentSound.play({
|
|
url: url
|
|
});
|
|
_soundId = title;
|
|
}
|
|
});
|
|
};
|
|
this.play = function (mix, url) {
|
|
var _this = this;
|
|
return $q(function (resolve, reject) {
|
|
if (soundManager.canPlayURL(url)) {
|
|
_this.stop();
|
|
_currentMix = mix;
|
|
_currentSound = makeSound(url);
|
|
_currentSound.play({
|
|
url: mix.stream_url,
|
|
position: 0
|
|
});
|
|
_soundId = mix.slug;
|
|
resolve();
|
|
} else {
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioFailed, _soundId);
|
|
}
|
|
});
|
|
};
|
|
this.pause = function () {
|
|
if (_currentSound) {
|
|
_currentSound.togglePause();
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioPause, _soundId);
|
|
}
|
|
};
|
|
this.resume = function () {
|
|
if (_currentSound) {
|
|
_currentSound.togglePause();
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioResume, _soundId);
|
|
}
|
|
};
|
|
this.stop = function () {
|
|
if (_currentSound) {
|
|
_currentSound.stop();
|
|
$rootScope.$broadcast(AUDIO_EVENTS.audioStop, _soundId);
|
|
}
|
|
};
|
|
this.setPosition = function (position, absolute) {
|
|
if (absolute)
|
|
_currentSound.setPosition(position);
|
|
else
|
|
_currentSound.setPosition((_currentSound.durationEstimate / 100) * position);
|
|
_currentSound._iO.whileplaying.apply(_currentSound);
|
|
};
|
|
this.isPlaying = function (mix) {
|
|
return _soundId === mix.slug;
|
|
};
|
|
this.setVolume = function (volume) {
|
|
if (_currentSound) {
|
|
_currentSound.setVolume(volume);
|
|
}
|
|
_setStoredVolume(volume);
|
|
};
|
|
this.getVolume = function (volume) {
|
|
return _getStoredVolume();
|
|
};
|
|
});
|