@awayjs/core
Version:
AwayJS core classes
88 lines (87 loc) • 4.13 kB
JavaScript
import { StreamingAudioChannel } from './StreamingAudioChannel';
import { WebAudioChannel } from './WebAudioChannel';
import { EventAudioChannel } from './EventAudioChannel';
var AudioManager = /** @class */ (function () {
function AudioManager() {
}
AudioManager.setVolume = function (value, channelGroup) {
if (channelGroup === void 0) { channelGroup = -1; }
if (channelGroup < 0) {
var len = AudioManager._channelGroupVolumes.length;
for (var j = 0; j < len; j++) {
AudioManager._channelGroupVolumes[j] = value;
}
}
else {
AudioManager._channelGroupVolumes[channelGroup] = value;
}
WebAudioChannel.setChannelGroupVolume(value, channelGroup);
StreamingAudioChannel.setChannelGroupVolume(value, channelGroup);
EventAudioChannel.setChannelGroupVolume(value, channelGroup);
};
AudioManager.getVolume = function (channelGroup) {
if (channelGroup === void 0) { channelGroup = 0; }
return AudioManager._channelGroupVolumes[channelGroup];
};
AudioManager.setExternalSoundInterface = function (new_obj) {
if (new_obj.startSound == null) {
console.log('Could not set the externalSoundInterface, ' +
'because it does not provide a \'startSound\' function');
return;
}
if (new_obj.stopSound == null) {
console.log('Could not set the externalSoundInterface, ' +
'because it does not provide a \'stopSound\' function');
return;
}
AudioManager._externalSoundInterface = new_obj;
};
AudioManager.getExternalSoundInterface = function () {
return AudioManager._externalSoundInterface;
};
AudioManager.stopAllSounds = function () {
WebAudioChannel.stopAllSounds();
StreamingAudioChannel.stopAllSounds();
EventAudioChannel.stopAllSounds();
//AudioChannel.stopAllSounds();
};
AudioManager.getChannel = function (byteLength, channelGroup) {
if (channelGroup === void 0) { channelGroup = 0; }
//choose best audio channel by bytelength
//todo: StreamingAudioChannel doesnt seem to be working. no error, but also no sound is playing
var channelClass = (byteLength > 50000000) ? StreamingAudioChannel : WebAudioChannel;
if (AudioManager.isIE) {
channelClass = EventAudioChannel;
}
//var channelClass:IAudioChannelClass = WebAudioChannel;
var i = 0;
while (channelClass._channels[i] && channelClass._channels[i].isPlaying())
i++;
if (i == channelClass.maxChannels) {
//pick the oldest channel to reuse, ignoring looping channels
var channel = void 0;
var len = channelClass._channels.length;
for (var j = 0; j < len; j++) {
channel = channelClass._channels[j];
if (!channel.isLooping() && !channel.isDecoding()) {
channel.groupID = channelGroup;
channel.groupVolume = AudioManager._channelGroupVolumes[channelGroup];
channel.groupPan = AudioManager._channelGroupPanning[channelGroup];
channelClass._channels.push(channelClass._channels.splice(j, 1)[0]);
channel.stop();
return channel;
}
}
//do not return channel until one is freed up
return null;
}
return (channelClass._channels[i] = new channelClass(channelGroup, AudioManager._channelGroupVolumes[channelGroup], AudioManager._channelGroupPanning[channelGroup]));
};
AudioManager.isIE = !!navigator.userAgent.match(/Trident/g) || !!navigator.userAgent.match(/MSIE/g);
//todo: make AudioPlaybackManager keep track of active sounds + implement global playback control
AudioManager._externalSoundInterface = null;
AudioManager._channelGroupVolumes = [1];
AudioManager._channelGroupPanning = [0.5];
return AudioManager;
}());
export { AudioManager };