Home | History | Annotate | Download | only in vad
      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 "webrtc/common_audio/vad/include/webrtc_vad.h"
     12 
     13 #include <stdlib.h>
     14 #include <string.h>
     15 
     16 #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"
     19 
     20 static const int kInitCheck = 42;
     21 static const int kValidRates[] = { 8000, 16000, 32000, 48000 };
     22 static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates);
     23 static const int kMaxFrameLengthMs = 30;
     24 
     25 VadInst* WebRtcVad_Create() {
     26   VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT));
     27 
     28   WebRtcSpl_Init();
     29   self->init_flag = 0;
     30 
     31   return (VadInst*)self;
     32 }
     33 
     34 void WebRtcVad_Free(VadInst* handle) {
     35   free(handle);
     36 }
     37 
     38 // TODO(bjornv): Move WebRtcVad_InitCore() code here.
     39 int WebRtcVad_Init(VadInst* handle) {
     40   // Initialize the core VAD component.
     41   return WebRtcVad_InitCore((VadInstT*) handle);
     42 }
     43 
     44 // TODO(bjornv): Move WebRtcVad_set_mode_core() code here.
     45 int WebRtcVad_set_mode(VadInst* handle, int mode) {
     46   VadInstT* self = (VadInstT*) handle;
     47 
     48   if (handle == NULL) {
     49     return -1;
     50   }
     51   if (self->init_flag != kInitCheck) {
     52     return -1;
     53   }
     54 
     55   return WebRtcVad_set_mode_core(self, mode);
     56 }
     57 
     58 int WebRtcVad_Process(VadInst* handle, int fs, 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 }
    117