Browserfenster schließen LINQ to VisualTree Tonaufnahmen mit Windows Phone 7 (Teil 2)
Kommentare

Menü 3 für Windows Phone 7: Tonaufnahmen mit Windows Phone 7
Eine Tonaufnahme zu implementieren, ist gar nicht so aufwändig, da alle weiteren Hilfsmittel bereits vorhanden sind. Es wird lediglich

Menü 3 für Windows Phone 7: Tonaufnahmen mit Windows Phone 7

Eine Tonaufnahme zu implementieren, ist gar nicht so aufwändig, da alle weiteren Hilfsmittel bereits vorhanden sind. Es wird lediglich die Microphone-Klasse vom XNA-Framework benötigt. Diese funktioniert folgendermaßen: Der Treiber vom Mikrophon nimmt ein Audiosignal (in Bytes) und legt diesen in einem Puffer fest. Dieser Puffer wird in so genannten Pufferblöcken (Byte Arrays) der Microphone-Klasse übergeben. Die Pufferblöcke können dann in einem Stream als Sound abgespielt werden. Für die Vermittlung von dem Microphone-Treiber zur Microphone-Klasse wird das XNA-Famework beansprucht. Das XNA-Framework ist in der Regel nur für Spiele gedacht, und sie haben einen ganz anderen Architekturstil als einfache Silverlight-Apps. Das XNA-Framework arbeitet mit einer so genannten Game Loop. Worauf bei jedem Intervall eine Aktualisierung vorgenommen wird. Unter Silverlight wird alles mittels Threads gehandhabt. Somit müssen wir uns nur um eine eigene Game Loop mittels Timer kümmern. Die Reactive Extensions bieten dazu eine kompakte Lösung.

Im folgenden Beispiel wird ein neues WP7-Projekt angelegt. Dem Projekt werden dann folgende zwei Assemblys referenziert: Microsoft.Xna.Framework und Microsoft.Phone.Reactive. Auf die Oberfläche kommen dann zwei Buttons, ein RECORD– und ein PLAY-Button. Beide Buttons abonnieren zudem den Click-Event. In der Code-Behind folgt dann der Sourcecode aus Listing 3.

Listing 3: Tonaufnahme unter Windows Phone 7

public partial class MainPage : PhoneApplicationPage
{
    private readonly Microphone _microphone = Microphone.Default;
    private Byte[] _buffer;
    readonly MemoryStream _memoryStream = new MemoryStream();
    private SoundEffect _soundEffect;

    public MainPage()
    {
        InitializeComponent();

        // Timer to simulate the XNA game loop (Microphone is from XNA) 
        Observable.Interval(TimeSpan.FromMilliseconds(50)).TimeInterval()
            .Subscribe(x =>FrameworkDispatcher.Update());

        _microphone.BufferReady += OnBufferReady;
    }

    private void OnBufferReady(object sender, EventArgs e)
    {
        _microphone.GetData(_buffer);
        _memoryStream.Write(_buffer, 0, _buffer.Length);
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        if (_microphone.State == MicrophoneState.Stopped)
        {
            _microphone.BufferDuration = TimeSpan.FromSeconds(1);
            _buffer = new byte[_microphone.GetSampleSizeInBytes(_microphone.BufferDuration)];
            _microphone.Start();

            button1.Content = "Stop";
        }
        else
        {
            _microphone.Stop();

            button1.Content = "Record";
        }
    }

    private void button2_Click(object sender, RoutedEventArgs e)
    {
        _soundEffect = new SoundEffect(_memoryStream.ToArray(), _microphone.SampleRate, AudioChannels.Mono);
        _soundEffect.Play();
    }
}  

Gregor Biswanger ist Microsoft MVP für Client App Dev und arbeitet als Solution Architect und Silverlight-Experte der Firma impuls Informationsmanagement GmbH aus Nürnberg. Seine Schwerpunkte liegen in den Bereichen .NET-Architektur, Silverlight und agile Prozesse. Er veröffentlichte vor Kurzem seine DVD mit Videotrainings zum Thema „WPF 4 und Silverlight 4“ bei Addison-Wesley von video2brain. Biswanger ist auch freier Autor, Speaker und Microsoft CLIPler der INdotNET (Ingolstädter .NET Developers Group). Sie erreichen seinen Blog unter http://www.dotnet-blog.net.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -