Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: Firefox от Ноябрь 29, 2012, 14:57



Название: подключение микрофона и линейного входа.
Отправлено: Firefox от Ноябрь 29, 2012, 14:57
Здравствуйте. у меня встала задача записи звука с микрофона или линейного входа.причем надо четко разделять. то есть типа такого:если нажали одну кнопки пиши с микрофона, другую пиши с линейного входа.Проблема появилась вот в чем: в Windows 7 если по умолчанию в системе стоит линейный вход то и писаться будет с него. а если надо с микрофона, то либо надо сделать его устройством по умолчанию либо точно знать GUID микрофона. как на разных звуковых картах определить этот идентификатор микрофона пока мне не понятно. не нашла в структурах никаких параметров которые бы точно указывали на принадлежность линии микшера микрофону. поэтому решила менять состояние "по умолчанию" в системе. кое что тут навояла, но пока не понятно как именно отправить сообщение линии микшера, то есть не понятно само сообщение, что в него писать.
Код:
HMIXER mixer;
MIXERCAPS mixercaps;
MIXERLINE mixerline;
MIXERLINECONTROLS mix_line_ctrl;
MIXERCONTROLDETAILS WOVolDet;
MIXERCONTROLDETAILS_BOOLEAN mixer_ctrl_bool;
int MixerCount;
int Res;


QString 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();
QString ttt,jjj,kkk;
if (!MixerCount)
{
ttt="No mixers is system";
ui.textEdit->setText(ttt);
return;
}
ttt="Mixers count = " + jjj.setNum(MixerCount)+"\n";
ui.textEdit->setText(ttt);

for (int m = 0; m < MixerCount; m++)
{
Res = mixerOpen(&mixer, m, 0, 0, 0);
if (Res == MMSYSERR_NOERROR)
{
ttt+= "Mixer #" + jjj.setNum(m);
Res = mixerGetDevCaps((UINT) mixer, &mixercaps, sizeof(MIXERCAPS));
if (Res == MMSYSERR_NOERROR)
{
//вывод информации для удобства
kkk="";
for(int y=0;y<MIXER_LONG_NAME_CHARS,mixercaps.szPname[y]!='\0';y++)
kkk+=mixercaps.szPname[y];
ttt += ", Device = " + kkk+"\n";
}
ui.textEdit->setText(" ");
mixerline.cbStruct = sizeof(mixerline);
mixerline.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;

Res = mixerGetLineInfo((HMIXEROBJ)mixer, &mixerline, MIXER_GETLINEINFOF_COMPONENTTYPE);
if (Res == MMSYSERR_NOERROR)
{
jjj="MIXERLINE_COMPONENTTYPE_DST_WAVEIN";
kkk="";
for(int y=0;y<MIXER_LONG_NAME_CHARS;y++)
kkk+=mixerline.szName[y];
ttt+="*****MIXER_GETLINEINFOF_COMPONENTTYPE/ " +  jjj+ "*****" +"\n";

mix_line_ctrl.dwControlType=MIXERCONTROL_CONTROLTYPE_MIXER/*MIXERCONTROL_CONTROLTYPE_BOOLEAN*/;
mix_line_ctrl.cControls=1;
mix_line_ctrl.dwLineID=mixerline.dwLineID;
mix_line_ctrl.cbStruct=sizeof(mix_line_ctrl);
Res = mixerGetLineControls ((HMIXEROBJ)mixer,&mix_line_ctrl,MIXER_GETLINECONTROLSF_ONEBYTYPE);

mixer_ctrl_bool.fValue=true;
WOVolDet.cbStruct=sizeof(WOVolDet);
WOVolDet.dwControlID=mix_line_ctrl.dwControlID;
WOVolDet.cChannels=1;
WOVolDet.cbDetails=sizeof(MIXERCONTROLDETAILS_BOOLEAN);
//WOVolDet.paDetails=sizeof(MIXERCONTROLDETAILS_BOOLEAN)*1;
WOVolDet.cMultipleItems=0;
                                //
mixerSetControlDetails ((HMIXEROBJ)mixer,&WOVolDet,MIXER_GETCONTROLDETAILSF_VALUE);
                                // - не уверена что функция правильно заполнена (mixerSetControlDetails)
//mixerMessage ((HMIXEROBJ)mixer, UINT Msg, DWORD P1, DWORD P2); - что надо писать в
                                  //UINT Msg, DWORD P1, DWORD P2 не понятно

}
подскажите по поводу косяков в коде пожалуйста.


Название: Re: подключение микрофона и линейного входа.
Отправлено: xokc от Ноябрь 30, 2012, 10:54
Универсальное решение подсказать невозможно - многое зависит от версии ОС (XP, 7, восемь) и используемого API (MME, DirectSound, ASIO, WDM_KS). Кроме того, на некоторых платах вовсе нет линейного входа или он общий между линейным и микрофоном. В общем, не имея опыта в программировании звука под Windows утоните в управлении микшером. Я бы для начала выбрал одну их универсальных библиотек (portaudio, RtAudio) для работы со звуком, добавил бы в настройки программы параметры: "устройство для ввода с микрофона" и "устройство для ввода с linein) и уже имея их deviceid использовать их при нажатиях на соответствующие кнопки.