2015-06-14 29 views
1

我用n音讯在指定的频率一样,产生口气:信号发生器类 - 持续时间玩

private void gen_Sinus(double frequency) 
    { 
     WaveOut _myWaveOut = new WaveOut(); 

     SignalGenerator mySinus = new SignalGenerator(44100, 1);//using NAudio.Wave.SampleProviders; 
     mySinus.Frequency = frequency; 
     mySinus.Type = SignalGeneratorType.Sin; 
     _myWaveOut.Init(mySinus); 
     _myWaveOut.Play(); 
    } 

我想在点击一个按钮时,将播放音特定时间会传递给这个方法。让我们把它叫做例如:

double toneDuration 

我更喜欢防止一些睡眠的方法,因为它必须尽可能准确。

回答

2

您可以使用OffsetSampleProvider要做到这一点,并设置Take时间:

var trimmed = new OffsetSampleProvider(signalGenerator); 
trimmed.Take = TimeSpan.FromSeconds(10); 
waveOut.Init(trimmed); 
waveOut.Play(); 
+0

伟大的解决方案,谢谢! – axcelenator

+0

你好,有没有类或照顾频率转换的使用超过1个singalGenerator的情况下别的东西? – axcelenator

1

使用一个计时器,并等待处理

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      timer1.Tick += new EventHandler(timer1_Tick); 
     } 
     static AutoResetEvent autoEvent = new AutoResetEvent(false); 

     private void gen_Sinus(double frequency) 
     { 
      WaveOut _myWaveOut = new WaveOut(); 

      SignalGenerator mySinus = new SignalGenerator(44100, 1);//using NAudio.Wave.SampleProviders; 
      mySinus.Frequency = frequency; 
      mySinus.Type = SignalGeneratorType.Sin; 
      _myWaveOut.Init(mySinus); 

      timer1.Interval = 5000; 
      timer1.Start() 

      _myWaveOut.Play(); 
      autoEvent.Reset(); 
      autoEvent.WaitOne(); 
      _myWaveOut.Stop(); 
     } 
     private void timer1_Tick(object sender, EventArgs e) 
     { 
      autoEvent.Set(); 

     } 
    } 
} 
​ 
+0

你好,我使用WPF,我在哪里需要声明timer1对象? – axcelenator

+0

参见以下网页:https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx – jdweng

+0

您好感谢您的链接。我看到如果我使用WPF“timer”类,那么称为dispatcherTimer。它是一样的吗? – axcelenator