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