audio_utility.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "media/cast/test/utility/audio_utility.h" 6 7#include "base/time/time.h" 8#include "media/base/audio_bus.h" 9#include "media/cast/cast_config.h" 10 11namespace media { 12namespace cast { 13 14TestAudioBusFactory::TestAudioBusFactory(int num_channels, 15 int sample_rate, 16 float sine_wave_frequency, 17 float volume) 18 : num_channels_(num_channels), 19 sample_rate_(sample_rate), 20 volume_(volume), 21 source_(num_channels, sine_wave_frequency, sample_rate) { 22 CHECK_LT(0, num_channels); 23 CHECK_LT(0, sample_rate); 24 CHECK_LE(0.0f, volume_); 25 CHECK_LE(volume_, 1.0f); 26} 27 28TestAudioBusFactory::~TestAudioBusFactory() {} 29 30scoped_ptr<AudioBus> TestAudioBusFactory::NextAudioBus( 31 const base::TimeDelta& duration) { 32 const int num_samples = static_cast<int>((sample_rate_ * duration) / 33 base::TimeDelta::FromSeconds(1)); 34 scoped_ptr<AudioBus> bus(AudioBus::Create(num_channels_, num_samples)); 35 source_.OnMoreData(bus.get(), AudioBuffersState()); 36 bus->Scale(volume_); 37 return bus.Pass(); 38} 39 40scoped_ptr<PcmAudioFrame> ToPcmAudioFrame(const AudioBus& audio_bus, 41 int sample_rate) { 42 scoped_ptr<PcmAudioFrame> audio_frame(new PcmAudioFrame()); 43 audio_frame->channels = audio_bus.channels(); 44 audio_frame->frequency = sample_rate; 45 audio_frame->samples.resize(audio_bus.channels() * audio_bus.frames()); 46 audio_bus.ToInterleaved(audio_bus.frames(), 47 sizeof(audio_frame->samples.front()), 48 &audio_frame->samples.front()); 49 return audio_frame.Pass(); 50} 51 52int CountZeroCrossings(const std::vector<int16>& samples) { 53 // The sample values must pass beyond |kAmplitudeThreshold| on the opposite 54 // side of zero before a crossing will be counted. 55 const int kAmplitudeThreshold = 1000; // Approx. 3% of max amplitude. 56 57 int count = 0; 58 std::vector<int16>::const_iterator i = samples.begin(); 59 int16 last = 0; 60 for (; i != samples.end() && abs(last) < kAmplitudeThreshold; ++i) 61 last = *i; 62 for (; i != samples.end(); ++i) { 63 if (abs(*i) >= kAmplitudeThreshold && (last < 0) != (*i < 0)) { 64 ++count; 65 last = *i; 66 } 67 } 68 return count; 69} 70 71} // namespace cast 72} // namespace media 73