原文:windows phone 7 通过麦克风录音,并且播放
//模拟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.
时间: 2024-12-23 19:11:34