audio_parameters.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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
10namespace media {
11
12AudioParameters::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
23AudioParameters::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
36AudioParameters::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
50AudioParameters::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
66void 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
82bool 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
99int AudioParameters::GetBytesPerBuffer() const {
100  return frames_per_buffer_ * GetBytesPerFrame();
101}
102
103int AudioParameters::GetBytesPerSecond() const {
104  return sample_rate_ * GetBytesPerFrame();
105}
106
107int AudioParameters::GetBytesPerFrame() const {
108  return channels_ * bits_per_sample_ / 8;
109}
110
111base::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