• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2011 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 
12 /*
13  * This file includes the VAD API calls. For a specific function call description,
14  * see webrtc_vad.h
15  */
16 
17 #include <stdlib.h>
18 #include <string.h>
19 
20 #include "webrtc_vad.h"
21 #include "vad_core.h"
22 
23 static const int kInitCheck = 42;
24 
WebRtcVad_get_version(char * version,size_t size_bytes)25 WebRtc_Word16 WebRtcVad_get_version(char *version, size_t size_bytes)
26 {
27     const char my_version[] = "VAD 1.2.0";
28 
29     if (version == NULL)
30     {
31         return -1;
32     }
33 
34     if (size_bytes < sizeof(my_version))
35     {
36         return -1;
37     }
38 
39     memcpy(version, my_version, sizeof(my_version));
40     return 0;
41 }
42 
WebRtcVad_AssignSize(int * size_in_bytes)43 WebRtc_Word16 WebRtcVad_AssignSize(int *size_in_bytes)
44 {
45     *size_in_bytes = sizeof(VadInstT) * 2 / sizeof(WebRtc_Word16);
46     return 0;
47 }
48 
WebRtcVad_Assign(VadInst ** vad_inst,void * vad_inst_addr)49 WebRtc_Word16 WebRtcVad_Assign(VadInst **vad_inst, void *vad_inst_addr)
50 {
51 
52     if (vad_inst == NULL)
53     {
54         return -1;
55     }
56 
57     if (vad_inst_addr != NULL)
58     {
59         *vad_inst = (VadInst*)vad_inst_addr;
60         return 0;
61     } else
62     {
63         return -1;
64     }
65 }
66 
WebRtcVad_Create(VadInst ** vad_inst)67 WebRtc_Word16 WebRtcVad_Create(VadInst **vad_inst)
68 {
69 
70     VadInstT *vad_ptr = NULL;
71 
72     if (vad_inst == NULL)
73     {
74         return -1;
75     }
76 
77     *vad_inst = NULL;
78 
79     vad_ptr = (VadInstT *)malloc(sizeof(VadInstT));
80     *vad_inst = (VadInst *)vad_ptr;
81 
82     if (vad_ptr == NULL)
83     {
84         return -1;
85     }
86 
87     vad_ptr->init_flag = 0;
88 
89     return 0;
90 }
91 
WebRtcVad_Free(VadInst * vad_inst)92 WebRtc_Word16 WebRtcVad_Free(VadInst *vad_inst)
93 {
94 
95     if (vad_inst == NULL)
96     {
97         return -1;
98     }
99 
100     free(vad_inst);
101     return 0;
102 }
103 
WebRtcVad_Init(VadInst * vad_inst)104 WebRtc_Word16 WebRtcVad_Init(VadInst *vad_inst)
105 {
106     short mode = 0; // Default high quality
107 
108     if (vad_inst == NULL)
109     {
110         return -1;
111     }
112 
113     return WebRtcVad_InitCore((VadInstT*)vad_inst, mode);
114 }
115 
WebRtcVad_set_mode(VadInst * vad_inst,WebRtc_Word16 mode)116 WebRtc_Word16 WebRtcVad_set_mode(VadInst *vad_inst, WebRtc_Word16 mode)
117 {
118     VadInstT* vad_ptr;
119 
120     if (vad_inst == NULL)
121     {
122         return -1;
123     }
124 
125     vad_ptr = (VadInstT*)vad_inst;
126     if (vad_ptr->init_flag != kInitCheck)
127     {
128         return -1;
129     }
130 
131     return WebRtcVad_set_mode_core((VadInstT*)vad_inst, mode);
132 }
133 
WebRtcVad_Process(VadInst * vad_inst,WebRtc_Word16 fs,WebRtc_Word16 * speech_frame,WebRtc_Word16 frame_length)134 WebRtc_Word16 WebRtcVad_Process(VadInst *vad_inst,
135                                 WebRtc_Word16 fs,
136                                 WebRtc_Word16 *speech_frame,
137                                 WebRtc_Word16 frame_length)
138 {
139     WebRtc_Word16 vad;
140     VadInstT* vad_ptr;
141 
142     if (vad_inst == NULL)
143     {
144         return -1;
145     }
146 
147     vad_ptr = (VadInstT*)vad_inst;
148     if (vad_ptr->init_flag != kInitCheck)
149     {
150         return -1;
151     }
152 
153     if (speech_frame == NULL)
154     {
155         return -1;
156     }
157 
158     if (fs == 32000)
159     {
160         if ((frame_length != 320) && (frame_length != 640) && (frame_length != 960))
161         {
162             return -1;
163         }
164         vad = WebRtcVad_CalcVad32khz((VadInstT*)vad_inst, speech_frame, frame_length);
165 
166     } else if (fs == 16000)
167     {
168         if ((frame_length != 160) && (frame_length != 320) && (frame_length != 480))
169         {
170             return -1;
171         }
172         vad = WebRtcVad_CalcVad16khz((VadInstT*)vad_inst, speech_frame, frame_length);
173 
174     } else if (fs == 8000)
175     {
176         if ((frame_length != 80) && (frame_length != 160) && (frame_length != 240))
177         {
178             return -1;
179         }
180         vad = WebRtcVad_CalcVad8khz((VadInstT*)vad_inst, speech_frame, frame_length);
181 
182     } else
183     {
184         return -1; // Not a supported sampling frequency
185     }
186 
187     if (vad > 0)
188     {
189         return 1;
190     } else if (vad == 0)
191     {
192         return 0;
193     } else
194     {
195         return -1;
196     }
197 }
198