首页 > 解决方案 > 通过 PJSIP 使用两个声音设备

问题描述

这是我的问题:我想用 PJSIP 开发一个 SIP 客户端,更准确地说是用 PJSUA。有了这个 SIP 客户端,我希望能够通过三种不同的方式从呼叫中输出声音。

  1. 仅在我的耳机内部
  2. 仅在我的扬声器上
  3. 在我的耳机内和我的扬声器上同时

下面是我尝试过的代码示例:

int listeningMethod = message[0];
pjmedia_aud_dev_route media;
switch (listeningMethod) {
case (int)EnumListeningDevice::SPEAKER:
    printf("Operator asked for SPEAKER\r\n");
    media = PJMEDIA_AUD_DEV_ROUTE_LOUDSPEAKER;
    int idMicro;
    int idOutput;
    if (pjsua_get_snd_dev(&idMicro, &idOutput) == -1) {
        printf("Error pjsua_get_snd_dev\r\n");
    }
    idOutput = obj_PJSIP_Phonie.getIdLoudspeaker();
    if (pjsua_set_snd_dev(idMicro, idOutput) != PJ_SUCCESS) {
        printf("Error pjsua_set_snd_dev ID OUTPUT = %d\r\n", idOutput);
    }
    break;
case (int)EnumListeningDevice::HEADSET:
    media = PJMEDIA_AUD_DEV_ROUTE_EARPIECE;
    printf("Operator asked for HEADSET\r\n");
    if (pjsua_get_snd_dev(&idMicro, &idOutput) == -1) {
        printf("Error pjsua_get_snd_dev\r\n");
    }
    idOutput = obj_PJSIP_Phonie.getIdHeadphone();
    if (pjsua_set_snd_dev(idMicro, idOutput) != PJ_SUCCESS) {
        printf("Error pjsua_set_snd_dev ID OUTPUT = %d\r\n", idOutput);
    }
    break;
case (int)EnumListeningDevice::SPEAKER_AND_HEADSET:
    printf("Operator asked for SPEAKER_AND_HEADSET\r\n");
    break;
default:
    printf("Error in request\r\n");
    break;
}

我可以在耳机或扬声器之间切换,但我找不到同时使用这两种设备的方法。

我试图查看pjmedia_snd_port_create_player函数并尝试了这个:

    pjmedia_snd_port* headsetSoundPort;
    pjmedia_snd_port* speakerSoundPort;

    const char* driverNameHeadset = "WMME";
    const char* driverNameSpeaker = "WMME";

    const char* deviceNameHeadset = "Haut-parleurs (4- USB audio COD";
    const char* deviceNameSpeaker = "Haut-parleurs (3- USB audio COD";
    
    pjmedia_aud_dev_index deviceHeadsetIndex;
    pjmedia_aud_dev_index deviceSpeakerIndex;
      
    pjmedia_aud_dev_lookup(driverNameHeadset, deviceNameHeadset, &deviceHeadsetIndex);
    pjmedia_aud_dev_lookup(driverNameSpeaker, deviceNameSpeaker, &deviceSpeakerIndex);

    pjmedia_snd_port_create_player(pool1, deviceHeadsetIndex, 16000, 2, 160, 16, 0, &headsetSoundPort);

    pjmedia_snd_port_create_player(pool1, deviceHeadsetIndex, 16000, 2, 160, 16, 0, &speakerSoundPort);

但没有成功。任何帮助,将不胜感激。随意问的问题。

标签: c++audiosipvoippjsip

解决方案


当您尝试切换到两者时,您是否有一些日志?

我假设 PJSIP 每次通话只允许 1 个主要声音设备,就像 1 个仅播放/接收音频的设备一样。如果不查看代码等,我无法确认。


推荐阅读