Во-первых, обратите внимание, что я знаю, что уже есть несколько вопросов, подобных этому; Однако они
кажется, не решить проблему адекватно. У меня есть приложение C # со всеми хуками pInvoke для связи с API WaveXXX, и я могу делать захват и воспроизведение из
аудио с этим. Я также могу настроить громкость динамика (WaveOut) с помощью этого API.
Проблема в том, что по какой-то причине этот API не позволяет мне настраивать микрофон
(WaveIn) громкость. Итак, мне удалось найти код микшера, который я также извлек и
доступ через pInvoke и это позволяет мне регулировать громкость микрофона, но только на моем ПК W7. Код микшера, с которого я начал, взят отсюда:
http://social.msdn.microsoft.com/Forums/en-US/isvvba/thread/05dc2d35-1d45-4837-8e16-562ee919da85
и это работает, но написано для регулировки громкости динамика. Я добавил метод SetMicVolume
показано здесь ...
public static void SetMicVolume(int mxid, int percentage)
{
bool rc;
int mixer, vVolume;
MIXERCONTROL volCtrl = new MIXERCONTROL();
int currentVol;
mixerOpen(out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN);
int type = MIXERCONTROL_CONTROLTYPE_VOLUME;
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
{
mixerClose(mixer);
mixerOpen(out mixer, 0, 0, 0, 0);
rc = GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, type, out volCtrl, out currentVol);
if (rc == false)
throw new Exception("SetMicVolume/GetVolumeControl() failed");
}
vVolume = ((int)((float)(volCtrl.lMaximum - volCtrl.lMinimum) / 100.0F) * percentage);
rc = SetVolumeControl(mixer, volCtrl, vVolume);
if (rc == false)
throw new Exception("SetMicVolume/SetVolumeControl() failed");
mixerClose(mixer);
}
Обратите внимание на «вторую попытку» вызвать GetVolumeControl (). Это сделано потому, что в XP при первом вызове GetVolumeControl (см. Сайт выше для этого кода) происходит сбой вызова mixerGetLineControlsA (), а системы XP возвращают MIXERR_INVALCONTROL. Затем, со второй попыткой использования mixerOpen (out mixer, 0, 0, 0, 0), код не возвращает ошибку, но усиление микрофона не изменяется. Обратите внимание, как я уже говорил выше, это работает на W7 (вторая попытка никогда не выполняется, потому что она не завершается с помощью mixerOpen (out mixer, mxid, 0, 0, MIXER_OBJECTF_WAVEIN)).
Я признаю, что не очень хорошо разбираюсь в API микшера, так что сейчас я в этом разбираюсь; Однако, если кто-нибудь знает, почему это будет работать на W7, но не на XP, я бы хотел это услышать. Между тем, если я выясню это до того, как получу ответ, я опубликую свой собственный ответ ...