Files
dss.web/client/app/services/audio/audio.service.js
2015-12-16 20:41:17 +00:00

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();
};
});