Reputation: 164
I am getting this error in Safari(MAC),
i am implementing a feature that triggers audio alert when a buyer sends a request to the seller. I am able to play muted audio but it show error when it is being played Unmuted. I want to ask is there any way we can ask users to allow audio play permissin as like we ask geolocation or camera/mic access permission with JavaScript. Any help would be appreciated.
This is my code:
window.MutedAudioPlayed = false;
window.MyAudio = new Audio("https://XXXX.com/input_sound.mp3");
window.MyAudio.preload = 'auto';
window.MyAudio.muted = true;
window.MyAudio.play().then(function (event) {
window.MutedAudioPlayed = true;
console.log('Audio MutedAudioPlayed: ', window.MutedAudioPlayed);
}).catch(function (error) {
window.MutedAudioPlayed = false;
console.log('Audio Play Error: ', error.message);
});
window.MyAudio.muted = false;
window.MyAudio.play().then(function (event) {
console.log("Audio Play: ", event);
}).catch(function (error) {
console.log('Audio Play Error: ', error.message);
});
Upvotes: 3
Views: 5106
Reputation: 1292
From what we figured so far, you can do the following:
audio
(that usually stands for microphone, but also works for sounds)AudioBuffer
to play it, see below for example.const audioContext = new (window.AudioContext || window.webkitAudioContext)();
navigator.mediaDevices
.getUserMedia({ audio: true })
.then(() => {
const source = audioContext.createBufferSource();
source.addEventListener('ended', () => {
source.stop();
audioContext.close();
});
const request = new XMLHttpRequest();
request.open('GET', '/path-to-sound.mp3', true);
request.responseType = 'arraybuffer';
request.onload = () => {
audioContext.decodeAudioData(
request.response,
(buffer) => {
source.buffer = buffer;
source.connect(audioContext.destination);
source.start();
},
(e) => {
console.log('Error with decoding audio data' + e.message);
});
}
request.send();
})
.catch(reason => console.error(`Audio permissions denied: ${reason}`));
This approach has several drawbacks, though:
Upvotes: 1