Home | History | Annotate | Download | only in base
      1 // Copyright 2013 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 // MSVC++ requires this to be set before any other includes to get M_PI.
      6 #define _USE_MATH_DEFINES
      7 #include <cmath>
      8 
      9 #include "media/base/audio_hash.h"
     10 
     11 #include "base/strings/stringprintf.h"
     12 #include "media/base/audio_bus.h"
     13 
     14 namespace media {
     15 
     16 AudioHash::AudioHash()
     17     : audio_hash_(),
     18       sample_count_(0) {
     19 }
     20 
     21 AudioHash::~AudioHash() {}
     22 
     23 void AudioHash::Update(const AudioBus* audio_bus, int frames) {
     24   // Use uint32 to ensure overflow is a defined operation.
     25   for (uint32 ch = 0; ch < static_cast<uint32>(audio_bus->channels()); ++ch) {
     26     const float* channel = audio_bus->channel(ch);
     27     for (uint32 i = 0; i < static_cast<uint32>(frames); ++i) {
     28       const uint32 kSampleIndex = sample_count_ + i;
     29       const uint32 kHashIndex =
     30           (kSampleIndex * (ch + 1)) % arraysize(audio_hash_);
     31 
     32       // Mix in a sine wave with the result so we ensure that sequences of empty
     33       // buffers don't result in an empty hash.
     34       if (ch == 0) {
     35         audio_hash_[kHashIndex] +=
     36             channel[i] + sin(2.0 * M_PI * M_PI * kSampleIndex);
     37       } else {
     38         audio_hash_[kHashIndex] += channel[i];
     39       }
     40     }
     41   }
     42 
     43   sample_count_ += static_cast<uint32>(frames);
     44 }
     45 
     46 std::string AudioHash::ToString() const {
     47   std::string result;
     48   for (size_t i = 0; i < arraysize(audio_hash_); ++i)
     49     result += base::StringPrintf("%.2f,", audio_hash_[i]);
     50   return result;
     51 }
     52 
     53 }  // namespace media
     54