| Index: remoting/host/audio_capturer_win.cc
|
| diff --git a/remoting/host/audio_capturer_win.cc b/remoting/host/audio_capturer_win.cc
|
| index 55bc0855b887d8a05e8a870f8e0093da4fb11942..8a256454fac9362d4a5774fb85a00c1cc1cd4328 100644
|
| --- a/remoting/host/audio_capturer_win.cc
|
| +++ b/remoting/host/audio_capturer_win.cc
|
| @@ -23,7 +23,6 @@
|
| namespace {
|
| const int kChannels = 2;
|
| const int kBitsPerSample = 16;
|
| -const int kSamplesPerSecond = 44100;
|
| const int kBitsPerByte = 8;
|
| // Conversion factor from 100ns to 1ms.
|
| const int kHnsToMs = 10000;
|
| @@ -48,6 +47,8 @@ class AudioCapturerWin : public AudioCapturer {
|
|
|
| PacketCapturedCallback callback_;
|
|
|
| + AudioPacket::SamplingRate sampling_rate_;
|
| +
|
| scoped_ptr<base::RepeatingTimer<AudioCapturerWin> > capture_timer_;
|
| base::TimeDelta audio_device_period_;
|
|
|
| @@ -62,8 +63,9 @@ class AudioCapturerWin : public AudioCapturer {
|
| DISALLOW_COPY_AND_ASSIGN(AudioCapturerWin);
|
| };
|
|
|
| -AudioCapturerWin::AudioCapturerWin() {
|
| - thread_checker_.DetachFromThread();
|
| +AudioCapturerWin::AudioCapturerWin()
|
| + : sampling_rate_(AudioPacket::SAMPLING_RATE_INVALID) {
|
| + thread_checker_.DetachFromThread();
|
| }
|
|
|
| AudioCapturerWin::~AudioCapturerWin() {
|
| @@ -131,13 +133,19 @@ bool AudioCapturerWin::Start(const PacketCapturedCallback& callback) {
|
| case WAVE_FORMAT_IEEE_FLOAT:
|
| // Intentional fall-through.
|
| case WAVE_FORMAT_PCM:
|
| + if (!AudioCapturer::IsValidSampleRate(wave_format_ex_->nSamplesPerSec)) {
|
| + LOG(ERROR) << "Host sampling rate is neither 44.1 kHz nor 48 kHz.";
|
| + return false;
|
| + }
|
| + sampling_rate_ = static_cast<AudioPacket::SamplingRate>(
|
| + wave_format_ex_->nSamplesPerSec);
|
| +
|
| wave_format_ex_->wFormatTag = WAVE_FORMAT_PCM;
|
| wave_format_ex_->nChannels = kChannels;
|
| - wave_format_ex_->nSamplesPerSec = kSamplesPerSecond;
|
| wave_format_ex_->wBitsPerSample = kBitsPerSample;
|
| wave_format_ex_->nBlockAlign = kChannels * kBitsPerSample / kBitsPerByte;
|
| wave_format_ex_->nAvgBytesPerSec =
|
| - kSamplesPerSecond * kChannels * kBitsPerSample / kBitsPerByte;
|
| + sampling_rate_ * kChannels * kBitsPerSample / kBitsPerByte;
|
| break;
|
| case WAVE_FORMAT_EXTENSIBLE: {
|
| PWAVEFORMATEXTENSIBLE wave_format_extensible =
|
| @@ -145,16 +153,24 @@ bool AudioCapturerWin::Start(const PacketCapturedCallback& callback) {
|
| static_cast<WAVEFORMATEX*>(wave_format_ex_));
|
| if (IsEqualGUID(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT,
|
| wave_format_extensible->SubFormat)) {
|
| + if (!AudioCapturer::IsValidSampleRate(
|
| + wave_format_extensible->Format.nSamplesPerSec)) {
|
| + LOG(ERROR) << "Host sampling rate is neither 44.1 kHz nor 48 kHz.";
|
| + return false;
|
| + }
|
| + sampling_rate_ = static_cast<AudioPacket::SamplingRate>(
|
| + wave_format_extensible->Format.nSamplesPerSec);
|
| +
|
| wave_format_extensible->SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
|
| wave_format_extensible->Samples.wValidBitsPerSample = kBitsPerSample;
|
|
|
| wave_format_extensible->Format.nChannels = kChannels;
|
| - wave_format_extensible->Format.nSamplesPerSec = kSamplesPerSecond;
|
| + wave_format_extensible->Format.nSamplesPerSec = sampling_rate_;
|
| wave_format_extensible->Format.wBitsPerSample = kBitsPerSample;
|
| wave_format_extensible->Format.nBlockAlign =
|
| kChannels * kBitsPerSample / kBitsPerByte;
|
| wave_format_extensible->Format.nAvgBytesPerSec =
|
| - kSamplesPerSecond * kChannels * kBitsPerSample / kBitsPerByte;
|
| + sampling_rate_ * kChannels * kBitsPerSample / kBitsPerByte;
|
| } else {
|
| LOG(ERROR) << "Failed to force 16-bit samples";
|
| return false;
|
| @@ -162,7 +178,7 @@ bool AudioCapturerWin::Start(const PacketCapturedCallback& callback) {
|
| break;
|
| }
|
| default:
|
| - LOG(ERROR) << "Failed to force 16-bit samples";
|
| + LOG(ERROR) << "Failed to force 16-bit PCM";
|
| return false;
|
| }
|
|
|
| @@ -221,6 +237,7 @@ bool AudioCapturerWin::IsRunning() {
|
| }
|
|
|
| void AudioCapturerWin::DoCapture() {
|
| + DCHECK(AudioCapturer::IsValidSampleRate(sampling_rate_));
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| DCHECK(IsRunning());
|
|
|
| @@ -249,6 +266,7 @@ void AudioCapturerWin::DoCapture() {
|
|
|
| scoped_ptr<AudioPacket> packet = scoped_ptr<AudioPacket>(new AudioPacket());
|
| packet->set_data(data, frames * wave_format_ex_->nBlockAlign);
|
| + packet->set_sampling_rate(sampling_rate_);
|
|
|
| callback_.Run(packet.Pass());
|
|
|
|
|