1*1295d682SXin Li /* Copyright (c) 2018 Gregor Richards 2*1295d682SXin Li * Copyright (c) 2017 Mozilla */ 3*1295d682SXin Li /* 4*1295d682SXin Li Redistribution and use in source and binary forms, with or without 5*1295d682SXin Li modification, are permitted provided that the following conditions 6*1295d682SXin Li are met: 7*1295d682SXin Li 8*1295d682SXin Li - Redistributions of source code must retain the above copyright 9*1295d682SXin Li notice, this list of conditions and the following disclaimer. 10*1295d682SXin Li 11*1295d682SXin Li - Redistributions in binary form must reproduce the above copyright 12*1295d682SXin Li notice, this list of conditions and the following disclaimer in the 13*1295d682SXin Li documentation and/or other materials provided with the distribution. 14*1295d682SXin Li 15*1295d682SXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16*1295d682SXin Li ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17*1295d682SXin Li LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18*1295d682SXin Li A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 19*1295d682SXin Li CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 20*1295d682SXin Li EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21*1295d682SXin Li PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 22*1295d682SXin Li PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 23*1295d682SXin Li LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 24*1295d682SXin Li NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 25*1295d682SXin Li SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*1295d682SXin Li */ 27*1295d682SXin Li 28*1295d682SXin Li #ifndef RNNOISE_H 29*1295d682SXin Li #define RNNOISE_H 1 30*1295d682SXin Li 31*1295d682SXin Li #include <stdio.h> 32*1295d682SXin Li 33*1295d682SXin Li #ifdef __cplusplus 34*1295d682SXin Li extern "C" { 35*1295d682SXin Li #endif 36*1295d682SXin Li 37*1295d682SXin Li #ifndef RNNOISE_EXPORT 38*1295d682SXin Li # if defined(WIN32) 39*1295d682SXin Li # if defined(RNNOISE_BUILD) && defined(DLL_EXPORT) 40*1295d682SXin Li # define RNNOISE_EXPORT __declspec(dllexport) 41*1295d682SXin Li # else 42*1295d682SXin Li # define RNNOISE_EXPORT 43*1295d682SXin Li # endif 44*1295d682SXin Li # elif defined(__GNUC__) && defined(RNNOISE_BUILD) 45*1295d682SXin Li # define RNNOISE_EXPORT __attribute__ ((visibility ("default"))) 46*1295d682SXin Li # else 47*1295d682SXin Li # define RNNOISE_EXPORT 48*1295d682SXin Li # endif 49*1295d682SXin Li #endif 50*1295d682SXin Li 51*1295d682SXin Li typedef struct DenoiseState DenoiseState; 52*1295d682SXin Li typedef struct RNNModel RNNModel; 53*1295d682SXin Li 54*1295d682SXin Li /** 55*1295d682SXin Li * Return the size of DenoiseState 56*1295d682SXin Li */ 57*1295d682SXin Li RNNOISE_EXPORT int rnnoise_get_size(); 58*1295d682SXin Li 59*1295d682SXin Li /** 60*1295d682SXin Li * Return the number of samples processed by rnnoise_process_frame at a time 61*1295d682SXin Li */ 62*1295d682SXin Li RNNOISE_EXPORT int rnnoise_get_frame_size(); 63*1295d682SXin Li 64*1295d682SXin Li /** 65*1295d682SXin Li * Initializes a pre-allocated DenoiseState 66*1295d682SXin Li * 67*1295d682SXin Li * If model is NULL the default model is used. 68*1295d682SXin Li * 69*1295d682SXin Li * See: rnnoise_create() and rnnoise_model_from_file() 70*1295d682SXin Li */ 71*1295d682SXin Li RNNOISE_EXPORT int rnnoise_init(DenoiseState *st, RNNModel *model); 72*1295d682SXin Li 73*1295d682SXin Li /** 74*1295d682SXin Li * Allocate and initialize a DenoiseState 75*1295d682SXin Li * 76*1295d682SXin Li * If model is NULL the default model is used. 77*1295d682SXin Li * 78*1295d682SXin Li * The returned pointer MUST be freed with rnnoise_destroy(). 79*1295d682SXin Li */ 80*1295d682SXin Li RNNOISE_EXPORT DenoiseState *rnnoise_create(RNNModel *model); 81*1295d682SXin Li 82*1295d682SXin Li /** 83*1295d682SXin Li * Free a DenoiseState produced by rnnoise_create. 84*1295d682SXin Li * 85*1295d682SXin Li * The optional custom model must be freed by rnnoise_model_free() after. 86*1295d682SXin Li */ 87*1295d682SXin Li RNNOISE_EXPORT void rnnoise_destroy(DenoiseState *st); 88*1295d682SXin Li 89*1295d682SXin Li /** 90*1295d682SXin Li * Denoise a frame of samples 91*1295d682SXin Li * 92*1295d682SXin Li * in and out must be at least rnnoise_get_frame_size() large. 93*1295d682SXin Li */ 94*1295d682SXin Li RNNOISE_EXPORT float rnnoise_process_frame(DenoiseState *st, float *out, const float *in); 95*1295d682SXin Li 96*1295d682SXin Li /** 97*1295d682SXin Li * Load a model from a file 98*1295d682SXin Li * 99*1295d682SXin Li * It must be deallocated with rnnoise_model_free() 100*1295d682SXin Li */ 101*1295d682SXin Li RNNOISE_EXPORT RNNModel *rnnoise_model_from_file(FILE *f); 102*1295d682SXin Li 103*1295d682SXin Li /** 104*1295d682SXin Li * Free a custom model 105*1295d682SXin Li * 106*1295d682SXin Li * It must be called after all the DenoiseStates referring to it are freed. 107*1295d682SXin Li */ 108*1295d682SXin Li RNNOISE_EXPORT void rnnoise_model_free(RNNModel *model); 109*1295d682SXin Li 110*1295d682SXin Li #ifdef __cplusplus 111*1295d682SXin Li } 112*1295d682SXin Li #endif 113*1295d682SXin Li 114*1295d682SXin Li #endif 115