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