C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Программное включение и выключение микрофона.  (Прочитано 11911 раз)
ConfliCt
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 29


« : 03 июня 2009, 15:53:45 »

Давольно интересная тема. Уже болие полутра лет я разбираюсь с API функциями. Накодил множество больших и мелких программ с их применением. И казалось постиг всю их истину. Ну не так, чтобы разбуди и спроси, но... материала накопил много. И тут на днях друг попросил дописть патч к комерческой проге. Прога-патч, должна уложится в три строчки, но я с ужасом понял (пару дней спустя), что написать ее не судьба. Посему прошу вашей помощи:
Прога должна программно включать и выключать микрофон (как это делается в ручную когда вы регулируете громкость через системный трей). Книги по API и ИНЕТ молчит об этой проблеме. Хотя на мой взгляд она решаема. И я знаю что ее кто-то решал.
Прошу, помогите, кто чем сможет.
P.S. Программный запуск панели настройки звука с последующей имитаций нажатий клавиш типа TAB и пробел не предлагать, сам могу рассказать
Записан
Zor
Глобальный модератор
***

Сказали спасибо: +158/-30
Offline Offline

Сообщений: 2946


« Ответ #1 : 03 июня 2009, 17:14:05 »

вот тут хорошо пожевано. лично передирал к себе в прогу - примеры рабочие Улыбка
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=827
Записан
ConfliCt
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 29


« Ответ #2 : 03 июня 2009, 17:24:12 »

Спасибо огромное. Не могли бы выложить кусок кода из вашей программы?
Записан
Zor
Глобальный модератор
***

Сказали спасибо: +158/-30
Offline Offline

Сообщений: 2946


« Ответ #3 : 03 июня 2009, 19:15:39 »

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

+

выводим список всего что есть.
на форме listbox + кнопка. +mmsystem.h

Код:

void __fastcall TForm1::ButtonInfoClick (TObject *Sender)
{
HMIXER mixer;
MIXERCAPS mixercaps;
MIXERLINE mixerline;
int MixerCount;
int Res;

int MixerTypes[20] =
{
MIXERLINE_COMPONENTTYPE_DST_DIGITAL,
MIXERLINE_COMPONENTTYPE_DST_HEADPHONES,
MIXERLINE_COMPONENTTYPE_DST_LINE,
MIXERLINE_COMPONENTTYPE_DST_MONITOR,
MIXERLINE_COMPONENTTYPE_DST_SPEAKERS,
MIXERLINE_COMPONENTTYPE_DST_TELEPHONE,
MIXERLINE_COMPONENTTYPE_DST_UNDEFINED,
MIXERLINE_COMPONENTTYPE_DST_VOICEIN,
MIXERLINE_COMPONENTTYPE_DST_WAVEIN,
MIXERLINE_COMPONENTTYPE_SRC_ANALOG,
MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY,
MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC,
MIXERLINE_COMPONENTTYPE_SRC_DIGITAL,
MIXERLINE_COMPONENTTYPE_SRC_LINE,
MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE,
MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER,
MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER,
MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE,
MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED,
MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT,
};

AnsiString MixerStrTypes[20] =
{
"MIXERLINE_COMPONENTTYPE_DST_DIGITAL",
"MIXERLINE_COMPONENTTYPE_DST_HEADPHONES",
"MIXERLINE_COMPONENTTYPE_DST_LINE",
"MIXERLINE_COMPONENTTYPE_DST_MONITOR",
"MIXERLINE_COMPONENTTYPE_DST_SPEAKERS",
"MIXERLINE_COMPONENTTYPE_DST_TELEPHONE",
"MIXERLINE_COMPONENTTYPE_DST_UNDEFINED",
"MIXERLINE_COMPONENTTYPE_DST_VOICEIN",
"MIXERLINE_COMPONENTTYPE_DST_WAVEIN",
"MIXERLINE_COMPONENTTYPE_SRC_ANALOG",
"MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY",
"MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC",
"MIXERLINE_COMPONENTTYPE_SRC_DIGITAL",
"MIXERLINE_COMPONENTTYPE_SRC_LINE",
"MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE",
"MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER",
"MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER",
"MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE",
"MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED",
"MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT",
};

MixerCount = mixerGetNumDevs();
if (!MixerCount)
  {
  ListBox1->Items->Add("No mixers is system");
  return;
  }

ListBox1->Items->Add("Mixers count = " + IntToStr(MixerCount));

for (int m = 0; m < MixerCount; m++)
  {
  Res = mixerOpen(&mixer, m, 0, 0, 0);
  if (Res == MMSYSERR_NOERROR)
    {
    AnsiString S = "Mixer #" + IntToStr(m);
    Res = mixerGetDevCaps((UINT) mixer, &mixercaps, sizeof(MIXERCAPS));
    if (Res == MMSYSERR_NOERROR) S = S + ", Device = " + mixercaps.szPname;
    ListBox1->Items->Add("");
    ListBox1->Items->Add(S);

    for (int i = 0; i < 20; i++)
      {
      mixerline.cbStruct = sizeof(mixerline);
      mixerline.dwComponentType = MixerTypes[i];

      Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE);
      if (Res == MMSYSERR_NOERROR)
        {
        AnsiString S = "MIXER_GETLINEINFOF_COMPONENTTYPE / " + MixerStrTypes[i] + " / " + mixerline.szName;
        ListBox1->Items->Add(S);
        }
      }

    Res = mixerGetDevCaps((UINT) mixer, &mixercaps, sizeof(MIXERCAPS));
    if (Res == MMSYSERR_NOERROR)
      {
      for (int i = 0; i < (int) mixercaps.cDestinations; i++)
        {
        mixerline.cbStruct = sizeof(mixerline);
        mixerline.dwDestination = i;

        Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_DESTINATION);
        if (Res == MMSYSERR_NOERROR)
          {
          AnsiString S = (AnsiString) "MIXER_GETLINEINFOF_DESTINATION / " + mixerline.szName;
          ListBox1->Items->Add(S);
          }
        }
      }

    mixerClose(mixer);
    }
  }
}


+
управляем микрофоном на указанном миксере:
+mmsystem.h
true - успешно завершено, иначе ошибка.

Код:

bool SetMicrophoneMute (bool AMute)
{
HMIXER mixer;
MIXERLINECONTROLS mxlc;
MIXERCONTROLDETAILS mxcd;
MIXERCONTROL mxc;
MIXERLINE mixerline;
MIXERCONTROLDETAILS_BOOLEAN mcdMute;
int MixerCount;
int Res;

bool Result = false;
int MYMIXERDEVICE = 0; // миксер, где микрофон. может быть 0..n-1 (n - число миксеров в системе)

MixerCount = mixerGetNumDevs();
if (!MixerCount) return Result;

Res = mixerOpen(&mixer, MYMIXERDEVICE, 0, 0, 0);
if (Res == MMSYSERR_NOERROR)
  {
  mixerline.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
  mixerline.cbStruct = sizeof(mixerline);

  Res = mixerGetLineInfo(mixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE);
  if (Res == MMSYSERR_NOERROR)
    {
    ZeroMemory(&mxlc, sizeof(mxlc));
    mxlc.cbStruct = sizeof(mxlc);
    mxlc.dwLineID = mixerline.dwLineID;
    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
    mxlc.cControls = 1;
    mxlc.cbmxctrl = sizeof(mxc);
    mxlc.pamxctrl = &mxc;

    Res = mixerGetLineControls(mixer, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
    if (Res == MMSYSERR_NOERROR)
      {
      ZeroMemory(&mxcd, sizeof(mxcd));
      mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
      mxcd.dwControlID = mxc.dwControlID;
      mxcd.cChannels = 1;
      mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
      mxcd.paDetails = &mcdMute;
      mcdMute.fValue = (AMute) ? 1 : 0;

      Res = mixerSetControlDetails(mixer, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
      if (Res == MMSYSERR_NOERROR) Result = true;
      }
    }

  mixerClose(mixer);
  }

return Result;
}


+
учтите, что номер миксера не фиксирован Улыбка
так что придется переискивать каждый раз заново (ну, это если неск карт в системе)
короче, я предупредил  Веселый
« Последнее редактирование: 03 июня 2009, 19:56:50 от Zor » Записан
Zor
Глобальный модератор
***

Сказали спасибо: +158/-30
Offline Offline

Сообщений: 2946


« Ответ #4 : 03 июня 2009, 19:54:15 »

up
Записан
alt_7
Участник
**

Сказали спасибо: +2/-0
Offline Offline

Сообщений: 30


« Ответ #5 : 05 марта 2015, 07:49:45 »

управляем микрофоном на указанном миксере:

Не совсем понял как можно управлять, если не сложно подскажите.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: