//類比XNA的架構(凡是在wp7中應用xna的都必須先類比此類)
public class XNAAsyncDispatcher : IApplicationService { private DispatcherTimer frameworkDispatcherTimer; public XNAAsyncDispatcher(TimeSpan dispatchInterval) { this.frameworkDispatcherTimer = new DispatcherTimer(); this.frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick); this.frameworkDispatcherTimer.Interval = dispatchInterval; } void IApplicationService.StartService(ApplicationServiceContext context) { this.frameworkDispatcherTimer.Start(); } void IApplicationService.StopService() { this.frameworkDispatcherTimer.Stop(); } void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); } }
在App 建構函式裡寫this.ApplicationLifetimeObjects.Add(new XNAAsyncDispatcher(TimeSpan.FromMilliseconds(50)));當程式激動時就開始類比XNA GameTimer
//後代代碼using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;using System.IO;using Microsoft.Xna.Framework.Audio;namespace Wp7_錄音{ public partial class MainPage : PhoneApplicationPage { // Constructor public MainPage() { InitializeComponent(); mic.BufferReady += Default_BufferReady; SoundEffect.MasterVolume = 1.0f; } MemoryStream ms; Microphone mic = Microphone.Default; // Wire up an event handler so we can empty the buffer when full // Crank up the volume to max // When the buffer's ready we need to empty it // We'll copy to a MemoryStream // We could push into IsolatedStorage etc void Default_BufferReady(object sender, EventArgs e) { byte[] buffer = new byte[1024]; int bytesRead = 0; while ((bytesRead = mic.GetData(buffer, 0, buffer.Length)) > 0) ms.Write(buffer, 0, bytesRead); } // The user wants to start recording. If we've already made // a recording, close that MemoryStream and create a new one. // Start recording on the default device. private void start_Click(object sender, RoutedEventArgs e) { if (ms != null) ms.Close(); ms = new MemoryStream(); mic.Start(); } // The user wants to stop recording. Checks the microphone // is stopped. Reset the MemoryStream position. // Play back the recording. Pitch is based on slider value private void stop_Click(object sender, RoutedEventArgs e) { if (mic.State != MicrophoneState.Stopped) mic.Stop(); ms.Position = 0; SoundEffect se = new SoundEffect(ms.ToArray(), mic.SampleRate, AudioChannels.Mono); //se.Play(1.0f, (float)slider1.Value, 0.0f); se.Play(); } }}
本執行個體UI就兩個Button 一個start 一個stop, 還有一個滑動條 Silder.