// Code to execute when the application is launching (eg, from Start) // This code will not execute when the application is reactivated private void Application_Launching(object sender, LaunchingEventArgs e) { Model = new Model.DataModel(); Api = new EchoNestApi("R2O4VVBVN5EFMCJRP", false); bool songsOnDeviceReady = false; bool analyzedSongsReady = false; bool catalogIdReady = false; ExecutionQueue.Enqueue( new WaitCallback(BeatMachine.Model.DataModel.GetAnalyzedSongs), ExecutionQueue.Policy.Immediate); ExecutionQueue.Enqueue( new WaitCallback(BeatMachine.Model.DataModel.GetSongsOnDevice), ExecutionQueue.Policy.Immediate); ExecutionQueue.Enqueue( new WaitCallback(BeatMachine.Model.DataModel.LoadCatalogId), ExecutionQueue.Policy.Immediate); Model.PropertyChanged += new PropertyChangedEventHandler( (pSender, pE) => { if (String.Equals(pE.PropertyName, "CatalogId") && !String.IsNullOrEmpty(Model.CatalogId)) { catalogIdReady = true; } else if (String.Equals(pE.PropertyName, "SongsOnDeviceLoaded")) { songsOnDeviceReady = true; } else if (String.Equals(pE.PropertyName, "AnalyzedSongsLoaded")) { analyzedSongsReady = true; } if (catalogIdReady && songsOnDeviceReady && analyzedSongsReady) { ExecutionQueue.Enqueue( new WaitCallback(BeatMachine.Model.DataModel.DiffSongs), ExecutionQueue.Policy.Immediate); // Make sure we only run this once catalogIdReady = false; songsOnDeviceReady = false; analyzedSongsReady = false; } }); Model.PropertyChanged += new PropertyChangedEventHandler( (pSender, pE) => { if (String.Equals(pE.PropertyName, "SongsToAnalyzeLoaded")) { if ((pSender as DataModel).SongsToAnalyzeLoaded) { ExecutionQueue.Enqueue( new WaitCallback( BeatMachine.Model.DataModel.AnalyzeSongs), ExecutionQueue.Policy.Immediate); } } else if (String.Equals(pE.PropertyName, "SongsToAnalyzeBatchUploadReady")) { if ((pSender as DataModel).SongsToAnalyzeBatchUploadReady) { ExecutionQueue.Enqueue( new WaitCallback( BeatMachine.Model.DataModel.DownloadAnalyzedSongs), ExecutionQueue.Policy.Queued); } } else if (String.Equals(pE.PropertyName, "SongsToAnalyzeBatchDownloadReady")) { if ((pSender as DataModel).SongsToAnalyzeBatchDownloadReady) { ExecutionQueue.Enqueue( new WaitCallback( BeatMachine.Model.DataModel.AnalyzeSongs), ExecutionQueue.Policy.Queued); } } }); }
/// <summary> /// Constructor for the Application object. /// </summary> public App() { // Global handler for uncaught exceptions. UnhandledException += Application_UnhandledException; // Standard Silverlight initialization InitializeComponent(); // Phone-specific initialization InitializePhoneApplication(); // Show graphics profiling information while debugging. if (System.Diagnostics.Debugger.IsAttached) { // Display the current frame rate counters. Application.Current.Host.Settings.EnableFrameRateCounter = true; // Show the areas of the app that are being redrawn in each frame. //Application.Current.Host.Settings.EnableRedrawRegions = true; // Enable non-production analysis visualization mode, // which shows areas of a page that are handed off to GPU with a colored overlay. //Application.Current.Host.Settings.EnableCacheVisualization = true; // Disable the application idle detection by setting the UserIdleDetectionMode property of the // application's PhoneApplicationService object to Disabled. // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run // and consume battery power when the user is not using the phone. //PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; } DispatcherHelper.Initialize(); logger = LogManager.GetCurrentClassLogger(); Model = new DataModel(); Songs = new ObservableCollection<Group<AnalyzedSong>>(); Cache = new Dictionary<Song,AnalyzedSong>(); // Create the database if it does not exist. using (BeatMachineDataContext db = new BeatMachineDataContext(BeatMachineDataContext.DBConnectionString)) { if (!db.DatabaseExists()) { logger.Info("Creating new database"); db.CreateDatabase(); } else { logger.Info("Database exists already"); } } MessengerInstance.Register<NewSongsAddedMessage>( this, m => { ThreadPool.QueueUserWorkItem(new WaitCallback(o => { List<IGrouping<int, AnalyzedSong>> rawSongs; using (BeatMachineDataContext context = new BeatMachineDataContext( BeatMachineDataContext.DBConnectionString)) { DataLoadOptions dlo = new DataLoadOptions(); dlo.LoadWith<AnalyzedSong>(p => p.AudioSummary); context.LoadOptions = dlo; context.ObjectTrackingEnabled = false; rawSongs = context.AnalyzedSongs .Where(s => s.AudioSummary != null) .GroupBy(s => (int)Math.Floor((double)s.AudioSummary.Tempo / 10) * 10) .OrderBy(g => g.Key) .ToList(); } foreach (IGrouping<int, AnalyzedSong> g in rawSongs) { List<AnalyzedSong> existingSongs = new List<AnalyzedSong>(); foreach (AnalyzedSong s in g) { Song mls = s.MediaLibrarySong; if (mls != null) { existingSongs.Add(s); Cache[mls] = s; } } if (existingSongs.Count > 0) { Songs.Add(new Group<AnalyzedSong>(g.Key, g.Shuffle())); SongGroupMessage message = new SongGroupMessage(); message.Songs = Songs; message.Cache = Cache; MessengerInstance.Send<SongGroupMessage>(message); } } })); }); // Clean up and restore MediaPlayer settings this.ApplicationLifetimeObjects.Add(new RunMediaPlayer(TimeSpan.FromMilliseconds(50))); }