NAudio

作者: 萧非子 | 来源:发表于2018-01-22 15:37 被阅读33次

using System;
using System.Linq;
using Windows.Storage.Streams;
using NAudio.CoreAudioApi;
using NAudio.Wave;
using NAudio.Win8.Wave.WaveOutputs;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Xaml.Controls;
using System.IO;
using NAudio.MediaFoundation;

namespace NAudioUniversalDemo
{
class MainPageViewModel : ViewModelBase
{
private IWavePlayer player;
private WaveStream reader;
private IWaveIn recorder;
private MemoryStream recordStream;
private IRandomAccessStream selectedStream;

    public MainPageViewModel()
    {
        LoadCommand = new DelegateCommand(Load);
        PlayCommand = new DelegateCommand(Play) { IsEnabled = false };
        PauseCommand = new DelegateCommand(Pause) { IsEnabled = false };
        StopCommand = new DelegateCommand(Stop) { IsEnabled = false };
        RecordCommand = new DelegateCommand(Record);
        StopRecordingCommand = new DelegateCommand(StopRecording) { IsEnabled = false };
        MediaFoundationApi.Startup();
    }
    
    private void Stop()
    {
        player?.Stop();
    }

    private void Pause()
    {
        player?.Pause();
    }

    private void Play()
    {
        if (player == null)
        {
            // Exclusive mode - fails with a weird buffer alignment error
            player = new WasapiOutRT(AudioClientShareMode.Shared, 200);
            player.Init(CreateReader);

            player.PlaybackStopped += PlayerOnPlaybackStopped;
        }

        if (player.PlaybackState != PlaybackState.Playing)
        {
            //reader.Seek(0, SeekOrigin.Begin);
            player.Play();
            StopCommand.IsEnabled = true;
            PauseCommand.IsEnabled = true;
            LoadCommand.IsEnabled = false;
        }
    }

    private IWaveProvider CreateReader()
    {
        if (reader is RawSourceWaveStream)
        {
            reader.Position = 0;
            return reader;
        }
        reader = new MediaFoundationReaderUniversal(selectedStream);
        return reader;
    }        

    private void Record()
    {
        if (recorder == null)
        {
            recorder = new WasapiCaptureRT();
            recorder.RecordingStopped += RecorderOnRecordingStopped;
            recorder.DataAvailable += RecorderOnDataAvailable;               
        }

        if (reader != null)
        {
            reader.Dispose();
            reader = null;
        }
        
        recorder.StartRecording();

        RecordCommand.IsEnabled = false;
        StopRecordingCommand.IsEnabled = true;
    }   

   

    private async void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
    {
        if (reader == null)
        {
            recordStream = new MemoryStream();
            reader = new RawSourceWaveStream(recordStream, recorder.WaveFormat);                
        }      
 
        await recordStream.WriteAsync(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);                      
    }

    private void StopRecording()
    {
        recorder?.StopRecording();
    }

    private void RecorderOnRecordingStopped(object sender, StoppedEventArgs stoppedEventArgs)
    {
        RecordCommand.IsEnabled = true;
        StopRecordingCommand.IsEnabled = false;            
        PlayCommand.IsEnabled = true;    
    }


    private void PlayerOnPlaybackStopped(object sender, StoppedEventArgs stoppedEventArgs)
    {
        LoadCommand.IsEnabled = true;
        StopCommand.IsEnabled = false;
        PauseCommand.IsEnabled = false;
        if (reader != null)
        {
            reader.Position = 0;
        }
    }

    private async void Load()
    {
        if (player != null)
        {
            player.Dispose();
            player = null;
        }
        reader = null; // will be disposed by player

        var picker = new FileOpenPicker();
        picker.SuggestedStartLocation = PickerLocationId.MusicLibrary;
        picker.FileTypeFilter.Add("*");
        var file = await picker.PickSingleFileAsync();
        if (file == null) return;
        var stream = await file.OpenAsync(FileAccessMode.Read);
        if (stream == null) return;
        selectedStream = stream; 
        PlayCommand.IsEnabled = true;
    }

    public DelegateCommand LoadCommand { get; }
    public DelegateCommand PlayCommand { get; }
    public DelegateCommand PauseCommand { get; }
    public DelegateCommand StopCommand { get; }
    public DelegateCommand RecordCommand { get; }
    public DelegateCommand StopRecordingCommand { get; }

    public MediaElement MediaElement { get; set; }
}

}

相关文章

网友评论

      本文标题:NAudio

      本文链接:https://www.haomeiwen.com/subject/udnlaxtx.html