• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_
13 
14 #include <assert.h>
15 #include <string.h>
16 
17 #include "webrtc/modules/audio_processing/include/audio_processing.h"
18 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
19 
20 namespace webrtc {
21 
ChannelsFromLayout(AudioProcessing::ChannelLayout layout)22 static inline int ChannelsFromLayout(AudioProcessing::ChannelLayout layout) {
23   switch (layout) {
24     case AudioProcessing::kMono:
25     case AudioProcessing::kMonoAndKeyboard:
26       return 1;
27     case AudioProcessing::kStereo:
28     case AudioProcessing::kStereoAndKeyboard:
29       return 2;
30   }
31   assert(false);
32   return -1;
33 }
34 
35 // Helper to encapsulate a contiguous data buffer with access to a pointer
36 // array of the deinterleaved channels.
37 template <typename T>
38 class ChannelBuffer {
39  public:
ChannelBuffer(int samples_per_channel,int num_channels)40   ChannelBuffer(int samples_per_channel, int num_channels)
41       : data_(new T[samples_per_channel * num_channels]),
42         channels_(new T*[num_channels]),
43         samples_per_channel_(samples_per_channel),
44         num_channels_(num_channels) {
45     memset(data_.get(), 0, sizeof(T) * samples_per_channel * num_channels);
46     for (int i = 0; i < num_channels; ++i)
47       channels_[i] = &data_[i * samples_per_channel];
48   }
~ChannelBuffer()49   ~ChannelBuffer() {}
50 
CopyFrom(const void * channel_ptr,int i)51   void CopyFrom(const void* channel_ptr, int i) {
52     assert(i < num_channels_);
53     memcpy(channels_[i], channel_ptr, samples_per_channel_ * sizeof(T));
54   }
55 
data()56   T* data() { return data_.get(); }
channel(int i)57   T* channel(int i) {
58     assert(i < num_channels_);
59     return channels_[i];
60   }
channels()61   T** channels() { return channels_.get(); }
62 
samples_per_channel()63   int samples_per_channel() { return samples_per_channel_; }
num_channels()64   int num_channels() { return num_channels_; }
length()65   int length() { return samples_per_channel_ * num_channels_; }
66 
67  private:
68   scoped_ptr<T[]> data_;
69   scoped_ptr<T*[]> channels_;
70   int samples_per_channel_;
71   int num_channels_;
72 };
73 
74 }  // namespace webrtc
75 
76 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_
77