mahno
asked on
Another multimedia question
Hi,
Please tell me, how can I using API functions (mixerXXX) set selection(wave input) to microphone? (Volume control->options->properti es->record ing)
PS: I'm using VC60 (OS Win9x/NT/2k)
Thanks,
mahno
Please tell me, how can I using API functions (mixerXXX) set selection(wave input) to microphone? (Volume control->options->properti
PS: I'm using VC60 (OS Win9x/NT/2k)
Thanks,
mahno
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Ur code doesn't work corretly, but I find way how to solve my problem. Ur code helps me. That is why I can't give grade "A".
Thanks,
mahno
Thanks,
mahno
I don't know why, these code runs ok in my computer, and the dwControlID of MixerLine is acturally zero, and the
mixerGetControlDetails returns S_OK, what happens in ur computer? could you tell me more? and how you solve it?
mixerGetControlDetails returns S_OK, what happens in ur computer? could you tell me more? and how you solve it?
ASKER
As I said on my computer mmr is equal to MMSYSERR_INVALPARAM.
>and how you solve it?
see bellow:
{
HMIXER hMixer;
MIXERLINE MixerLine;
MIXERLINECONTROLS MixerLineControls;
PMIXERCONTROL paMixerControls;
MIXERCONTROLDETAILS MixerControlDetails;
PMIXERCONTROLDETAILS_BOOLE AN pMixerControlDetails_Boole an;
PMIXERCONTROLDETAILS_LISTT EXT pMixerControlDetails_Listt ext;
MIXERCAPS MixerCaps;
MMRESULT mmr;
UINT u,v;
BOOL bFindDst = FALSE;
BOOL bFindCtrl = FALSE;
// Check if mixer exists
if(mixerGetNumDevs() < 1) {
return FALSE;
}
mmr = mixerOpen(&hMixer, 0, 0, 0L, MIXER_OBJECTF_MIXER);
if (mmr != MMSYSERR_NOERROR) {
return FALSE;
}
mmr = mixerGetDevCaps((UINT)hMix er, &MixerCaps, sizeof(MixerCaps));
if (mmr != MMSYSERR_NOERROR) {
mixerClose(hMixer);
return FALSE;
}
for (u = 0; u < MixerCaps.cDestinations; u++) {
MixerLine.cbStruct = sizeof(MixerLine);
MixerLine.dwDestination = u;
MixerLine.dwSource = 0;
// Get information on this line
mmr = mixerGetLineInfo((HMIXEROB J)hMixer, &MixerLine, MIXER_GETLINEINFOF_DESTINA TION);
if (mmr != MMSYSERR_NOERROR) {
mixerClose(hMixer);
return FALSE;
}
if (MixerLine.dwComponentType == MIXERLINE_COMPONENTTYPE_DS T_WAVEIN) { //(MixerLine.dwComponentTy pe == MIXERLINE_COMPONENTTYPE_DS T_VOICEIN)
bFindDst = TRUE;
break;
}
}
if (!bFindDst) {
mixerClose(hMixer);
return FALSE;
}
paMixerControls = new MIXERCONTROL[MixerLine.cCo ntrols];
MixerLineControls.cbStruct = sizeof(MIXERLINECONTROLS);
MixerLineControls.dwLineID = MixerLine.dwLineID;
MixerLineControls.cControl s = MixerLine.cControls;
MixerLineControls.cbmxctrl = sizeof(MIXERCONTROL);
MixerLineControls.pamxctrl = paMixerControls;
// Get the controls for the current destination mixer line
mmr = mixerGetLineControls((HMIX EROBJ)hMix er, &MixerLineControls, MIXER_GETLINECONTROLSF_ALL );
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
mixerClose(hMixer);
return FALSE;
}
for (u = 0; u < MixerLine.cControls; u++) {
if ((paMixerControls[u].dwCon trolType == MIXERCONTROL_CONTROLTYPE_M UX) ||
(paMixerControls[u].dwCont rolType == MIXERCONTROL_CONTROLTYPE_M IXER)) {
bFindCtrl = TRUE;
break;
}
}
if (!bFindCtrl) {
delete paMixerControls;
mixerClose(hMixer);
return FALSE;
}
pMixerControlDetails_Listt ext = new MIXERCONTROLDETAILS_LISTTE XT[MixerLi ne.cChanne ls * paMixerControls[u].cMultip leItems];
MixerControlDetails.cbStru ct = sizeof(MIXERCONTROLDETAILS );
MixerControlDetails.dwCont rolID = paMixerControls[u].dwContr olID;
MixerControlDetails.cChann els = 1;//MixerLine.cChannels;
MixerControlDetails.hwndOw ner = (HWND)paMixerControls[u].c MultipleIt ems;
MixerControlDetails.cbDeta ils = sizeof(MIXERCONTROLDETAILS _LISTTEXT) ;
MixerControlDetails.paDeta ils = pMixerControlDetails_Listt ext;
mmr = mixerGetControlDetails((HM IXEROBJ)hM ixer, &MixerControlDetails, MIXER_GETCONTROLDETAILSF_L ISTTEXT);
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt ext;
mixerClose(hMixer);
return FALSE;
}
pMixerControlDetails_Boole an = new MIXERCONTROLDETAILS_BOOLEA N[MixerLin e.cChannel s * paMixerControls[u].cMultip leItems];
MixerControlDetails.cbStru ct = sizeof(MIXERCONTROLDETAILS );
MixerControlDetails.dwCont rolID = paMixerControls[u].dwContr olID;
MixerControlDetails.cChann els = 1;//MixerLine.cChannels;
MixerControlDetails.hwndOw ner = (HWND)paMixerControls[u].c MultipleIt ems;
MixerControlDetails.cbDeta ils = sizeof(MIXERCONTROLDETAILS _BOOLEAN);
MixerControlDetails.paDeta ils = pMixerControlDetails_Boole an;
mmr = mixerGetControlDetails((HM IXEROBJ)hM ixer, &MixerControlDetails, MIXER_GETCONTROLDETAILSF_V ALUE);
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt ext;
delete pMixerControlDetails_Boole an;
mixerClose(hMixer);
return FALSE;
}
//Set only the microphone or line as input sources
for(v = 0; v < paMixerControls[u].cMultip leItems; v++) {
pMixerControlDetails_Boole an[v].fVal ue = FALSE;
if (pMixerControlDetails_List text[v].dw Param2 == MIXERLINE_COMPONENTTYPE_SR C_MICROPHO NE)
pMixerControlDetails_Boole an[v].fVal ue = TRUE;
}
mmr = mixerSetControlDetails((HM IXEROBJ)hM ixer, &MixerControlDetails, MIXER_SETCONTROLDETAILSF_V ALUE);
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt ext;
delete pMixerControlDetails_Boole an;
mixerClose(hMixer);
return FALSE;
}
delete paMixerControls;
delete pMixerControlDetails_Listt ext;
delete pMixerControlDetails_Boole an;
mixerClose(hMixer);
return TRUE;
}
Regards,
mahno
>and how you solve it?
see bellow:
{
HMIXER hMixer;
MIXERLINE MixerLine;
MIXERLINECONTROLS MixerLineControls;
PMIXERCONTROL paMixerControls;
MIXERCONTROLDETAILS MixerControlDetails;
PMIXERCONTROLDETAILS_BOOLE
PMIXERCONTROLDETAILS_LISTT
MIXERCAPS MixerCaps;
MMRESULT mmr;
UINT u,v;
BOOL bFindDst = FALSE;
BOOL bFindCtrl = FALSE;
// Check if mixer exists
if(mixerGetNumDevs() < 1) {
return FALSE;
}
mmr = mixerOpen(&hMixer, 0, 0, 0L, MIXER_OBJECTF_MIXER);
if (mmr != MMSYSERR_NOERROR) {
return FALSE;
}
mmr = mixerGetDevCaps((UINT)hMix
if (mmr != MMSYSERR_NOERROR) {
mixerClose(hMixer);
return FALSE;
}
for (u = 0; u < MixerCaps.cDestinations; u++) {
MixerLine.cbStruct = sizeof(MixerLine);
MixerLine.dwDestination = u;
MixerLine.dwSource = 0;
// Get information on this line
mmr = mixerGetLineInfo((HMIXEROB
if (mmr != MMSYSERR_NOERROR) {
mixerClose(hMixer);
return FALSE;
}
if (MixerLine.dwComponentType
bFindDst = TRUE;
break;
}
}
if (!bFindDst) {
mixerClose(hMixer);
return FALSE;
}
paMixerControls = new MIXERCONTROL[MixerLine.cCo
MixerLineControls.cbStruct
MixerLineControls.dwLineID
MixerLineControls.cControl
MixerLineControls.cbmxctrl
MixerLineControls.pamxctrl
// Get the controls for the current destination mixer line
mmr = mixerGetLineControls((HMIX
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
mixerClose(hMixer);
return FALSE;
}
for (u = 0; u < MixerLine.cControls; u++) {
if ((paMixerControls[u].dwCon
(paMixerControls[u].dwCont
bFindCtrl = TRUE;
break;
}
}
if (!bFindCtrl) {
delete paMixerControls;
mixerClose(hMixer);
return FALSE;
}
pMixerControlDetails_Listt
MixerControlDetails.cbStru
MixerControlDetails.dwCont
MixerControlDetails.cChann
MixerControlDetails.hwndOw
MixerControlDetails.cbDeta
MixerControlDetails.paDeta
mmr = mixerGetControlDetails((HM
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt
mixerClose(hMixer);
return FALSE;
}
pMixerControlDetails_Boole
MixerControlDetails.cbStru
MixerControlDetails.dwCont
MixerControlDetails.cChann
MixerControlDetails.hwndOw
MixerControlDetails.cbDeta
MixerControlDetails.paDeta
mmr = mixerGetControlDetails((HM
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt
delete pMixerControlDetails_Boole
mixerClose(hMixer);
return FALSE;
}
//Set only the microphone or line as input sources
for(v = 0; v < paMixerControls[u].cMultip
pMixerControlDetails_Boole
if (pMixerControlDetails_List
pMixerControlDetails_Boole
}
mmr = mixerSetControlDetails((HM
if (mmr != MMSYSERR_NOERROR) {
delete paMixerControls;
delete pMixerControlDetails_Listt
delete pMixerControlDetails_Boole
mixerClose(hMixer);
return FALSE;
}
delete paMixerControls;
delete pMixerControlDetails_Listt
delete pMixerControlDetails_Boole
mixerClose(hMixer);
return TRUE;
}
Regards,
mahno
ASKER
Something wrong in:
MixerControlDetails.cbStru
MixerControlDetails.dwCont
MixerControlDetails.cChann
MixerControlDetails.cMulti
MixerControlDetails.cbDeta
MixerControlDetails.paDeta
mmr = mixerGetControlDetails((HM
MIXER_GETCONTROLDETAILSF_L
mmr is equal to MMSYSERR_INVALPARAM
May be the reason is dwControlID (It's equal to 0)
Regards,
mahno