You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
6.3 KiB
JavaScript

/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
/* global qnx, PluginResult */
var audioObjects = {},
mediaErrorsHandled = false;
// There is a bug in the webplatform handling of media error
// dialogs prior to 10.2. This function needs to be run once
// on the webview which plays audio to prevent freezing.
function handleMediaErrors() {
var webview = qnx.webplatform.getWebViews()[0],
handler = webview.onDialogRequested;
if (!mediaErrorsHandled) {
webview.allowWebEvent("DialogRequested");
webview.onDialogRequested = undefined;
webview.onDialogRequested = function (eventArgs) {
var parsedArgs = JSON.parse(eventArgs);
if (parsedArgs.dialogType === 'MediaError') {
return '{"setPreventDefault": true}';
}
handler(eventArgs);
};
mediaErrorsHandled = true;
}
}
module.exports = {
create: function (success, fail, args, env) {
var result = new PluginResult(args, env),
id;
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
id = JSON.parse(decodeURIComponent(args[0]));
if (!args[1]){
audioObjects[id] = new Audio();
} else {
audioObjects[id] = new Audio(JSON.parse(decodeURIComponent(args[1])));
}
handleMediaErrors();
result.ok();
},
startPlayingAudio: function (success, fail, args, env) {
var audio,
id,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
id = JSON.parse(decodeURIComponent(args[0]));
audio = audioObjects[id];
if (!audio) {
result.error("Audio object has not been initialized");
} else {
audio.play();
result.ok();
}
},
stopPlayingAudio: function (success, fail, args, env) {
var audio,
id,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
id = JSON.parse(decodeURIComponent(args[0]));
audio = audioObjects[id];
if (!audio) {
result.error("Audio Object has not been initialized");
return;
}
audio.pause();
audio.currentTime = 0;
result.ok();
},
seekToAudio: function (success, fail, args, env) {
var audio,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
if (!audio) {
result.error("Audio Object has not been initialized");
} else if (!args[1]) {
result.error("Media seek time argument not found");
} else {
try {
audio.currentTime = JSON.parse(decodeURIComponent(args[1])) / 1000;
result.ok();
} catch (e) {
result.error("Error seeking audio: " + e);
}
}
},
pausePlayingAudio: function (success, fail, args, env) {
var audio,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
if (!audio) {
result.error("Audio Object has not been initialized");
return;
}
audio.pause();
},
getCurrentPositionAudio: function (success, fail, args, env) {
var audio,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
if (!audio) {
result.error("Audio Object has not been initialized");
return;
}
result.ok(audio.currentTime);
},
getDuration: function (success, fail, args, env) {
var audio,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
audio = audioObjects[JSON.parse(decodeURIComponent(args[0]))];
if (!audio) {
result.error("Audio Object has not been initialized");
return;
}
result.ok(audio.duration);
},
startRecordingAudio: function (success, fail, args, env) {
var result = new PluginResult(args, env);
result.error("Not supported");
},
stopRecordingAudio: function (success, fail, args, env) {
var result = new PluginResult(args, env);
result.error("Not supported");
},
release: function (success, fail, args, env) {
var audio,
id,
result = new PluginResult(args, env);
if (!args[0]) {
result.error("Media Object id was not sent in arguments");
return;
}
id = JSON.parse(decodeURIComponent(args[0]));
audio = audioObjects[id];
if (audio) {
if(audio.src !== ""){
audio.src = undefined;
}
audioObjects[id] = undefined;
}
result.ok();
}
};