(27.03.2018, 18:01)Erwin van der Zwart Wrote: Hi,
You could use this custom JS for that: (note that iOS devices needs to be touch once before audio works, Apple crazy policy)
Note that the audio files are uploaded in the Apps FTP user folder, otherwise you have to adjust the path.
BR,Code:// Closing current script section to add elements </script> <audio id="SE_Audio" style="display: none;"></audio> <script type="text/javascript"> // Starting new script section after adding elements $(function(){ // Table with parameters var AudioTable = [ { address:"32/2/0", url:"/user/audio1.mp3"}, { address:"32/2/1", url:"/user/audio2.mp3" }, { address:"32/2/2", url:"/user/audio3.mp3" }, ]; var ctx = new(window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.oAudioContext || window.msAudioContext), request = new XMLHttpRequest(); var snd = document.getElementById("SE_Audio"); function getMobileOperatingSystem() { var userAgent = navigator.userAgent || navigator.vendor || window.opera; //console.log(userAgent) if (userAgent.match(/iPad/i) || userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) { return 'iOS'; } else if ( userAgent.match(/Android/i)) { return 'Android'; } else if ( userAgent.match(/iKonWebTouch/i)) { return 'U.Motion'; } else { return 'PC'; } } var OS_Version = getMobileOperatingSystem(); // Fix iOS Audio Context (function() { var fixAudioContext = function (e) { if (ctx) { // Create empty buffer var buffer = ctx.createBuffer(1, 1, 22050); var source = ctx.createBufferSource(); source.buffer = buffer; // Connect to output source.connect(ctx.destination); // Play sound if (source.start) { source.start(0); } else if (source.play) { source.play(0); } else if (source.noteOn) { source.noteOn(0); } } // Check if document is loaded in iframe if (window.frameElement){ // Remove event listeners from parent var thisparent = window.parent; thisparent.document.removeEventListener('touchstart', fixAudioContext); thisparent.document.removeEventListener('touchend', fixAudioContext); } // Remove events document.removeEventListener('touchstart', fixAudioContext); document.removeEventListener('touchend', fixAudioContext); }; // Check if document is loaded in iframe if (window.frameElement){ // Add event listeners to parent var thisparent = window.parent; // Event listener for iOS 6-8 (was previous touchstart event) thisparent.document.addEventListener('touchstart', fixAudioContext); // Event listener for iOS 9+ (is now touchend event) thisparent.document.addEventListener('touchend', fixAudioContext); } // Event listener for iOS 6-8 (was previous touchstart event) document.addEventListener('touchstart', fixAudioContext); // Event listener for iOS 9+ (is now touchend event) document.addEventListener('touchend', fixAudioContext); })(); // Function to play audio by URL function Play_Audio(url){ //console.log(OS_Version) if (OS_Version === 'Android' || OS_Version === 'U.Motion' ){ //alert(OS_Version); snd.src = url; snd.pause(); sndcurrentTime = 0; //snd.load(); snd.play(); } else { request.open("GET", url, true); request.responseType = "arraybuffer"; request.onload = function(){ ctx.decodeAudioData(request.response, onDecoded); } function onDecoded(buffer){ var bufferSource = ctx.createBufferSource(); bufferSource.buffer = buffer; bufferSource.connect(ctx.destination); bufferSource.start(); } request.send(); } }; // Function to create event listeners function CreateListeners(groupaddr,url){ // Make event listener to object if (typeof grp != 'undefined') { grp.listen(groupaddr, function(object, state) { var value = object.value; if (state == 'value') { if (value == 1) { Play_Audio(url); } } }, true); } } // Start creating listeners for (var i in AudioTable) { CreateListeners(AudioTable[i].address,AudioTable[i].url); } });
Erwin
PS: Not complex at all (:
is there a simple way to adapt it to make a sound for every alert, regardless the object address?