/* * PhoneGap is available under *either* the terms of the modified BSD license *or* the * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text. * * Copyright (c) 2005-2011, Nitobi Software Inc. * Copyright (c) 2011, Microsoft Corporation * Copyright (c) 2011, Sergey Grebnov. */ using System; using System.Collections.Generic; using System.Runtime.Serialization; using System.Windows; namespace WP7GapClassLib.PhoneGap.Commands { /// /// Provides the ability to record and play back audio files on a device. /// public class Media : BaseCommand { /// /// Audio player objects /// private static Dictionary players = new Dictionary(); /// /// Represents Media action options. /// [DataContract] public class MediaOptions { /// /// Audio id /// [DataMember(Name = "id", IsRequired = true)] public string Id { get; set; } /// /// Path to audio file /// [DataMember(Name = "src")] public string Src { get; set; } /// /// New track position /// [DataMember(Name = "milliseconds")] public int Milliseconds { get; set; } } /// /// Releases the audio player instance to save memory. /// private void release(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } if (!Media.players.ContainsKey(mediaOptions.Id)) { DispatchCommandResult(new PluginResult(PluginResult.Status.OK, false)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { AudioPlayer audio = Media.players[mediaOptions.Id]; Media.players.Remove(mediaOptions.Id); audio.Dispose(); DispatchCommandResult(new PluginResult(PluginResult.Status.OK, true)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Starts recording and save the specified file /// public void startRecordingAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { if (!Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = new AudioPlayer(this, mediaOptions.Id); Media.players.Add(mediaOptions.Id, audio); audio.startRecording(mediaOptions.Src); } DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Stops recording and save to the file specified when recording started /// public void stopRecordingAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { if (Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = Media.players[mediaOptions.Id]; audio.stopRecording(); Media.players.Remove(mediaOptions.Id); } DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch(Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Starts or resume playing audio file /// public void startPlayingAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } AudioPlayer audio; if (!Media.players.ContainsKey(mediaOptions.Id)) { audio = new AudioPlayer(this, mediaOptions.Id); Media.players.Add(mediaOptions.Id, audio); } else { audio = Media.players[mediaOptions.Id]; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { audio.startPlaying(mediaOptions.Src); DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch(Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Seeks to a location /// public void seekToAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { if (Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = Media.players[mediaOptions.Id]; audio.seekToPlaying(mediaOptions.Milliseconds); } DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Pauses playing /// public void pausePlayingAudio(string options) { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { if (Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = Media.players[mediaOptions.Id]; audio.pausePlaying(); } DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } /// /// Stops playing the audio file /// public void stopPlayingAudio(String options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } Deployment.Current.Dispatcher.BeginInvoke(() => { try { if (Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = Media.players[mediaOptions.Id]; audio.stopPlaying(); } DispatchCommandResult(new PluginResult(PluginResult.Status.OK)); } catch(Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } }); } catch(Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Gets current position of playback /// public void getCurrentPositionAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } if (Media.players.ContainsKey(mediaOptions.Id)) { AudioPlayer audio = Media.players[mediaOptions.Id]; Deployment.Current.Dispatcher.BeginInvoke(() => { DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getCurrentPosition())); }); return; } else { DispatchCommandResult(new PluginResult(PluginResult.Status.OK, -1)); } } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } /// /// Gets the duration of the audio file /// public void getDurationAudio(string options) { try { MediaOptions mediaOptions; try { mediaOptions = JSON.JsonHelper.Deserialize(options); } catch (Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.JSON_EXCEPTION)); return; } AudioPlayer audio; if (Media.players.ContainsKey(mediaOptions.Id)) { audio = Media.players[mediaOptions.Id]; } else { audio = new AudioPlayer(this, mediaOptions.Id); Media.players.Add(mediaOptions.Id, audio); } Deployment.Current.Dispatcher.BeginInvoke(() => { DispatchCommandResult(new PluginResult(PluginResult.Status.OK, audio.getDuration(mediaOptions.Src))); }); } catch(Exception e) { DispatchCommandResult(new PluginResult(PluginResult.Status.ERROR, e.Message)); } } } }