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.

posted @ 2011-10-20 14:07 Sir。 阅读(...) 评论(...) 编辑 收藏