Chromium Code Reviews| Index: media/audio/sounds/wav_audio_handler.cc |
| diff --git a/media/audio/sounds/wav_audio_handler.cc b/media/audio/sounds/wav_audio_handler.cc |
| index 2c02db3fb13077d2ed55d7b849e31f241a777892..d48c33a9f7e7ba60c5ea52b43801f37ed923a5aa 100644 |
| --- a/media/audio/sounds/wav_audio_handler.cc |
| +++ b/media/audio/sounds/wav_audio_handler.cc |
| @@ -40,7 +40,8 @@ const size_t kBitsPerSampleOffset = 14; |
| const int kAudioFormatPCM = 1; |
| // Reads an integer from |data| with |offset|. |
| -template<typename T> T ReadInt(const base::StringPiece& data, size_t offset) { |
| +template <typename T> |
| +T ReadInt(const base::StringPiece& data, size_t offset) { |
| CHECK_LE(offset + sizeof(T), data.size()); |
| T result; |
| memcpy(&result, data.data() + offset, sizeof(T)); |
| @@ -57,7 +58,6 @@ namespace media { |
| WavAudioHandler::WavAudioHandler(const base::StringPiece& wav_data) |
| : num_channels_(0), |
| sample_rate_(0), |
| - byte_rate_(0), |
| bits_per_sample_(0) { |
| CHECK_LE(kWavFileHeaderSize, wav_data.size()) << "wav data is too small"; |
| CHECK(wav_data.starts_with(kChunkId) && |
| @@ -72,11 +72,17 @@ WavAudioHandler::WavAudioHandler(const base::StringPiece& wav_data) |
| CHECK_LE(0, length) << "can't parse wav sub-chunk"; |
| offset += length; |
| } |
| -} |
| -WavAudioHandler::~WavAudioHandler() { |
| + const int frame_count = data_.size() * 8 / num_channels_ / bits_per_sample_; |
| + params_ = AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| + GuessChannelLayout(num_channels_), |
| + sample_rate_, |
| + bits_per_sample_, |
| + frame_count); |
| } |
| +WavAudioHandler::~WavAudioHandler() {} |
| + |
| bool WavAudioHandler::AtEnd(size_t cursor) const { |
| return data_.size() <= cursor; |
| } |
| @@ -86,18 +92,20 @@ bool WavAudioHandler::CopyTo(AudioBus* bus, |
| size_t* bytes_written) const { |
| if (!bus) |
| return false; |
| - if (bus->channels() != num_channels_) { |
| - DLOG(ERROR) << "Number of channel mismatch."; |
| + if (bus->channels() != params_.channels()) { |
| + VLOG(1) << "Number of channel mismatch."; |
|
DaleCurtis
2014/01/09 19:58:26
DVLOG(1) ?
ygorshenin1
2014/01/13 10:00:55
Done.
|
| return false; |
| } |
| if (AtEnd(cursor)) { |
| bus->Zero(); |
| return true; |
| } |
| - const int remaining_frames = (data_.size() - cursor) / bytes_per_frame_; |
| + const int remaining_frames = |
| + (data_.size() - cursor) / params_.GetBytesPerFrame(); |
| const int frames = std::min(bus->frames(), remaining_frames); |
| - bus->FromInterleaved(data_.data() + cursor, frames, bytes_per_sample_); |
| - *bytes_written = frames * bytes_per_frame_; |
| + bus->FromInterleaved(data_.data() + cursor, frames, |
| + params_.bits_per_sample() / 8); |
| + *bytes_written = frames * params_.GetBytesPerFrame(); |
| bus->ZeroFramesPartial(frames, bus->frames() - frames); |
| return true; |
| } |
| @@ -126,10 +134,7 @@ bool WavAudioHandler::ParseFmtChunk(const base::StringPiece& data) { |
| DCHECK_EQ(ReadInt<uint16>(data, kAudioFormatOffset), kAudioFormatPCM); |
| num_channels_ = ReadInt<uint16>(data, kChannelOffset); |
| sample_rate_ = ReadInt<uint32>(data, kSampleRateOffset); |
| - byte_rate_ = ReadInt<uint32>(data, kByteRateOffset); |
| bits_per_sample_ = ReadInt<uint16>(data, kBitsPerSampleOffset); |
| - bytes_per_sample_ = bits_per_sample_ >> 3; |
| - bytes_per_frame_ = num_channels_ * bytes_per_sample_; |
| return true; |
| } |