15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/audio/audio_parameters.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/limits.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioParameters::AudioParameters()
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : format_(AUDIO_PCM_LINEAR),
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel_layout_(CHANNEL_LAYOUT_NONE),
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sample_rate_(0),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bits_per_sample_(0),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frames_per_buffer_(0),
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      channels_(0),
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      effects_(NO_EFFECTS) {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int sample_rate, int bits_per_sample,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int frames_per_buffer)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : format_(format),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      channel_layout_(channel_layout),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sample_rate_(sample_rate),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bits_per_sample_(bits_per_sample),
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      frames_per_buffer_(frames_per_buffer),
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      channels_(ChannelLayoutToChannelCount(channel_layout)),
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      effects_(NO_EFFECTS) {
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 int sample_rate, int bits_per_sample,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 int frames_per_buffer, int effects)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : format_(format),
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      channel_layout_(channel_layout),
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sample_rate_(sample_rate),
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bits_per_sample_(bits_per_sample),
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      frames_per_buffer_(frames_per_buffer),
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      channels_(ChannelLayoutToChannelCount(channel_layout)),
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      effects_(effects) {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)AudioParameters::AudioParameters(Format format, ChannelLayout channel_layout,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 int channels, int sample_rate,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 int bits_per_sample, int frames_per_buffer,
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 int effects)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : format_(format),
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      channel_layout_(channel_layout),
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      sample_rate_(sample_rate),
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bits_per_sample_(bits_per_sample),
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      frames_per_buffer_(frames_per_buffer),
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      channels_(channels),
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      effects_(effects) {
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (channel_layout != CHANNEL_LAYOUT_DISCRETE)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK_EQ(channels, ChannelLayoutToChannelCount(channel_layout));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AudioParameters::Reset(Format format, ChannelLayout channel_layout,
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            int channels, int sample_rate,
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                            int bits_per_sample, int frames_per_buffer) {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (channel_layout != CHANNEL_LAYOUT_DISCRETE)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(channels, ChannelLayoutToChannelCount(channel_layout));
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  format_ = format;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  channel_layout_ = channel_layout;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  channels_ = channels;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sample_rate_ = sample_rate;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bits_per_sample_ = bits_per_sample;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  frames_per_buffer_ = frames_per_buffer;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AudioParameters::IsValid() const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (format_ >= AUDIO_PCM_LINEAR) &&
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (format_ < AUDIO_LAST_FORMAT) &&
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (channels_ > 0) &&
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (channels_ <= media::limits::kMaxChannels) &&
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (channel_layout_ > CHANNEL_LAYOUT_UNSUPPORTED) &&
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)         (channel_layout_ <= CHANNEL_LAYOUT_MAX) &&
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (sample_rate_ >= media::limits::kMinSampleRate) &&
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (sample_rate_ <= media::limits::kMaxSampleRate) &&
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (bits_per_sample_ > 0) &&
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (bits_per_sample_ <= media::limits::kMaxBitsPerSample) &&
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (frames_per_buffer_ > 0) &&
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         (frames_per_buffer_ <= media::limits::kMaxSamplesPerPacket);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AudioParameters::GetBytesPerBuffer() const {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return frames_per_buffer_ * GetBytesPerFrame();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AudioParameters::GetBytesPerSecond() const {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sample_rate_ * GetBytesPerFrame();
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AudioParameters::GetBytesPerFrame() const {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return channels_ * bits_per_sample_ / 8;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)base::TimeDelta AudioParameters::GetBufferDuration() const {
1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return base::TimeDelta::FromMicroseconds(
1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      frames_per_buffer_ * base::Time::kMicrosecondsPerSecond /
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      static_cast<float>(sample_rate_));
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool AudioParameters::Equals(const AudioParameters& other) const {
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return format_ == other.format() &&
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         sample_rate_ == other.sample_rate() &&
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         channel_layout_ == other.channel_layout() &&
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         channels_ == other.channels() &&
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         bits_per_sample_ == other.bits_per_sample() &&
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         frames_per_buffer_ == other.frames_per_buffer() &&
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         effects_ == other.effects();
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
119