blob: 6615caf926937a05e5247533c61af32228fd9b86 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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#include "utility.h"
12
13#include "module.h"
14#include "trace.h"
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000015#include "signal_processing_library.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000016
17namespace webrtc
18{
19
20namespace voe
21{
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000022enum{kMaxTargetLen = 2*32*10}; // stereo 32KHz 10ms
niklase@google.com470e71d2011-07-07 08:21:25 +000023
pbos@webrtc.org6141e132013-04-09 10:09:10 +000024void Utility::MixWithSat(int16_t target[],
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000025 int target_channel,
pbos@webrtc.org6141e132013-04-09 10:09:10 +000026 const int16_t source[],
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000027 int source_channel,
28 int source_len)
niklase@google.com470e71d2011-07-07 08:21:25 +000029{
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000030 assert((target_channel == 1) || (target_channel == 2));
31 assert((source_channel == 1) || (source_channel == 2));
32 assert(source_len <= kMaxTargetLen);
33
34 if ((target_channel == 2) && (source_channel == 1))
niklase@google.com470e71d2011-07-07 08:21:25 +000035 {
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000036 // Convert source from mono to stereo.
pbos@webrtc.org6141e132013-04-09 10:09:10 +000037 int32_t left = 0;
38 int32_t right = 0;
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000039 for (int i = 0; i < source_len; ++i) {
40 left = source[i] + target[i*2];
41 right = source[i] + target[i*2 + 1];
42 target[i*2] = WebRtcSpl_SatW32ToW16(left);
43 target[i*2 + 1] = WebRtcSpl_SatW32ToW16(right);
44 }
45 }
46 else if ((target_channel == 1) && (source_channel == 2))
47 {
48 // Convert source from stereo to mono.
pbos@webrtc.org6141e132013-04-09 10:09:10 +000049 int32_t temp = 0;
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000050 for (int i = 0; i < source_len/2; ++i) {
51 temp = ((source[i*2] + source[i*2 + 1])>>1) + target[i];
52 target[i] = WebRtcSpl_SatW32ToW16(temp);
53 }
54 }
55 else
56 {
pbos@webrtc.org6141e132013-04-09 10:09:10 +000057 int32_t temp = 0;
braveyao@webrtc.orgd7131432012-03-29 10:39:44 +000058 for (int i = 0; i < source_len; ++i) {
59 temp = source[i] + target[i];
60 target[i] = WebRtcSpl_SatW32ToW16(temp);
61 }
niklase@google.com470e71d2011-07-07 08:21:25 +000062 }
63}
64
pbos@webrtc.org6141e132013-04-09 10:09:10 +000065void Utility::MixSubtractWithSat(int16_t target[],
66 const int16_t source[],
67 uint16_t len)
niklase@google.com470e71d2011-07-07 08:21:25 +000068{
pbos@webrtc.org6141e132013-04-09 10:09:10 +000069 int32_t temp(0);
niklase@google.com470e71d2011-07-07 08:21:25 +000070 for (int i = 0; i < len; i++)
71 {
72 temp = target[i] - source[i];
73 if (temp > 32767)
74 target[i] = 32767;
75 else if (temp < -32768)
76 target[i] = -32768;
77 else
pbos@webrtc.org6141e132013-04-09 10:09:10 +000078 target[i] = (int16_t) temp;
niklase@google.com470e71d2011-07-07 08:21:25 +000079 }
80}
81
pbos@webrtc.org6141e132013-04-09 10:09:10 +000082void Utility::MixAndScaleWithSat(int16_t target[],
83 const int16_t source[], float scale,
84 uint16_t len)
niklase@google.com470e71d2011-07-07 08:21:25 +000085{
pbos@webrtc.org6141e132013-04-09 10:09:10 +000086 int32_t temp(0);
niklase@google.com470e71d2011-07-07 08:21:25 +000087 for (int i = 0; i < len; i++)
88 {
pbos@webrtc.org6141e132013-04-09 10:09:10 +000089 temp = (int32_t) (target[i] + scale * source[i]);
niklase@google.com470e71d2011-07-07 08:21:25 +000090 if (temp > 32767)
91 target[i] = 32767;
92 else if (temp < -32768)
93 target[i] = -32768;
94 else
pbos@webrtc.org6141e132013-04-09 10:09:10 +000095 target[i] = (int16_t) temp;
niklase@google.com470e71d2011-07-07 08:21:25 +000096 }
97}
98
pbos@webrtc.org6141e132013-04-09 10:09:10 +000099void Utility::Scale(int16_t vector[], float scale, uint16_t len)
niklase@google.com470e71d2011-07-07 08:21:25 +0000100{
101 for (int i = 0; i < len; i++)
102 {
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000103 vector[i] = (int16_t) (scale * vector[i]);
niklase@google.com470e71d2011-07-07 08:21:25 +0000104 }
105}
106
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000107void Utility::ScaleWithSat(int16_t vector[], float scale,
108 uint16_t len)
niklase@google.com470e71d2011-07-07 08:21:25 +0000109{
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000110 int32_t temp(0);
niklase@google.com470e71d2011-07-07 08:21:25 +0000111 for (int i = 0; i < len; i++)
112 {
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000113 temp = (int32_t) (scale * vector[i]);
niklase@google.com470e71d2011-07-07 08:21:25 +0000114 if (temp > 32767)
115 vector[i] = 32767;
116 else if (temp < -32768)
117 vector[i] = -32768;
118 else
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000119 vector[i] = (int16_t) temp;
niklase@google.com470e71d2011-07-07 08:21:25 +0000120 }
121}
122
niklase@google.com470e71d2011-07-07 08:21:25 +0000123} // namespace voe
124
125} // namespace webrtc