如何仅使用pjsua2获取设备进行捕获或回放

时间:2018-09-02 15:48:20

标签: c++ pjsua2

我尝试从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

2 个答案:

答案 0 :(得分:2)

您可以检查inputCount内的字段outputCountAudioDevInfo

根据文档:

  

未签名的 inputCount

     

此设备支持的最大输入通道数。如果   值为零,表示该设备不支持输入操作(即   只能播放的设备)。

  

未签名的 outputCount

     

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

因此您可以执行以下操作:

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

答案 1 :(得分: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
}