NAudio を使用してピーク ボリューム メーターを作成しようとしています。私のコードはhttp://channel9.msdn.com/coding4fun/articles/NET-Voice-Recorderと非常によく似ていますが、私のコードとリンクされた Voice Recorder プロジェクトの両方に問題があります。
周波数と音量が一定のサウンドを再生する場合、音量メーターは最初は妥当なレベルで始まりますが、その後非常に小さな値に減衰します。NAudioDemo のピーク ボリューム メーターはこれを行わないため、なぜそうなるのかはわかりません。私のプログラムで NAudioDemo からコードを複製しようとしましたが、ピーク ボリューム メーター コードを含むコード ファイルを見つけることができませんでした。
誰かがピーク ボリューム メーターを作成するための代替ソリューションを案内してくれたり、私のソリューション (およびリンクで提供されているソリューション) の両方が機能しない理由を判断するのに役立ちますか?
public MainWindow()
{
int waveInDevices = WaveIn.DeviceCount;
for (int waveInDevice = 0; waveInDevice < waveInDevices; waveInDevice++)
{
WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(waveInDevice);
Console.WriteLine("Device {0}: {1}, {2} channels",
waveInDevice, deviceInfo.ProductName, deviceInfo.Channels);
WaveIn waveIn = new WaveIn();
waveIn.DeviceNumber = 0; //TODO: Let the user choose which device, this comes from the device numbers above
waveIn.DataAvailable += waveIn_DataAvailable;
int sampleRate = SAMPLE_RATE; // 8 kHz
int channels = 1; // mono
waveIn.WaveFormat = new WaveFormat(sampleRate, channels);
waveIn.StartRecording();
}
}
void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
for (int index = 0; index < e.BytesRecorded; index += 2)
{
short sample = (short)((e.Buffer[index + 1] << 8) |
e.Buffer[index + 0]);
float sample32 = sample / 32768f;
ProcessSample(sample32);
}
}
void ProcessSample(float sample1)
{
samplenumber += 1;
if (sample1 > maxval)
{
maxval = sample1;
}
if (sample1 < minval)
{
minval = sample1;
}
//Run updateView every few loops
if (samplenumber > (double)SAMPLE_RATE / DISPLAY_UPDATE_RATE)
{
samplenumber = 0;
updateView(); //needs to be fast!
}
}
void updateView()
{
Console.WriteLine(maxval);
Console.WriteLine(minval);
progressBar1.Value = (maxval - minval)*50;
maxval = 0;
minval = 0;
}