Home | History | Annotate | Download | only in audio
      1 // Copyright (c) 2012 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/audio/audio_parameters.h"
      6 
      7 #include "base/logging.h"
      8 #include "media/base/limits.h"
      9 
     10 namespace media {
     11 
     12 AudioParameters::AudioParameters()
     13     : format_(AUDIO_PCM_LINEAR),
     14       channel_layout_(CHANNEL_LAYOUT_NONE),
     15       sample_rate_(0),
     16       bits_per_sample_(0),
     17       frames_per_buffer_(0),
     18       channels_(0),
     19       effects_(NO_EFFECTS) {
     20 }
     21 
     22 AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
     23                                  int sample_rate, int bits_per_sample,
     24                                  int frames_per_buffer)
     25     : format_(format),
     26       channel_layout_(channel_layout),
     27       sample_rate_(sample_rate),
     28       bits_per_sample_(bits_per_sample),
     29       frames_per_buffer_(frames_per_buffer),
     30       channels_(ChannelLayoutToChannelCount(channel_layout)),
     31       effects_(NO_EFFECTS) {
     32 }
     33 
     34 AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
     35                                  int sample_rate, int bits_per_sample,
     36                                  int frames_per_buffer, int effects)
     37     : format_(format),
     38       channel_layout_(channel_layout),
     39       sample_rate_(sample_rate),
     40       bits_per_sample_(bits_per_sample),
     41       frames_per_buffer_(frames_per_buffer),
     42       channels_(ChannelLayoutToChannelCount(channel_layout)),
     43       effects_(effects) {
     44 }
     45 
     46 AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
     47                                  int channels, int sample_rate,
     48                                  int bits_per_sample, int frames_per_buffer,
     49                                  int effects)
     50     : format_(format),
     51       channel_layout_(channel_layout),
     52       sample_rate_(sample_rate),
     53       bits_per_sample_(bits_per_sample),
     54       frames_per_buffer_(frames_per_buffer),
     55       channels_(channels),
     56       effects_(effects) {
     57   if (channel_layout != CHANNEL_LAYOUT_DISCRETE)
     58     DCHECK_EQ(channels, ChannelLayoutToChannelCount(channel_layout));
     59 }
     60 
     61 void AudioParameters::Reset(Format format, ChannelLayout channel_layout,
     62                             int channels, int sample_rate,
     63                             int bits_per_sample, int frames_per_buffer) {
     64   if (channel_layout != CHANNEL_LAYOUT_DISCRETE)
     65     DCHECK_EQ(channels, ChannelLayoutToChannelCount(channel_layout));
     66 
     67   format_ = format;
     68   channel_layout_ = channel_layout;
     69   channels_ = channels;
     70   sample_rate_ = sample_rate;
     71   bits_per_sample_ = bits_per_sample;
     72   frames_per_buffer_ = frames_per_buffer;
     73 }
     74 
     75 bool AudioParameters::IsValid() const {
     76   return (format_ >= AUDIO_PCM_LINEAR) &&
     77          (format_ < AUDIO_LAST_FORMAT) &&
     78          (channels_ > 0) &&
     79          (channels_ <= media::limits::kMaxChannels) &&
     80          (channel_layout_ > CHANNEL_LAYOUT_UNSUPPORTED) &&
     81          (channel_layout_ <= CHANNEL_LAYOUT_MAX) &&
     82          (sample_rate_ >= media::limits::kMinSampleRate) &&
     83          (sample_rate_ <= media::limits::kMaxSampleRate) &&
     84          (bits_per_sample_ > 0) &&
     85          (bits_per_sample_ <= media::limits::kMaxBitsPerSample) &&
     86          (frames_per_buffer_ > 0) &&
     87          (frames_per_buffer_ <= media::limits::kMaxSamplesPerPacket);
     88 }
     89 
     90 int AudioParameters::GetBytesPerBuffer() const {
     91   return frames_per_buffer_ * GetBytesPerFrame();
     92 }
     93 
     94 int AudioParameters::GetBytesPerSecond() const {
     95   return sample_rate_ * GetBytesPerFrame();
     96 }
     97 
     98 int AudioParameters::GetBytesPerFrame() const {
     99   return channels_ * bits_per_sample_ / 8;
    100 }
    101 
    102 base::TimeDelta AudioParameters::GetBufferDuration() const {
    103   return base::TimeDelta::FromMicroseconds(
    104       frames_per_buffer_ * base::Time::kMicrosecondsPerSecond /
    105       static_cast<float>(sample_rate_));
    106 }
    107 
    108 bool AudioParameters::Equals(const AudioParameters& other) const {
    109   return format_ == other.format() &&
    110          sample_rate_ == other.sample_rate() &&
    111          channel_layout_ == other.channel_layout() &&
    112          channels_ == other.channels() &&
    113          bits_per_sample_ == other.bits_per_sample() &&
    114          frames_per_buffer_ == other.frames_per_buffer() &&
    115          effects_ == other.effects();
    116 }
    117 
    118 }  // namespace media
    119