Index: media/audio/sounds/wav_reader.cc |
diff --git a/media/audio/sounds/wav_reader.cc b/media/audio/sounds/wav_reader.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1e03e6d002c5b0bf631bdfa2cd659c912eec12ef |
--- /dev/null |
+++ b/media/audio/sounds/wav_reader.cc |
@@ -0,0 +1,45 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/audio/sounds/wav_reader.h" |
+ |
+#include "base/logging.h" |
+#include "media/base/audio_bus.h" |
+ |
+namespace media { |
+ |
+WavReaderImpl::WavReaderImpl(const WavParser& wav_parser) |
+ : wav_parser_(wav_parser) {} |
+ |
+WavReaderImpl::~WavReaderImpl() {} |
+ |
+bool WavReaderImpl::AtEnd(size_t cursor) { |
+ return wav_parser_.data().size() <= cursor; |
+} |
+ |
+bool WavReaderImpl::CopyTo(AudioBus* bus, |
+ size_t cursor, |
+ size_t* bytes_written) { |
+ if (!bus) |
+ return false; |
+ if (bus->channels() != wav_parser_.num_channels()) { |
+ VLOG(1) << "Number of channel mismatch."; |
+ return false; |
+ } |
+ if (AtEnd(cursor)) { |
+ bus->Zero(); |
+ return true; |
+ } |
+ const base::StringPiece& data = wav_parser_.data(); |
+ const int remaining_frames = |
+ (data.size() - cursor) / wav_parser_.bytes_per_frame(); |
+ const int frames = std::min(bus->frames(), remaining_frames); |
+ bus->FromInterleaved(data.data() + cursor, frames, |
+ wav_parser_.bytes_per_sample()); |
+ *bytes_written = frames * wav_parser_.bytes_per_frame(); |
+ bus->ZeroFramesPartial(frames, bus->frames() - frames); |
+ return true; |
+} |
+ |
+} // namespace media |