2009-07-04 4 views
1

Я хочу определить текущий том для устройства записи звука по умолчанию на текущем компьютере. Есть ли какой-либо API для использования или решений?Как определить текущий объем аудиоустройства

Я пишу аудиомагнитофон, и перед записью хочу сообщить пользователю текущий том для устройства записи звука по умолчанию, чтобы мы могли избежать проблемы с записью без звука (например, у конечного пользователя есть устройство записи звука приглушенный).

Если результат может быть получен в формате процентного значения (т. Е. 0% означает отключение звука, а 100% означает максимальный объем), это было бы здорово!

Я использую VSTS 2008 + C# + .Net 3.5 для записи приложения Windows Forms.

ответ

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 
     } 
    } 
} 
1

Для устройств захвата, объем смесителя и объем конечных точек и отражают объем фактического устройства захвата (это позволяет приложениям, которые используют АРУ корректно работать без изменений).

Смежные вопросы