--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <sys/stat.h>
+
+#include "audio_effect.h"
+#include "resources.h"
+
+#define SAMPLERATE 16000
+#define CHANNELS 1
+
+#define FIXED_FRAME_SIZE 160
+#define FRAME_SIZE (FIXED_FRAME_SIZE * CHANNELS * 2)
+
+#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)
+
+static short in[FRAME_SIZE];
+static short ns_out[FRAME_SIZE];
+static short aec_out[FRAME_SIZE];
+static short out[FRAME_SIZE];
+static short ref[FRAME_SIZE];
+
+int main(void)
+{
+ audio_effect_s *ae[3] = { NULL, };
+ 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;
+
+ assert(!stat(AEC_RECORDING_16K_1CH_FILE_NAME, &st));
+ input_file_size = st.st_size;
+
+ fin = fopen(AEC_RECORDING_16K_1CH_FILE_NAME, "r");
+ assert(fin);
+
+ fref = fopen(AEC_REFERENCE_16K_1CH_FILE_NAME, "r");
+ assert(fref);
+
+ fout = fopen(OUTPUT_FILE_NAME, "wb");
+ assert(fout);
+
+ for (i=0; i<ARRAY_SIZE(ae); i++)
+ assert((ae[i] = audio_effect_create(methods[i], SAMPLERATE, CHANNELS, AUDIO_EFFECT_FORMAT_S16, FIXED_FRAME_SIZE)));
+
+ framesize = audio_effect_get_process_framesize(ae[0]);
+ printf("frame size %zu\n", framesize);
+
+ assert(input_file_size > framesize);
+
+ input_file_size /= framesize;
+ input_file_size *= framesize;
+
+ for (i=0; i<(int)input_file_size; i+=FRAME_SIZE_IN_BYTES(framesize)) {
+ assert(fread(in, FRAME_SIZE_IN_BYTES(framesize), 1, fin));
+ assert(!audio_effect_process(ae[0], in, ns_out));
+ assert(fread(ref, FRAME_SIZE_IN_BYTES(framesize), 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);
+ }
+
+ for (i=0; i<ARRAY_SIZE(ae); i++)
+ audio_effect_destroy(ae[i]);
+
+ fclose(fin);
+ fclose(fref);
+ fclose(fout);
+
+ printf("--- integration test end ---\n");
+
+ return 0;
+}