SoundMixer
class
class SoundMixer {
static String _engine;
static WebAudioApiMixer _webAudioApiMixer;
static AudioElementMixer _audioElementMixer;
static SoundTransform _soundTransform = new SoundTransform();
static List<String> _supportedTypes = _getSupportedTypes();
//-------------------------------------------------------------------------------------------------
static String get engine {
if (_engine == null) _initEngine();
return _engine;
}
static SoundTransform get soundTransform {
return _soundTransform;
}
static set soundTransform(SoundTransform value) {
var initEngine = SoundMixer.engine;
var soundTransform = (value != null) ? value : new SoundTransform();
_soundTransform = soundTransform;
if (_webAudioApiMixer != null) {
_webAudioApiMixer.applySoundTransform(soundTransform);
}
if (_audioElementMixer != null) {
_audioElementMixer.applySoundTransform(soundTransform);
}
}
//-------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------
static void _initEngine() {
_engine = "AudioElement";
_audioElementMixer = new AudioElementMixer();
if (AudioContext.supported) {
_engine = "WebAudioApi";
_webAudioApiMixer = new WebAudioApiMixer();
}
var ua = html.window.navigator.userAgent;
if (ua.contains("IEMobile")) {
if (ua.contains("9.0") || ua.contains("10.0")) {
_engine = "Mock";
}
}
if (ua.contains("iPhone") || ua.contains("iPad") || ua.contains("iPod")) {
if (ua.contains("OS 3") || ua.contains("OS 4") || ua.contains("OS 5")) {
_engine = "Mock";
}
}
if (_supportedTypes.length == 0) {
_engine = "Mock";
}
print("StageXL audio engine : $engine");
}
//-------------------------------------------------------------------------------------------------
static List<String> _getSupportedTypes() {
var supportedTypes = new List<String>();
var audio = new AudioElement();
var valid = ["maybe", "probably"];
if (valid.indexOf(audio.canPlayType("audio/mpeg", "")) != -1) supportedTypes.add("mp3");
if (valid.indexOf(audio.canPlayType("audio/mp4", "")) != -1) supportedTypes.add("mp4");
if (valid.indexOf(audio.canPlayType("audio/ogg", "")) != -1) supportedTypes.add("ogg");
if (valid.indexOf(audio.canPlayType("audio/wav", "")) != -1) supportedTypes.add("wav");
print("StageXL audio types : ${supportedTypes}");
return supportedTypes;
}
//-------------------------------------------------------------------------------------------------
static List<String> _getOptimalAudioUrls(String originalUrl, SoundLoadOptions soundLoadOptions) {
var regex = new RegExp(r"(mp3|mp4|ogg|wav)$", multiLine:false, caseSensitive:true);
var availableTypes = _supportedTypes.toList();
var match = regex.firstMatch(originalUrl);
var urls = new List<String>();
if (match == null) {
throw new ArgumentError("Unsupported file extension.");
}
if (availableTypes.length == 0) {
throw new UnsupportedError("This browser supports no known audio codec.");
}
if (!soundLoadOptions.mp3) availableTypes.remove("mp3");
if (!soundLoadOptions.mp4) availableTypes.remove("mp4");
if (!soundLoadOptions.ogg) availableTypes.remove("ogg");
if (!soundLoadOptions.wav) availableTypes.remove("wav");
var fileType = match.group(1);
if (availableTypes.contains(fileType)) {
urls.add(originalUrl);
availableTypes.remove(fileType);
}
for(var availableType in availableTypes) {
urls.add(originalUrl.replaceAll(regex, availableType));
}
return urls;
}
}
Static Properties
final String engine #
static String get engine {
if (_engine == null) _initEngine();
return _engine;
}
static SoundTransform get soundTransform {
return _soundTransform;
}
static set soundTransform(SoundTransform value) {
var initEngine = SoundMixer.engine;
var soundTransform = (value != null) ? value : new SoundTransform();
_soundTransform = soundTransform;
if (_webAudioApiMixer != null) {
_webAudioApiMixer.applySoundTransform(soundTransform);
}
if (_audioElementMixer != null) {
_audioElementMixer.applySoundTransform(soundTransform);
}
}