클래스 (제가 방금 봤던 것 중 하나를 사용한다고 가정)는 아마도 무한한 데이터 스트림을 제공합니다. 출력을 특정 기간으로 제한하려면 특정 양의 데이터를 다른 버퍼/스트림으로로드하거나 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;
}
}
유사하거나 당신의 코드는? Google을 검색 했습니까? – wudzik
@wudzik 물론 내 코드와 유사합니까? 이제 저를 도울 수 있습니까? 아니면 질문에 대한 답변으로 질문을 할 수 있습니까? 어쨌든 시간을 절약하기 위해 고마워요. –
그래서 실제 코드를 붙여 넣으시겠습니까? 소중한 시간을 낭비해서 죄송합니다.하지만 좋은 질문을하면 많은 시간을 절약 할 수 있습니다. http://stackoverflow.com/questions/5485577/c-sharp-naudio-playing-sine-wave-for-x-milliseconds?rq=1 여기서 naudio에 시간을 보낼 수 없다는 것을 알 수 있습니다. – wudzik