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()); |