mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 22:00:47 +01:00
Add PeerConnection::GetAudioLevels (#64)
This commit is contained in:
parent
811e54d333
commit
0ee96853f8
17 changed files with 161 additions and 0 deletions
|
@ -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) {}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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_) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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() {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue