Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2004 Google Inc. | 3 * Copyright 2004 Google Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
| 9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
| (...skipping 2356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2367 DCHECK(send == SEND_NOTHING); | 2367 DCHECK(send == SEND_NOTHING); |
| 2368 if (engine()->voe()->base()->StopSend(channel) == -1) { | 2368 if (engine()->voe()->base()->StopSend(channel) == -1) { |
| 2369 LOG_RTCERR1(StopSend, channel); | 2369 LOG_RTCERR1(StopSend, channel); |
| 2370 return false; | 2370 return false; |
| 2371 } | 2371 } |
| 2372 } | 2372 } |
| 2373 | 2373 |
| 2374 return true; | 2374 return true; |
| 2375 } | 2375 } |
| 2376 | 2376 |
| 2377 bool WebRtcVoiceMediaChannel::SetAudioSend(uint32 ssrc, bool mute, | |
| 2378 const AudioOptions* options, | |
| 2379 AudioRenderer* renderer) { | |
| 2380 // SetLocalRenderer | |
| 2381 { | |
| 2382 ChannelMap::iterator it = send_channels_.find(ssrc); | |
| 2383 if (it == send_channels_.end()) { | |
| 2384 if (renderer) { | |
| 2385 // Return error if trying to set a valid renderer with an invalid ssrc. | |
| 2386 LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc; | |
| 2387 return false; | |
| 2388 } | |
| 2389 // The channel likely has gone away, do nothing. | |
| 2390 } else { | |
| 2391 if (renderer) { | |
| 2392 it->second->Start(renderer); | |
| 2393 } else { | |
| 2394 it->second->Stop(); | |
| 2395 } | |
| 2396 } | |
| 2397 } | |
| 2398 | |
| 2399 // MuteStream | |
| 2400 { | |
| 2401 int channel = (ssrc == 0) ? voe_channel() : GetSendChannelNum(ssrc); | |
| 2402 if (channel == -1) { | |
| 2403 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; | |
| 2404 return false; | |
| 2405 } | |
| 2406 if (engine()->voe()->volume()->SetInputMute(channel, mute) == -1) { | |
| 2407 LOG_RTCERR2(SetInputMute, channel, mute); | |
| 2408 return false; | |
| 2409 } | |
| 2410 // We set the AGC to mute state only when all the channels are muted. | |
| 2411 // This implementation is not ideal, instead we should signal the AGC when | |
| 2412 // the mic channel is muted/unmuted. We can't do it today because there | |
| 2413 // is no good way to know which stream is mapping to the mic channel. | |
| 2414 bool all_muted = mute; | |
| 2415 for (const auto& ch : send_channels_) { | |
| 2416 if (!all_muted) { | |
| 2417 break; | |
| 2418 } | |
| 2419 if (engine()->voe()->volume()->GetInputMute(ch.second->channel(), | |
| 2420 all_muted)) { | |
| 2421 LOG_RTCERR1(GetInputMute, ch.second->channel()); | |
| 2422 return false; | |
| 2423 } | |
| 2424 } | |
| 2425 | |
| 2426 webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing(); | |
| 2427 if (ap) | |
| 2428 ap->set_output_will_be_muted(all_muted); | |
| 2429 | |
| 2430 if (!mute && options) { | |
| 2431 return SetOptions(*options); | |
| 2432 } | |
| 2433 } | |
| 2434 | |
| 2435 return true; | |
|
pthatcher1
2015/09/09 07:16:12
Similarly, would it make more sense for this CL to
the sun
2015/09/09 09:50:50
Done.
| |
| 2436 } | |
| 2437 | |
| 2377 // TODO(ronghuawu): Change this method to return bool. | 2438 // TODO(ronghuawu): Change this method to return bool. |
| 2378 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) { | 2439 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) { |
| 2379 if (engine()->voe()->network()->RegisterExternalTransport( | 2440 if (engine()->voe()->network()->RegisterExternalTransport( |
| 2380 channel, *this) == -1) { | 2441 channel, *this) == -1) { |
| 2381 LOG_RTCERR2(RegisterExternalTransport, channel, this); | 2442 LOG_RTCERR2(RegisterExternalTransport, channel, this); |
| 2382 } | 2443 } |
| 2383 | 2444 |
| 2384 // Enable RTCP (for quality stats and feedback messages) | 2445 // Enable RTCP (for quality stats and feedback messages) |
| 2385 EnableRtcp(channel); | 2446 EnableRtcp(channel); |
| 2386 | 2447 |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2716 } | 2777 } |
| 2717 | 2778 |
| 2718 if (renderer) | 2779 if (renderer) |
| 2719 it->second->Start(renderer); | 2780 it->second->Start(renderer); |
| 2720 else | 2781 else |
| 2721 it->second->Stop(); | 2782 it->second->Stop(); |
| 2722 | 2783 |
| 2723 return true; | 2784 return true; |
| 2724 } | 2785 } |
| 2725 | 2786 |
| 2726 bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32 ssrc, | |
| 2727 AudioRenderer* renderer) { | |
| 2728 ChannelMap::iterator it = send_channels_.find(ssrc); | |
| 2729 if (it == send_channels_.end()) { | |
| 2730 if (renderer) { | |
| 2731 // Return an error if trying to set a valid renderer with an invalid ssrc. | |
| 2732 LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc; | |
| 2733 return false; | |
| 2734 } | |
| 2735 | |
| 2736 // The channel likely has gone away, do nothing. | |
| 2737 return true; | |
| 2738 } | |
| 2739 | |
| 2740 if (renderer) | |
| 2741 it->second->Start(renderer); | |
| 2742 else | |
| 2743 it->second->Stop(); | |
| 2744 | |
| 2745 return true; | |
| 2746 } | |
| 2747 | |
| 2748 bool WebRtcVoiceMediaChannel::GetActiveStreams( | 2787 bool WebRtcVoiceMediaChannel::GetActiveStreams( |
| 2749 AudioInfo::StreamList* actives) { | 2788 AudioInfo::StreamList* actives) { |
| 2750 // In conference mode, the default channel should not be in | 2789 // In conference mode, the default channel should not be in |
| 2751 // |receive_channels_|. | 2790 // |receive_channels_|. |
| 2752 actives->clear(); | 2791 actives->clear(); |
| 2753 for (const auto& ch : receive_channels_) { | 2792 for (const auto& ch : receive_channels_) { |
| 2754 int level = GetOutputLevel(ch.second->channel()); | 2793 int level = GetOutputLevel(ch.second->channel()); |
| 2755 if (level > 0) { | 2794 if (level > 0) { |
| 2756 actives->push_back(std::make_pair(ch.first, level)); | 2795 actives->push_back(std::make_pair(ch.first, level)); |
| 2757 } | 2796 } |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3025 // Make sure not sending the same packet to default channel more than once. | 3064 // Make sure not sending the same packet to default channel more than once. |
| 3026 if (IsDefaultChannel(ch.second->channel()) && | 3065 if (IsDefaultChannel(ch.second->channel()) && |
| 3027 has_sent_to_default_channel) | 3066 has_sent_to_default_channel) |
| 3028 continue; | 3067 continue; |
| 3029 | 3068 |
| 3030 engine()->voe()->network()->ReceivedRTCPPacket( | 3069 engine()->voe()->network()->ReceivedRTCPPacket( |
| 3031 ch.second->channel(), packet->data(), packet->size()); | 3070 ch.second->channel(), packet->data(), packet->size()); |
| 3032 } | 3071 } |
| 3033 } | 3072 } |
| 3034 | 3073 |
| 3035 bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) { | |
| 3036 int channel = (ssrc == 0) ? voe_channel() : GetSendChannelNum(ssrc); | |
| 3037 if (channel == -1) { | |
| 3038 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; | |
| 3039 return false; | |
| 3040 } | |
| 3041 if (engine()->voe()->volume()->SetInputMute(channel, muted) == -1) { | |
| 3042 LOG_RTCERR2(SetInputMute, channel, muted); | |
| 3043 return false; | |
| 3044 } | |
| 3045 // We set the AGC to mute state only when all the channels are muted. | |
| 3046 // This implementation is not ideal, instead we should signal the AGC when | |
| 3047 // the mic channel is muted/unmuted. We can't do it today because there | |
| 3048 // is no good way to know which stream is mapping to the mic channel. | |
| 3049 bool all_muted = muted; | |
| 3050 for (const auto& ch : send_channels_) { | |
| 3051 if (!all_muted) { | |
| 3052 break; | |
| 3053 } | |
| 3054 if (engine()->voe()->volume()->GetInputMute(ch.second->channel(), | |
| 3055 all_muted)) { | |
| 3056 LOG_RTCERR1(GetInputMute, ch.second->channel()); | |
| 3057 return false; | |
| 3058 } | |
| 3059 } | |
| 3060 | |
| 3061 webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing(); | |
| 3062 if (ap) | |
| 3063 ap->set_output_will_be_muted(all_muted); | |
| 3064 return true; | |
| 3065 } | |
| 3066 | |
| 3067 // TODO(minyue): SetMaxSendBandwidth() is subject to be renamed to | 3074 // TODO(minyue): SetMaxSendBandwidth() is subject to be renamed to |
| 3068 // SetMaxSendBitrate() in future. | 3075 // SetMaxSendBitrate() in future. |
| 3069 bool WebRtcVoiceMediaChannel::SetMaxSendBandwidth(int bps) { | 3076 bool WebRtcVoiceMediaChannel::SetMaxSendBandwidth(int bps) { |
| 3070 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBandwidth."; | 3077 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBandwidth."; |
| 3071 | 3078 |
| 3072 return SetSendBitrateInternal(bps); | 3079 return SetSendBitrateInternal(bps); |
| 3073 } | 3080 } |
| 3074 | 3081 |
| 3075 bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) { | 3082 bool WebRtcVoiceMediaChannel::SetSendBitrateInternal(int bps) { |
| 3076 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetSendBitrateInternal."; | 3083 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetSendBitrateInternal."; |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3614 | 3621 |
| 3615 int WebRtcSoundclipStream::Rewind() { | 3622 int WebRtcSoundclipStream::Rewind() { |
| 3616 mem_.Rewind(); | 3623 mem_.Rewind(); |
| 3617 // Return -1 to keep VoiceEngine from looping. | 3624 // Return -1 to keep VoiceEngine from looping. |
| 3618 return (loop_) ? 0 : -1; | 3625 return (loop_) ? 0 : -1; |
| 3619 } | 3626 } |
| 3620 | 3627 |
| 3621 } // namespace cricket | 3628 } // namespace cricket |
| 3622 | 3629 |
| 3623 #endif // HAVE_WEBRTC_VOICE | 3630 #endif // HAVE_WEBRTC_VOICE |
| OLD | NEW |