1

現在のコンピューターのデフォルトのオーディオ録音デバイスの現在の音量を検出したいと考えています。使用する API またはソリューションはありますか?

オーディオ レコーダーを作成していますが、録音前にデフォルトのオーディオ録音デバイスの現在の音量をユーザーに知らせて、オーディオが録音されない問題 (エンド ユーザーがオーディオ録音デバイスをミュートしているなど) を回避できるようにしたいと考えています。

結果がパーセンテージ値の形式で取得できれば (つまり、0% はミュートを意味し、100% は最大音量を意味します)、それは素晴らしいことです!

VSTS 2008 + C# + .Net 3.5 を使用して Windows フォーム アプリケーションを作成しています。

4

2 に答える 2

3

これを行う方法は、を使用してデフォルトのWaveInデバイスを開くことですWaveInOpen。これにより、waveInハンドルが取得されます。次に、ミキサー... APIを使用して、関連するミキサーラインを選択できます。

これは宛先ラインになり、いくつかのコントロール(多くの場合、ミュートとボリューム)があります。これらを設定できる場合があります。ただし、ここで少し複雑になります。宛先に関連付けられた複数の「ソース」もあります(マイク、ライン入力など)。これらもボリュームとミュートおよび他のカスタムコントロールを持つことができます。本当に変更したいコントロールを見つけるために、少し実験する必要があるかもしれません。VistaとXPの両方で確実に機能するコードを思い付くのは難しいと思いました(実際にはサウンドカードドライバーに関係している可能性があります)。

これらすべての関数のマネージラッパーをNAudioで作成しました。これにより、途中で使用できるようになります。これは大まかにあなたがしたいことです:

MixerLine mixerLine;
if (waveInHandle != IntPtr.Zero)
{
    mixerLine = new MixerLine(waveInHandle, 0, MixerFlags.WaveInHandle);
}
else
{
    mixerLine = new MixerLine((IntPtr)waveInDeviceNumber, 0, MixerFlags.WaveIn);
}

foreach (MixerControl control in mixerLine.Controls)
{
    if (control.ControlType == MixerControlType.Volume)
    {
        // this is the volume control of the "destination"
        UnsignedMixerControl volumeControl = (UnsignedMixerControl)control;
        Debug.WriteLine(volumeControl.Percent.ToString());
    }      
}

// to examine the volume controls of the "sources":
if (source.ComponentType == MixerLineComponentType.SourceMicrophone)
{
    foreach (MixerControl control in source.Controls)
    {
        if (control.ControlType == MixerControlType.Volume)
        {
            // this might be the one you want to set
        }
    }
}
于 2009-07-04T06:40:01.293 に答える
1

キャプチャ デバイスの場合、ミキサー ボリュームとエンドポイント ボリュームの両方が、実際のキャプチャ ハードウェアのボリュームを反映します (これにより、AGC を使用するアプリは変更なしで正しく動作します)。

于 2009-07-05T06:44:45.030 に答える