| Index: talk/media/webrtc/webrtcvoiceengine.cc
|
| diff --git a/talk/media/webrtc/webrtcvoiceengine.cc b/talk/media/webrtc/webrtcvoiceengine.cc
|
| index 40d8442405ad83df68862de2fb03dec13a0d729e..05b98ec154402c2de2d94c8716def60bb0692e8d 100644
|
| --- a/talk/media/webrtc/webrtcvoiceengine.cc
|
| +++ b/talk/media/webrtc/webrtcvoiceengine.cc
|
| @@ -54,8 +54,9 @@
|
| #include "webrtc/modules/audio_processing/include/audio_processing.h"
|
|
|
| namespace cricket {
|
| +namespace {
|
|
|
| -static const int kMaxNumPacketSize = 6;
|
| +const int kMaxNumPacketSize = 6;
|
| struct CodecPref {
|
| const char* name;
|
| int clockrate;
|
| @@ -65,7 +66,7 @@ struct CodecPref {
|
| int packet_sizes_ms[kMaxNumPacketSize];
|
| };
|
| // Note: keep the supported packet sizes in ascending order.
|
| -static const CodecPref kCodecPrefs[] = {
|
| +const CodecPref kCodecPrefs[] = {
|
| { kOpusCodecName, 48000, 2, 111, true, { 10, 20, 40, 60 } },
|
| { kIsacCodecName, 16000, 1, 103, true, { 30, 60 } },
|
| { kIsacCodecName, 32000, 1, 104, true, { 30 } },
|
| @@ -97,14 +98,14 @@ static const CodecPref kCodecPrefs[] = {
|
| // It's not clear yet whether the -2 index is handled properly on other OSes.
|
|
|
| #ifdef WIN32
|
| -static const int kDefaultAudioDeviceId = -1;
|
| +const int kDefaultAudioDeviceId = -1;
|
| #else
|
| -static const int kDefaultAudioDeviceId = 0;
|
| +const int kDefaultAudioDeviceId = 0;
|
| #endif
|
|
|
| // Parameter used for NACK.
|
| // This value is equivalent to 5 seconds of audio data at 20 ms per packet.
|
| -static const int kNackMaxPackets = 250;
|
| +const int kNackMaxPackets = 250;
|
|
|
| // Codec parameters for Opus.
|
| // draft-spittka-payload-rtp-opus-03
|
| @@ -117,18 +118,18 @@ static const int kNackMaxPackets = 250;
|
| // 64-128 kb/s for FB stereo music.
|
| // The current implementation applies the following values to mono signals,
|
| // and multiplies them by 2 for stereo.
|
| -static const int kOpusBitrateNb = 12000;
|
| -static const int kOpusBitrateWb = 20000;
|
| -static const int kOpusBitrateFb = 32000;
|
| +const int kOpusBitrateNb = 12000;
|
| +const int kOpusBitrateWb = 20000;
|
| +const int kOpusBitrateFb = 32000;
|
|
|
| // Opus bitrate should be in the range between 6000 and 510000.
|
| -static const int kOpusMinBitrate = 6000;
|
| -static const int kOpusMaxBitrate = 510000;
|
| +const int kOpusMinBitrate = 6000;
|
| +const int kOpusMaxBitrate = 510000;
|
|
|
| // Default audio dscp value.
|
| // See http://tools.ietf.org/html/rfc2474 for details.
|
| // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00
|
| -static const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF;
|
| +const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF;
|
|
|
| // Ensure we open the file in a writeable path on ChromeOS and Android. This
|
| // workaround can be removed when it's possible to specify a filename for audio
|
| @@ -140,29 +141,29 @@ static const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF;
|
| // NOTE(ajm): Don't use hardcoded paths on platforms not explicitly specified
|
| // below.
|
| #if defined(CHROMEOS)
|
| -static const char kAecDumpByAudioOptionFilename[] = "/tmp/audio.aecdump";
|
| +const char kAecDumpByAudioOptionFilename[] = "/tmp/audio.aecdump";
|
| #elif defined(ANDROID)
|
| -static const char kAecDumpByAudioOptionFilename[] = "/sdcard/audio.aecdump";
|
| +const char kAecDumpByAudioOptionFilename[] = "/sdcard/audio.aecdump";
|
| #else
|
| -static const char kAecDumpByAudioOptionFilename[] = "audio.aecdump";
|
| +const char kAecDumpByAudioOptionFilename[] = "audio.aecdump";
|
| #endif
|
|
|
| // Dumps an AudioCodec in RFC 2327-ish format.
|
| -static std::string ToString(const AudioCodec& codec) {
|
| +std::string ToString(const AudioCodec& codec) {
|
| std::stringstream ss;
|
| ss << codec.name << "/" << codec.clockrate << "/" << codec.channels
|
| << " (" << codec.id << ")";
|
| return ss.str();
|
| }
|
|
|
| -static std::string ToString(const webrtc::CodecInst& codec) {
|
| +std::string ToString(const webrtc::CodecInst& codec) {
|
| std::stringstream ss;
|
| ss << codec.plname << "/" << codec.plfreq << "/" << codec.channels
|
| << " (" << codec.pltype << ")";
|
| return ss.str();
|
| }
|
|
|
| -static void LogMultiline(rtc::LoggingSeverity sev, char* text) {
|
| +void LogMultiline(rtc::LoggingSeverity sev, char* text) {
|
| const char* delim = "\r\n";
|
| for (char* tok = strtok(text, delim); tok; tok = strtok(NULL, delim)) {
|
| LOG_V(sev) << tok;
|
| @@ -170,7 +171,7 @@ static void LogMultiline(rtc::LoggingSeverity sev, char* text) {
|
| }
|
|
|
| // Severity is an integer because it comes is assumed to be from command line.
|
| -static int SeverityToFilter(int severity) {
|
| +int SeverityToFilter(int severity) {
|
| int filter = webrtc::kTraceNone;
|
| switch (severity) {
|
| case rtc::LS_VERBOSE:
|
| @@ -188,15 +189,15 @@ static int SeverityToFilter(int severity) {
|
| return filter;
|
| }
|
|
|
| -static bool IsCodec(const AudioCodec& codec, const char* ref_name) {
|
| +bool IsCodec(const AudioCodec& codec, const char* ref_name) {
|
| return (_stricmp(codec.name.c_str(), ref_name) == 0);
|
| }
|
|
|
| -static bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) {
|
| +bool IsCodec(const webrtc::CodecInst& codec, const char* ref_name) {
|
| return (_stricmp(codec.plname, ref_name) == 0);
|
| }
|
|
|
| -static bool IsCodecMultiRate(const webrtc::CodecInst& codec) {
|
| +bool IsCodecMultiRate(const webrtc::CodecInst& codec) {
|
| for (size_t i = 0; i < ARRAY_SIZE(kCodecPrefs); ++i) {
|
| if (IsCodec(codec, kCodecPrefs[i].name) &&
|
| kCodecPrefs[i].clockrate == codec.plfreq) {
|
| @@ -206,7 +207,7 @@ static bool IsCodecMultiRate(const webrtc::CodecInst& codec) {
|
| return false;
|
| }
|
|
|
| -static bool FindCodec(const std::vector<AudioCodec>& codecs,
|
| +bool FindCodec(const std::vector<AudioCodec>& codecs,
|
| const AudioCodec& codec,
|
| AudioCodec* found_codec) {
|
| for (const AudioCodec& c : codecs) {
|
| @@ -220,12 +221,12 @@ static bool FindCodec(const std::vector<AudioCodec>& codecs,
|
| return false;
|
| }
|
|
|
| -static bool IsNackEnabled(const AudioCodec& codec) {
|
| +bool IsNackEnabled(const AudioCodec& codec) {
|
| return codec.HasFeedbackParam(FeedbackParam(kRtcpFbParamNack,
|
| kParamValueEmpty));
|
| }
|
|
|
| -static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) {
|
| +int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) {
|
| int selected_packet_size_ms = codec_pref.packet_sizes_ms[0];
|
| for (int packet_size_ms : codec_pref.packet_sizes_ms) {
|
| if (packet_size_ms && packet_size_ms <= ptime_ms) {
|
| @@ -238,7 +239,7 @@ static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) {
|
| // If the AudioCodec param kCodecParamPTime is set, then we will set it to codec
|
| // pacsize if it's valid, or we will pick the next smallest value we support.
|
| // TODO(Brave): Query supported packet sizes from ACM when the API is ready.
|
| -static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) {
|
| +bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) {
|
| for (const CodecPref& codec_pref : kCodecPrefs) {
|
| if ((IsCodec(*codec, codec_pref.name) &&
|
| codec_pref.clockrate == codec->plfreq) ||
|
| @@ -255,7 +256,7 @@ static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) {
|
| }
|
|
|
| // Return true if codec.params[feature] == "1", false otherwise.
|
| -static bool IsCodecFeatureEnabled(const AudioCodec& codec,
|
| +bool IsCodecFeatureEnabled(const AudioCodec& codec,
|
| const char* feature) {
|
| int value;
|
| return codec.GetParam(feature, &value) && value == 1;
|
| @@ -265,7 +266,7 @@ static bool IsCodecFeatureEnabled(const AudioCodec& codec,
|
| // otherwise. If the value (either from params or codec.bitrate) <=0, use the
|
| // default configuration. If the value is beyond feasible bit rate of Opus,
|
| // clamp it. Returns the Opus bit rate for operation.
|
| -static int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) {
|
| +int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) {
|
| int bitrate = 0;
|
| bool use_param = true;
|
| if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) {
|
| @@ -298,7 +299,7 @@ static int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) {
|
|
|
| // Returns kOpusDefaultPlaybackRate if params[kCodecParamMaxPlaybackRate] is not
|
| // defined. Returns the value of params[kCodecParamMaxPlaybackRate] otherwise.
|
| -static int GetOpusMaxPlaybackRate(const AudioCodec& codec) {
|
| +int GetOpusMaxPlaybackRate(const AudioCodec& codec) {
|
| int value;
|
| if (codec.GetParam(kCodecParamMaxPlaybackRate, &value)) {
|
| return value;
|
| @@ -306,7 +307,7 @@ static int GetOpusMaxPlaybackRate(const AudioCodec& codec) {
|
| return kOpusDefaultMaxPlaybackRate;
|
| }
|
|
|
| -static void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec,
|
| +void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec,
|
| bool* enable_codec_fec, int* max_playback_rate,
|
| bool* enable_codec_dtx) {
|
| *enable_codec_fec = IsCodecFeatureEnabled(codec, kCodecParamUseInbandFec);
|
| @@ -326,7 +327,7 @@ static void GetOpusConfig(const AudioCodec& codec, webrtc::CodecInst* voe_codec,
|
| // Changes RTP timestamp rate of G722. This is due to the "bug" in the RFC
|
| // which says that G722 should be advertised as 8 kHz although it is a 16 kHz
|
| // codec.
|
| -static void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) {
|
| +void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) {
|
| if (IsCodec(*voe_codec, kG722CodecName)) {
|
| // If the ASSERT triggers, the codec definition in WebRTC VoiceEngine
|
| // has changed, and this special case is no longer needed.
|
| @@ -338,7 +339,7 @@ static void MaybeFixupG722(webrtc::CodecInst* voe_codec, int new_plfreq) {
|
| // Gets the default set of options applied to the engine. Historically, these
|
| // were supplied as a combination of flags from the channel manager (ec, agc,
|
| // ns, and highpass) and the rest hardcoded in InitInternal.
|
| -static AudioOptions GetDefaultEngineOptions() {
|
| +AudioOptions GetDefaultEngineOptions() {
|
| AudioOptions options;
|
| options.echo_cancellation.Set(true);
|
| options.auto_gain_control.Set(true);
|
| @@ -358,9 +359,10 @@ static AudioOptions GetDefaultEngineOptions() {
|
| return options;
|
| }
|
|
|
| -static std::string GetEnableString(bool enable) {
|
| +std::string GetEnableString(bool enable) {
|
| return enable ? "enable" : "disable";
|
| }
|
| +} // namespace {
|
|
|
| WebRtcVoiceEngine::WebRtcVoiceEngine()
|
| : voe_wrapper_(new VoEWrapper()),
|
| @@ -862,18 +864,6 @@ bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
|
| return true;
|
| }
|
|
|
| -struct ResumeEntry {
|
| - ResumeEntry(WebRtcVoiceMediaChannel *c, bool p, SendFlags s)
|
| - : channel(c),
|
| - playout(p),
|
| - send(s) {
|
| - }
|
| -
|
| - WebRtcVoiceMediaChannel *channel;
|
| - bool playout;
|
| - SendFlags send;
|
| -};
|
| -
|
| // TODO(juberti): Refactor this so that the core logic can be used to set the
|
| // soundclip device. At that time, reinstate the soundclip pause/resume code.
|
| bool WebRtcVoiceEngine::SetDevices(const Device* in_device,
|
| @@ -1186,40 +1176,18 @@ void WebRtcVoiceEngine::Print(webrtc::TraceLevel level, const char* trace,
|
| }
|
| }
|
|
|
| -void WebRtcVoiceEngine::CallbackOnError(int channel_num, int err_code) {
|
| - rtc::CritScope lock(&channels_cs_);
|
| - WebRtcVoiceMediaChannel* channel = NULL;
|
| - uint32 ssrc = 0;
|
| +void WebRtcVoiceEngine::CallbackOnError(int channel_id, int err_code) {
|
| + RTC_DCHECK(channel_id == -1);
|
| LOG(LS_WARNING) << "VoiceEngine error " << err_code << " reported on channel "
|
| - << channel_num << ".";
|
| - if (FindChannelAndSsrc(channel_num, &channel, &ssrc)) {
|
| - RTC_DCHECK(channel != NULL);
|
| - channel->OnError(ssrc, err_code);
|
| - } else {
|
| - LOG(LS_ERROR) << "VoiceEngine channel " << channel_num
|
| - << " could not be found in channel list when error reported.";
|
| + << channel_id << ".";
|
| + rtc::CritScope lock(&channels_cs_);
|
| + for (WebRtcVoiceMediaChannel* channel : channels_) {
|
| + channel->OnError(err_code);
|
| }
|
| }
|
|
|
| -bool WebRtcVoiceEngine::FindChannelAndSsrc(
|
| - int channel_num, WebRtcVoiceMediaChannel** channel, uint32* ssrc) const {
|
| - RTC_DCHECK(channel != NULL && ssrc != NULL);
|
| -
|
| - *channel = NULL;
|
| - *ssrc = 0;
|
| - // Find corresponding channel and ssrc
|
| - for (WebRtcVoiceMediaChannel* ch : channels_) {
|
| - RTC_DCHECK(ch != NULL);
|
| - if (ch->FindSsrc(channel_num, ssrc)) {
|
| - *channel = ch;
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) {
|
| + RTC_DCHECK(channel != NULL);
|
| rtc::CritScope lock(&channels_cs_);
|
| channels_.push_back(channel);
|
| }
|
| @@ -1416,6 +1384,7 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
|
| send_(SEND_NOTHING),
|
| call_(call),
|
| default_receive_ssrc_(0) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| engine->RegisterChannel(this);
|
| LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel "
|
| << voe_channel();
|
| @@ -1425,16 +1394,19 @@ WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
|
| }
|
|
|
| WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel "
|
| << voe_channel();
|
|
|
| // Remove any remaining send streams, the default channel will be deleted
|
| // later.
|
| - while (!send_channels_.empty())
|
| + while (!send_channels_.empty()) {
|
| RemoveSendStream(send_channels_.begin()->first);
|
| + }
|
|
|
| // Unregister ourselves from the engine.
|
| engine()->UnregisterChannel(this);
|
| +
|
| // Remove any remaining streams.
|
| while (!receive_channels_.empty()) {
|
| RemoveRecvStream(receive_channels_.begin()->first);
|
| @@ -1447,6 +1419,7 @@ WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
|
|
|
| bool WebRtcVoiceMediaChannel::SetSendParameters(
|
| const AudioSendParameters& params) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // TODO(pthatcher): Refactor this to be more clean now that we have
|
| // all the information at once.
|
| return (SetSendCodecs(params.codecs) &&
|
| @@ -1457,6 +1430,7 @@ bool WebRtcVoiceMediaChannel::SetSendParameters(
|
|
|
| bool WebRtcVoiceMediaChannel::SetRecvParameters(
|
| const AudioRecvParameters& params) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // TODO(pthatcher): Refactor this to be more clean now that we have
|
| // all the information at once.
|
| return (SetRecvCodecs(params.codecs) &&
|
| @@ -1464,6 +1438,7 @@ bool WebRtcVoiceMediaChannel::SetRecvParameters(
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| LOG(LS_INFO) << "Setting voice channel options: "
|
| << options.ToString();
|
|
|
| @@ -1553,6 +1528,7 @@ bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) {
|
|
|
| bool WebRtcVoiceMediaChannel::SetRecvCodecs(
|
| const std::vector<AudioCodec>& codecs) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // Set the payload types to be used for incoming media.
|
| LOG(LS_INFO) << "Setting receive voice codecs:";
|
|
|
| @@ -1804,6 +1780,8 @@ bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
|
|
| bool WebRtcVoiceMediaChannel::SetSendCodecs(
|
| const std::vector<AudioCodec>& codecs) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| dtmf_allowed_ = false;
|
| for (const AudioCodec& codec : codecs) {
|
| // Find the DTMF telephone event "codec".
|
| @@ -1875,6 +1853,7 @@ bool WebRtcVoiceMediaChannel::SetSendCodec(
|
|
|
| bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions(
|
| const std::vector<RtpHeaderExtension>& extensions) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| if (receive_extensions_ == extensions) {
|
| return true;
|
| }
|
| @@ -1942,6 +1921,7 @@ bool WebRtcVoiceMediaChannel::SetChannelRecvRtpHeaderExtensions(
|
|
|
| bool WebRtcVoiceMediaChannel::SetSendRtpHeaderExtensions(
|
| const std::vector<RtpHeaderExtension>& extensions) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| if (send_extensions_ == extensions) {
|
| return true;
|
| }
|
| @@ -2000,6 +1980,7 @@ bool WebRtcVoiceMediaChannel::ResumePlayout() {
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| if (playout_ == playout) {
|
| return true;
|
| }
|
| @@ -2088,6 +2069,7 @@ bool WebRtcVoiceMediaChannel::ChangeSend(int channel, SendFlags send) {
|
| bool WebRtcVoiceMediaChannel::SetAudioSend(uint32 ssrc, bool enable,
|
| const AudioOptions* options,
|
| AudioRenderer* renderer) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // TODO(solenberg): The state change should be fully rolled back if any one of
|
| // these calls fail.
|
| if (!SetLocalRenderer(ssrc, renderer)) {
|
| @@ -2133,9 +2115,10 @@ bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) {
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // If the default channel is already used for sending create a new channel
|
| // otherwise use the default channel for sending.
|
| - int channel = GetSendChannelNum(sp.first_ssrc());
|
| + int channel = GetSendChannelId(sp.first_ssrc());
|
| if (channel != -1) {
|
| LOG(LS_ERROR) << "Stream already exists with ssrc " << sp.first_ssrc();
|
| return false;
|
| @@ -2243,6 +2226,8 @@ bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32 ssrc) {
|
|
|
| bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| + LOG(LS_INFO) << "AddRecvStream: " << sp.ToString();
|
| +
|
| rtc::CritScope lock(&receive_channels_cs_);
|
|
|
| if (!VERIFY(sp.ssrcs.size() == 1))
|
| @@ -2301,6 +2286,7 @@ bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // Configure to use external transport, like our default channel.
|
| if (engine()->voe()->network()->RegisterExternalTransport(
|
| channel, *this) == -1) {
|
| @@ -2373,6 +2359,8 @@ bool WebRtcVoiceMediaChannel::ConfigureRecvChannel(int channel) {
|
|
|
| bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) {
|
| RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| + LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
|
| +
|
| rtc::CritScope lock(&receive_channels_cs_);
|
| ChannelMap::iterator it = receive_channels_.find(ssrc);
|
| if (it == receive_channels_.end()) {
|
| @@ -2431,6 +2419,7 @@ bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) {
|
|
|
| bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32 ssrc,
|
| AudioRenderer* renderer) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| ChannelMap::iterator it = receive_channels_.find(ssrc);
|
| if (it == receive_channels_.end()) {
|
| if (renderer) {
|
| @@ -2475,6 +2464,7 @@ bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32 ssrc,
|
|
|
| bool WebRtcVoiceMediaChannel::GetActiveStreams(
|
| AudioInfo::StreamList* actives) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // In conference mode, the default channel should not be in
|
| // |receive_channels_|.
|
| actives->clear();
|
| @@ -2488,6 +2478,7 @@ bool WebRtcVoiceMediaChannel::GetActiveStreams(
|
| }
|
|
|
| int WebRtcVoiceMediaChannel::GetOutputLevel() {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| // return the highest output level of all streams
|
| int highest = GetOutputLevel(voe_channel());
|
| for (const auto& ch : receive_channels_) {
|
| @@ -2524,6 +2515,7 @@ void WebRtcVoiceMediaChannel::SetTypingDetectionParameters(int time_window,
|
|
|
| bool WebRtcVoiceMediaChannel::SetOutputScaling(
|
| uint32 ssrc, double left, double right) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| rtc::CritScope lock(&receive_channels_cs_);
|
| // Collect the channels to scale the output volume.
|
| std::vector<int> channels;
|
| @@ -2536,7 +2528,7 @@ bool WebRtcVoiceMediaChannel::SetOutputScaling(
|
| channels.push_back(ch.second->channel());
|
| }
|
| } else { // Collect only the channel of the specified ssrc.
|
| - int channel = GetReceiveChannelNum(ssrc);
|
| + int channel = GetReceiveChannelId(ssrc);
|
| if (-1 == channel) {
|
| LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc;
|
| return false;
|
| @@ -2597,7 +2589,7 @@ bool WebRtcVoiceMediaChannel::InsertDtmf(uint32 ssrc, int event,
|
| channel = send_channels_.begin()->second->channel();
|
| }
|
| } else {
|
| - channel = GetSendChannelNum(ssrc);
|
| + channel = GetSendChannelId(ssrc);
|
| }
|
| if (channel == -1) {
|
| LOG(LS_WARNING) << "InsertDtmf - The specified ssrc "
|
| @@ -2639,7 +2631,7 @@ void WebRtcVoiceMediaChannel::OnPacketReceived(
|
| // any multiplexed streams, just send it to the default channel. Otherwise,
|
| // send it to the specific decoder instance for that stream.
|
| int which_channel =
|
| - GetReceiveChannelNum(ParseSsrc(packet->data(), packet->size(), false));
|
| + GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), false));
|
| if (which_channel == -1) {
|
| which_channel = voe_channel();
|
| }
|
| @@ -2675,7 +2667,7 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived(
|
| bool has_sent_to_default_channel = false;
|
| if (type == kRtcpTypeSR) {
|
| int which_channel =
|
| - GetReceiveChannelNum(ParseSsrc(packet->data(), packet->size(), true));
|
| + GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), true));
|
| if (which_channel != -1) {
|
| engine()->voe()->network()->ReceivedRTCPPacket(
|
| which_channel, packet->data(), packet->size());
|
| @@ -2700,7 +2692,7 @@ void WebRtcVoiceMediaChannel::OnRtcpReceived(
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) {
|
| - int channel = (ssrc == 0) ? voe_channel() : GetSendChannelNum(ssrc);
|
| + int channel = (ssrc == 0) ? voe_channel() : GetSendChannelId(ssrc);
|
| if (channel == -1) {
|
| LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
|
| return false;
|
| @@ -2784,6 +2776,8 @@ bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) {
|
| }
|
|
|
| bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| bool echo_metrics_on = false;
|
| // These can take on valid negative values, so use the lowest possible level
|
| // as default rather than -1.
|
| @@ -2970,42 +2964,10 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
|
| return true;
|
| }
|
|
|
| -bool WebRtcVoiceMediaChannel::FindSsrc(int channel_num, uint32* ssrc) {
|
| - rtc::CritScope lock(&receive_channels_cs_);
|
| - RTC_DCHECK(ssrc != NULL);
|
| - if (channel_num == -1 && send_ != SEND_NOTHING) {
|
| - // Sometimes the VoiceEngine core will throw error with channel_num = -1.
|
| - // This means the error is not limited to a specific channel. Signal the
|
| - // message using ssrc=0. If the current channel is sending, use this
|
| - // channel for sending the message.
|
| - *ssrc = 0;
|
| - return true;
|
| - } else {
|
| - // Check whether this is a sending channel.
|
| - for (const auto& ch : send_channels_) {
|
| - if (ch.second->channel() == channel_num) {
|
| - // This is a sending channel.
|
| - uint32 local_ssrc = 0;
|
| - if (engine()->voe()->rtp()->GetLocalSSRC(
|
| - channel_num, local_ssrc) != -1) {
|
| - *ssrc = local_ssrc;
|
| - }
|
| - return true;
|
| - }
|
| - }
|
| -
|
| - // Check whether this is a receiving channel.
|
| - for (const auto& ch : receive_channels_) {
|
| - if (ch.second->channel() == channel_num) {
|
| - *ssrc = ch.first;
|
| - return true;
|
| - }
|
| - }
|
| +void WebRtcVoiceMediaChannel::OnError(int error) {
|
| + if (send_ == SEND_NOTHING) {
|
| + return;
|
| }
|
| - return false;
|
| -}
|
| -
|
| -void WebRtcVoiceMediaChannel::OnError(uint32 ssrc, int error) {
|
| if (error == VE_TYPING_NOISE_WARNING) {
|
| typing_noise_detected_ = true;
|
| } else if (error == VE_TYPING_NOISE_OFF_WARNING) {
|
| @@ -3014,20 +2976,21 @@ void WebRtcVoiceMediaChannel::OnError(uint32 ssrc, int error) {
|
| }
|
|
|
| int WebRtcVoiceMediaChannel::GetOutputLevel(int channel) {
|
| - unsigned int ulevel;
|
| - int ret =
|
| - engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel);
|
| + unsigned int ulevel = 0;
|
| + int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel);
|
| return (ret == 0) ? static_cast<int>(ulevel) : -1;
|
| }
|
|
|
| -int WebRtcVoiceMediaChannel::GetReceiveChannelNum(uint32 ssrc) const {
|
| +int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32 ssrc) const {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| ChannelMap::const_iterator it = receive_channels_.find(ssrc);
|
| if (it != receive_channels_.end())
|
| return it->second->channel();
|
| return (ssrc == default_receive_ssrc_) ? voe_channel() : -1;
|
| }
|
|
|
| -int WebRtcVoiceMediaChannel::GetSendChannelNum(uint32 ssrc) const {
|
| +int WebRtcVoiceMediaChannel::GetSendChannelId(uint32 ssrc) const {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| ChannelMap::const_iterator it = send_channels_.find(ssrc);
|
| if (it != send_channels_.end())
|
| return it->second->channel();
|
| @@ -3219,6 +3182,7 @@ void WebRtcVoiceMediaChannel::RemoveAudioReceiveStream(uint32 ssrc) {
|
|
|
| bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal(
|
| const std::vector<AudioCodec>& new_codecs) {
|
| + RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
| for (const AudioCodec& codec : new_codecs) {
|
| webrtc::CodecInst voe_codec;
|
| if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
|
|
|