2013-07-27 1 views
-1

지정된 볼륨과 주파수에서 사운드를 재생하고 싶지만 재생 지속 시간을 2 초로 고정하고 싶습니다.NAudio에서 WaveTone()으로 생성 한 사운드 (톤) 지정

내 코드는 여기에있는 코드와 유사합니다.

  double freq, volume; 
      WaveTone tone = new WaveTone(freq, volume); 
      stream = new BlockAlignReductionStream(tone); 
      output = new DirectSoundOut(); 
      output.Init(stream); 
      output.Play(); 

위의 DirectSoundOut()에서 대기 시간을 사용하려고했지만 원하는대로 작동하지 않았습니다. 각 재생마다 주파수와 볼륨을 동적으로 변경해야합니다.

정확한 음의 재생 지속 시간을 알아야합니다.

+0

유사하거나 당신의 코드는? Google을 검색 했습니까? – wudzik

+0

@wudzik 물론 내 코드와 유사합니까? 이제 저를 도울 수 있습니까? 아니면 질문에 대한 답변으로 질문을 할 수 있습니까? 어쨌든 시간을 절약하기 위해 고마워요. –

+0

그래서 실제 코드를 붙여 넣으시겠습니까? 소중한 시간을 낭비해서 죄송합니다.하지만 좋은 질문을하면 많은 시간을 절약 할 수 있습니다. http://stackoverflow.com/questions/5485577/c-sharp-naudio-playing-sine-wave-for-x-milliseconds?rq=1 여기서 naudio에 시간을 보낼 수 없다는 것을 알 수 있습니다. – wudzik

답변

0

클래스 (제가 방금 봤던 것 중 하나를 사용한다고 가정)는 아마도 무한한 데이터 스트림을 제공합니다. 출력을 특정 기간으로 제한하려면 특정 양의 데이터를 다른 버퍼/스트림으로로드하거나 WaveTone 클래스를 수정하여 기간 이후의 데이터 생성을 중지해야합니다. 이 같은

뭔가 :

class WaveTone : WaveStream 
{ 
    readonly WaveFormat Format; 
    public readonly double Frequency; 
    public readonly double Amplitude; 
    public readonly double Duration; 

    readonly long streamLength; 

    long pos; 

    const double timeIncr = 1/44100.0; 
    readonly double sinMult; 

    public WaveTone(double freq, double amp) 
     : this(freq, amp, 0) 
    { } 

    public WaveTone(double freq, double amp, double dur) 
    { 
     Format = new WaveFormat(44100, 16, 1); 
     Frequency = freq; 
     Amplitude = Math.Min(1, Math.Max(0, amp)); 
     Duration = dur; 

     streamLength = Duration == 0 ? long.MaxValue : (long)(44100 * 2 * Duration); 

     pos = 0; 

     sinMult = Math.PI * 2 * Frequency; 
    } 

    public override WaveFormat WaveFormat 
    { 
     get { return Format; } 
    } 

    public override long Length 
    { 
     get { return streamLength; } 
    } 

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

    public override int Read(byte[] buffer, int offset, int count) 
    { 
     if (pos >= streamLength) 
      return 0; 
     int nSamples = count/2; 
     if ((pos + nSamples * 2) > streamLength) 
      nSamples = (int)(streamLength - pos)/2; 

     double time = pos/(44100 * 2.0); 
     int rc = 0; 
     for (int i = 0; i < nSamples; i++, time += timeIncr, ++rc, pos += 2) 
     { 
      double val = Amplitude * Math.Sin(sinMult * time); 
      short sval = (short)(Math.Round(val * (short.MaxValue - 1))); 
      buffer[offset + i * 2] = (byte)(sval & 0xFF); 
      buffer[offset + i * 2 + 1] = (byte)((sval >> 8) & 0xFF); 
     } 

     return rc * 2; 
    } 
}