You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cordova.apache.org by pu...@apache.org on 2013/11/01 02:27:38 UTC

[43/50] [abbrv] git commit: update Audio/Media plugins

update Audio/Media plugins


Project: http://git-wip-us.apache.org/repos/asf/cordova-wp8/repo
Commit: http://git-wip-us.apache.org/repos/asf/cordova-wp8/commit/57dc0253
Tree: http://git-wip-us.apache.org/repos/asf/cordova-wp8/tree/57dc0253
Diff: http://git-wip-us.apache.org/repos/asf/cordova-wp8/diff/57dc0253

Branch: refs/heads/2.9.x
Commit: 57dc02537700712063a6a0ec1dd601b7d5583252
Parents: bfd3894
Author: purplecabbage <pu...@gmail.com>
Authored: Tue Oct 29 16:56:12 2013 -0700
Committer: purplecabbage <pu...@gmail.com>
Committed: Tue Oct 29 16:56:12 2013 -0700

----------------------------------------------------------------------
 common/Plugins/AudioPlayer.cs |  48 ++++++---
 common/Plugins/Media.cs       | 194 ++++++++++++++++++++++---------------
 2 files changed, 154 insertions(+), 88 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cordova-wp8/blob/57dc0253/common/Plugins/AudioPlayer.cs
----------------------------------------------------------------------
diff --git a/common/Plugins/AudioPlayer.cs b/common/Plugins/AudioPlayer.cs
index cc65939..f103cf5 100644
--- a/common/Plugins/AudioPlayer.cs
+++ b/common/Plugins/AudioPlayer.cs
@@ -27,6 +27,7 @@ using System.Windows.Resources;
 
 namespace WPCordovaClassLib.Cordova.Commands
 {
+
     /// <summary>
     /// Implements audio record and play back functionality.
     /// </summary>
@@ -62,6 +63,7 @@ namespace WPCordovaClassLib.Cordova.Commands
 
         #endregion
 
+
         /// <summary>
         /// The AudioHandler object
         /// </summary>
@@ -77,6 +79,7 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         DispatcherTimer dtXna;
 
+
         /// <summary>
         /// Output buffer
         /// </summary>
@@ -128,6 +131,7 @@ namespace WPCordovaClassLib.Cordova.Commands
             this.id = id;
         }
 
+
         /// <summary>
         /// Destroys player and stop audio playing or recording
         /// </summary>
@@ -194,8 +198,26 @@ namespace WPCordovaClassLib.Cordova.Commands
                     this.recorder.BufferDuration = TimeSpan.FromMilliseconds(500);
                     this.buffer = new byte[recorder.GetSampleSizeInBytes(this.recorder.BufferDuration)];
                     this.recorder.BufferReady += new EventHandler<EventArgs>(recorderBufferReady);
-                    this.memoryStream = new MemoryStream();
-                    this.memoryStream.InitializeWavStream(this.recorder.SampleRate);
+                    MemoryStream stream = new MemoryStream();
+                    this.memoryStream = stream;
+                    int numBits = 16;
+                    int numBytes = numBits / 8;
+
+                    // inline version from AudioFormatsHelper
+                    stream.Write(System.Text.Encoding.UTF8.GetBytes("RIFF"), 0, 4);
+                    stream.Write(BitConverter.GetBytes(0), 0, 4);
+                    stream.Write(System.Text.Encoding.UTF8.GetBytes("WAVE"), 0, 4);
+                    stream.Write(System.Text.Encoding.UTF8.GetBytes("fmt "), 0, 4);
+                    stream.Write(BitConverter.GetBytes(16), 0, 4);
+                    stream.Write(BitConverter.GetBytes((short)1), 0, 2);
+                    stream.Write(BitConverter.GetBytes((short)1), 0, 2);
+                    stream.Write(BitConverter.GetBytes(this.recorder.SampleRate), 0, 4);
+                    stream.Write(BitConverter.GetBytes(this.recorder.SampleRate * numBytes), 0, 4);
+                    stream.Write(BitConverter.GetBytes((short)(numBytes)), 0, 2);
+                    stream.Write(BitConverter.GetBytes((short)(numBits)), 0, 2);
+                    stream.Write(System.Text.Encoding.UTF8.GetBytes("data"), 0, 4);
+                    stream.Write(BitConverter.GetBytes(0), 0, 4);
+
                     this.recorder.Start();
                     FrameworkDispatcher.Update();
                     this.SetState(PlayerState_Running);
@@ -284,7 +306,7 @@ namespace WPCordovaClassLib.Cordova.Commands
                                 {
                                     this.player.Stop(); // stop it!
                                 }
-                                
+
                                 this.player.Source = null; // Garbage collect it.
                                 this.player.MediaOpened += MediaOpened;
                                 this.player.MediaEnded += MediaEnded;
@@ -312,7 +334,7 @@ namespace WPCordovaClassLib.Cordova.Commands
                                 {
                                     using (BinaryReader br = new BinaryReader(fileResourceStreamInfo.Stream))
                                     {
-                                        byte[] data = br.ReadBytes((int)fileResourceStreamInfo.Stream.Length);          
+                                        byte[] data = br.ReadBytes((int)fileResourceStreamInfo.Stream.Length);
 
                                         string[] dirParts = filePath.Split('/');
                                         string dirName = "";
@@ -410,10 +432,7 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         private void MediaFailed(object sender, RoutedEventArgs arg)
         {
-            if (player != null)
-            {
-                player.Stop();
-            }
+            player.Stop();
             InvokeCallback(MediaError, MediaErrorStartingPlayback, false);
             //this.handler.InvokeCustomScript(new ScriptCallback(CallbackFunction, this.id, MediaError.ToString(), "Media failed"),false);
         }
@@ -558,12 +577,17 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// <returns></returns>
         private void SaveAudioClipToLocalStorage()
         {
-            if (this.memoryStream == null || this.memoryStream.Length <= 0)
+            if (memoryStream == null || memoryStream.Length <= 0)
             {
                 return;
             }
 
-            this.memoryStream.UpdateWavStream();
+            long position = memoryStream.Position;
+            memoryStream.Seek(4, SeekOrigin.Begin);
+            memoryStream.Write(BitConverter.GetBytes((int)memoryStream.Length - 8), 0, 4);
+            memoryStream.Seek(40, SeekOrigin.Begin);
+            memoryStream.Write(BitConverter.GetBytes((int)memoryStream.Length - 44), 0, 4);
+            memoryStream.Seek(position, SeekOrigin.Begin);
 
             try
             {
@@ -589,7 +613,7 @@ namespace WPCordovaClassLib.Cordova.Commands
                 //TODO: log or do something else
                 throw;
             }
-        }    
+        }
 
         #region Xna loop
         /// <summary>
@@ -620,4 +644,4 @@ namespace WPCordovaClassLib.Cordova.Commands
 
         #endregion
     }
-}
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-wp8/blob/57dc0253/common/Plugins/Media.cs
----------------------------------------------------------------------
diff --git a/common/Plugins/Media.cs b/common/Plugins/Media.cs
index 5de4884..74d53af 100644
--- a/common/Plugins/Media.cs
+++ b/common/Plugins/Media.cs
@@ -53,6 +53,8 @@ namespace WPCordovaClassLib.Cordova.Commands
             /// </summary>
             [DataMember(Name = "milliseconds")]
             public int Milliseconds { get; set; }
+
+            public string CallbackId { get; set; }
         }
 
         /// <summary>
@@ -60,25 +62,26 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>  
         public void release(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
-                MediaOptions mediaOptions;
+                MediaOptions mediaOptions = new MediaOptions();
 
                 try
                 {
                     string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
-                    mediaOptions = new MediaOptions();
                     mediaOptions.Id = optionsString[0];
+                    callbackId = mediaOptions.CallbackId = optionsString[1];
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
                     return;
                 }
 
                 if (!Media.players.ContainsKey(mediaOptions.Id))
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK, false));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK, false), callbackId);
                     return;
                 }
 
@@ -89,39 +92,58 @@ namespace WPCordovaClassLib.Cordova.Commands
                         AudioPlayer audio = Media.players[mediaOptions.Id];
                         Media.players.Remove(mediaOptions.Id);
                         audio.Dispose();
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK, true));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK, true), mediaOptions.CallbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), mediaOptions.CallbackId);
                     }
                 });
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
 
+        private AudioPlayer GetOrCreatePlayerById(string id)
+        {
+            AudioPlayer audio = null;
+
+            lock (Media.players)
+            {
+                if (!Media.players.TryGetValue(id, out audio))
+                {
+                    audio = new AudioPlayer(this, id);
+                    Media.players.Add(id, audio);
+                }
+            }
+
+
+
+            return audio;
+        }
+
         /// <summary>
         /// Starts recording and save the specified file 
         /// </summary>
         public void startRecordingAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
-                MediaOptions mediaOptions;
+                MediaOptions mediaOptions = new MediaOptions();
 
                 try
                 {
                     string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
-                    mediaOptions = new MediaOptions();
                     mediaOptions.Id = optionsString[0];
                     mediaOptions.Src = optionsString[1];
+                    callbackId = mediaOptions.CallbackId = optionsString[2];
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), mediaOptions.CallbackId);
                     return;
                 }
 
@@ -146,30 +168,31 @@ namespace WPCordovaClassLib.Cordova.Commands
                             if (audio != null)
                             {
                                 audio.startRecording(mediaOptions.Src);
-                                DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                                DispatchCommandResult(new PluginResult(PluginResult.Status.OK), mediaOptions.CallbackId);
                             }
                             else
                             {
-                                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, "Error accessing AudioPlayer for key " + mediaOptions.Id));
+                                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR,
+                                                        "Error accessing AudioPlayer for key " + mediaOptions.Id), mediaOptions.CallbackId);
                             }
-                            
-                            
+
+
                         }
                         catch (Exception e)
                         {
-                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), mediaOptions.CallbackId);
                         }
 
                     });
                 }
                 else
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), mediaOptions.CallbackId);
                 }
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
 
@@ -178,9 +201,13 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void stopRecordingAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
+
             try
             {
-                string mediaId = JSON.JsonHelper.Deserialize<string[]>(options)[0];
+                string[] optStrings = JSON.JsonHelper.Deserialize<string[]>(options);
+                string mediaId = optStrings[0];
+                callbackId = optStrings[1];
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
                     try
@@ -191,27 +218,31 @@ namespace WPCordovaClassLib.Cordova.Commands
                             audio.stopRecording();
                             Media.players.Remove(mediaId);
                         }
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
             }
         }
 
         public void setVolume(string options) // id,volume
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
                 string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
                 string id = optionsString[0];
-                double volume = double.Parse(optionsString[1]);
+                double volume = 0.0d;
+                double.TryParse(optionsString[1], out volume);
+
+                callbackId = optionsString[2];
 
                 if (Media.players.ContainsKey(id))
                 {
@@ -224,15 +255,15 @@ namespace WPCordovaClassLib.Cordova.Commands
                         }
                         catch (Exception e)
                         {
-                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                            DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                         }
                     });
                 }
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION, "Error parsing options into setVolume method"));
-                return;
+                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION,
+                                                        "Error parsing options into setVolume method"), callbackId);
             }
         }
 
@@ -241,10 +272,10 @@ namespace WPCordovaClassLib.Cordova.Commands
         // While playing, a MediaElement stops all other media playback on the phone.
         // Multiple MediaElement controls are NOT supported
 
-        // Called when you create a new Media('blah') object in JS.
+        // Called when you create a new Media('blah.wav') object in JS.
         public void create(string options)
         {
-            // Debug.WriteLine("Creating Audio :: " + options);
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
                 MediaOptions mediaOptions;
@@ -254,21 +285,22 @@ namespace WPCordovaClassLib.Cordova.Commands
                     mediaOptions = new MediaOptions();
                     mediaOptions.Id = optionsString[0];
                     mediaOptions.Src = optionsString[1];
+                    callbackId = mediaOptions.CallbackId = optionsString[2];
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION, "Error parsing options into create method"));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION,
+                                            "Error parsing options into create method"), callbackId);
                     return;
                 }
 
-                AudioPlayer audio = new AudioPlayer(this, mediaOptions.Id);
-                Media.players.Add(mediaOptions.Id, audio);
-                DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                GetOrCreatePlayerById(mediaOptions.Id);
+                DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
 
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
 
@@ -277,6 +309,7 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void startPlayingAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
                 MediaOptions mediaOptions;
@@ -286,47 +319,38 @@ namespace WPCordovaClassLib.Cordova.Commands
                     mediaOptions = new MediaOptions();
                     mediaOptions.Id = optionsString[0];
                     mediaOptions.Src = optionsString[1];
-                    if (optionsString.Length > 2 && optionsString[2] != null)
+                    int msec = 0;
+                    if (int.TryParse(optionsString[2], out msec))
                     {
-                        mediaOptions.Milliseconds = int.Parse(optionsString[2]);
+                        mediaOptions.Milliseconds = msec;
                     }
+                    callbackId = mediaOptions.CallbackId = optionsString[3];
 
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
                     return;
                 }
 
-                AudioPlayer audio;
-
-                if (!Media.players.ContainsKey(mediaOptions.Id))
-                {
-                    audio = new AudioPlayer(this, mediaOptions.Id);
-                    Media.players.Add(mediaOptions.Id, audio);
-                }
-                else
-                {
-                    //Debug.WriteLine("INFO: startPlayingAudio FOUND mediaPlayer for " + mediaOptions.Id);
-                    audio = Media.players[mediaOptions.Id];
-                }
+                AudioPlayer audio = GetOrCreatePlayerById(mediaOptions.Id);
 
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
                     try
                     {
                         audio.startPlaying(mediaOptions.Src);
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
 
@@ -336,6 +360,7 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void seekToAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
                 MediaOptions mediaOptions;
@@ -345,14 +370,17 @@ namespace WPCordovaClassLib.Cordova.Commands
                     string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
                     mediaOptions = new MediaOptions();
                     mediaOptions.Id = optionsString[0];
-                    if (optionsString.Length > 1 && optionsString[1] != null)
+                    int msec = 0;
+                    if (int.TryParse(optionsString[2], out msec))
                     {
-                        mediaOptions.Milliseconds = int.Parse(optionsString[1]);
+                        mediaOptions.Milliseconds = msec;
                     }
+                    callbackId = mediaOptions.CallbackId = optionsString[3];
+
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
                     return;
                 }
 
@@ -370,17 +398,17 @@ namespace WPCordovaClassLib.Cordova.Commands
                             Debug.WriteLine("ERROR: seekToAudio could not find mediaPlayer for " + mediaOptions.Id);
                         }
 
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
 
@@ -389,10 +417,12 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void pausePlayingAudio(string options)
         {
-
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
-                string mediaId = JSON.JsonHelper.Deserialize<string[]>(options)[0];
+                string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
+                string mediaId = optionsString[0];
+                callbackId = optionsString[1];
 
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
@@ -408,11 +438,11 @@ namespace WPCordovaClassLib.Cordova.Commands
                             Debug.WriteLine("ERROR: pausePlayingAudio could not find mediaPlayer for " + mediaId);
                         }
 
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
 
@@ -420,7 +450,7 @@ namespace WPCordovaClassLib.Cordova.Commands
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
             }
 
 
@@ -432,9 +462,12 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void stopPlayingAudio(String options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
-                string mediaId = JSON.JsonHelper.Deserialize<string[]>(options)[0];
+                string[] optionsStrings = JSON.JsonHelper.Deserialize<string[]>(options);
+                string mediaId = optionsStrings[0];
+                callbackId = optionsStrings[1];
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
                     try
@@ -449,18 +482,18 @@ namespace WPCordovaClassLib.Cordova.Commands
                             Debug.WriteLine("stopPlaying could not find mediaPlayer for " + mediaId);
                         }
 
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.OK), callbackId);
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
 
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
             }
         }
 
@@ -469,9 +502,12 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// </summary>
         public void getCurrentPositionAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
-                string mediaId = JSON.JsonHelper.Deserialize<string[]>(options)[0];
+                string[] optionsStrings = JSON.JsonHelper.Deserialize<string[]>(options);
+                string mediaId = optionsStrings[0];
+                callbackId = optionsStrings[1];
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
                     try
@@ -479,22 +515,22 @@ namespace WPCordovaClassLib.Cordova.Commands
                         if (Media.players.ContainsKey(mediaId))
                         {
                             AudioPlayer audio = Media.players[mediaId];
-                            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getCurrentPosition()));
+                            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getCurrentPosition()), callbackId);
                         }
                         else
                         {
-                            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, -1));
+                            DispatchCommandResult(new PluginResult(PluginResult.Status.OK, -1), callbackId);
                         }
                     }
                     catch (Exception e)
                     {
-                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                        DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
                     }
                 });
             }
             catch (Exception)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
                 return;
             }
         }
@@ -503,21 +539,27 @@ namespace WPCordovaClassLib.Cordova.Commands
         /// <summary>
         /// Gets the duration of the audio file
         /// </summary>
-        
+
         [Obsolete("This method will be removed shortly")]
         public void getDurationAudio(string options)
         {
+            string callbackId = this.CurrentCommandCallbackId;
             try
             {
                 MediaOptions mediaOptions;
 
                 try
                 {
-                    mediaOptions = JSON.JsonHelper.Deserialize<MediaOptions>(options);
+                    string[] optionsString = JSON.JsonHelper.Deserialize<string[]>(options);
+
+                    mediaOptions = new MediaOptions();
+                    mediaOptions.Id = optionsString[0];
+                    mediaOptions.Src = optionsString[1];
+                    callbackId = mediaOptions.CallbackId = optionsString[2];
                 }
                 catch (Exception)
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION), callbackId);
                     return;
                 }
 
@@ -535,13 +577,13 @@ namespace WPCordovaClassLib.Cordova.Commands
 
                 Deployment.Current.Dispatcher.BeginInvoke(() =>
                 {
-                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getDuration(mediaOptions.Src)));
+                    DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getDuration(mediaOptions.Src)), callbackId);
                 });
             }
             catch (Exception e)
             {
-                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message));
+                DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message), callbackId);
             }
         }
     }
-}
+}
\ No newline at end of file