Index: media/audio/audio_output_device.cc |
diff --git a/media/audio/audio_output_device.cc b/media/audio/audio_output_device.cc |
index 34ff54eb7078224293f70c7e107dafcbcd7e329f..e9119cb18f03cb7ea68f80e5ae75503e219a6f29 100644 |
--- a/media/audio/audio_output_device.cc |
+++ b/media/audio/audio_output_device.cc |
@@ -33,6 +33,7 @@ class AudioOutputDevice::AudioThreadCallback |
private: |
AudioRendererSink::RenderCallback* render_callback_; |
+ scoped_ptr<AudioBus> audio_bus_; |
DISALLOW_COPY_AND_ASSIGN(AudioThreadCallback); |
}; |
@@ -49,7 +50,7 @@ AudioOutputDevice::AudioOutputDevice( |
} |
void AudioOutputDevice::Initialize(const AudioParameters& params, |
- RenderCallback* callback) { |
+ RenderCallback* callback) { |
CHECK_EQ(0, stream_id_) << |
"AudioOutputDevice::Initialize() must be called before Start()"; |
@@ -194,7 +195,6 @@ void AudioOutputDevice::OnStreamCreated( |
base::SyncSocket::Handle socket_handle, |
int length) { |
DCHECK(message_loop()->BelongsToCurrentThread()); |
- DCHECK_GE(length, audio_parameters_.GetBytesPerBuffer()); |
#if defined(OS_WIN) |
DCHECK(handle); |
DCHECK(socket_handle); |
@@ -250,6 +250,8 @@ AudioOutputDevice::AudioThreadCallback::~AudioThreadCallback() { |
void AudioOutputDevice::AudioThreadCallback::MapSharedMemory() { |
shared_memory_.Map(TotalSharedMemorySizeInBytes(memory_length_)); |
+ DCHECK_EQ(memory_length_, AudioBus::CalculateMemorySize(audio_parameters_)); |
+ audio_bus_ = AudioBus::WrapMemory(audio_parameters_, shared_memory_.memory()); |
} |
// Called whenever we receive notifications about pending data. |
@@ -266,20 +268,20 @@ void AudioOutputDevice::AudioThreadCallback::Process(int pending_data) { |
TRACE_EVENT0("audio", "AudioOutputDevice::FireRenderCallback"); |
- // Update the audio-delay measurement then ask client to render audio. |
+ // Update the audio-delay measurement then ask client to render audio. Since |
+ // |audio_bus_| is wrapping the shared memory the Render() call is writing |
+ // directly into the shared memory. |
size_t num_frames = render_callback_->Render( |
audio_bus_.get(), audio_delay_milliseconds); |
- // Interleave, scale, and clip to int. |
- // TODO(dalecurtis): Remove this when we have float everywhere: |
- // http://crbug.com/114700 |
- audio_bus_->ToInterleaved(num_frames, audio_parameters_.bits_per_sample() / 8, |
- shared_memory_.memory()); |
- |
// Let the host know we are done. |
+ // TODO(dalecurtis): Technically this is not always correct. Due to channel |
+ // padding for alignment, there may be more data available than this. We're |
+ // relying on AudioSyncReader::Read() to parse this with that in mind. Rename |
+ // these methods to Set/GetActualFrameCount(). |
SetActualDataSizeInBytes( |
&shared_memory_, memory_length_, |
- num_frames * audio_parameters_.GetBytesPerFrame()); |
+ num_frames * sizeof(*audio_bus_->channel(0)) * audio_bus_->channels()); |
} |
} // namespace media. |