2011-10-22 14 views
6

मैंने क्रोम में एक मूल लिपि लिखी है जो 3 ध्वनि फ़ाइलों (XMLHTTPRequest पर) लोड करने के लिए नए वेब ऑडियो एपी का उपयोग करती है और उनमें से प्रत्येक को व्यक्तिगत रूप से वापस चलाती है। मैंने प्रत्येक ध्वनि के लिए एक अलग बटन प्रदान किया है जो उपयोगकर्ता को प्रत्येक ध्वनि को शुरू करने और रोकने की अनुमति देता है।वेब ऑडियो एपीआई: मैं एक ध्वनि के प्लेबैक को फिर से शुरू कैसे कर सकता हूं?

स्क्रिप्ट तुरंत सभी तीन ध्वनि फ़ाइलें लोड करता है और जब किया, चलाएं बटन अन-मंद तो उपयोगकर्ता केवल हिट कर सकते हैं एक बार लगता है के लिए तैयार हैं खेलते हैं। इसके अलावा, ध्वनियां लूपिंग होती हैं ताकि प्रत्येक बटन पर लेबल "प्ले" और "स्टॉप" के बीच बदलता है जब बटन क्लिक किया जाता है।

यह सब अच्छा काम करता है ... जब आप एक प्ले बटन आप पाशन ध्वनि सुनने और जब आप बंद करो मारा ध्वनि बंद हो जाता है पर क्लिक करें। हालांकि, जब आप दूसरी बार एक ही ध्वनि को फिर से चलाने की कोशिश करते हैं, तो ध्वनि फिर से खेलना शुरू नहीं कर देगी। प्रत्येक बार जब आप Play/Stop बटन पर क्लिक करते हैं तो उचित playSound() या stopSound() फ़ंक्शन को कॉल किया जाता है और उपयुक्त पैरामीटर पास हो जाते हैं लेकिन किसी कारण से मैं दूसरी बार ध्वनि चलाने के लिए ध्वनि नहीं प्राप्त कर सकता। क्या मुझसे कुछ गलत हो रही है?

यहाँ मेरी कोड है:

<body> 

<label for="playBtn1">Moog:</label> 
<input id="playBtn1" type="button" value="Play" disabled /> 
<label for="playBtn1">Drums:</label> 
<input id="playBtn2" type="button" value="Play" disabled /> 
<label for="playBtn1">Choir:</label> 
<input id="playBtn3" type="button" value="Play" disabled /> 

<script> 
    var playBtn1 = document.getElementById("playBtn1"); 
    var playBtn2 = document.getElementById("playBtn2"); 
    var playBtn3 = document.getElementById("playBtn3"); 

    var context = new webkitAudioContext(); 

    var soundBuffer1 = null; 
    var soundBuffer2 = null; 
    var soundBuffer3 = null; 

    var soundBufferSourceNode1 = context.createBufferSource(); 
    soundBufferSourceNode1.looping = true; 
    var soundBufferSourceNode2 = context.createBufferSource(); 
    soundBufferSourceNode2.looping = true; 
    var soundBufferSourceNode3 = context.createBufferSource(); 
    soundBufferSourceNode3.looping = true; 

    loadSound('micromoog.wav', 1); 
    loadSound('breakbeat-drum-loop.wav', 2); 
    loadSound('choir.wav', 3); 

    playBtn1.addEventListener("click", function(e) { 
    if(this.value == "Play") { 
     this.value = "Stop"; 
     playSound(soundBuffer1, soundBufferSourceNode1); 
    } else if(this.value == "Stop") { 
     this.value = "Play"; 
     stopSound(soundBufferSourceNode1); 
    } 
    }, false); 
    playBtn2.addEventListener("click", function(e) { 
    if(this.value == "Play") { 
     this.value = "Stop"; 
     playSound(soundBuffer2, soundBufferSourceNode2); 
    } else if(this.value == "Stop") { 
     this.value = "Play"; 
     stopSound(soundBufferSourceNode2); 
    } 
    }, false); 
    playBtn3.addEventListener("click", function(e) { 
    if(this.value == "Play") { 
     this.value = "Stop"; 
     playSound(soundBuffer3, soundBufferSourceNode3); 
    } else if(this.value == "Stop") { 
     this.value = "Play"; 
     stopSound(soundBufferSourceNode3); 
    } 
    }, false); 

    function loadSound(url, bufferNum) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    // Decode asynchronously 
    request.onload = function() { 
     var successCallback = function(buffer) { 
     switch(bufferNum) { 
      case 1: 
      soundBuffer1 = buffer; 
      playBtn1.disabled = false; 
      break; 
      case 2: 
       soundBuffer2 = buffer; 
      playBtn2.disabled = false; 
      break; 
      case 3: 
      soundBuffer3 = buffer; 
      playBtn3.disabled = false; 
      break; 
     } 
     } 
     var errorCallback = function(e) { 
     console.log(e); 
     } 
     context.decodeAudioData(request.response, successCallback, errorCallback); 
    } 

    request.send(); 
    } 

    function playSound(buffer, bufferSourceNode) { 
    bufferSourceNode.buffer = buffer; 
    bufferSourceNode.connect(context.destination); 
    bufferSourceNode.noteOn(0); 
    } 

    function stopSound(bufferSourceNode) { 
    bufferSourceNode.noteOff(0); 
    } 
</script> 

</body> 

इसके अलावा, किसी को भी घटना के किसी भी प्रकार है कि एक बार सक्रिय हो सकता है एक गैर पाशन ध्वनि खेलने से किया जाता है के बारे में पता है? यह अच्छा होगा अगर मैं इन ध्वनियों को गैर-लूपिंग पर सेट कर सकता हूं और जैसे ही ध्वनि चलती है, इस तरह के एक ईवेंट का उपयोग अपने लेबल को टॉगल करने के लिए करें। मुझे कल्पना में कुछ भी नहीं दिख रहा है लेकिन शायद एक बेहतर तरीका है?

धन्यवाद, ब्राड।

+1

क्या आपने कभी इसे ठीक किया है? मुझे एक समान समस्या है। – mdm

+1

मुझे यहां एक ही समस्या है! : एस कोई विचार है? – asheinfeld

उत्तर

5

बस वेब ऑडियो एपीआई सीखना। पहली नज़र में मैं यह कहूंगा क्योंकि ऐसा लगता है कि जब भी आप ध्वनि बजाते हैं तो आपको बफररसोर्स बनाना होता है और ऐसा लगता है कि आप इसे पहली बार करते हैं। उदाहरण देखें यहाँ: http://www.html5rocks.com/en/tutorials/webaudio/intro/

6

मैं जानता हूँ कि यह एक साल देर हो चुकी है, लेकिन मैं एक ऐसी ही मुद्दा था, कुछ त्वरित खोज किया था और यहाँ मैं क्या पाया है:

इस पेज में: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ

फिर प्रश्नों का संदर्भ लें:

  • "मैं ऑडियो स्रोत नोड कब खेलना समाप्त कर सकता हूं?"
  • "मैं एक AudioBufferSourceNode मिल गया है, कि मैं सिर्फ noteOn() के साथ वापस निभाई है, और मैं इसे फिर से खेलने के लिए चाहते हैं, लेकिन noteOn() कुछ भी नहीं है! मदद करो!"

जो मैं समझता हूं उससे: CreateBufferSource() से बनाए गए स्रोत को केवल एक बार खेला जा सकता है। एक बार इसे रोकने के बाद, आपको एक नया बनाना होगा। यदि आप जानना चाहते थे कि एक विशेष ध्वनि कब खेलना बंद कर दिया है, तो कोई घटना नहीं है जो इसे प्रेषित करती है; तो आपको एक टाइमआउट का उपयोग करना होगा।

आशा है कि इससे मदद मिलती है!

+1

पुन। जब कोई स्रोत खेलना समाप्त होता है तो कोई ईवेंट नहीं होता - अब एक 'ऑनेंड' कॉलबैक है। मैं सिर्फ यह क्रोम वी 35 में काम करता है सत्यापित: audioSource.onended = function() { playingSound = झूठी; }; टिप्पणियों में टिप के लिए एंडर्स लॉरीट्सन को धन्यवाद: http://updates.html5rocks.com/2012/01/Web-Audio-FAQ – poshaughnessy

संबंधित मुद्दे