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