मैंने क्रोम में एक मूल लिपि लिखी है जो 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>
इसके अलावा, किसी को भी घटना के किसी भी प्रकार है कि एक बार सक्रिय हो सकता है एक गैर पाशन ध्वनि खेलने से किया जाता है के बारे में पता है? यह अच्छा होगा अगर मैं इन ध्वनियों को गैर-लूपिंग पर सेट कर सकता हूं और जैसे ही ध्वनि चलती है, इस तरह के एक ईवेंट का उपयोग अपने लेबल को टॉगल करने के लिए करें। मुझे कल्पना में कुछ भी नहीं दिख रहा है लेकिन शायद एक बेहतर तरीका है?
धन्यवाद, ब्राड।
क्या आपने कभी इसे ठीक किया है? मुझे एक समान समस्या है। – mdm
मुझे यहां एक ही समस्या है! : एस कोई विचार है? – asheinfeld