2013-07-18 3 views
0

Я использую NAudio, и сейчас я играю.Воспроизведение с Memorystream, остановка, когда достигнут конца, и начать запись снова

И теперь у меня есть проблема.

Я записываю микрофон в запоминающее устройство.

Когда я нажимаю кнопку, она прекращает запись (чтобы предотвратить запись и чтение одновременно) И играть из этого памятного тома.

Но я не знаю, как это сказать, когда он достиг конца, если начнется снова.

Чтобы после его воспроизведения он снова запишет мой микрофон, и я смогу повторить процесс.

Благодаря

private void play_Click(object sender, EventArgs e) 
     { 
      StreamReader streamu = new StreamReader(waveStream); 


       //waveWriter.Close(); 

       sourceStream.StopRecording(); 
       // Wasout.Dispose(); 
       waveStream.Seek(0, SeekOrigin.Begin); 

       //waveStream.Read(bytes, 0, waveStream.Length); 
       playwave = new NAudio.Wave.RawSourceWaveStream(@waveStream, sourceStream.WaveFormat); 
       waveOut2.Init(playwave); 
       //Aut.InitRecordAndPlayback(playwave, 2, 48000); 
       waveOut2.Play(); 

       if (streamu.EndOfStream) 
       { 
        waveOut2.Dispose(); 
        waveOut2 = new NAudio.Wave.DirectSoundOut(); 
        sourceStream.StartRecording(); 
        Wasout.Init(waveIn); 
        Wasout.Play(); 
       } 


     } 

Это то, что я делаю сейчас, и как вы можете видеть, я бездельничал. И хорошо, он не работает; P

ответ

0

Создайте LoopStream, как этот из NAudioDemo, и передайте в него свой RawSourceWaveStream. (возможно, можно немного упростить, но демонстрирует основную идею)

class LoopStream : WaveStream 
{ 
    WaveStream sourceStream; 

    public LoopStream(WaveStream source) 
    { 
     this.sourceStream = source; 
    } 

    public override WaveFormat WaveFormat 
    { 
     get { return sourceStream.WaveFormat; } 
    } 

    public override long Length 
    { 
     get { return long.MaxValue/32; } 
    } 

    public override long Position 
    { 
     get 
     { 
      return sourceStream.Position; 
     } 
     set 
     { 
      sourceStream.Position = value; 
     } 
    } 

    public override bool HasData(int count) 
    { 
     // infinite loop 
     return true; 
    } 

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     int read = 0; 
     while (read < count) 
     { 
      int required = count - read; 
      int readThisTime = sourceStream.Read(buffer, offset + read, required); 
      if (readThisTime < required) 
      { 
       sourceStream.Position = 0; 
      } 

      if (sourceStream.Position >= sourceStream.Length) 
      { 
       sourceStream.Position = 0; 
      } 
      read += readThisTime; 
     } 
     return read; 
    } 

    protected override void Dispose(bool disposing) 
    { 
     sourceStream.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
+0

Есть ли способ, который может быть написан проще? Это сложно: S Не могу ли я определить, когда он играл до конца, очистить мемостриум и записать еще раз? Спасибо – Zerowalker

+0

Там не так много, просто вырежьте и вставьте этот код в свой проект и вызовите waveOut.Init (новый LoopStream (playWave)); –

+0

На самом деле, я думаю, что, возможно, неправильно понял ваш вопрос. Чтобы определить прекращение воспроизведения, используйте событие PlaybackStopped. Затем вы можете запустить другую запись. –

 Смежные вопросы

  • Нет связанных вопросов^_^