1467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org/* 2467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * 4467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * Use of this source code is governed by a BSD-style license 5467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * in the file PATENTS. All contributing project authors may 8467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org */ 10467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 11467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_ 12467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#define WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_ 13467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 14151f6f2b95bc99093ecaf0d41e1843f0c0c1a547henrike@webrtc.org#include <assert.h> 15467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#include <string.h> 16467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 17a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org#include "webrtc/base/checks.h" 18467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#include "webrtc/modules/audio_processing/include/audio_processing.h" 19467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#include "webrtc/system_wrappers/interface/scoped_ptr.h" 20467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 21467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.orgnamespace webrtc { 22467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 23467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.orgstatic inline int ChannelsFromLayout(AudioProcessing::ChannelLayout layout) { 24467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org switch (layout) { 25467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org case AudioProcessing::kMono: 26467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org case AudioProcessing::kMonoAndKeyboard: 27467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org return 1; 28467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org case AudioProcessing::kStereo: 29467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org case AudioProcessing::kStereoAndKeyboard: 30467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org return 2; 31467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org } 32467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org assert(false); 33467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org return -1; 34467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org} 35467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 36467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org// Helper to encapsulate a contiguous data buffer with access to a pointer 37467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org// array of the deinterleaved channels. 38467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.orgtemplate <typename T> 39467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.orgclass ChannelBuffer { 40467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org public: 41467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org ChannelBuffer(int samples_per_channel, int num_channels) 42467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org : data_(new T[samples_per_channel * num_channels]), 43467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org channels_(new T*[num_channels]), 44467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org samples_per_channel_(samples_per_channel), 45467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org num_channels_(num_channels) { 46017b2a46b9d099da1bd2cc9264ef27914349b5ebandrew@webrtc.org Initialize(); 47467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org } 48a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 49a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org ChannelBuffer(const T* data, int samples_per_channel, int num_channels) 50a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org : data_(new T[samples_per_channel * num_channels]), 51a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org channels_(new T*[num_channels]), 52a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org samples_per_channel_(samples_per_channel), 53a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org num_channels_(num_channels) { 54017b2a46b9d099da1bd2cc9264ef27914349b5ebandrew@webrtc.org Initialize(); 55a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org memcpy(data_.get(), data, length() * sizeof(T)); 56a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org } 57a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 58a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org ChannelBuffer(const T* const* channels, int samples_per_channel, 59a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org int num_channels) 60a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org : data_(new T[samples_per_channel * num_channels]), 61a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org channels_(new T*[num_channels]), 62a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org samples_per_channel_(samples_per_channel), 63a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org num_channels_(num_channels) { 64017b2a46b9d099da1bd2cc9264ef27914349b5ebandrew@webrtc.org Initialize(); 65a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org for (int i = 0; i < num_channels_; ++i) 66a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org CopyFrom(channels[i], i); 67a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org } 68a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 69467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org ~ChannelBuffer() {} 70467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 71467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org void CopyFrom(const void* channel_ptr, int i) { 72a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org DCHECK_LT(i, num_channels_); 73467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org memcpy(channels_[i], channel_ptr, samples_per_channel_ * sizeof(T)); 74467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org } 75467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 76467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org T* data() { return data_.get(); } 77a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org const T* data() const { return data_.get(); } 78a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 7984649c022683027d6c1765fad1d7b447a8e8b03akwiberg@webrtc.org const T* channel(int i) const { 80a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org DCHECK_GE(i, 0); 81a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org DCHECK_LT(i, num_channels_); 82467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org return channels_[i]; 83467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org } 8484649c022683027d6c1765fad1d7b447a8e8b03akwiberg@webrtc.org T* channel(int i) { 8584649c022683027d6c1765fad1d7b447a8e8b03akwiberg@webrtc.org const ChannelBuffer<T>* t = this; 8684649c022683027d6c1765fad1d7b447a8e8b03akwiberg@webrtc.org return const_cast<T*>(t->channel(i)); 8784649c022683027d6c1765fad1d7b447a8e8b03akwiberg@webrtc.org } 88467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 89a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org T* const* channels() { return channels_.get(); } 90a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org const T* const* channels() const { return channels_.get(); } 91a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 92a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org int samples_per_channel() const { return samples_per_channel_; } 93a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org int num_channels() const { return num_channels_; } 94a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org int length() const { return samples_per_channel_ * num_channels_; } 95467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 96467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org private: 97017b2a46b9d099da1bd2cc9264ef27914349b5ebandrew@webrtc.org void Initialize() { 98017b2a46b9d099da1bd2cc9264ef27914349b5ebandrew@webrtc.org memset(data_.get(), 0, sizeof(T) * length()); 99a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org for (int i = 0; i < num_channels_; ++i) 100a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org channels_[i] = &data_[i * samples_per_channel_]; 101a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org } 102a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org 103467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org scoped_ptr<T[]> data_; 104467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org scoped_ptr<T*[]> channels_; 105a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org const int samples_per_channel_; 106a0d235763fdcf0820ec97bb51b94a01f547f8334andrew@webrtc.org const int num_channels_; 107467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org}; 108467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 109467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org} // namespace webrtc 110467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org 111467f7567c8befea153861e09f048f69932d6e3bdandrew@webrtc.org#endif // WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_ 112