diff --git a/modules/audio_coding/acm2/acm_receive_test.cc b/modules/audio_coding/acm2/acm_receive_test.cc index 082506ab56..6cfe464a32 100644 --- a/modules/audio_coding/acm2/acm_receive_test.cc +++ b/modules/audio_coding/acm2/acm_receive_test.cc @@ -110,6 +110,7 @@ AudioCodingModule::Config MakeAcmConfig( Clock* clock, rtc::scoped_refptr decoder_factory) { AudioCodingModule::Config config; + config.id = 0; config.clock = clock; config.decoder_factory = std::move(decoder_factory); return config; diff --git a/modules/audio_coding/acm2/acm_send_test.cc b/modules/audio_coding/acm2/acm_send_test.cc index 307c9066b1..d5f196b9a2 100644 --- a/modules/audio_coding/acm2/acm_send_test.cc +++ b/modules/audio_coding/acm2/acm_send_test.cc @@ -28,7 +28,7 @@ AcmSendTestOldApi::AcmSendTestOldApi(InputAudioFile* audio_source, int source_rate_hz, int test_duration_ms) : clock_(0), - acm_(webrtc::AudioCodingModule::Create(&clock_)), + acm_(webrtc::AudioCodingModule::Create(0, &clock_)), audio_source_(audio_source), source_rate_hz_(source_rate_hz), input_block_size_samples_( diff --git a/modules/audio_coding/acm2/audio_coding_module.cc b/modules/audio_coding/acm2/audio_coding_module.cc index c48fbef329..5997d1269e 100644 --- a/modules/audio_coding/acm2/audio_coding_module.cc +++ b/modules/audio_coding/acm2/audio_coding_module.cc @@ -269,6 +269,7 @@ class AudioCodingModuleImpl final : public AudioCodingModule { rtc::CriticalSection acm_crit_sect_; rtc::Buffer encode_buffer_ RTC_GUARDED_BY(acm_crit_sect_); + int id_; // TODO(henrik.lundin) Make const. uint32_t expected_codec_ts_ RTC_GUARDED_BY(acm_crit_sect_); uint32_t expected_in_ts_ RTC_GUARDED_BY(acm_crit_sect_); acm2::ACMResampler resampler_ RTC_GUARDED_BY(acm_crit_sect_); @@ -455,7 +456,8 @@ void AudioCodingModuleImpl::ChangeLogger::MaybeLog(int value) { AudioCodingModuleImpl::AudioCodingModuleImpl( const AudioCodingModule::Config& config) - : expected_codec_ts_(0xD87F3F9F), + : id_(config.id), + expected_codec_ts_(0xD87F3F9F), expected_in_ts_(0xD87F3F9F), receiver_(config), bitrate_logger_("WebRTC.Audio.TargetBitrateInKbps"), @@ -1118,6 +1120,7 @@ int AudioCodingModuleImpl::PlayoutData10Ms(int desired_freq_hz, LOG(LS_ERROR) << "PlayoutData failed, RecOut Failed"; return -1; } + audio_frame->id_ = id_; return 0; } @@ -1283,7 +1286,7 @@ ANAStats AudioCodingModuleImpl::GetANAStats() const { } // namespace AudioCodingModule::Config::Config() - : neteq_config(), clock(Clock::GetRealTimeClock()) { + : id(0), neteq_config(), clock(Clock::GetRealTimeClock()) { // Post-decode VAD is disabled by default in NetEq, however, Audio // Conference Mixer relies on VAD decisions and fails without them. neteq_config.enable_post_decode_vad = true; @@ -1293,15 +1296,17 @@ AudioCodingModule::Config::Config(const Config&) = default; AudioCodingModule::Config::~Config() = default; // Create module -AudioCodingModule* AudioCodingModule::Create() { +AudioCodingModule* AudioCodingModule::Create(int id) { Config config; + config.id = id; config.clock = Clock::GetRealTimeClock(); config.decoder_factory = CreateBuiltinAudioDecoderFactory(); return Create(config); } -AudioCodingModule* AudioCodingModule::Create(Clock* clock) { +AudioCodingModule* AudioCodingModule::Create(int id, Clock* clock) { Config config; + config.id = id; config.clock = clock; config.decoder_factory = CreateBuiltinAudioDecoderFactory(); return Create(config); diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/modules/audio_coding/acm2/audio_coding_module_unittest.cc index a010619b7e..80fc4d80b7 100644 --- a/modules/audio_coding/acm2/audio_coding_module_unittest.cc +++ b/modules/audio_coding/acm2/audio_coding_module_unittest.cc @@ -157,7 +157,8 @@ class PacketizationCallbackStubOldApi : public AudioPacketizationCallback { class AudioCodingModuleTestOldApi : public ::testing::Test { protected: AudioCodingModuleTestOldApi() - : rtp_utility_(new RtpUtility(kFrameSizeSamples, kPayloadType)), + : id_(1), + rtp_utility_(new RtpUtility(kFrameSizeSamples, kPayloadType)), clock_(Clock::GetRealTimeClock()) {} ~AudioCodingModuleTestOldApi() {} @@ -165,7 +166,7 @@ class AudioCodingModuleTestOldApi : public ::testing::Test { void TearDown() {} void SetUp() { - acm_.reset(AudioCodingModule::Create(clock_)); + acm_.reset(AudioCodingModule::Create(id_, clock_)); rtp_utility_->Populate(&rtp_header_); @@ -229,6 +230,7 @@ class AudioCodingModuleTestOldApi : public ::testing::Test { VerifyEncoding(); } + const int id_; std::unique_ptr rtp_utility_; std::unique_ptr acm_; PacketizationCallbackStubOldApi packet_cb_; @@ -312,6 +314,7 @@ TEST_F(AudioCodingModuleTestOldApi, VerifyOutputFrame) { bool muted; EXPECT_EQ(0, acm_->PlayoutData10Ms(kSampleRateHz, &audio_frame, &muted)); ASSERT_FALSE(muted); + EXPECT_EQ(id_, audio_frame.id_); EXPECT_EQ(0u, audio_frame.timestamp_); EXPECT_GT(audio_frame.num_channels_, 0u); EXPECT_EQ(static_cast(kSampleRateHz / 100), diff --git a/modules/audio_coding/include/audio_coding_module.h b/modules/audio_coding/include/audio_coding_module.h index 63af3ab298..944ad604f5 100644 --- a/modules/audio_coding/include/audio_coding_module.h +++ b/modules/audio_coding/include/audio_coding_module.h @@ -70,6 +70,7 @@ class AudioCodingModule { Config(const Config&); ~Config(); + int id; NetEq::Config neteq_config; Clock* clock; rtc::scoped_refptr decoder_factory; @@ -82,8 +83,8 @@ class AudioCodingModule { // injected into ACM. ACM will take the ownership of the object clock and // delete it when destroyed. // - static AudioCodingModule* Create(); - static AudioCodingModule* Create(Clock* clock); + static AudioCodingModule* Create(int id); + static AudioCodingModule* Create(int id, Clock* clock); static AudioCodingModule* Create(const Config& config); virtual ~AudioCodingModule() = default; diff --git a/modules/audio_coding/test/APITest.cc b/modules/audio_coding/test/APITest.cc index b29e84e106..5418342714 100644 --- a/modules/audio_coding/test/APITest.cc +++ b/modules/audio_coding/test/APITest.cc @@ -48,8 +48,8 @@ void APITest::Wait(uint32_t waitLengthMs) { } APITest::APITest() - : _acmA(AudioCodingModule::Create()), - _acmB(AudioCodingModule::Create()), + : _acmA(AudioCodingModule::Create(1)), + _acmB(AudioCodingModule::Create(2)), _channel_A2B(NULL), _channel_B2A(NULL), _writeToFile(true), diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc index 2b6b4acfd0..8257ed9c10 100644 --- a/modules/audio_coding/test/EncodeDecodeTest.cc +++ b/modules/audio_coding/test/EncodeDecodeTest.cc @@ -281,7 +281,7 @@ void EncodeDecodeTest::Perform() { codePars[1] = 0; codePars[2] = 0; - std::unique_ptr acm(AudioCodingModule::Create()); + std::unique_ptr acm(AudioCodingModule::Create(0)); struct CodecInst sendCodecTmp; numCodecs = acm->NumberOfCodecs(); @@ -337,7 +337,7 @@ std::string EncodeDecodeTest::EncodeToFile(int fileType, int codeId, int* codePars, int testMode) { - std::unique_ptr acm(AudioCodingModule::Create()); + std::unique_ptr acm(AudioCodingModule::Create(1)); RTPFile rtpFile; std::string fileName = webrtc::test::TempFilename(webrtc::test::OutputPath(), "encode_decode_rtp"); diff --git a/modules/audio_coding/test/PacketLossTest.cc b/modules/audio_coding/test/PacketLossTest.cc index a6c56fa780..c80615a36d 100644 --- a/modules/audio_coding/test/PacketLossTest.cc +++ b/modules/audio_coding/test/PacketLossTest.cc @@ -127,7 +127,7 @@ void PacketLossTest::Perform() { #ifndef WEBRTC_CODEC_OPUS return; #else - std::unique_ptr acm(AudioCodingModule::Create()); + std::unique_ptr acm(AudioCodingModule::Create(0)); int codec_id = acm->Codec("opus", 48000, channels_); diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc index ff28a28807..74319c2dc5 100644 --- a/modules/audio_coding/test/TestAllCodecs.cc +++ b/modules/audio_coding/test/TestAllCodecs.cc @@ -104,8 +104,8 @@ void TestPack::reset_payload_size() { } TestAllCodecs::TestAllCodecs(int test_mode) - : acm_a_(AudioCodingModule::Create()), - acm_b_(AudioCodingModule::Create()), + : acm_a_(AudioCodingModule::Create(0)), + acm_b_(AudioCodingModule::Create(1)), channel_a_to_b_(NULL), test_count_(0), packet_size_samples_(0), diff --git a/modules/audio_coding/test/TestRedFec.cc b/modules/audio_coding/test/TestRedFec.cc index 58561c6fe1..3e88290a1c 100644 --- a/modules/audio_coding/test/TestRedFec.cc +++ b/modules/audio_coding/test/TestRedFec.cc @@ -48,8 +48,8 @@ namespace { } TestRedFec::TestRedFec() - : _acmA(AudioCodingModule::Create()), - _acmB(AudioCodingModule::Create()), + : _acmA(AudioCodingModule::Create(0)), + _acmB(AudioCodingModule::Create(1)), _channelA2B(NULL), _testCntr(0) { } diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc index eca81f81cf..d598191f81 100644 --- a/modules/audio_coding/test/TestStereo.cc +++ b/modules/audio_coding/test/TestStereo.cc @@ -108,8 +108,8 @@ void TestPackStereo::set_lost_packet(bool lost) { } TestStereo::TestStereo(int test_mode) - : acm_a_(AudioCodingModule::Create()), - acm_b_(AudioCodingModule::Create()), + : acm_a_(AudioCodingModule::Create(0)), + acm_b_(AudioCodingModule::Create(1)), channel_a2b_(NULL), test_cntr_(0), pack_size_samp_(0), diff --git a/modules/audio_coding/test/TestVADDTX.cc b/modules/audio_coding/test/TestVADDTX.cc index 628582d55c..1aa00b5524 100644 --- a/modules/audio_coding/test/TestVADDTX.cc +++ b/modules/audio_coding/test/TestVADDTX.cc @@ -62,8 +62,8 @@ void ActivityMonitor::GetStatistics(uint32_t* counter) { } TestVadDtx::TestVadDtx() - : acm_send_(AudioCodingModule::Create()), - acm_receive_(AudioCodingModule::Create()), + : acm_send_(AudioCodingModule::Create(0)), + acm_receive_(AudioCodingModule::Create(1)), channel_(new Channel), monitor_(new ActivityMonitor) { EXPECT_EQ(0, acm_send_->RegisterTransportCallback(channel_.get())); diff --git a/modules/audio_coding/test/TwoWayCommunication.cc b/modules/audio_coding/test/TwoWayCommunication.cc index 8049436cd0..addb71764e 100644 --- a/modules/audio_coding/test/TwoWayCommunication.cc +++ b/modules/audio_coding/test/TwoWayCommunication.cc @@ -34,14 +34,16 @@ namespace webrtc { #define MAX_FILE_NAME_LENGTH_BYTE 500 TwoWayCommunication::TwoWayCommunication(int testMode) - : _acmA(AudioCodingModule::Create()), - _acmRefA(AudioCodingModule::Create()), + : _acmA(AudioCodingModule::Create(1)), + _acmRefA(AudioCodingModule::Create(3)), _testMode(testMode) { AudioCodingModule::Config config; // The clicks will be more obvious in FAX mode. TODO(henrik.lundin) Really? config.neteq_config.playout_mode = kPlayoutFax; + config.id = 2; config.decoder_factory = CreateBuiltinAudioDecoderFactory(); _acmB.reset(AudioCodingModule::Create(config)); + config.id = 4; _acmRefB.reset(AudioCodingModule::Create(config)); } @@ -60,7 +62,7 @@ TwoWayCommunication::~TwoWayCommunication() { void TwoWayCommunication::ChooseCodec(uint8_t* codecID_A, uint8_t* codecID_B) { - std::unique_ptr tmpACM(AudioCodingModule::Create()); + std::unique_ptr tmpACM(AudioCodingModule::Create(0)); uint8_t noCodec = tmpACM->NumberOfCodecs(); CodecInst codecInst; printf("List of Supported Codecs\n"); diff --git a/modules/audio_coding/test/delay_test.cc b/modules/audio_coding/test/delay_test.cc index 407f7095cb..3f78ea68e3 100644 --- a/modules/audio_coding/test/delay_test.cc +++ b/modules/audio_coding/test/delay_test.cc @@ -64,8 +64,8 @@ struct TestSettings { class DelayTest { public: DelayTest() - : acm_a_(AudioCodingModule::Create()), - acm_b_(AudioCodingModule::Create()), + : acm_a_(AudioCodingModule::Create(0)), + acm_b_(AudioCodingModule::Create(1)), channel_a2b_(new Channel), test_cntr_(0), encoding_sample_rate_hz_(8000) {} diff --git a/modules/audio_coding/test/iSACTest.cc b/modules/audio_coding/test/iSACTest.cc index a44259fbbe..a14f795b9b 100644 --- a/modules/audio_coding/test/iSACTest.cc +++ b/modules/audio_coding/test/iSACTest.cc @@ -67,8 +67,8 @@ int16_t SetISAConfig(ACMTestISACConfig& isacConfig, AudioCodingModule* acm, } ISACTest::ISACTest(int testMode) - : _acmA(AudioCodingModule::Create()), - _acmB(AudioCodingModule::Create()), + : _acmA(AudioCodingModule::Create(1)), + _acmB(AudioCodingModule::Create(2)), _testMode(testMode) {} ISACTest::~ISACTest() {} diff --git a/modules/audio_coding/test/insert_packet_with_timing.cc b/modules/audio_coding/test/insert_packet_with_timing.cc index 2c0e54b0cb..500375c8da 100644 --- a/modules/audio_coding/test/insert_packet_with_timing.cc +++ b/modules/audio_coding/test/insert_packet_with_timing.cc @@ -61,8 +61,8 @@ class InsertPacketWithTiming { InsertPacketWithTiming() : sender_clock_(new SimulatedClock(0)), receiver_clock_(new SimulatedClock(0)), - send_acm_(AudioCodingModule::Create(sender_clock_)), - receive_acm_(AudioCodingModule::Create(receiver_clock_)), + send_acm_(AudioCodingModule::Create(0, sender_clock_)), + receive_acm_(AudioCodingModule::Create(0, receiver_clock_)), channel_(new Channel), seq_num_fid_(fopen(FLAG_seq_num, "rt")), send_ts_fid_(fopen(FLAG_send_ts, "rt")), diff --git a/modules/audio_coding/test/opus_test.cc b/modules/audio_coding/test/opus_test.cc index b7acc0f7c6..7b54668bae 100644 --- a/modules/audio_coding/test/opus_test.cc +++ b/modules/audio_coding/test/opus_test.cc @@ -27,7 +27,7 @@ namespace webrtc { OpusTest::OpusTest() - : acm_receiver_(AudioCodingModule::Create()), + : acm_receiver_(AudioCodingModule::Create(0)), channel_a2b_(NULL), counter_(0), payload_type_(255), diff --git a/modules/audio_coding/test/target_delay_unittest.cc b/modules/audio_coding/test/target_delay_unittest.cc index 03135da6c4..2a757069e8 100644 --- a/modules/audio_coding/test/target_delay_unittest.cc +++ b/modules/audio_coding/test/target_delay_unittest.cc @@ -22,7 +22,7 @@ namespace webrtc { class TargetDelayTest : public ::testing::Test { protected: - TargetDelayTest() : acm_(AudioCodingModule::Create()) {} + TargetDelayTest() : acm_(AudioCodingModule::Create(0)) {} ~TargetDelayTest() {} diff --git a/modules/audio_mixer/audio_mixer_impl_unittest.cc b/modules/audio_mixer/audio_mixer_impl_unittest.cc index 4461e6e038..678f625eac 100644 --- a/modules/audio_mixer/audio_mixer_impl_unittest.cc +++ b/modules/audio_mixer/audio_mixer_impl_unittest.cc @@ -35,10 +35,12 @@ namespace webrtc { namespace { constexpr int kDefaultSampleRateHz = 48000; +constexpr int kId = 1; // Utility function that resets the frame member variables with // sensible defaults. void ResetFrame(AudioFrame* frame) { + frame->id_ = kId; frame->sample_rate_hz_ = kDefaultSampleRateHz; frame->num_channels_ = 1; diff --git a/modules/audio_mixer/frame_combiner.cc b/modules/audio_mixer/frame_combiner.cc index 8000904529..9e9bcfafb0 100644 --- a/modules/audio_mixer/frame_combiner.cc +++ b/modules/audio_mixer/frame_combiner.cc @@ -193,7 +193,7 @@ void FrameCombiner::Combine(const std::vector& mix_list, // value '0', because it is only supported in the one channel case and // is then updated in the helper functions. audio_frame_for_mixing->UpdateFrame( - 0, nullptr, samples_per_channel, sample_rate, AudioFrame::kUndefined, + -1, 0, nullptr, samples_per_channel, sample_rate, AudioFrame::kUndefined, AudioFrame::kVadUnknown, number_of_channels); const bool use_limiter_this_round = use_apm_limiter_ && number_of_streams > 1; diff --git a/modules/audio_mixer/frame_combiner_unittest.cc b/modules/audio_mixer/frame_combiner_unittest.cc index 490e99e495..568143608c 100644 --- a/modules/audio_mixer/frame_combiner_unittest.cc +++ b/modules/audio_mixer/frame_combiner_unittest.cc @@ -53,7 +53,8 @@ AudioFrame audio_frame_for_mixing; void SetUpFrames(int sample_rate_hz, int number_of_channels) { for (auto* frame : {&frame1, &frame2}) { - frame->UpdateFrame(0, nullptr, rtc::CheckedDivExact(sample_rate_hz, 100), + frame->UpdateFrame(-1, 0, nullptr, + rtc::CheckedDivExact(sample_rate_hz, 100), sample_rate_hz, AudioFrame::kNormalSpeech, AudioFrame::kVadActive, number_of_channels); } diff --git a/modules/include/module_common_types.h b/modules/include/module_common_types.h index c3ad993555..bc5c347a4a 100644 --- a/modules/include/module_common_types.h +++ b/modules/include/module_common_types.h @@ -330,18 +330,7 @@ class AudioFrame { // ResetWithoutMuting() to skip this wasteful zeroing. void ResetWithoutMuting(); - // TODO(solenberg): Remove once downstream users of AudioFrame have updated. - RTC_DEPRECATED - void UpdateFrame(int id, uint32_t timestamp, const int16_t* data, - size_t samples_per_channel, int sample_rate_hz, - SpeechType speech_type, VADActivity vad_activity, - size_t num_channels = 1) { - RTC_UNUSED(id); - UpdateFrame(timestamp, data, samples_per_channel, sample_rate_hz, - speech_type, vad_activity, num_channels); - } - - void UpdateFrame(uint32_t timestamp, const int16_t* data, + void UpdateFrame(int id, uint32_t timestamp, const int16_t* data, size_t samples_per_channel, int sample_rate_hz, SpeechType speech_type, VADActivity vad_activity, size_t num_channels = 1); @@ -377,6 +366,7 @@ class AudioFrame { RTC_DEPRECATED AudioFrame& operator>>=(const int rhs); RTC_DEPRECATED AudioFrame& operator+=(const AudioFrame& rhs); + int id_; // RTP timestamp of the first sample in the AudioFrame. uint32_t timestamp_ = 0; // Time since the first frame in milliseconds. @@ -424,6 +414,7 @@ inline void AudioFrame::Reset() { } inline void AudioFrame::ResetWithoutMuting() { + id_ = -1; // TODO(wu): Zero is a valid value for |timestamp_|. We should initialize // to an invalid value, or add a new member to indicate invalidity. timestamp_ = 0; @@ -437,13 +428,15 @@ inline void AudioFrame::ResetWithoutMuting() { profile_timestamp_ms_ = 0; } -inline void AudioFrame::UpdateFrame(uint32_t timestamp, +inline void AudioFrame::UpdateFrame(int id, + uint32_t timestamp, const int16_t* data, size_t samples_per_channel, int sample_rate_hz, SpeechType speech_type, VADActivity vad_activity, size_t num_channels) { + id_ = id; timestamp_ = timestamp; samples_per_channel_ = samples_per_channel; sample_rate_hz_ = sample_rate_hz; @@ -464,6 +457,7 @@ inline void AudioFrame::UpdateFrame(uint32_t timestamp, inline void AudioFrame::CopyFrom(const AudioFrame& src) { if (this == &src) return; + id_ = src.id_; timestamp_ = src.timestamp_; elapsed_time_ms_ = src.elapsed_time_ms_; ntp_time_ms_ = src.ntp_time_ms_; diff --git a/modules/module_common_types_unittest.cc b/modules/module_common_types_unittest.cc index c8bb5f9850..f601a59051 100644 --- a/modules/module_common_types_unittest.cc +++ b/modules/module_common_types_unittest.cc @@ -28,6 +28,7 @@ bool AllSamplesAre(int16_t sample, const AudioFrame& frame) { return true; } +constexpr int kId = 16; constexpr uint32_t kTimestamp = 27; constexpr int kSampleRateHz = 16000; constexpr size_t kNumChannels = 1; @@ -63,9 +64,10 @@ TEST(AudioFrameTest, MutedFrameBufferIsZeroed) { TEST(AudioFrameTest, UpdateFrame) { AudioFrame frame; int16_t samples[kNumChannels * kSamplesPerChannel] = {17}; - frame.UpdateFrame(kTimestamp, samples, kSamplesPerChannel, kSampleRateHz, + frame.UpdateFrame(kId, kTimestamp, samples, kSamplesPerChannel, kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels); + EXPECT_EQ(kId, frame.id_); EXPECT_EQ(kTimestamp, frame.timestamp_); EXPECT_EQ(kSamplesPerChannel, frame.samples_per_channel_); EXPECT_EQ(kSampleRateHz, frame.sample_rate_hz_); @@ -76,7 +78,7 @@ TEST(AudioFrameTest, UpdateFrame) { EXPECT_FALSE(frame.muted()); EXPECT_EQ(0, memcmp(samples, frame.data(), sizeof(samples))); - frame.UpdateFrame(kTimestamp, nullptr /* data*/, kSamplesPerChannel, + frame.UpdateFrame(kId, kTimestamp, nullptr /* data*/, kSamplesPerChannel, kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels); EXPECT_TRUE(frame.muted()); @@ -88,11 +90,12 @@ TEST(AudioFrameTest, CopyFrom) { AudioFrame frame2; int16_t samples[kNumChannels * kSamplesPerChannel] = {17}; - frame2.UpdateFrame(kTimestamp, samples, kSamplesPerChannel, + frame2.UpdateFrame(kId, kTimestamp, samples, kSamplesPerChannel, kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels); frame1.CopyFrom(frame2); + EXPECT_EQ(frame2.id_, frame1.id_); EXPECT_EQ(frame2.timestamp_, frame1.timestamp_); EXPECT_EQ(frame2.samples_per_channel_, frame1.samples_per_channel_); EXPECT_EQ(frame2.sample_rate_hz_, frame1.sample_rate_hz_); @@ -103,7 +106,7 @@ TEST(AudioFrameTest, CopyFrom) { EXPECT_EQ(frame2.muted(), frame1.muted()); EXPECT_EQ(0, memcmp(frame2.data(), frame1.data(), sizeof(samples))); - frame2.UpdateFrame(kTimestamp, nullptr /* data */, kSamplesPerChannel, + frame2.UpdateFrame(kId, kTimestamp, nullptr /* data */, kSamplesPerChannel, kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels); frame1.CopyFrom(frame2); diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc index 875454a17d..4dff3de585 100644 --- a/voice_engine/channel.cc +++ b/voice_engine/channel.cc @@ -646,6 +646,8 @@ AudioMixer::Source::AudioFrameInfo Channel::GetAudioFrameWithInfo( AudioFrameOperations::Mute(audio_frame); } + // Convert module ID to internal VoE channel ID + audio_frame->id_ = VoEChannelId(audio_frame->id_); // Store speech type for dead-or-alive detection _outputSpeechType = audio_frame->speech_type_; @@ -794,6 +796,7 @@ Channel::Channel(int32_t channelId, WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId), "Channel::Channel() - ctor"); AudioCodingModule::Config acm_config(config.acm_config); + acm_config.id = VoEModuleId(instanceId, channelId); acm_config.neteq_config.enable_muted_state = true; audio_coding_.reset(AudioCodingModule::Create(acm_config)); @@ -1639,6 +1642,7 @@ void Channel::ProcessAndEncodeAudio(const AudioFrame& audio_input) { // TODO(henrika): try to avoid copying by moving ownership of audio frame // either into pool of frames or into the task itself. audio_frame->CopyFrom(audio_input); + audio_frame->id_ = ChannelId(); encoder_queue_->PostTask(std::unique_ptr( new ProcessAndEncodeAudioTask(std::move(audio_frame), this))); } @@ -1655,6 +1659,7 @@ void Channel::ProcessAndEncodeAudio(const int16_t* audio_data, CodecInst codec; const int result = GetSendCodec(codec); std::unique_ptr audio_frame(new AudioFrame()); + audio_frame->id_ = ChannelId(); // TODO(ossu): Investigate how this could happen. b/62909493 if (result == 0) { audio_frame->sample_rate_hz_ = std::min(codec.plfreq, sample_rate); @@ -1675,6 +1680,7 @@ void Channel::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) { RTC_DCHECK_RUN_ON(encoder_queue_); RTC_DCHECK_GT(audio_input->samples_per_channel_, 0); RTC_DCHECK_LE(audio_input->num_channels_, 2); + RTC_DCHECK_EQ(audio_input->id_, ChannelId()); bool is_muted = InputMute(); AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted); diff --git a/voice_engine/voice_engine_defines.h b/voice_engine/voice_engine_defines.h index 4397662057..bc5eb1b81f 100644 --- a/voice_engine/voice_engine_defines.h +++ b/voice_engine/voice_engine_defines.h @@ -16,13 +16,23 @@ #ifndef VOICE_ENGINE_VOICE_ENGINE_DEFINES_H_ #define VOICE_ENGINE_VOICE_ENGINE_DEFINES_H_ +#include "common_types.h" // NOLINT(build/include) #include "modules/audio_processing/include/audio_processing.h" +#include "typedefs.h" // NOLINT(build/include) namespace webrtc { // VolumeControl enum { kMinVolumeLevel = 0 }; enum { kMaxVolumeLevel = 255 }; +// Min scale factor for per-channel volume scaling +const float kMinOutputVolumeScaling = 0.0f; +// Max scale factor for per-channel volume scaling +const float kMaxOutputVolumeScaling = 10.0f; +// Min scale factor for output volume panning +const float kMinOutputVolumePanning = 0.0f; +// Max scale factor for output volume panning +const float kMaxOutputVolumePanning = 1.0f; // Audio processing const NoiseSuppression::Level kDefaultNsMode = NoiseSuppression::kModerate; @@ -38,6 +48,7 @@ const bool kDefaultAgcState = #else true; #endif +const GainControl::Mode kDefaultRxAgcMode = GainControl::kAdaptiveDigital; // VideoSync // Lowest minimum playout delay @@ -57,6 +68,15 @@ inline int VoEId(int veId, int chId) { return (int)((veId << 16) + chId); } +inline int VoEModuleId(int veId, int chId) { + return (int)((veId << 16) + chId); +} + +// Convert module ID to internal VoE channel ID +inline int VoEChannelId(int moduleId) { + return (int)(moduleId & 0xffff); +} + } // namespace webrtc #if defined(_WIN32)