Add PeerConnection::GetAudioLevels (#64)

This commit is contained in:
Peter Thatcher 2022-01-10 15:19:10 -07:00 committed by GitHub
parent 811e54d333
commit 0ee96853f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 161 additions and 0 deletions

View file

@ -84,6 +84,17 @@ bool PeerConnectionInterface::ReceiveRtp(uint8_t pt) {
return false; return false;
} }
// RingRTC change to get audio levels
void PeerConnectionInterface::GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
RTC_LOG(LS_ERROR) << "No GetAudioLevels in dummy implementation";
*received_size_out = 0;
*captured_out = 0;
}
PeerConnectionDependencies::PeerConnectionDependencies( PeerConnectionDependencies::PeerConnectionDependencies(
PeerConnectionObserver* observer_in) PeerConnectionObserver* observer_in)
: observer(observer_in) {} : observer(observer_in) {}

View file

@ -1143,6 +1143,11 @@ class RTC_EXPORT PeerConnectionInterface : public rtc::RefCountInterface {
RTC_LOG(LS_WARNING) << "Default PeerConnectionInterface::ConfigureAudioEncoders(...) does nothing!"; RTC_LOG(LS_WARNING) << "Default PeerConnectionInterface::ConfigureAudioEncoders(...) does nothing!";
} }
virtual void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out);
// SetBitrate limits the bandwidth allocated for all RTP streams sent by // SetBitrate limits the bandwidth allocated for all RTP streams sent by
// this PeerConnection. Other limitations might affect these limits and // this PeerConnection. Other limitations might affect these limits and

View file

@ -191,6 +191,11 @@ void AudioReceiveStream::ReconfigureForTesting(
config_ = config; config_ = config;
} }
// RingRTC change to get recv audio levels
uint16_t AudioReceiveStream::GetAudioLevel() {
return channel_receive_->GetSpeechOutputLevelFullRange();
}
void AudioReceiveStream::Start() { void AudioReceiveStream::Start() {
RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK_RUN_ON(&worker_thread_checker_);
if (playing_) { if (playing_) {

View file

@ -141,6 +141,9 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream,
// TODO(tommi): Remove this method. // TODO(tommi): Remove this method.
void ReconfigureForTesting(const webrtc::AudioReceiveStream::Config& config); void ReconfigureForTesting(const webrtc::AudioReceiveStream::Config& config);
// RingRTC change to get recv audio levels
uint16_t GetAudioLevel() override;
private: private:
AudioState* audio_state() const; AudioState* audio_state() const;

View file

@ -112,6 +112,12 @@ class AudioSendStream final : public webrtc::AudioSendStream,
// RingRTC change to configure opus // RingRTC change to configure opus
void ConfigureEncoder(const webrtc::AudioEncoder::Config& config) override; void ConfigureEncoder(const webrtc::AudioEncoder::Config& config) override;
// RingRTC change to get send/capture audio level
uint16_t GetAudioLevel() override {
MutexLock lock(&audio_level_lock_);
return audio_level_.LevelFullRange();
}
private: private:
class TimedTransport; class TimedTransport;
// Constraints including overhead. // Constraints including overhead.

View file

@ -194,6 +194,9 @@ class AudioReceiveStream : public MediaReceiveStream {
// Returns current value of base minimum delay in milliseconds. // Returns current value of base minimum delay in milliseconds.
virtual int GetBaseMinimumPlayoutDelayMs() const = 0; virtual int GetBaseMinimumPlayoutDelayMs() const = 0;
// RingRTC change to get recv audio levels
virtual uint16_t GetAudioLevel() = 0;
protected: protected:
virtual ~AudioReceiveStream() {} virtual ~AudioReceiveStream() {}
}; };

View file

@ -196,6 +196,12 @@ class AudioSendStream : public AudioSender {
virtual void ConfigureEncoder(const webrtc::AudioEncoder::Config& config) { virtual void ConfigureEncoder(const webrtc::AudioEncoder::Config& config) {
RTC_LOG(LS_WARNING) << "Default AudioSendStream::ConfigureEncoder(...) does nothing!"; RTC_LOG(LS_WARNING) << "Default AudioSendStream::ConfigureEncoder(...) does nothing!";
} }
// RingRTC change to configure opus to get audio levels
virtual uint16_t GetAudioLevel() {
RTC_LOG(LS_WARNING) << "Default AudioSendStream::GetAudioLevel() does nothing!";
return 0;
}
}; };
} // namespace webrtc } // namespace webrtc

View file

@ -155,6 +155,16 @@ struct VideoOptions {
} }
}; };
// RingRTC change for audio level methods
// Higher is louder.
typedef uint16_t AudioLevel;
typedef struct {
uint32_t ssrc;
AudioLevel level;
} ReceivedAudioLevel;
class MediaChannel { class MediaChannel {
public: public:
class NetworkInterface { class NetworkInterface {
@ -824,6 +834,17 @@ class VoiceMediaChannel : public MediaChannel, public Delayable {
virtual void ConfigureEncoders(const webrtc::AudioEncoder::Config& config) { virtual void ConfigureEncoders(const webrtc::AudioEncoder::Config& config) {
RTC_LOG(LS_WARNING) << "Default VoiceMediaChannel::ConfigureEncoders(...) does nothing!"; RTC_LOG(LS_WARNING) << "Default VoiceMediaChannel::ConfigureEncoders(...) does nothing!";
} }
// RingRTC change to get audio levels
virtual void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
RTC_LOG(LS_WARNING) << "Default VoiceMediaChannel::GetAudioLevels does nothing!";
*captured_out = 0;
*received_size_out = 0;
}
}; };
// TODO(deadbeef): Rename to VideoSenderParameters, since they're intended to // TODO(deadbeef): Rename to VideoSenderParameters, since they're intended to

View file

@ -1095,6 +1095,11 @@ class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
stream_->ConfigureEncoder(config); stream_->ConfigureEncoder(config);
} }
uint16_t GetAudioLevel() {
return stream_->GetAudioLevel();
}
private: private:
void UpdateSendState() { void UpdateSendState() {
RTC_DCHECK_RUN_ON(&worker_thread_checker_); RTC_DCHECK_RUN_ON(&worker_thread_checker_);
@ -1330,6 +1335,11 @@ class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
stream_->SetDepacketizerToDecoderFrameTransformer(frame_transformer); stream_->SetDepacketizerToDecoderFrameTransformer(frame_transformer);
} }
// RingRTC change to get audio level
uint16_t GetAudioLevel() {
return stream_->GetAudioLevel();
}
private: private:
webrtc::SequenceChecker worker_thread_checker_; webrtc::SequenceChecker worker_thread_checker_;
webrtc::Call* call_ = nullptr; webrtc::Call* call_ = nullptr;
@ -2582,4 +2592,30 @@ void WebRtcVoiceMediaChannel::ConfigureEncoders(const webrtc::AudioEncoder::Conf
} }
} }
void WebRtcVoiceMediaChannel::GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
cricket::AudioLevel captured = 0;
for (const auto& kv : send_streams_) {
captured = kv.second->GetAudioLevel();
}
size_t received_size = 0;
for (const auto& kv : recv_streams_) {
if (received_size >= received_out_size) {
break;
}
received_out[received_size++] = cricket::ReceivedAudioLevel {
kv.first,
kv.second->GetAudioLevel()
};
}
*captured_out = captured;
*received_size_out = received_size;
}
} // namespace cricket } // namespace cricket

View file

@ -246,6 +246,13 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
// RingRTC change to configure opus // RingRTC change to configure opus
void ConfigureEncoders(const webrtc::AudioEncoder::Config& config) override; void ConfigureEncoders(const webrtc::AudioEncoder::Config& config) override;
// RingRTC change to get audio levels
void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) override;
private: private:
bool SetOptions(const AudioOptions& options); bool SetOptions(const AudioOptions& options);
bool SetRecvCodecs(const std::vector<AudioCodec>& codecs); bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);

View file

@ -944,6 +944,17 @@ void VoiceChannel::ConfigureEncoders(const webrtc::AudioEncoder::Config& config)
}); });
} }
// RingRTC change to get audio levels
void VoiceChannel::GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
worker_thread()->Invoke<void>(RTC_FROM_HERE, [this, captured_out, received_out, received_out_size, received_size_out] {
media_channel()->GetAudioLevels(captured_out, received_out, received_out_size, received_size_out);
});
}
VideoChannel::VideoChannel(rtc::Thread* worker_thread, VideoChannel::VideoChannel(rtc::Thread* worker_thread,
rtc::Thread* network_thread, rtc::Thread* network_thread,
rtc::Thread* signaling_thread, rtc::Thread* signaling_thread,

View file

@ -407,6 +407,13 @@ class VoiceChannel : public BaseChannel {
// RingRTC change to configure OPUS // RingRTC change to configure OPUS
void ConfigureEncoders(const webrtc::AudioEncoder::Config& config); void ConfigureEncoders(const webrtc::AudioEncoder::Config& config);
// RingRTC change to get audio levels
void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out);
private: private:
// overrides from BaseChannel // overrides from BaseChannel
void UpdateMediaSendRecvState_w() override; void UpdateMediaSendRecvState_w() override;

View file

@ -2967,4 +2967,17 @@ void PeerConnection::ConfigureAudioEncoders(const webrtc::AudioEncoder::Config&
} }
} }
void PeerConnection::GetAudioLevels(cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
auto* voice_channel = static_cast<cricket::VoiceChannel*>(rtp_manager()->GetAudioTransceiver()->internal()->channel());
if (voice_channel) {
voice_channel->GetAudioLevels(captured_out, received_out, received_out_size, received_size_out);
} else {
*captured_out = 0;
*received_size_out = 0;
}
}
} // namespace webrtc } // namespace webrtc

View file

@ -250,6 +250,12 @@ class PeerConnection : public PeerConnectionInternal,
void ConfigureAudioEncoders(const webrtc::AudioEncoder::Config& config) override; void ConfigureAudioEncoders(const webrtc::AudioEncoder::Config& config) override;
void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) override;
RTCError SetBitrate(const BitrateSettings& bitrate) override; RTCError SetBitrate(const BitrateSettings& bitrate) override;
void SetAudioPlayout(bool playout) override; void SetAudioPlayout(bool playout) override;

View file

@ -144,6 +144,12 @@ PROXY_METHOD1(bool,
PROXY_METHOD1(void, PROXY_METHOD1(void,
ConfigureAudioEncoders, ConfigureAudioEncoders,
const webrtc::AudioEncoder::Config&) const webrtc::AudioEncoder::Config&)
PROXY_METHOD4(void,
GetAudioLevels,
cricket::AudioLevel*,
cricket::ReceivedAudioLevel*,
size_t,
size_t*)
PROXY_METHOD1(bool, SetIncomingRtpEnabled, bool) PROXY_METHOD1(bool, SetIncomingRtpEnabled, bool)
PROXY_METHOD1(RTCError, SetBitrate, const BitrateSettings&) PROXY_METHOD1(RTCError, SetBitrate, const BitrateSettings&)
PROXY_METHOD1(void, SetAudioPlayout, bool) PROXY_METHOD1(void, SetAudioPlayout, bool)

View file

@ -301,6 +301,15 @@ bool PeerConnectionWrapper::ReceiveRtp(uint8_t pt) {
return pc()->ReceiveRtp(pt); return pc()->ReceiveRtp(pt);
} }
void PeerConnectionWrapper::GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out) {
pc()->GetAudioLevels(captured_out, received_out, received_out_size, received_size_out);
}
rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack( rtc::scoped_refptr<AudioTrackInterface> PeerConnectionWrapper::CreateAudioTrack(
const std::string& label) { const std::string& label) {
return pc_factory()->CreateAudioTrack(label, nullptr); return pc_factory()->CreateAudioTrack(label, nullptr);

View file

@ -149,6 +149,12 @@ class PeerConnectionWrapper {
bool SendRtp(std::unique_ptr<RtpPacket> rtp_packet); bool SendRtp(std::unique_ptr<RtpPacket> rtp_packet);
bool ReceiveRtp(uint8_t pt); bool ReceiveRtp(uint8_t pt);
void GetAudioLevels(
cricket::AudioLevel* captured_out,
cricket::ReceivedAudioLevel* received_out,
size_t received_out_size,
size_t* received_size_out);
// Returns a new dummy audio track with the given label. // Returns a new dummy audio track with the given label.
rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack( rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack(
const std::string& label); const std::string& label);