diff options
| author | Roxie Linden <roxie@lindenlab.com> | 2023-09-27 18:16:57 -0700 | 
|---|---|---|
| committer | Roxie Linden <roxie@lindenlab.com> | 2024-02-08 18:34:01 -0800 | 
| commit | e147381eb3d977eeed9b45621e2f40d0ff379607 (patch) | |
| tree | 650dcea603fc6e6d3e1cb9c4713a565be5a9c884 | |
| parent | 861f21957ef164831f57fbd59fce55cb5eaca641 (diff) | |
add stereo support
| -rw-r--r-- | indra/llwebrtc/llwebrtc.cpp | 87 | 
1 files changed, 56 insertions, 31 deletions
| diff --git a/indra/llwebrtc/llwebrtc.cpp b/indra/llwebrtc/llwebrtc.cpp index b02354cbac..3152e1eef6 100644 --- a/indra/llwebrtc/llwebrtc.cpp +++ b/indra/llwebrtc/llwebrtc.cpp @@ -106,6 +106,7 @@ void LLWebRTCImpl::init()                                                                        std::unique_ptr<webrtc::AudioDeviceDataObserver>(mAudioDeviceObserver));              mDeviceModule->Init();              mDeviceModule->SetStereoRecording(false); +            mDeviceModule->SetStereoPlayout(true);              mDeviceModule->EnableBuiltInAEC(false);              updateDevices();          }); @@ -321,6 +322,8 @@ bool LLWebRTCImpl::initializeConnectionThreaded()      apm_config.noise_suppression.enabled  = true;      apm_config.noise_suppression.level    = webrtc::AudioProcessing::Config::NoiseSuppression::kVeryHigh;      apm_config.transient_suppression.enabled = true; +    apm_config.pipeline.multi_channel_render = true; +    apm_config.pipeline.multi_channel_capture = true;      //      apm->ApplyConfig(apm_config); @@ -416,8 +419,8 @@ bool LLWebRTCImpl::initializeConnectionThreaded()          params.codecs.push_back(codecparam);          receiver->SetParameters(params);      } - -    mPeerConnection->SetLocalDescription(rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this)); +    webrtc::PeerConnectionInterface::RTCOfferAnswerOptions offerOptions; +    mPeerConnection->CreateOffer(this, offerOptions);      RTC_LOG(LS_INFO) << __FUNCTION__ << " " << mPeerConnection->signaling_state(); @@ -516,6 +519,16 @@ void LLWebRTCImpl::OnAddTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>                                const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>> &streams)  {      RTC_LOG(LS_INFO) << __FUNCTION__ << " " << receiver->id(); +    webrtc::RtpParameters  params; +    webrtc::RtpCodecParameters codecparam; +    codecparam.name                       = "opus"; +    codecparam.kind                       = cricket::MEDIA_TYPE_AUDIO; +    codecparam.clock_rate                 = 48000; +    codecparam.num_channels               = 2; +    codecparam.parameters["stereo"]       = "1"; +    codecparam.parameters["sprop-stereo"] = "1"; +    params.codecs.push_back(codecparam); +    receiver->SetParameters(params);  }  void LLWebRTCImpl::OnRemoveTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver) @@ -632,11 +645,47 @@ void LLWebRTCImpl::OnSuccess(webrtc::SessionDescriptionInterface *desc)      std::string sdp;      desc->ToString(&sdp);      RTC_LOG(LS_INFO) << sdp; +; +    // mangle the sdp as this is the only way currently to bump up +    // the send audio rate to 48k +    std::istringstream sdp_stream(sdp); +    std::ostringstream sdp_mangled_stream; +    std::string        sdp_line; +    int                opus_payload = 0; +    while (std::getline(sdp_stream, sdp_line)) +    { +        int bandwidth  = 0; +        int payload_id = 0; +        // force mono down, stereo up +        if (std::sscanf(sdp_line.c_str(), "a=rtpmap:%i opus/%i/2", &payload_id, &bandwidth) == 2) +        { +            sdp_mangled_stream << sdp_line << "\n"; +            opus_payload = payload_id; +        } +        else if (sdp_line.rfind(std::format("a=fmtp:{}", opus_payload)) == 0) +        { +            sdp_mangled_stream << sdp_line << "a=fmtp:" << opus_payload +                               << " minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;maxplaybackrate=48000\n"; +        } +        else +        { +            sdp_mangled_stream << sdp_line << "\n"; +        } +    } +     +    webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, sdp_mangled_stream.str()); + + + +    mPeerConnection->SetLocalDescription(std::unique_ptr<webrtc::SessionDescriptionInterface>( +                                             webrtc::CreateSessionDescription(webrtc::SdpType::kOffer, sdp_mangled_stream.str())), +        rtc::scoped_refptr<webrtc::SetLocalDescriptionObserverInterface>(this)); +    RTC_LOG(LS_INFO) << __FUNCTION__ << " Local SDP: " << sdp_mangled_stream.str(); + -    RTC_LOG(LS_INFO) << __FUNCTION__ << " " << mPeerConnection->signaling_state();      for (auto &observer : mSignalingObserverList)      { -        observer->OnOfferAvailable(sdp); +        observer->OnOfferAvailable(sdp_mangled_stream.str());      }  } @@ -669,36 +718,12 @@ void LLWebRTCImpl::OnSetLocalDescriptionComplete(webrtc::RTCError error)      auto        desc = mPeerConnection->pending_local_description();      std::string sdp;      desc->ToString(&sdp); -    // mangle the sdp as this is the only way currently to bump up -    // the send audio rate to 48k -    std::istringstream sdp_stream(sdp); -    std::ostringstream sdp_mangled_stream; -    std::string        sdp_line; -    char               opus_payload[10]; -    while (std::getline(sdp_stream, sdp_line)) { -        int bandwidth = 0; -        int payload_id = 0; -        // force mono down, stereo up -        if (std::sscanf(sdp_line.c_str(), "a=rtpmap:%i opus/%i/2", &payload_id, &bandwidth) == 2) -        { -            sdp_mangled_stream << sdp_line << "\n"; -            sprintf(opus_payload,"%d",payload_id); -        } -        else if (sdp_line.rfind(std::string("a=fmtp:") + opus_payload) == 0)  -        { -            sdp_mangled_stream << sdp_line << "a=fmtp:" << opus_payload -                               << " stereo=1;sprop-stereo=0;minptime=10;useinbandfec=1;maxplaybackrate=48000\n"; -        } -        else -        { -            sdp_mangled_stream << sdp_line << "\n"; -        } -    } -    RTC_LOG(LS_INFO) << __FUNCTION__ << " Local SDP: " << sdp_mangled_stream.str(); + +    RTC_LOG(LS_INFO) << __FUNCTION__ << " Local SDP: " << sdp;      ;      for (auto &observer : mSignalingObserverList)      { -        observer->OnOfferAvailable(sdp_mangled_stream.str()); +        observer->OnOfferAvailable(sdp);      }  } | 
