Per Quested Aronsson created CB-1680: ----------------------------------------
Summary: Uncaught TypeError in cordova-*.js when using media API Key: CB-1680 URL: https://issues.apache.org/jira/browse/CB-1680 Project: Apache Cordova Issue Type: Bug Components: CordovaJS Affects Versions: 2.0.0 Environment: 1. Ripple, Chrome, Mac OSX 10.7.5 2. Phonegap Build, Apple iPad Reporter: Per Quested Aronsson Assignee: Filip Maj Fix For: Master When testing my code in Ripple, I get the following error and no sound plays: ``` Uncaught TypeError: Cannot set property '_duration' of undefined cordova-2.0.0.js:3090 Media.onStatus cordova-2.0.0.js:3090 (called from anonymous function) ripple.js:477 row 3090: media._duration = value; ``` The same code tested in Phonegap Build does *not* crash. It doesn't work as expected, but it doesn't crash. Audio playback doesn't stop when it should. The audio file is played to the end every time. Please find the relevant part of the code below. It will not run as is. It expects to find an audio file of at least 8s duration at "audio/FX.m4a", and it expects to find an HTML element with ID "cross", but that's it I think. ```javascript function AudioPG() { var self = this; var soundOff = false; var inter; var sound = new Media('audio/FX.m4a', self.onSuccess, self.onError); var segmentEnd = 0.5; //sound.getDuration(); // used for sound var sprites = { // id: [start, length], startpoints: 0,1,2,7 0: [1, 1.7], // Jackpot 1: [0.0, 0.5], // Click 2: [2.5, 5], // Whosh 3: [7.2, 7.7] // Buzz }; this.checkSprite = function () { console.log('checkSprite'); if (segmentEnd) { sound.getCurrentPosition(function(position) { console.log([position, segmentEnd]); if (position >= segmentEnd) { // getCurrentPosistion uses seconds sound.pause(); clearInterval(inter); inter = null; } }, function(e) { console.log("Error getting pos=" + e); } ); } }; this.playSprite = function (id) { if (soundOff) { return; } var startTime = sprites[id][0]; segmentEnd = startTime + sprites[id][1]; if (sound) { sound.seekTo(startTime*1000); // seekTo uses milliseconds sound.play(); if (!inter) { inter = setInterval(self.checkSprite,100); } } }; this.stopSprite = function () { if (sound) { sound.pause(); } }; this.toggleSound = function (e) { var cross = e.target; soundOff = !soundOff; cross.style.opacity = (soundOff ? 0.4 : 0); }; // onSuccess Callback // this.onSuccess = function () { console.log("playAudio():Audio Success"); }; // onError Callback // this.onError = function (error) { alert('code: ' + error.code + '\n' + 'message: ' + error.message + '\n'); }; document.getElementById('cross').addEventListener('touchstart', self.toggleSound, false); console.log(['AudioPG', segmentEnd]); } ``` -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira