2012-10-17 35 views
0

我對HTML5音頻api非常陌生:我已閱讀HTML5 Rocks的一些相關文章,但它有時候會在Javascript和Dart之間有點棘手的翻轉。Dartium中的Dartium和Web Audio API扭曲的聲音

無論如何,我一直在用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或(與dart2js Javascript)在Chrome中,它們是扭曲的。 (在Firefox中,還有更嚴重的問題!)

有沒有什麼明顯的,我忽視做或我需要考慮?否則,有沒有任何參考或教程,最好在Dart上下文中,可能有幫助?

+1

Dart團隊有一個[git repo](https://github.com/dart-lang/dart-html5-samples),他們將HTML5 Rocks教程移植到Dart。其中之一是[Web Audio API入門]的端口(http://www.html5rocks.com/en/tutorials/webaudio/intro/)。不知道這是你以後的樣子,但它是[這裏](https://github.com/dart-lang/dart-html5-samples/blob/master/webaudio/intro/filter_sample.dart),如果你想看看他們是怎麼做到的。 – scribeGriff

+0

謝謝!這聽起來是一個很好的起點。我一定會檢查出來。 –

+0

就像更新:我看了一下上面鏈接的git repo;問題似乎在於我使用的音頻文件:它是一個32位.wav,而示例中的聲音是16位。當我將我的聲音文件保存爲16位.wav文件時,它們在Chrome和Safari中均按預期播放... –

回答

1

感謝您試用Dart!

首先,Firefox不支持Web Audio API(還?)Chrome和Safari支持Web Audio API。您可以在這裏跟蹤Web Audio API的採用:http://caniuse.com/#feat=audio-api

其次,請嘗試Dartium中的Web Audio API示例:https://github.com/dart-lang/dart-html5-samples/tree/master/web/webaudio/intro您需要首先克隆回放並在本地運行。這個示例適用於本地。

這聽起來更像是一個錯誤報告。如果來自dart-html5-samples的樣本適合您,但您的上述代碼仍然失真,請打開http://dartbug.com/new的錯誤,以便我們可以看一看。

需要考慮的一件事就是等待特定的MISSLE聲音加載之後再連接keyUp處理程序。

+0

那麼解釋Firefox!至於等待加載聲音:加載聲音時會打印一條消息,以便我知道何時可以開始測試。感謝您的鏈接!在我稱之爲錯誤之前,我會稍微玩弄一下。 –