2016-02-07 1 views
1

Есть ли способ установить начальную и конечную точки воспроизведения в NAudio? В настоящее время я использую Timer, чтобы периодически проверять ChannelPosition и вернуть его в исходное положение, когда он достигнет конца. Есть ли лучший способ?Настройка начальных/конечных точек воспроизведения в NAudio

ответ

0

Если вы реализуете свой собственный IWaveProvider, который оборачивает WaveStream вы можете установить CurrentTime на вашем потоке и проверить в Read реализации, если вы прошли окончания. Установив время в базовом потоке обратно к началу, вы можете сделать цикл звукового клика между двумя временными метками.

Реализация класса будет выглядеть следующим образом:

private class StartEndLoopReader:IWaveProvider 
{ 
    private TimeSpan _start; 
    private TimeSpan _end; 
    private WaveStream _stream; 

    public StartEndLoopReader(WaveStream stream, TimeSpan start, TimeSpan end) 
    { 
     _stream = stream; 
     _stream.CurrentTime = start; 
     _start = start; 
     _end = end; 
    } 

    public int Read(byte[] array, int offset, int count) 
    { 
     Debug.WriteLine(_stream.CurrentTime); 
     if (_stream.CurrentTime>_end) 
     { 
      // back to start to loop 
      // if you want to stop here, return 0 instead. 
      _stream.CurrentTime = _start; 
     } 

     return _stream.Read(array, offset, count);  
    } 

    #region IWaveProvider Members 
    public WaveFormat WaveFormat 
    { 
     get { return _stream.WaveFormat; } 
    } 
    #endregion 
} 

Вы можете использовать этот класс следующим образом:

var wo = new NAudio.Wave.WaveOutEvent(); 
var reader = new StartEndLoopReader(
     new WaveFileReader(@"v1.wav"), 
     new TimeSpan(0,0,2), 
     new TimeSpan(0,0,4)); 

wo.Init(reader); 
wo.Play(); 
+0

Простой и элегантный. Спасибо. – dotNET