Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 映射ISPMMSSASUDIO::SetLineId和mixerLineId_C++_Windows_Speech Recognition_Sapi_Mixer - Fatal编程技术网

C++ 映射ISPMMSSASUDIO::SetLineId和mixerLineId

C++ 映射ISPMMSSASUDIO::SetLineId和mixerLineId,c++,windows,speech-recognition,sapi,mixer,C++,Windows,Speech Recognition,Sapi,Mixer,我想通过调用ISPMMSSASUDIO::SetLineId为SAPI设置lineId。 我从我拥有的混音器手柄中找出我想要设置的线。 但是,我从混合器中获得的行id不是SAPI假定的。信息技术 导致SAPI监听错误的麦克风输入线,从而导致 没有输入 我正在为“DST_WAVEIN”的混音器手柄和 然后检查麦克风的哪个源线处于活动状态。我想 将激活线路设置为SAPI的“输入” 我通过枚举MUX控件从混合器中获取行Id,如下所示: int GetSelectedWaveInLine(UINT uM

我想通过调用ISPMMSSASUDIO::SetLineId为SAPI设置lineId。 我从我拥有的混音器手柄中找出我想要设置的线。 但是,我从混合器中获得的行id不是SAPI假定的。信息技术 导致SAPI监听错误的麦克风输入线,从而导致 没有输入

我正在为“DST_WAVEIN”的混音器手柄和 然后检查麦克风的哪个源线处于活动状态。我想 将激活线路设置为SAPI的“输入”

我通过枚举MUX控件从混合器中获取行Id,如下所示:

int GetSelectedWaveInLine(UINT uMixrId) { int-iRetVal=-1; MMRESULT MMRESULT; HMIXER dwMixerHandle

mmResult = mixerOpen( (LPHMIXER)&dwMixerHandle, uMixrId, 0L, 0L, 0L);
if (MMSYSERR_NOERROR != mmResult)
{   
    LOG_ERROR("FAILURE: Could not Open mixer, with id: %d. mmResult=%d",uMixrId, mmResult );
    return  -1;
}

MIXERLINE MixerLine;
memset( &MixerLine, 0, sizeof(MIXERLINE) );
MixerLine.cbStruct = sizeof(MIXERLINE);
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
mmResult = mixerGetLineInfo( (HMIXEROBJ)dwMixerHandle, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE );
if (MMSYSERR_NOERROR != mmResult)
{
    mixerClose( (HMIXER)dwMixerHandle );
    LOG_ERROR("FAILURE: Could not get WaveIn Destionation Line for the requested source while enumerating. mmResult=%d", mmResult );
    return -1;
}

// get the MUX
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = MixerLine.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
mmResult = ::mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(uMixrId),
                           &mxlc,
                           MIXER_OBJECTF_HMIXER |
                           MIXER_GETLINECONTROLSF_ONEBYTYPE);
if (MMSYSERR_NOERROR != mmResult)
{
    LOG_INFO0("Could not get Mux control for waveIn line. Get selected id");
    mixerClose( (HMIXER)dwMixerHandle );
    return -1;
}
LOG_INFO("Got mux controls. Total lines associated with mux = %d", mxc.cMultipleItems); 

// from the MUX get as many lines for "MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE" {from dwParam1/dwParam2 }
// then get the boolean control for the line and return the one currently selected
MIXERCONTROLDETAILS_LISTTEXT *pmxcdSelectText = new MIXERCONTROLDETAILS_LISTTEXT[mxc.cMultipleItems];
if (pmxcdSelectText != NULL)
{
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = mxc.dwControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = mxc.cMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_LISTTEXT);
    mxcd.paDetails = pmxcdSelectText;
    if (::mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(uMixrId),
                                 &mxcd,
                                 MIXER_OBJECTF_HMIXER |
                                 MIXER_GETCONTROLDETAILSF_LISTTEXT)
        != MMSYSERR_NOERROR)
    {
        delete []pmxcdSelectText;
        mixerClose( (HMIXER)dwMixerHandle );
        return -1;
    }
}

//get all the boolean values for the mux
MIXERCONTROLDETAILS_BOOLEAN *pmxcdSelectValue = new MIXERCONTROLDETAILS_BOOLEAN[mxc.cMultipleItems];
if (pmxcdSelectValue != NULL)
{
    MIXERCONTROLDETAILS mxcd;
    mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
    mxcd.dwControlID = mxc.dwControlID;
    mxcd.cChannels = 1;
    mxcd.cMultipleItems = mxc.cMultipleItems;
    mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
    mxcd.paDetails = pmxcdSelectValue;
    if (::mixerGetControlDetails(reinterpret_cast<HMIXEROBJ>(uMixrId),
                                 &mxcd,
                                 MIXER_OBJECTF_HMIXER |
                                 MIXER_GETCONTROLDETAILSF_VALUE)
        != MMSYSERR_NOERROR)
    {
        delete []pmxcdSelectValue;
        mixerClose( (HMIXER)dwMixerHandle );
        return -1;
    }
}

for (int i = 0; i < mxc.cMultipleItems; i++)
{
    if(/*(pmxcdSelectText[i].dwParam2 == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE) && */pmxcdSelectValue[i].fValue)
    {
        LOG_INFO("Got SELECTED microphone source line. Line index = %d, Line name = %s",i,pmxcdSelectText[i].szName);   
        iRetVal  = i;
        break;
    }
}
//LOG_INFO("Got mux controls. Total lines associated with mux = %d", mxc.cMultipleItems);   
delete []pmxcdSelectText;
delete []pmxcdSelectValue;
mixerClose( (HMIXER)dwMixerHandle );
return iRetVal;
mmResult=mixerOpen((LPHMIXER)和dwMixerHandle、uMixrId、0L、0L);
如果(MMSYSERR\u NOERROR!=mmResult)
{   
日志_错误(“失败:无法打开混音器,id为:%d.mmResult=%d”,uMixrId,mmResult);
返回-1;
}
混合线混合线;
memset(&MixerLine,0,sizeof(MixerLine));
MixerLine.cbStruct=sizeof(MixerLine);
MixerLine.dwComponentType=MixerLine_COMPONENTTYPE_DST_WAVEIN;
mmResult=mixerGetLineInfo((HMIXEROBJ)dwMixerHandle和MixerLine,MIXER\u GETLINEINFOF\u COMPONENTTYPE);
如果(MMSYSERR\u NOERROR!=mmResult)
{
mixerClose((HMIXER)dwMixerHandle);
日志_错误(“失败:枚举时无法获取请求源的WaveIn目标行。mmResult=%d”,mmResult);
返回-1;
}
//获取多路复用器
混频器控制mxc;
混频器线性控制mxlc;
mxlc.cbStruct=sizeof(MIXERLINECONTROLS);
mxlc.dwLineID=MixerLine.dwLineID;
mxlc.dwControlType=MIXERCONTROL\u CONTROLTYPE\u MUX;
mxlc.cControl=1;
mxlc.cbmxctrl=sizeof(混合控制);
mxlc.pamxctrl=&mxc;
mmResult=::mixerGetLineControls(重新解释强制转换(uMixrId),
&mxlc,
混音器|
混合器\u GETLINECONTROLSF\u按类型);
如果(MMSYSERR\u NOERROR!=mmResult)
{
LOG_INFO0(“无法获取waveIn line的Mux控制。获取所选id”);
mixerClose((HMIXER)dwMixerHandle);
返回-1;
}
日志信息(“已获取mux控件。与mux关联的行总数=%d”,mxc.cMultipleItems);
//从多路复用器获取“混音器线路\组件类型\ SRC\麦克风”{来自dwParam1/dwParam2}的尽可能多的线路
//然后获取该行的布尔控件并返回当前选定的控件
MIXERCONTROLDETAILS_LISTTEXT*pmxcdSelectText=新的MIXERCONTROLDETAILS_LISTTEXT[mxc.cMultipleItems];
如果(pmxcdSelectText!=NULL)
{
混合器控制细节mxcd;
mxcd.cbStruct=sizeof(混合器控制细节);
mxcd.dwControlID=mxc.dwControlID;
mxcd.c通道=1;
mxcd.cMultipleItems=mxc.cMultipleItems;
mxcd.cbDetails=sizeof(MIXERCONTROLDETAILS\u LISTTEXT);
mxcd.paDetails=pmxcdSelectText;
如果(::mixerGetControlDetails(重新解释强制转换(uMixrId)),
&mxcd,
混音器|
混音器\u GETCONTROLDETAILSF\u LISTTEXT)
!=MMSYSERR\u NOERROR)
{
删除[]pmxcdSelectText;
mixerClose((HMIXER)dwMixerHandle);
返回-1;
}
}
//获取mux的所有布尔值
MIXERCONTROLDETAILS_BOOLEAN*pmxcdSelectValue=新的MIXERCONTROLDETAILS_BOOLEAN[mxc.cMultipleItems];
如果(pmxcdSelectValue!=NULL)
{
混合器控制细节mxcd;
mxcd.cbStruct=sizeof(混合器控制细节);
mxcd.dwControlID=mxc.dwControlID;
mxcd.c通道=1;
mxcd.cMultipleItems=mxc.cMultipleItems;
mxcd.cbDetails=sizeof(MIXERCONTROLDETAILS\u布尔值);
mxcd.paDetails=pmxcdSelectValue;
如果(::mixerGetControlDetails(重新解释强制转换(uMixrId)),
&mxcd,
混音器|
混合器\u GETCONTROLDETAILSF\u值)
!=MMSYSERR\u NOERROR)
{
删除[]pmxcdSelectValue;
mixerClose((HMIXER)dwMixerHandle);
返回-1;
}
}
对于(int i=0;i
}

混合器返回的索引与ISpMMSysAudio使用的索引不匹配。我的语音引擎会选择不同的线路ID


感谢

ispmmsasaudio::SetLineId实际上指定了混音器索引,而不是行ID(我知道这很混乱)。因此,您要做的是枚举混音器行以找到与行ID对应的索引,然后返回索引