snappymail/dev/Common/Audio.js
2016-08-30 01:10:24 +03:00

141 lines
3 KiB
JavaScript

import window from 'window';
import {bMobileDevice, bSafari} from 'Common/Globals';
import * as Links from 'Common/Links';
import * as Events from 'Common/Events';
import {trim} from 'Common/Utils';
class Audio
{
constructor() {
this.notificator = null;
this.supportedMp3 = false;
this.supportedOgg = false;
this.supportedWav = false;
this.supportedNotification = false;
this.player = this.createNewObject();
this.supported = !bMobileDevice && !bSafari && !!this.player && !!this.player.play;
if (this.supported && this.player.canPlayType)
{
this.supportedMp3 = '' !== this.player.canPlayType('audio/mpeg;').replace(/no/, '');
this.supportedWav = '' !== this.player.canPlayType('audio/wav; codecs="1"').replace(/no/, '');
this.supportedOgg = '' !== this.player.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, '');
this.supportedNotification = this.supported && this.supportedMp3;
}
if (!this.player || (!this.supportedMp3 && !this.supportedOgg && !this.supportedWav))
{
this.supported = false;
this.supportedMp3 = false;
this.supportedOgg = false;
this.supportedWav = false;
this.supportedNotification = false;
}
if (this.supported)
{
const stopFn = () => this.stop();
this.player.addEventListener('ended', stopFn);
this.player.addEventListener('error', stopFn);
Events.sub('audio.api.stop', stopFn);
}
}
createNewObject() {
const player = window.Audio ? new window.Audio() : null;
if (player && player.canPlayType && player.pause && player.play)
{
player.preload = 'none';
player.loop = false;
player.autoplay = false;
player.muted = false;
}
return player;
}
paused() {
return this.supported ? !!this.player.paused : true;
}
stop() {
if (this.supported && this.player.pause)
{
this.player.pause();
}
Events.pub('audio.stop');
}
pause() {
this.stop();
}
clearName(name = '', ext = '') {
name = trim(name);
if (ext && '.' + ext === name.toLowerCase().substr((ext.length + 1) * -1))
{
name = trim(name.substr(0, name.length - 4));
}
return '' === name ? 'audio' : name;
}
playMp3(url, name) {
if (this.supported && this.supportedMp3)
{
this.player.src = url;
this.player.play();
Events.pub('audio.start', [this.clearName(name, 'mp3'), 'mp3']);
}
}
playOgg(url, name) {
if (this.supported && this.supportedOgg)
{
this.player.src = url;
this.player.play();
name = this.clearName(name, 'oga');
name = this.clearName(name, 'ogg');
Events.pub('audio.start', [name, 'ogg']);
}
}
playWav(url, name) {
if (this.supported && this.supportedWav)
{
this.player.src = url;
this.player.play();
Events.pub('audio.start', [this.clearName(name, 'wav'), 'wav']);
}
}
playNotification() {
if (this.supported && this.supportedMp3)
{
if (!this.notificator)
{
this.notificator = this.createNewObject();
this.notificator.src = Links.sound('new-mail.mp3');
}
if (this.notificator && this.notificator.play)
{
this.notificator.play();
}
}
}
}
module.exports = new Audio();