我对 HTML5 音频 api 还很陌生:我已经阅读了HTML5 Rocks上的一些相关文章,但有时在 Javascript 和 Dart 之间切换可能有点棘手。
无论如何,我一直在 Dart 中试验 HTML5 音频。为了给一个简单的游戏产生声音效果,我创建了一个如下的类。我创建了一个 AudioContext,将声音数据加载到 SoundBuffers 中,当需要播放声音时,创建一个 AudioBufferSourceNode 来播放存储在缓冲区中的数据:
class Sfx {
AudioContext audioContext;
List<Map> soundList;
int soundFiles;
Sfx() {
audioContext = new AudioContext();
soundList = new List<Map>();
var soundsToLoad = [
{"name": "MISSILE", "url": "SFX/missile.wav"},
{"name": "EXPLOSION", "url": "SFX/explosion.wav"}
];
soundFiles = soundsToLoad.length;
for (Map sound in soundsToLoad) {
initSound(sound);
}
}
bool allSoundsLoaded() => (soundFiles == 0);
void initSound(Map soundMap) {
HttpRequest req = new HttpRequest();
req.open('GET', soundMap["url"], true);
req.responseType = 'arraybuffer';
req.on.load.add((Event e) {
audioContext.decodeAudioData(
req.response,
(var buffer) {
// successful decode
print("...${soundMap["name"]} loaded...");
soundList.add({"name": soundMap["name"], "buffer": buffer});
soundFiles--;
},
(var error) {
print("error loading ${soundMap["name"]}");
}
);
});
req.send();
}
void sfx(AudioBuffer buffer) {
AudioBufferSourceNode source = audioContext.createBufferSource();
source.connect(audioContext.destination, 0, 0);
source.buffer = buffer;
source.start(0);
}
void playSound(String sound) {
for (Map m in soundList) {
print(m);
if (m["name"] == sound) {
sfx(m["buffer"]);
break;
}
}
}
}
(音效在文件夹“SFX”中。现在我查看代码,可能有上百万种更好的方法来组织数据,但现在还不是重点。)我可以通过创建来播放音效Sfx 的一个实例并调用 playSound 方法。
例如
#import('dart:html');
#source('sfx.dart');
Sfx sfx;
void main() {
sfx = new Sfx();
window.on.keyUp.add((KeyboardEvent keX) {
sfx.playSound("MISSILE");
});
}
(编辑:添加代码以在按键时播放声音。)
问题是:尽管使用 dart2js Javascript,声音效果在 Safari 中按预期播放,但当它们在 Dartium 或 Chrome 中(使用 dart2js Javascript)播放时,它们会失真。(在 Firefox 中,还有更严重的问题!)
有什么明显的我忽略或需要考虑的吗?否则,是否有任何参考或教程,最好是在 Dart 上下文中,这可能会有所帮助?