| Index: remoting/host/audio_capturer_win.cc
|
| diff --git a/remoting/host/audio_capturer_win.cc b/remoting/host/audio_capturer_win.cc
|
| index b3d4d9f453983413e0533268d8dca914ab47ce6a..2610e6e2b692eed2523b0dfe2047d3222b379996 100644
|
| --- a/remoting/host/audio_capturer_win.cc
|
| +++ b/remoting/host/audio_capturer_win.cc
|
| @@ -45,7 +45,7 @@ namespace remoting {
|
|
|
| AudioCapturerWin::AudioCapturerWin()
|
| : sampling_rate_(AudioPacket::SAMPLING_RATE_INVALID),
|
| - silence_detector_(kSilenceThreshold),
|
| + volume_filter_(kSilenceThreshold),
|
| last_capture_error_(S_OK) {
|
| thread_checker_.DetachFromThread();
|
| }
|
| @@ -91,14 +91,12 @@ void AudioCapturerWin::Deinitialize() {
|
| }
|
| audio_client_.Reset();
|
| mm_device_.Reset();
|
| - audio_volume_.Reset();
|
| }
|
|
|
| bool AudioCapturerWin::Initialize() {
|
| DCHECK(!audio_capture_client_.Get());
|
| DCHECK(!audio_client_.Get());
|
| DCHECK(!mm_device_.Get());
|
| - DCHECK(!audio_volume_.Get());
|
| DCHECK(static_cast<PWAVEFORMATEX>(wave_format_ex_) == nullptr);
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
| @@ -234,86 +232,15 @@ bool AudioCapturerWin::Initialize() {
|
| return false;
|
| }
|
|
|
| - // Initialize IAudioEndpointVolume.
|
| - // TODO(zijiehe): Do we need to control per process volume?
|
| - hr = mm_device_->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, nullptr,
|
| - &audio_volume_);
|
| - if (FAILED(hr)) {
|
| - LOG(ERROR) << "Failed to get an IAudioEndpointVolume. Error " << hr;
|
| - return false;
|
| - }
|
| -
|
| - silence_detector_.Reset(sampling_rate_, kChannels);
|
| + volume_filter_.ActivateBy(mm_device_.Get());
|
| + volume_filter_.Initialize(sampling_rate_, kChannels);
|
|
|
| return true;
|
| }
|
|
|
| bool AudioCapturerWin::is_initialized() const {
|
| // All Com components should be initialized / deinitialized together.
|
| - return !!audio_volume_;
|
| -}
|
| -
|
| -float AudioCapturerWin::GetAudioLevel() {
|
| - BOOL mute;
|
| - HRESULT hr = audio_volume_->GetMute(&mute);
|
| - if (FAILED(hr)) {
|
| - LOG(ERROR) << "Failed to get mute status from IAudioEndpointVolume, error "
|
| - << hr;
|
| - return 1;
|
| - }
|
| - if (mute) {
|
| - return 0;
|
| - }
|
| -
|
| - float level;
|
| - hr = audio_volume_->GetMasterVolumeLevelScalar(&level);
|
| - if (FAILED(hr) || level > 1) {
|
| - LOG(ERROR) << "Failed to get master volume from IAudioEndpointVolume, "
|
| - "error "
|
| - << hr;
|
| - return 1;
|
| - }
|
| - if (level < 0) {
|
| - return 0;
|
| - }
|
| - return level;
|
| -}
|
| -
|
| -void AudioCapturerWin::ProcessSamples(uint8_t* data, size_t frames) {
|
| - if (frames == 0) {
|
| - return;
|
| - }
|
| -
|
| - int16_t* samples = reinterpret_cast<int16_t*>(data);
|
| - static_assert(sizeof(samples[0]) == kBytesPerSample,
|
| - "expect 16 bits per sample");
|
| - size_t sample_count = frames * kChannels;
|
| - if (silence_detector_.IsSilence(samples, sample_count)) {
|
| - return;
|
| - }
|
| -
|
| - // Windows API does not provide volume adjusted audio sample as Linux does.
|
| - // So we need to manually apply volume to the samples.
|
| - float level = GetAudioLevel();
|
| - if (level == 0) {
|
| - return;
|
| - }
|
| -
|
| - if (level < 1) {
|
| - int32_t level_int = static_cast<int32_t>(level * 65536);
|
| - for (size_t i = 0; i < sample_count; i++) {
|
| - samples[i] = (static_cast<int32_t>(samples[i]) * level_int) >> 16;
|
| - }
|
| - }
|
| -
|
| - std::unique_ptr<AudioPacket> packet(new AudioPacket());
|
| - packet->add_data(data, frames * wave_format_ex_->nBlockAlign);
|
| - packet->set_encoding(AudioPacket::ENCODING_RAW);
|
| - packet->set_sampling_rate(sampling_rate_);
|
| - packet->set_bytes_per_sample(AudioPacket::BYTES_PER_SAMPLE_2);
|
| - packet->set_channels(AudioPacket::CHANNELS_STEREO);
|
| -
|
| - callback_.Run(std::move(packet));
|
| + return !!audio_client_;
|
| }
|
|
|
| void AudioCapturerWin::DoCapture() {
|
| @@ -347,7 +274,16 @@ void AudioCapturerWin::DoCapture() {
|
| if (FAILED(hr))
|
| break;
|
|
|
| - ProcessSamples(data, frames);
|
| + if (volume_filter_.Apply(reinterpret_cast<int16_t*>(data), frames)) {
|
| + std::unique_ptr<AudioPacket> packet(new AudioPacket());
|
| + packet->add_data(data, frames * wave_format_ex_->nBlockAlign);
|
| + packet->set_encoding(AudioPacket::ENCODING_RAW);
|
| + packet->set_sampling_rate(sampling_rate_);
|
| + packet->set_bytes_per_sample(AudioPacket::BYTES_PER_SAMPLE_2);
|
| + packet->set_channels(AudioPacket::CHANNELS_STEREO);
|
| +
|
| + callback_.Run(std::move(packet));
|
| + }
|
|
|
| hr = audio_capture_client_->ReleaseBuffer(frames);
|
| if (FAILED(hr))
|
|
|