0

AudioMeterInformation を表示するには?

Windows 7 で Windows の [Playback and Recording devices] ダイアログを開くときと同様に、デフォルトのキャプチャ デバイスと出力デバイスのメータリングを表示する必要があります。

naudio という名前の Windows コア オーディオのラッパーであるオープン ソース API が利用可能です。提供されている例では、WaveIn デバイスを使用してサウンド サンプルを収集し、計測情報を生成しています。

WaveIn = new WaveIn { DeviceNumber = 0 };
WaveIn.DataAvailable += OnDataAvailable;
WaveIn.RecordingStopped += OnRecordingStopped;
WaveIn.WaveFormat = new WaveFormat(44100, 1);

public virtual void OnDataAvailable(object sender, WaveInEventArgs e)
{
    byte[] buffer = e.Buffer;
    for (int index = 0; index < e.BytesRecorded; index += 2)
    {
        short sample = (short)((buffer[index + 1] << 8) | buffer[index + 0]);
        float sample32 = sample / 32768f;
        SampleAggregator.Add(sample32);
    }
}

public class SampleAggregator
{
    // volume
    private int Count { get; set; }

    public float MaxValue { get; set; }
    public float MinValue { get; set; }
    public int NotificationCount { get; set; }
    public event EventHandler<MaxSampleEventArgs> MaximumCalculated;
    public event EventHandler Restart = delegate { };

    public void RaiseRestart()
    {
        Restart(this, EventArgs.Empty);
    }

    private void Reset()
    {
        Count = 0;
        MaxValue = MinValue = 0;
    }

    public void Add(float value)
    {
        MaxValue = Math.Max(MaxValue, value);
        MinValue = Math.Min(MinValue, value);

        Count++;

        if (Count >= NotificationCount && NotificationCount > 0)
        {
            if (MaximumCalculated != null)
            {
                MaximumCalculated(this, new MaxSampleEventArgs(MinValue, MaxValue));
            }

            Reset();
        }
    }
}

サンプルを取得することは、AudioMeterInformation が利用できない Windows XP では理にかなっています。デバイスからサンプルを取得せずに AudioMeterInformation を表示するのを手伝ってくれる人はいますか?

4

1 に答える 1

0

CoreAudioApi ( CodeProject の記事) を試してください。

MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
MMDevice defaultDevice = 
  devEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);

// Call this line as often as you need.
int level = defaultDevice.AudioMeterInformation.MasterPeakValue;
于 2012-07-26T17:58:49.157 に答える