3

我尝试从 pjsua2 获取设备,我得到了所有设备,但没有分成捕获设备和播放设备。

void AudioController::load(){
    Endpoint ep;
    ep.libCreate();
    // Initialize endpoint
    EpConfig ep_cfg;
    ep.libInit( ep_cfg );
    AudDevManager &manager  =  ep.audDevManager();
    manager.refreshDevs();
    this->input.clear();
    const AudioDevInfoVector &list = manager.enumDev();
    for(unsigned int i = 0;list.size() != i;i++){
        AudioDevInfo * info = list[i];
        GtAudioDevice * a = new GtAudioDevice();
        a->name = info->name.c_str();
        a->deviceId = i;
        qDebug() << info->name.c_str();
        qDebug() << info->driver.c_str();
         qDebug() << info->caps;
        this->input.append(a);
    }
    ep.libDestroy();
}

这是我的输出:

Wave mapper
WMME
23
Microfone (Dispositivo de High 
WMME
3
Alto-falantes (Dispositivo de H
WMME
21
4

2 回答 2

2

您可以检查字段inputCountoutputCount内部AudioDevInfo

根据文档:

无符号输入计数

此设备支持的最大输入通道数。如果该值为零,则该设备不支持输入操作(即它是一个仅播放设备)。

无符号输出计数

此设备支持的最大输出通道数。如果该值为零,则该设备不支持输出操作(即它是一个仅输入设备)。

所以你可以做这样的事情:

for(unsigned int i = 0;list.size() != i;i++){
    AudioDevInfo * info = list[i];
    GtAudioDevice * a = new GtAudioDevice();
    a->name = info->name.c_str();
    a->deviceId = i;
    if (info->inputCount > 0) {
        a->captureDevice = true;
    }
    if (info->outputCount > 0) {
        a->playbackDevice = true;
    }
    this->input.append(a);
}

参考:http ://www.pjsip.org/pjsip/docs/html/structpj_1_1AudioDevInfo.htm

于 2018-09-07T07:44:55.187 回答
0

另一种方式,您可以检查字段caps(功能)。像这样的东西:

for (int i = 0; i < list.size(); i++)
{
    AudioDevInfo * info = list[i];
    if ((info.caps & (int)pjmedia_aud_dev_cap.PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY) != 0)
    {
        // Playback devices come here
    }
    if ((info.caps & (int)pjmedia_aud_dev_cap.PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY) != 0)
    {
        // Capture devices come here
    }
}

caps由这些可能的值组合而成:

enum pjmedia_aud_dev_cap {
  PJMEDIA_AUD_DEV_CAP_EXT_FORMAT = 1,
  PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY = 2,
  PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY = 4,
  PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING = 8,
  PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING = 16,
  PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER = 32,
  PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER = 64,
  PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE = 128,
  PJMEDIA_AUD_DEV_CAP_INPUT_SOURCE = 128,
  PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE = 256,
  PJMEDIA_AUD_DEV_CAP_EC = 512,
  PJMEDIA_AUD_DEV_CAP_EC_TAIL = 1024,
  PJMEDIA_AUD_DEV_CAP_VAD = 2048,
  PJMEDIA_AUD_DEV_CAP_CNG = 4096,
  PJMEDIA_AUD_DEV_CAP_PLC = 8192,
  PJMEDIA_AUD_DEV_CAP_MAX = 16384
}
于 2020-03-26T18:10:26.230 回答