webrtc_vad.c (3083B)
1 /* 2 * Copyright (c) 2012 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 #include "common_audio/vad/include/webrtc_vad.h" 12 13 #include <stdlib.h> 14 #include <string.h> 15 16 #include "common_audio/signal_processing/include/signal_processing_library.h" 17 #include "common_audio/vad/vad_core.h" 18 19 static const int kInitCheck = 42; 20 static const int kValidRates[] = {8000, 16000, 32000, 48000}; 21 static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates); 22 static const int kMaxFrameLengthMs = 30; 23 24 VadInst* WebRtcVad_Create(void) { 25 VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT)); 26 27 self->init_flag = 0; 28 29 return (VadInst*)self; 30 } 31 32 void WebRtcVad_Free(VadInst* handle) { 33 free(handle); 34 } 35 36 // TODO(bjornv): Move WebRtcVad_InitCore() code here. 37 int WebRtcVad_Init(VadInst* handle) { 38 // Initialize the core VAD component. 39 return WebRtcVad_InitCore((VadInstT*)handle); 40 } 41 42 // TODO(bjornv): Move WebRtcVad_set_mode_core() code here. 43 int WebRtcVad_set_mode(VadInst* handle, int mode) { 44 VadInstT* self = (VadInstT*)handle; 45 46 if (handle == NULL) { 47 return -1; 48 } 49 if (self->init_flag != kInitCheck) { 50 return -1; 51 } 52 53 return WebRtcVad_set_mode_core(self, mode); 54 } 55 56 int WebRtcVad_Process(VadInst* handle, 57 int fs, 58 const int16_t* audio_frame, 59 size_t frame_length) { 60 int vad = -1; 61 VadInstT* self = (VadInstT*)handle; 62 63 if (handle == NULL) { 64 return -1; 65 } 66 67 if (self->init_flag != kInitCheck) { 68 return -1; 69 } 70 if (audio_frame == NULL) { 71 return -1; 72 } 73 if (WebRtcVad_ValidRateAndFrameLength(fs, frame_length) != 0) { 74 return -1; 75 } 76 77 if (fs == 48000) { 78 vad = WebRtcVad_CalcVad48khz(self, audio_frame, frame_length); 79 } else if (fs == 32000) { 80 vad = WebRtcVad_CalcVad32khz(self, audio_frame, frame_length); 81 } else if (fs == 16000) { 82 vad = WebRtcVad_CalcVad16khz(self, audio_frame, frame_length); 83 } else if (fs == 8000) { 84 vad = WebRtcVad_CalcVad8khz(self, audio_frame, frame_length); 85 } 86 87 if (vad > 0) { 88 vad = 1; 89 } 90 return vad; 91 } 92 93 int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length) { 94 int return_value = -1; 95 size_t i; 96 int valid_length_ms; 97 size_t valid_length; 98 99 // We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and 100 // see if we have a matching pair. 101 for (i = 0; i < kRatesSize; i++) { 102 if (kValidRates[i] == rate) { 103 for (valid_length_ms = 10; valid_length_ms <= kMaxFrameLengthMs; 104 valid_length_ms += 10) { 105 valid_length = (size_t)(kValidRates[i] / 1000 * valid_length_ms); 106 if (frame_length == valid_length) { 107 return_value = 0; 108 break; 109 } 110 } 111 break; 112 } 113 } 114 115 return return_value; 116 }