blob: 3acd3c37d8d854034f1b5bf638b5e3d5e36b2fea [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
bjornv@webrtc.org152c34c2012-01-23 12:36:46 +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
pbos@webrtc.orgaa30bb72013-05-27 09:49:58 +000011#include "webrtc/common_audio/vad/include/webrtc_vad.h"
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000012
niklase@google.com470e71d2011-07-07 08:21:25 +000013#include <stdlib.h>
14#include <string.h>
15
pbos@webrtc.orgaa30bb72013-05-27 09:49:58 +000016#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
17#include "webrtc/common_audio/vad/vad_core.h"
18#include "webrtc/typedefs.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
20static const int kInitCheck = 42;
tina.legrand@webrtc.orgef433572012-10-15 17:46:19 +000021static const int kValidRates[] = { 8000, 16000, 32000, 48000 };
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000022static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates);
23static const int kMaxFrameLengthMs = 30;
niklase@google.com470e71d2011-07-07 08:21:25 +000024
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000025int WebRtcVad_Create(VadInst** handle) {
26 VadInstT* self = NULL;
niklase@google.com470e71d2011-07-07 08:21:25 +000027
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000028 if (handle == NULL) {
29 return -1;
30 }
niklase@google.com470e71d2011-07-07 08:21:25 +000031
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000032 *handle = NULL;
33 self = (VadInstT*) malloc(sizeof(VadInstT));
34 *handle = (VadInst*) self;
niklase@google.com470e71d2011-07-07 08:21:25 +000035
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000036 if (self == NULL) {
37 return -1;
38 }
niklase@google.com470e71d2011-07-07 08:21:25 +000039
kma@webrtc.orgac4d70d2012-10-05 00:19:01 +000040 WebRtcSpl_Init();
41
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000042 self->init_flag = 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000043
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000044 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000045}
46
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000047int WebRtcVad_Free(VadInst* handle) {
48 if (handle == NULL) {
49 return -1;
50 }
niklase@google.com470e71d2011-07-07 08:21:25 +000051
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000052 free(handle);
niklase@google.com470e71d2011-07-07 08:21:25 +000053
bjornv@webrtc.org26e8a582012-01-31 14:42:50 +000054 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000055}
56
bjornv@webrtc.orged700db2012-03-12 12:17:26 +000057// TODO(bjornv): Move WebRtcVad_InitCore() code here.
bjornv@webrtc.org2a4dcd72012-01-25 12:18:12 +000058int WebRtcVad_Init(VadInst* handle) {
59 // Initialize the core VAD component.
60 return WebRtcVad_InitCore((VadInstT*) handle);
niklase@google.com470e71d2011-07-07 08:21:25 +000061}
62
bjornv@webrtc.org78f0cdc2012-03-27 11:06:29 +000063// TODO(bjornv): Move WebRtcVad_set_mode_core() code here.
64int WebRtcVad_set_mode(VadInst* handle, int mode) {
65 VadInstT* self = (VadInstT*) handle;
niklase@google.com470e71d2011-07-07 08:21:25 +000066
bjornv@webrtc.org78f0cdc2012-03-27 11:06:29 +000067 if (handle == NULL) {
68 return -1;
69 }
70 if (self->init_flag != kInitCheck) {
71 return -1;
72 }
niklase@google.com470e71d2011-07-07 08:21:25 +000073
bjornv@webrtc.org78f0cdc2012-03-27 11:06:29 +000074 return WebRtcVad_set_mode_core(self, mode);
niklase@google.com470e71d2011-07-07 08:21:25 +000075}
76
bjornv@webrtc.orgb38fca12012-06-19 11:03:32 +000077int WebRtcVad_Process(VadInst* handle, int fs, int16_t* audio_frame,
78 int frame_length) {
79 int vad = -1;
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000080 VadInstT* self = (VadInstT*) handle;
niklase@google.com470e71d2011-07-07 08:21:25 +000081
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000082 if (handle == NULL) {
83 return -1;
84 }
niklase@google.com470e71d2011-07-07 08:21:25 +000085
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000086 if (self->init_flag != kInitCheck) {
87 return -1;
88 }
89 if (audio_frame == NULL) {
90 return -1;
91 }
92 if (WebRtcVad_ValidRateAndFrameLength(fs, frame_length) != 0) {
93 return -1;
94 }
niklase@google.com470e71d2011-07-07 08:21:25 +000095
tina.legrand@webrtc.orgef433572012-10-15 17:46:19 +000096 if (fs == 48000) {
97 vad = WebRtcVad_CalcVad48khz(self, audio_frame, frame_length);
98 } else if (fs == 32000) {
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +000099 vad = WebRtcVad_CalcVad32khz(self, audio_frame, frame_length);
100 } else if (fs == 16000) {
101 vad = WebRtcVad_CalcVad16khz(self, audio_frame, frame_length);
102 } else if (fs == 8000) {
103 vad = WebRtcVad_CalcVad8khz(self, audio_frame, frame_length);
104 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000105
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +0000106 if (vad > 0) {
107 vad = 1;
108 }
109 return vad;
110}
111
112int WebRtcVad_ValidRateAndFrameLength(int rate, int frame_length) {
113 int return_value = -1;
114 size_t i;
115 int valid_length_ms;
116 int valid_length;
117
118 // We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and
119 // see if we have a matching pair.
120 for (i = 0; i < kRatesSize; i++) {
121 if (kValidRates[i] == rate) {
122 for (valid_length_ms = 10; valid_length_ms <= kMaxFrameLengthMs;
123 valid_length_ms += 10) {
124 valid_length = (kValidRates[i] / 1000 * valid_length_ms);
125 if (frame_length == valid_length) {
126 return_value = 0;
127 break;
niklase@google.com470e71d2011-07-07 08:21:25 +0000128 }
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +0000129 }
130 break;
niklase@google.com470e71d2011-07-07 08:21:25 +0000131 }
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +0000132 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000133
bjornv@webrtc.orgb1c32762012-06-12 08:19:24 +0000134 return return_value;
niklase@google.com470e71d2011-07-07 08:21:25 +0000135}