56 lines
3.0 KiB
C
56 lines
3.0 KiB
C
#include <opus.h>
|
|
#include "rnnoise.h"
|
|
|
|
#ifdef _WIN32
|
|
#define VC_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define VC_EXPORT __attribute__((visibility("default")))
|
|
#endif
|
|
|
|
VC_EXPORT const char *vcm_opus_version(void) { return opus_get_version_string(); }
|
|
VC_EXPORT const char *vcm_opus_error(int error) { return opus_strerror(error); }
|
|
VC_EXPORT OpusEncoder *vcm_encoder_create(int rate, int channels, int application, int *error) {
|
|
return opus_encoder_create(rate, channels, application, error);
|
|
}
|
|
VC_EXPORT void vcm_encoder_destroy(OpusEncoder *encoder) { opus_encoder_destroy(encoder); }
|
|
/* C varargs are called here, not through P/Invoke: Apple arm64 uses a distinct varargs ABI. */
|
|
VC_EXPORT int vcm_encoder_set(OpusEncoder *encoder, int request, int value) {
|
|
switch (request) {
|
|
case OPUS_SET_BITRATE_REQUEST: case OPUS_SET_MAX_BANDWIDTH_REQUEST:
|
|
case OPUS_SET_COMPLEXITY_REQUEST: case OPUS_SET_INBAND_FEC_REQUEST:
|
|
case OPUS_SET_DTX_REQUEST: case OPUS_SET_PACKET_LOSS_PERC_REQUEST:
|
|
case OPUS_SET_DRED_DURATION_REQUEST:
|
|
return opus_encoder_ctl(encoder, request, value);
|
|
default: return OPUS_BAD_ARG;
|
|
}
|
|
}
|
|
VC_EXPORT int vcm_encoder_get_dred(OpusEncoder *encoder, int *duration) {
|
|
return opus_encoder_ctl(encoder, OPUS_GET_DRED_DURATION(duration));
|
|
}
|
|
VC_EXPORT int vcm_encode(OpusEncoder *encoder, const short *pcm, int samples, unsigned char *packet, int capacity) {
|
|
return opus_encode(encoder, pcm, samples, packet, capacity);
|
|
}
|
|
VC_EXPORT OpusDecoder *vcm_decoder_create(int rate, int channels, int *error) {
|
|
return opus_decoder_create(rate, channels, error);
|
|
}
|
|
VC_EXPORT void vcm_decoder_destroy(OpusDecoder *decoder) { opus_decoder_destroy(decoder); }
|
|
VC_EXPORT int vcm_decode(OpusDecoder *decoder, const unsigned char *packet, int length, short *pcm, int samples, int fec) {
|
|
return opus_decode(decoder, packet, length, pcm, samples, fec);
|
|
}
|
|
VC_EXPORT OpusDREDDecoder *vcm_dred_decoder_create(int *error) { return opus_dred_decoder_create(error); }
|
|
VC_EXPORT void vcm_dred_decoder_destroy(OpusDREDDecoder *decoder) { opus_dred_decoder_destroy(decoder); }
|
|
VC_EXPORT OpusDRED *vcm_dred_create(int *error) { return opus_dred_alloc(error); }
|
|
VC_EXPORT void vcm_dred_destroy(OpusDRED *dred) { opus_dred_free(dred); }
|
|
VC_EXPORT int vcm_dred_parse(OpusDREDDecoder *decoder, OpusDRED *dred, const unsigned char *packet,
|
|
int length, int samples, int rate, int *end) {
|
|
return opus_dred_parse(decoder, dred, packet, length, samples, rate, end, 0);
|
|
}
|
|
VC_EXPORT int vcm_dred_decode(OpusDecoder *decoder, OpusDRED *dred, int offset, short *pcm, int samples) {
|
|
return opus_decoder_dred_decode(decoder, dred, offset, pcm, samples);
|
|
}
|
|
VC_EXPORT DenoiseState *vcm_rnnoise_create(void) { return rnnoise_create(NULL); }
|
|
VC_EXPORT void vcm_rnnoise_destroy(DenoiseState *state) { rnnoise_destroy(state); }
|
|
VC_EXPORT float vcm_rnnoise_process(DenoiseState *state, float *output, const float *input) {
|
|
return rnnoise_process_frame(state, output, input);
|
|
}
|