From: Jaechul Lee Date: Wed, 7 Aug 2024 08:31:39 +0000 (+0900) Subject: Support multi-thread X-Git-Tag: accepted/tizen/unified/20240903.110731^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_9.0;p=platform%2Fcore%2Fmultimedia%2Flibaudio-effect.git Support multi-thread * refactoring * remove global variables [Version] 0.0.26 [Issue Type] Update Change-Id: Ie8ef599ae970934e8de04121fd887316463f9e78 Signed-off-by: Jaechul Lee --- diff --git a/include/audio_effect.h b/include/audio_effect.h index b89c130..321b01e 100644 --- a/include/audio_effect.h +++ b/include/audio_effect.h @@ -21,8 +21,6 @@ extern "C" { #endif -#include - typedef struct audio_effect_interface audio_effect_interface_s; typedef enum { AUDIO_EFFECT_METHOD_REFCOPY, /* Synthesis the reference source into the recording source */ @@ -48,18 +46,21 @@ typedef enum { } audio_effect_format_e; typedef struct audio_effect { + void *dl_handle; void *priv; audio_effect_interface_s *intf; - size_t request_framesize; + audio_effect_method_e method; } audio_effect_s; -audio_effect_s *audio_effect_create(audio_effect_method_e method, int rate, - int channels, audio_effect_format_e format, - size_t frames); -int audio_effect_process(audio_effect_s *ae, void *in, void *out); -int audio_effect_process_reference(audio_effect_s *ae, void *in, void *ref, void *out); +audio_effect_s *audio_effect_create(audio_effect_method_e method, + int rate, + int channels, + audio_effect_format_e format, + size_t request_frames, + size_t *adjust_frames); +int audio_effect_process(audio_effect_s *ae, const void *in, void *out); +int audio_effect_process_reference(audio_effect_s *ae, const void *in, const void *ref, void *out); void audio_effect_destroy(audio_effect_s *ae); -size_t audio_effect_get_process_framesize(audio_effect_s *ae); #ifdef __cplusplus } diff --git a/include/audio_effect_interface.h b/include/audio_effect_interface.h index 826a40f..7afbc3e 100644 --- a/include/audio_effect_interface.h +++ b/include/audio_effect_interface.h @@ -24,8 +24,8 @@ extern "C" { #include "audio_effect.h" typedef void *(*dl_create_t)(int, int, audio_effect_format_e, size_t); -typedef int (*dl_process_t)(void *, char *, char *); -typedef int (*dl_process_reference_t)(void *, char *, char *, char *); +typedef int (*dl_process_t)(void *, const void *, void *); +typedef int (*dl_process_reference_t)(void *, const void *, const void *, void *); typedef void (*dl_destroy_t)(void *); typedef struct audio_effect_interface { @@ -41,7 +41,6 @@ typedef struct audio_effect_plugin_info { const char *name; audio_effect_interface_s interface; struct { - size_t frames; size_t frames_msec; int min_rate; int max_rate; @@ -52,11 +51,12 @@ typedef struct audio_effect_plugin_info { } constraint; } audio_effect_plugin_info_s; -audio_effect_interface_s *audio_effect_interface_new(audio_effect_method_e method, - int rate, int channels, - audio_effect_format_e format, - size_t frames); -void audio_effect_interface_free(audio_effect_interface_s *intf); +audio_effect_interface_s *audio_effect_interface_get(void *dl_handle, + int rate, + int channels, + audio_effect_format_e format, + size_t request_frames, + size_t *adjust_frames); #define PLUGIN_ENTRY_POINT __audio_effect_plugin_entry_point__ #define PLUGIN_ENTRY_POINT_DEFINE_FUNC(s) \ @@ -66,6 +66,8 @@ void audio_effect_interface_free(audio_effect_interface_s *intf); #define PLUGIN_ENTRY_POINT_CONVERT(X) PLUGIN_CONVERT_TO_STRING(X) #define PLUGIN_ENTRY_POINT_STRING PLUGIN_ENTRY_POINT_CONVERT(PLUGIN_ENTRY_POINT) +typedef audio_effect_plugin_info_s *(*entry_point_t)(void); + #ifdef __cplusplus } #endif diff --git a/include/audio_effect_log.h b/include/audio_effect_log.h index 3936f10..20dcbbb 100644 --- a/include/audio_effect_log.h +++ b/include/audio_effect_log.h @@ -34,11 +34,11 @@ extern "C" { #define LOG_VERBOSE(...) SLOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) #else #include -#define LOG_ERROR(...) { printf(__VA_ARGS__); printf("\n"); } -#define LOG_WARN(...) { printf(__VA_ARGS__); printf("\n"); } -#define LOG_INFO(...) { printf(__VA_ARGS__); printf("\n"); } -#define LOG_DEBUG(...) { printf(__VA_ARGS__); printf("\n"); } -#define LOG_VERBOSE(...) { printf(__VA_ARGS__); printf("\n"); } +#define LOG_ERROR(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } +#define LOG_WARN(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } +#define LOG_INFO(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } +#define LOG_DEBUG(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } +#define LOG_VERBOSE(...) { fprintf(stderr, __VA_ARGS__); fprintf(stderr, "\n"); } #endif #ifdef __cplusplus diff --git a/include/audio_effect_util.h b/include/audio_effect_util.h index cf0f067..402ac87 100644 --- a/include/audio_effect_util.h +++ b/include/audio_effect_util.h @@ -25,6 +25,7 @@ extern "C" { size_t audio_effect_util_get_sample_size(audio_effect_format_e format); size_t audio_effect_util_get_frame_size(audio_effect_format_e format, int channels); +size_t audio_effect_util_frame_to_msec(size_t frame, int rate); size_t audio_effect_util_msec_to_frame(size_t msec, int rate); size_t audio_effect_util_msec_to_bytes(size_t msec, int rate, int channels, audio_effect_format_e format); void audio_effect_util_convert_s16le_to_float(size_t n, const short *a, float *b); diff --git a/packaging/libaudio-effect.spec b/packaging/libaudio-effect.spec index 46c5474..05fa802 100644 --- a/packaging/libaudio-effect.spec +++ b/packaging/libaudio-effect.spec @@ -1,6 +1,6 @@ Name: libaudio-effect Summary: audio effect library -Version: 0.0.25 +Version: 0.0.26 Release: 0 Group: System/Libraries License: Apache-2.0 diff --git a/src/audio_effect.c b/src/audio_effect.c index 3df374d..c7c78b3 100644 --- a/src/audio_effect.c +++ b/src/audio_effect.c @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include #include @@ -26,39 +29,88 @@ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) -audio_effect_s *audio_effect_create(audio_effect_method_e method, int rate, int channels, - audio_effect_format_e format, size_t frames) +static const char *effect_path_list[] = { + [AUDIO_EFFECT_METHOD_AEC_SPEEX] = DL_PLUGIN_PATH "libaudio-effect-aec-speex.so", + [AUDIO_EFFECT_METHOD_AEC_WEBRTC] = DL_PLUGIN_PATH "libaudio-effect-aec-webrtc.so", + [AUDIO_EFFECT_METHOD_REFCOPY] = DL_PLUGIN_PATH "libaudio-effect-refcopy.so", + [AUDIO_EFFECT_METHOD_NS_PSE] = DL_PLUGIN_PATH "libaudio-effect-ns-pse.so", + [AUDIO_EFFECT_METHOD_NS_RNNOISE] = DL_PLUGIN_PATH "libaudio-effect-ns-rnnoise.so", + [AUDIO_EFFECT_METHOD_NS_SRID] = DL_PLUGIN_PATH "libaudio-effect-ns-srid.so", + [AUDIO_EFFECT_METHOD_AGC_SPEEX] = DL_PLUGIN_PATH "libaudio-effect-agc-speex.so", + [AUDIO_EFFECT_METHOD_AMPLIFY] = DL_PLUGIN_PATH "libaudio-effect-amplify.so", +}; + +static_assert(sizeof(effect_path_list) / sizeof(char *) == AUDIO_EFFECT_METHOD_MAX); + +static const char *_get_plugin_name(const char *name) { - audio_effect_s *ae; - audio_effect_interface_s *intf; + assert(name); + return name + strlen(DL_PLUGIN_PATH); +} - intf = audio_effect_interface_new(method, rate, channels, format, frames); - if (!intf) { - LOG_ERROR("failed to create interface," - "method(%d) rate(%d), channels(%d), format(%d), frames(%zu)", - method, rate, channels, format, frames); +audio_effect_s *audio_effect_create(audio_effect_method_e method, + int rate, + int channels, + audio_effect_format_e format, + size_t request_frames, + size_t *adjust_frames) +{ + audio_effect_s *ae = NULL; + audio_effect_interface_s *intf = NULL; + void *dl_handle = NULL; + size_t _adjust_frames; + + LOG_INFO("Trys to open plugin. name(%s)", _get_plugin_name(effect_path_list[method])); + + dl_handle = dlopen(effect_path_list[method], RTLD_LAZY); + if (!dl_handle) { + LOG_ERROR("Failed to open handle. path(%s) dlerror(%s)", _get_plugin_name(effect_path_list[method]), dlerror()); return NULL; } + LOG_INFO("dlopened plugin. name(%s)", _get_plugin_name(effect_path_list[method])); + + intf = audio_effect_interface_get(dl_handle, rate, channels, format, request_frames, &_adjust_frames); + if (!intf) { + LOG_ERROR("Failed to create interface," + "method(%d) rate(%d), channels(%d), format(%d), request_frames(%zu)", + method, rate, channels, format, request_frames); + goto fail; + } + ae = (audio_effect_s *)calloc(1, sizeof(audio_effect_s)); - assert(ae); + if (!ae) { + LOG_ERROR("Failed to allocate memory"); + goto fail; + } + ae->dl_handle = dl_handle; ae->intf = intf; - ae->priv = intf->create(rate, channels, format, frames); - ae->request_framesize = frames; - + ae->method = method; + ae->priv = intf->create(rate, channels, format, _adjust_frames); if (!ae->priv) { - audio_effect_interface_free(ae->intf); - free(ae); - LOG_ERROR("Failed to create plugin function"); - return NULL; + goto fail; } + *adjust_frames = _adjust_frames; + + LOG_INFO("audio-effect created. method(%d), rate(%d), channels(%d), " + "foramt(%d), request_frames(%zu), adjust_framesize(%zu)", + method, rate, channels, format, request_frames, *adjust_frames); + return ae; + +fail: + if (dl_handle) + dlclose(dl_handle); + if (ae) + free(ae); + + return NULL; } -int audio_effect_process(audio_effect_s *ae, void *in, void *out) +int audio_effect_process(audio_effect_s *ae, const void *in, void *out) { assert(in); assert(out); @@ -74,7 +126,7 @@ int audio_effect_process(audio_effect_s *ae, void *in, void *out) return ae->intf->process(ae->priv, in, out); } -int audio_effect_process_reference(audio_effect_s *ae, void *in, void *ref, void *out) +int audio_effect_process_reference(audio_effect_s *ae, const void *in, const void *ref, void *out) { assert(in); assert(out); @@ -92,27 +144,22 @@ int audio_effect_process_reference(audio_effect_s *ae, void *in, void *ref, void void audio_effect_destroy(audio_effect_s *ae) { + int ret; + assert(ae); assert(ae->intf); assert(ae->priv); assert(ae->intf->destroy); ae->intf->destroy(ae->priv); - audio_effect_interface_free(ae->intf); - free(ae); -} + LOG_INFO("unloading the plugin. (%s)", _get_plugin_name(effect_path_list[ae->method])); -size_t audio_effect_get_process_framesize(audio_effect_s *ae) -{ - audio_effect_plugin_info_s *plugin_info; + if ((ret = dlclose(ae->dl_handle)) != 0) + LOG_ERROR("Failed to close plugin. ret(%d), dlerror(%s)", ret, dlerror()); - assert(ae); + LOG_INFO("unloaded the plugin. (%s)", _get_plugin_name(effect_path_list[ae->method])); - plugin_info = container_of(ae->intf, audio_effect_plugin_info_s, interface); - - if (plugin_info->constraint.frames != 0) - return plugin_info->constraint.frames; - else - return ae->request_framesize; + free(ae); } + diff --git a/src/audio_effect_interface.c b/src/audio_effect_interface.c index e507a70..8821008 100644 --- a/src/audio_effect_interface.c +++ b/src/audio_effect_interface.c @@ -18,132 +18,81 @@ #include #include #include -#include +#include /* Remove annoying errors like below * ISO C forbids conversion of object pointer to function pointer type * when I convert void pointer to function pointer */ #include -#include #include #include #include -typedef audio_effect_plugin_info_s *(*entry_point_t)(void); +static bool _audio_effect_interface_verify_constraint(audio_effect_plugin_info_s *plugin_info, + int rate, + int channels, + audio_effect_format_e format, + size_t request_frames, + size_t *adjust_frames) +{ + /* check constraint */ + if (plugin_info->constraint.min_rate > rate || rate > plugin_info->constraint.max_rate) { + LOG_ERROR("Not supported. name(%s), rate(%d), min_rate(%d), max_rate(%d)", + plugin_info->name, rate, plugin_info->constraint.min_rate, plugin_info->constraint.max_rate); + return false; + } + + if (plugin_info->constraint.min_channels > channels || channels > plugin_info->constraint.max_channels) { + LOG_ERROR("Not supported. name(%s), channels(%d), min_channels(%d), max_channels(%d)", + plugin_info->name, channels, plugin_info->constraint.min_channels, plugin_info->constraint.max_channels); + return false; + } -static const char *effect_path_list[] = { - [AUDIO_EFFECT_METHOD_AEC_SPEEX] = DL_PLUGIN_PATH "libaudio-effect-aec-speex.so", - [AUDIO_EFFECT_METHOD_AEC_WEBRTC] = DL_PLUGIN_PATH "libaudio-effect-aec-webrtc.so", - [AUDIO_EFFECT_METHOD_REFCOPY] = DL_PLUGIN_PATH "libaudio-effect-refcopy.so", - [AUDIO_EFFECT_METHOD_NS_PSE] = DL_PLUGIN_PATH "libaudio-effect-ns-pse.so", - [AUDIO_EFFECT_METHOD_NS_RNNOISE] = DL_PLUGIN_PATH "libaudio-effect-ns-rnnoise.so", - [AUDIO_EFFECT_METHOD_NS_SRID] = DL_PLUGIN_PATH "libaudio-effect-ns-srid.so", - [AUDIO_EFFECT_METHOD_AGC_SPEEX] = DL_PLUGIN_PATH "libaudio-effect-agc-speex.so", - [AUDIO_EFFECT_METHOD_AMPLIFY] = DL_PLUGIN_PATH "libaudio-effect-amplify.so", -}; + if (plugin_info->constraint.min_format > format || format > plugin_info->constraint.max_format) { + LOG_ERROR("Not supported. name(%s), format(%d), min_format(%d), max_format(%d)", + plugin_info->name, format, plugin_info->constraint.min_format, plugin_info->constraint.max_format); + return false; + } -static_assert(sizeof(effect_path_list) / sizeof(char *) == AUDIO_EFFECT_METHOD_MAX); + if (plugin_info->constraint.frames_msec == 0) { + LOG_INFO("Can't find frame size in plugin_info"); + return false; + } -static void *dl_handles[AUDIO_EFFECT_METHOD_MAX]; + *adjust_frames = audio_effect_util_msec_to_frame(plugin_info->constraint.frames_msec, rate); -static const char *get_plugin_name(const char *name) -{ - assert(name); - return name + strlen(DL_PLUGIN_PATH); + return true; } -audio_effect_interface_s *audio_effect_interface_new(audio_effect_method_e method, - int rate, int channels, - audio_effect_format_e format, - size_t frames) +audio_effect_interface_s *audio_effect_interface_get(void *dl_handle, + int rate, + int channels, + audio_effect_format_e format, + size_t request_frames, + size_t *adjust_frames) { audio_effect_plugin_info_s *plugin_info; entry_point_t entry_point; - void *handle; - - assert(method < AUDIO_EFFECT_METHOD_MAX); - - LOG_INFO("Trying to create the plugin. method(%s)", get_plugin_name(effect_path_list[method])); - - if (dl_handles[method]) { - LOG_ERROR("Failed to load plugin. It's already loaded. method(%s)", get_plugin_name(effect_path_list[method])); - return NULL; - } - handle = dlopen(effect_path_list[method], RTLD_LAZY); - if (!handle) { - LOG_ERROR("Failed to open handle. path(%s) dlerror(%s)", get_plugin_name(effect_path_list[method]), dlerror()); - return NULL; - } - - entry_point = dlsym(handle, PLUGIN_ENTRY_POINT_STRING); + entry_point = dlsym(dl_handle, PLUGIN_ENTRY_POINT_STRING); if (!entry_point) { LOG_ERROR("Failed to get the symbol(%s)", PLUGIN_ENTRY_POINT_STRING); - goto fail; + return NULL; } plugin_info = entry_point(); if (!plugin_info) { LOG_ERROR("Failed to get plugin_info"); - goto fail; - } - - /* check constraint */ - if (plugin_info->constraint.min_rate > rate || rate > plugin_info->constraint.max_rate) { - LOG_ERROR("Not supported rate(%d), min_rate(%d), max_rate(%d)", - rate, plugin_info->constraint.min_rate, plugin_info->constraint.max_rate); - goto fail; - } - - if (plugin_info->constraint.min_channels > channels || channels > plugin_info->constraint.max_channels) { - LOG_ERROR("Not supported channels(%d), min_channels(%d), max_channels(%d)", - channels, plugin_info->constraint.min_channels, plugin_info->constraint.max_channels); - goto fail; + return NULL; } - if (plugin_info->constraint.min_format > format || format > plugin_info->constraint.max_format) { - LOG_ERROR("Not supported format(%d), min_format(%d), max_format(%d)", - format, plugin_info->constraint.min_format, plugin_info->constraint.max_format); - goto fail; + if (!_audio_effect_interface_verify_constraint(plugin_info, rate, channels, + format, request_frames, adjust_frames)) { + LOG_WARN("Failed to verify the method with constraint"); + return NULL; } - if (plugin_info->constraint.frames_msec != 0) - plugin_info->constraint.frames = audio_effect_util_msec_to_frame(plugin_info->constraint.frames_msec, rate); - - if (plugin_info->constraint.frames != 0 && plugin_info->constraint.frames != frames) - LOG_WARN("This plugin uses fixed frames size. Check frames size with audio_effect_get_process_framesize api"); - - dl_handles[method] = handle; - - LOG_INFO("plugin(%s) was created successfully. handle(%p)", get_plugin_name(effect_path_list[method]), dl_handles[method]); - return &plugin_info->interface; - -fail: - dlclose(handle); - - return NULL; -} - -void audio_effect_interface_free(audio_effect_interface_s *intf) -{ - audio_effect_method_e method; - int ret; - - assert(intf); - assert(dl_handles[intf->method]); - assert(intf->method < AUDIO_EFFECT_METHOD_MAX); - - method = intf->method; - - LOG_INFO("unloading the plugin. (%s). handle(%p)", get_plugin_name(effect_path_list[method]), dl_handles[method]); - - if ((ret = dlclose(dl_handles[method])) != 0) - LOG_ERROR("Failed to close plugin. ret(%d), dlerror(%s)", ret, dlerror()); - - dl_handles[method] = NULL; - - LOG_INFO("unloaded the plugin. (%s)", get_plugin_name(effect_path_list[method])); } diff --git a/src/audio_effect_util.c b/src/audio_effect_util.c index 2cfdda6..e0e59ce 100644 --- a/src/audio_effect_util.c +++ b/src/audio_effect_util.c @@ -43,6 +43,11 @@ size_t audio_effect_util_get_frame_size(audio_effect_format_e format, int channe return sample_size_table[format] * channels; } +size_t audio_effect_util_frame_to_msec(size_t frame, int rate) +{ + return (frame * 1000) / rate; +} + size_t audio_effect_util_msec_to_frame(size_t msec, int rate) { return rate * msec / 1000; diff --git a/src/plugin_aec_speex.c b/src/plugin_aec_speex.c index bcafbf7..5cd02b3 100644 --- a/src/plugin_aec_speex.c +++ b/src/plugin_aec_speex.c @@ -24,6 +24,8 @@ #include #include +#define FRAMES_MSEC 10 + struct userdata { SpeexEchoState *echo_state; SpeexPreprocessState *preprocess; @@ -89,7 +91,7 @@ fail: return NULL; } -static int aec_speex_process_reference(void *priv, char *rec, char *ref, char *out) +static int aec_speex_process_reference(void *priv, const void *rec, const void *ref, void *out) { struct userdata *u = (struct userdata *)priv; @@ -131,6 +133,7 @@ static audio_effect_plugin_info_s aec_speex_desc= { .destroy = aec_speex_destroy, }, .constraint = { + .frames_msec = FRAMES_MSEC, .min_rate = 8000, .max_rate = 48000, .min_channels = 1, diff --git a/src/plugin_aec_webrtc.cpp b/src/plugin_aec_webrtc.cpp index 160bee6..28ea991 100644 --- a/src/plugin_aec_webrtc.cpp +++ b/src/plugin_aec_webrtc.cpp @@ -118,7 +118,7 @@ fail: return NULL; } -static int aec_webrtc_process_reference(void *priv, char *rec, char *ref, char *out) +static int aec_webrtc_process_reference(void *priv, const void *rec, const void *ref, void *out) { struct userdata *u = (struct userdata *)priv; size_t frames; diff --git a/src/plugin_agc_speex.c b/src/plugin_agc_speex.c index e0dcc0e..7835336 100644 --- a/src/plugin_agc_speex.c +++ b/src/plugin_agc_speex.c @@ -95,10 +95,10 @@ fail: return NULL; } -static int agc_speex_process(void *priv, char *in, char *out) +static int agc_speex_process(void *priv, const void *in, void *out) { int i; - char *src = in; + const char *src = (const char *)in; char *dst = out; struct userdata *u = (struct userdata *)priv; diff --git a/src/plugin_amplify.c b/src/plugin_amplify.c index 3f8490a..ad99e2b 100644 --- a/src/plugin_amplify.c +++ b/src/plugin_amplify.c @@ -19,6 +19,7 @@ #include #include +#define FRAMES_MSEC 10 #define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x))) struct userdata { @@ -42,7 +43,7 @@ static void *amplify_create(int rate, int channels, audio_effect_format_e format return (void *)u; } -static int amplify_process(void *priv, char *in, char *out) +static int amplify_process(void *priv, const void *in, void *out) { size_t i; struct userdata *u = (struct userdata *)priv; @@ -76,6 +77,7 @@ static audio_effect_plugin_info_s amplify_desc = { .destroy = amplify_destroy, }, .constraint = { + .frames_msec = FRAMES_MSEC, .min_rate = 8000, .max_rate = 48000, .min_channels = 1, diff --git a/src/plugin_ns_rnnoise.c b/src/plugin_ns_rnnoise.c index da056d2..b01a8b5 100644 --- a/src/plugin_ns_rnnoise.c +++ b/src/plugin_ns_rnnoise.c @@ -279,7 +279,7 @@ fail: return NULL; } -static int ns_rnnoise_process(void *priv, char *in, char *out) +static int ns_rnnoise_process(void *priv, const void *in, void *out) { struct userdata *u = (struct userdata *)priv; diff --git a/src/plugin_ns_srid.c b/src/plugin_ns_srid.c index ec42620..14f1242 100644 --- a/src/plugin_ns_srid.c +++ b/src/plugin_ns_srid.c @@ -22,6 +22,7 @@ #include +#define FIXED_FRAME_SIZE_MSEC 20 #define MAX_DELAY_MSEC 20 struct userdata { @@ -63,8 +64,6 @@ static void *ns_srid_create(int rate, int channels, audio_effect_format_e format u->frames = (size_t)frame_size; u->buffer = (float *)malloc(sizeof(float) * u->frames); - ns_srid_desc.constraint.frames = u->frames; - noise_suppression_set_level(u->handle, NOISE_SUPPRESSION_LEVEL_MID); LOG_INFO("plugin noise-suppression srid init. rate(%d), channels(%d), format(%d), frames(%zu)", @@ -73,7 +72,7 @@ static void *ns_srid_create(int rate, int channels, audio_effect_format_e format return u; } -static int ns_srid_process(void *priv, char *in, char *out) +static int ns_srid_process(void *priv, const void *in, void *out) { struct userdata *u = (struct userdata *)priv; int16_t *rec = (int16_t *)in; @@ -123,7 +122,7 @@ static audio_effect_plugin_info_s ns_srid_desc = { .destroy = ns_srid_destroy, }, .constraint = { - .frames = 480, + .frames_msec = FIXED_FRAME_SIZE_MSEC, .min_rate = 16000, .max_rate = 48000, .min_channels = 1, diff --git a/src/plugin_refcopy.c b/src/plugin_refcopy.c index ab491e9..17c0ed5 100644 --- a/src/plugin_refcopy.c +++ b/src/plugin_refcopy.c @@ -22,6 +22,8 @@ #include #include +#define FRAMES_MSEC 10 + struct userdata { size_t frames; size_t sample_size; @@ -47,23 +49,24 @@ static void *reference_copy_create(int rate, int channels, audio_effect_format_e return (void *)u; } -static int reference_copy_process_reference(void *priv, char *rec, char *ref, char *out) +static int reference_copy_process_reference(void *priv, const void *rec, const void *ref, void *out) { struct userdata *u = (struct userdata *)priv; size_t rec_bytes, ref_bytes, actual_bytes, total_bytes; char *dst = out; + char *_out = out; assert(u); assert(rec); assert(ref); - assert(out); + assert(_out); rec_bytes = u->frame_size; ref_bytes = u->sample_size; /* reference must be mono channel */ actual_bytes = rec_bytes - ref_bytes; total_bytes = rec_bytes * u->frames; - while ((size_t)(dst - out) < total_bytes) { + while ((size_t)(dst - _out) < total_bytes) { memcpy(dst, rec, actual_bytes); memcpy(dst + actual_bytes, ref, ref_bytes); dst += rec_bytes; @@ -90,6 +93,7 @@ static audio_effect_plugin_info_s reference_copy_desc = { .destroy = reference_copy_destroy, }, .constraint = { + .frames_msec = FRAMES_MSEC, .min_rate = 8000, .max_rate = 48000, .min_channels = 1, diff --git a/test/aec_speex_test.c b/test/aec_speex_test.c index 1433853..922dfb7 100644 --- a/test/aec_speex_test.c +++ b/test/aec_speex_test.c @@ -28,6 +28,7 @@ int main(void) int loop; size_t process_framesize = FRAME_SIZE; + size_t adjust_framesize; int i=1; @@ -57,12 +58,11 @@ int main(void) exit(-1); } - ae = audio_effect_create(AUDIO_EFFECT_METHOD_AEC_SPEEX, 16000, 1, AUDIO_EFFECT_FORMAT_S16, process_framesize); - process_framesize = audio_effect_get_process_framesize(ae); + ae = audio_effect_create(AUDIO_EFFECT_METHOD_AEC_SPEEX, 16000, 1, AUDIO_EFFECT_FORMAT_S16, process_framesize, &adjust_framesize); - printf("process_framesize (%zu)\n", process_framesize); + printf("adjust_framesize (%zu)\n", adjust_framesize); - loop = MIN(rec_size / (process_framesize * sizeof(short)), ref_size / (process_framesize * sizeof(short))); + loop = MIN(rec_size / (adjust_framesize * sizeof(short)), ref_size / (adjust_framesize * sizeof(short))); while (loop-- > 0) { ret = fread(in, sizeof(in), 1, f_rec); diff --git a/test/aec_webrtc_test.c b/test/aec_webrtc_test.c index f34608b..26f59e4 100644 --- a/test/aec_webrtc_test.c +++ b/test/aec_webrtc_test.c @@ -28,6 +28,7 @@ int main(void) int loop; size_t process_framesize = FRAME_SIZE; + size_t adjust_framesize; int i=1; @@ -57,12 +58,11 @@ int main(void) exit(-1); } - ae = audio_effect_create(AUDIO_EFFECT_METHOD_AEC_WEBRTC, 16000, 1, AUDIO_EFFECT_FORMAT_S16, process_framesize); - process_framesize = audio_effect_get_process_framesize(ae); + ae = audio_effect_create(AUDIO_EFFECT_METHOD_AEC_WEBRTC, 16000, 1, AUDIO_EFFECT_FORMAT_S16, process_framesize, &adjust_framesize); - printf("process_framesize (%zu)\n", process_framesize); + printf("adjust_framesize (%zu)\n", adjust_framesize); - loop = MIN(rec_size / (process_framesize * sizeof(short)), ref_size / (process_framesize * sizeof(short))); + loop = MIN(rec_size / (adjust_framesize * sizeof(short)), ref_size / (adjust_framesize * sizeof(short))); while (loop-- > 0) { ret = fread(in, sizeof(in), 1, f_rec); diff --git a/test/agc_speex_test.c b/test/agc_speex_test.c index d440d07..74d6d6c 100644 --- a/test/agc_speex_test.c +++ b/test/agc_speex_test.c @@ -27,8 +27,8 @@ int main(void) int rate[] = { 16000, 16000, 48000 }; int channels[] = { 1, 2, 2 }; - int frames[] = { 160, 160, 480 }; - size_t fs; + size_t frames[] = { 160, 160, 480 }; + size_t adjust_frames; printf("--- agc speex start ---\n"); @@ -45,20 +45,17 @@ int main(void) exit(-1); } - ae = audio_effect_create(AUDIO_EFFECT_METHOD_AGC_SPEEX, rate[i], channels[i], AUDIO_EFFECT_FORMAT_S16, frames[i]); + ae = audio_effect_create(AUDIO_EFFECT_METHOD_AGC_SPEEX, rate[i], channels[i], AUDIO_EFFECT_FORMAT_S16, frames[i], &adjust_frames); assert(ae); - fs = audio_effect_get_process_framesize(ae); - printf("frame size %zu\n", fs); - - in = (char *)malloc(fs * channels[i] * FORMAT_SIZE); + in = (char *)malloc(adjust_frames * channels[i] * FORMAT_SIZE); assert(in); - out = (char *)malloc(fs * channels[i] * FORMAT_SIZE); + out = (char *)malloc(adjust_frames * channels[i] * FORMAT_SIZE); assert(out); while (!feof(fin)) { - if (fread(in, channels[i] * FORMAT_SIZE, fs, fin) < 0) + if (fread(in, channels[i] * FORMAT_SIZE, adjust_frames, fin) < 0) break; printf("#%d frame. ", n++); @@ -67,7 +64,7 @@ int main(void) printf("(failed!)\n"); } else { printf("(success!)\n"); - fwrite(out, channels[i] * FORMAT_SIZE, fs, fout); + fwrite(out, channels[i] * FORMAT_SIZE, adjust_frames, fout); } } diff --git a/test/amplify_test.c b/test/amplify_test.c index 06f41b1..8f01532 100644 --- a/test/amplify_test.c +++ b/test/amplify_test.c @@ -16,6 +16,7 @@ int main(void) char in[FRAME_SIZE*2]; char out[FRAME_SIZE*2]; size_t ret; + size_t adjust_frames; int i=0; @@ -33,15 +34,17 @@ int main(void) exit(-1); } - ae = audio_effect_create(AUDIO_EFFECT_METHOD_AMPLIFY, 16000, 1, AUDIO_EFFECT_FORMAT_S16, FRAME_SIZE); + ae = audio_effect_create(AUDIO_EFFECT_METHOD_AMPLIFY, 16000, 1, AUDIO_EFFECT_FORMAT_S16, FRAME_SIZE, &adjust_frames); + assert(ae); + while (!feof(fin)) { printf("#%d frame. ", i++); - ret = fread(in, FRAME_SIZE*sizeof(short), 1, fin); + ret = fread(in, adjust_frames*sizeof(short), 1, fin); if (audio_effect_process(ae, in, out) < 0) { printf("(failed!)\n"); } else { printf("(success!), ret(%zu)\n", ret); - fwrite(out, FRAME_SIZE*sizeof(short), 1, fout); + fwrite(out, adjust_frames*sizeof(short), 1, fout); } } diff --git a/test/integration_test.c b/test/integration_test.c index 6b3c00a..c8208cd 100644 --- a/test/integration_test.c +++ b/test/integration_test.c @@ -15,6 +15,7 @@ #define OUTPUT_FILE_NAME "output_integration.raw" #define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0])) #define FRAME_SIZE_IN_BYTES(size) (sizeof(short) * CHANNELS * size) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) static short in[FRAME_SIZE]; static short ns_out[FRAME_SIZE]; @@ -28,13 +29,13 @@ int main(void) FILE *fin = NULL; FILE *fref = NULL; FILE *fout = NULL; - size_t framesize = FRAME_SIZE; struct stat st; off_t input_file_size; audio_effect_method_e methods[3] = { AUDIO_EFFECT_METHOD_NS_RNNOISE, AUDIO_EFFECT_METHOD_AEC_WEBRTC, AUDIO_EFFECT_METHOD_AGC_SPEEX }; int i; + size_t adjust_frames = -1; assert(!stat(AEC_RECORDING_16K_1CH_FILE_NAME, &st)); input_file_size = st.st_size; @@ -48,24 +49,26 @@ int main(void) fout = fopen(OUTPUT_FILE_NAME, "wb"); assert(fout); - for (i=0; i framesize); + assert(input_file_size > adjust_frames); - input_file_size /= framesize; - input_file_size *= framesize; + input_file_size /= adjust_frames; + input_file_size *= adjust_frames; - for (i=0; i<(int)input_file_size; i+=FRAME_SIZE_IN_BYTES(framesize)) { - assert(fread(in, FRAME_SIZE_IN_BYTES(framesize), 1, fin)); + for (i=0; i<(int)input_file_size; i+=FRAME_SIZE_IN_BYTES(adjust_frames)) { + assert(fread(in, FRAME_SIZE_IN_BYTES(adjust_frames), 1, fin)); assert(!audio_effect_process(ae[0], in, ns_out)); - assert(fread(ref, FRAME_SIZE_IN_BYTES(framesize), 1, fref) > 0); + assert(fread(ref, FRAME_SIZE_IN_BYTES(adjust_frames), 1, fref) > 0); assert(audio_effect_process_reference(ae[1], ns_out, ref, aec_out) >= 0); assert(!audio_effect_process(ae[2], aec_out, out)); - assert(fwrite(out, FRAME_SIZE_IN_BYTES(framesize), 1, fout) > 0); + assert(fwrite(out, FRAME_SIZE_IN_BYTES(adjust_frames), 1, fout) > 0); } for (i=0; i +#include +#include +#include + +#include +#include + +#include "audio_effect.h" +#include "resources.h" + +#define FRAME_SIZE 160 + +#define OUTPUT_FILE "output_multi_thread" +#define MIN(a, b) (a > b ? b : a) + +void thread_func(int i) +{ + audio_effect_s *ae; + FILE *f_rec; + FILE *f_ref; + FILE *f_out; + + struct stat st; + short in[FRAME_SIZE]; + short ref[FRAME_SIZE]; + short out[FRAME_SIZE]; + off_t rec_size; + off_t ref_size; + size_t ret; + int loop; + char output_file[256]; + + size_t process_framesize = FRAME_SIZE; + size_t adjust_framesize; + + printf("--- aec webrtc test start ---\n"); + + stat(AEC_RECORDING_16K_1CH_FILE_NAME, &st); + rec_size = st.st_size; + + stat(AEC_REFERENCE_16K_1CH_FILE_NAME, &st); + ref_size = st.st_size; + + f_rec = fopen(AEC_RECORDING_16K_1CH_FILE_NAME, "r"); + if (!f_rec) { + printf("failed to find rec.raw\n"); + exit(-1); + } + + f_ref = fopen(AEC_REFERENCE_16K_1CH_FILE_NAME, "r"); + if (!f_ref) { + printf("failed to find ref.raw\n"); + exit(-1); + } + + sprintf(output_file, "%s_%d.raw", OUTPUT_FILE, i); + f_out = fopen(output_file, "wb"); + if (!f_out) { + printf("failed to open raw\n"); + exit(-1); + } + + ae = audio_effect_create(AUDIO_EFFECT_METHOD_AEC_WEBRTC, 16000, 1, AUDIO_EFFECT_FORMAT_S16, process_framesize, &adjust_framesize); + + printf("adjust_framesize (%zu)\n", adjust_framesize); + + loop = MIN(rec_size / (adjust_framesize * sizeof(short)), ref_size / (adjust_framesize * sizeof(short))); + + while (loop-- > 0) { + ret = fread(in, sizeof(in), 1, f_rec); + if (ret == 0) { + printf("Failed to read from rec file\n"); + exit(-1); + } + + ret = fread(ref, sizeof(ref), 1, f_ref); + if (ret == 0) { + printf("Failed to read from ref file\n"); + exit(-1); + } + + if (audio_effect_process_reference(ae, in, ref, out) < 0) { + printf("(failed!)\n"); + exit(-1); + } + + fwrite(out, sizeof(out), 1, f_out); + + printf("#%d frame done.\n", i++); + } + + fclose(f_rec); + fclose(f_ref); + fclose(f_out); + + audio_effect_destroy(ae); + + printf("--- test end ---\n"); + +} + +int main(void) +{ + const int thread_max = 10; + std::vector threads; + + for (int i=0; i 0) { ret = fread(in, sizeof(in), 1, f_rec);