summaryrefslogtreecommitdiff
path: root/plugins/org.apache.cordova.media/src/windows8/MediaProxy.js
diff options
context:
space:
mode:
authorArjun Roychowdhury <pliablepixels@gmail.com>2015-10-28 13:31:08 -0400
committerArjun Roychowdhury <pliablepixels@gmail.com>2015-10-28 13:31:08 -0400
commite76b54b8e3f3d7299e5a921dcecc9dc442b278e1 (patch)
treecbfa4476dae975ed443361e37acef0ab0a45bfa1 /plugins/org.apache.cordova.media/src/windows8/MediaProxy.js
parent3cb5cda7583566cec66aabf3543b0d876a864369 (diff)
media plugin
Diffstat (limited to 'plugins/org.apache.cordova.media/src/windows8/MediaProxy.js')
-rw-r--r--plugins/org.apache.cordova.media/src/windows8/MediaProxy.js217
1 files changed, 217 insertions, 0 deletions
diff --git a/plugins/org.apache.cordova.media/src/windows8/MediaProxy.js b/plugins/org.apache.cordova.media/src/windows8/MediaProxy.js
new file mode 100644
index 00000000..e7ec51b7
--- /dev/null
+++ b/plugins/org.apache.cordova.media/src/windows8/MediaProxy.js
@@ -0,0 +1,217 @@
+/*
+ *
+ * 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 Windows:true */
+
+var cordova = require('cordova'),
+ Media = require('org.apache.cordova.media.Media');
+
+var MediaError = require('org.apache.cordova.media.MediaError');
+
+var recordedFile;
+
+module.exports = {
+ mediaCaptureMrg:null,
+
+ // Initiates the audio file
+ create:function(win, lose, args) {
+ var id = args[0];
+ var src = args[1];
+ var thisM = Media.get(id);
+ Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STARTING);
+
+ Media.prototype.node = null;
+
+ var fn = src.split('.').pop(); // gets the file extension
+ if (thisM.node === null) {
+ if (fn === 'mp3' || fn === 'wma' || fn === 'wav' ||
+ fn === 'cda' || fn === 'adx' || fn === 'wm' ||
+ fn === 'm3u' || fn === 'wmx' || fn === 'm4a') {
+ thisM.node = new Audio(src);
+ thisM.node.load();
+
+ var getDuration = function () {
+ var dur = thisM.node.duration;
+ if (isNaN(dur)) {
+ dur = -1;
+ }
+ Media.onStatus(id, Media.MEDIA_DURATION, dur);
+ };
+
+ thisM.node.onloadedmetadata = getDuration;
+ getDuration();
+ }
+ else {
+ lose && lose({code:MediaError.MEDIA_ERR_ABORTED});
+ }
+ }
+ },
+
+ // Start playing the audio
+ startPlayingAudio:function(win, lose, args) {
+ var id = args[0];
+ //var src = args[1];
+ //var options = args[2];
+
+ var thisM = Media.get(id);
+ // if Media was released, then node will be null and we need to create it again
+ if (!thisM.node) {
+ module.exports.create(win, lose, args);
+ }
+
+ Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_RUNNING);
+
+ thisM.node.play();
+ },
+
+ // Stops the playing audio
+ stopPlayingAudio:function(win, lose, args) {
+ var id = args[0];
+ try {
+ (Media.get(id)).node.pause();
+ (Media.get(id)).node.currentTime = 0;
+ Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_STOPPED);
+ win();
+ } catch (err) {
+ lose("Failed to stop: "+err);
+ }
+ },
+
+ // Seeks to the position in the audio
+ seekToAudio:function(win, lose, args) {
+ var id = args[0];
+ var milliseconds = args[1];
+ try {
+ (Media.get(id)).node.currentTime = milliseconds / 1000;
+ win();
+ } catch (err) {
+ lose("Failed to seek: "+err);
+ }
+ },
+
+ // Pauses the playing audio
+ pausePlayingAudio:function(win, lose, args) {
+ var id = args[0];
+ var thisM = Media.get(id);
+ try {
+ thisM.node.pause();
+ Media.onStatus(id, Media.MEDIA_STATE, Media.MEDIA_PAUSED);
+ } catch (err) {
+ lose("Failed to pause: "+err);
+ }
+ },
+
+ // Gets current position in the audio
+ getCurrentPositionAudio:function(win, lose, args) {
+ var id = args[0];
+ try {
+ var p = (Media.get(id)).node.currentTime;
+ Media.onStatus(id, Media.MEDIA_POSITION, p);
+ win(p);
+ } catch (err) {
+ lose(err);
+ }
+ },
+
+ // Start recording audio
+ startRecordingAudio:function(win, lose, args) {
+ var id = args[0];
+ var src = args[1];
+
+ var normalizedSrc = src.replace(/\//g, '\\');
+ var destPath = normalizedSrc.substr(0, normalizedSrc.lastIndexOf('\\'));
+ var destFileName = normalizedSrc.replace(destPath + '\\', '');
+
+ // Initialize device
+ Media.prototype.mediaCaptureMgr = null;
+ var thisM = (Media.get(id));
+ var captureInitSettings = new Windows.Media.Capture.MediaCaptureInitializationSettings();
+ captureInitSettings.streamingCaptureMode = Windows.Media.Capture.StreamingCaptureMode.audio;
+ thisM.mediaCaptureMgr = new Windows.Media.Capture.MediaCapture();
+ thisM.mediaCaptureMgr.addEventListener("failed", lose);
+
+ thisM.mediaCaptureMgr.initializeAsync(captureInitSettings).done(function (result) {
+ thisM.mediaCaptureMgr.addEventListener("recordlimitationexceeded", lose);
+ thisM.mediaCaptureMgr.addEventListener("failed", lose);
+
+ // Start recording
+ Windows.Storage.ApplicationData.current.temporaryFolder.createFileAsync(destFileName, Windows.Storage.CreationCollisionOption.replaceExisting).done(function (newFile) {
+ recordedFile = newFile;
+ var encodingProfile = null;
+ switch (newFile.fileType) {
+ case '.m4a':
+ encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createM4a(Windows.Media.MediaProperties.AudioEncodingQuality.auto);
+ break;
+ case '.mp3':
+ encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createMp3(Windows.Media.MediaProperties.AudioEncodingQuality.auto);
+ break;
+ case '.wma':
+ encodingProfile = Windows.Media.MediaProperties.MediaEncodingProfile.createWma(Windows.Media.MediaProperties.AudioEncodingQuality.auto);
+ break;
+ default:
+ lose("Invalid file type for record");
+ break;
+ }
+ thisM.mediaCaptureMgr.startRecordToStorageFileAsync(encodingProfile, newFile).done(win, lose);
+ }, lose);
+ }, lose);
+ },
+
+ // Stop recording audio
+ stopRecordingAudio:function(win, lose, args) {
+ var id = args[0];
+ var thisM = Media.get(id);
+
+ var normalizedSrc = thisM.src.replace(/\//g, '\\');
+ var destPath = normalizedSrc.substr(0, normalizedSrc.lastIndexOf('\\'));
+ var destFileName = normalizedSrc.replace(destPath + '\\', '');
+
+ thisM.mediaCaptureMgr.stopRecordAsync().done(function () {
+ if (destPath) {
+ Windows.Storage.StorageFolder.getFolderFromPathAsync(destPath).done(function(destFolder) {
+ recordedFile.copyAsync(destFolder, destFileName, Windows.Storage.CreationCollisionOption.replaceExisting).done(win, lose);
+ }, lose);
+ } else {
+ // if path is not defined, we leave recorded file in temporary folder (similar to iOS)
+ win();
+ }
+ }, lose);
+ },
+
+ // Release the media object
+ release:function(win, lose, args) {
+ var id = args[0];
+ var thisM = Media.get(id);
+ try {
+ delete thisM.node;
+ } catch (err) {
+ lose("Failed to release: "+err);
+ }
+ },
+ setVolume:function(win, lose, args) {
+ var id = args[0];
+ var volume = args[1];
+ var thisM = Media.get(id);
+ thisM.volume = volume;
+ }
+};
+
+require("cordova/exec/proxy").add("Media",module.exports);