/*
 * HA_clientinterface.h
 *
 */

#ifndef HA_CLIENTINTERFACE_H_
#define HA_CLIENTINTERFACE_H_

#undef HAC_LEGACY_ARGUMENTS_MODE

#include "HA_config.h"

#ifdef ENABLE_JNI_FOR_ANDROID
#include <jni.h>
#endif // ENABLE_JNI_FOR_ANDROID

#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

#ifdef ENABLE_JNI_FOR_ANDROID
extern jint HACCreate(JNIEnv *env, jobject thiz);
extern jint HACStart(JNIEnv *env, jobject thiz);
extern jint HACStop(JNIEnv *env, jobject thiz);
extern jboolean HACisStop(JNIEnv *env, jobject thiz);

extern jint HACConnectPortA(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortA(JNIEnv *env, jobject thiz, jint port, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortA(JNIEnv *env, jobject thiz, jint port, jintArray channel, jintArray length, jintArray advance, jdoubleArray acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortA(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortB(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortB(JNIEnv *env, jobject thiz, jint port, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortB(JNIEnv *env, jobject thiz, jint port, jintArray channel, jintArray length, jintArray advance, jintArray fft_length, jdoubleArray spectra);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortB(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortC(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortC(JNIEnv *env, jobject thiz, jint port, jintArray array_num, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortC(JNIEnv *env, jobject thiz, jint port, jintArray source_count, jintArray source_ids, jdoubleArray source_coordinates);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortC(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortD(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortD(JNIEnv *env, jobject thiz, jint port, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortD(JNIEnv *env, jobject thiz, jint port, jintArray source_count, jintArray fft_length, jintArray source_ids, jdoubleArray source_coordinates, jdoubleArray spectra);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortD(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortE(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortE(JNIEnv *env, jobject thiz, jint port, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortE(JNIEnv *env, jobject thiz, jint port, jintArray source_count, jintArray banks, jintArray source_ids, jdoubleArray source_coordinates, jdoubleArray features);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortE(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortF(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortF(JNIEnv *env, jobject thiz, jint port, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortF(JNIEnv *env, jobject thiz, jint port, jintArray source_count, jintArray advance, jintArray source_ids, jdoubleArray source_coordinates, jdoubleArray acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortF(JNIEnv *env, jobject thiz, jint port);

extern jint HACConnectPortFwithSrc(JNIEnv *env, jobject thiz);
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortFwithSrc(JNIEnv *env, jobject thiz, jint port, jintArray array_src, jdoubleArray array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACRecvFromPortFwithSrc(JNIEnv *env, jobject thiz, jint port, jintArray source_count, jintArray advance, jintArray source_ids, jdoubleArray source_coordinates, jdoubleArray acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern jint HACClosePortFwithSrc(JNIEnv *env, jobject thiz, jint port);
#else // ENABLE_JNI_FOR_ANDROID

extern int HACCreate();
extern int HACStart();
extern int HACStop();
extern bool HACisStop();

extern int HACConnectPortA();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortA(int port, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortA(int port, int *channel, int *length, int *advance, float *acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortA(int port);

extern int HACConnectPortB();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortB(int port, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortB(int port, int *channel, int *length, int *advance, int *fft_length, float *spectra);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortB(int port);

extern int HACConnectPortC();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortC(int port, int *array_num, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortC(int port, int *source_count, int *source_ids, float *source_coordinates);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortC(int port);

extern int HACConnectPortD();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortD(int port, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortD(int port, int *source_count, int *fft_length, int *source_ids, float *source_coordinates, float *spectra);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortD(int port);

extern int HACConnectPortE();
#ifdef IS_APPLE_IOS
extern int HACRecvFromPortE(int port, int *array_num, float *array);
#else // IS_APPLE_IOS
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortE(int port, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortE(int port, int *source_count, int *banks, int *source_ids, float *source_coordinates, float *features);
#endif // HAC_LEGACY_ARGUMENTS_MODE
#endif // IS_APPLE_IOS
extern int HACClosePortE(int port);

extern int HACConnectPortF();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortF(int port, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortF(int port, int *source_count, int *advance, int *source_ids, float *source_coordinates, float *acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortF(int port);

extern int HACConnectPortFwithSrc();
#ifdef HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortFwithSrc(int port, int *array_src, float *array);
#else // HAC_LEGACY_ARGUMENTS_MODE
extern int HACRecvFromPortFwithSrc(int port, int *source_count, int *advance, int *source_ids, float *source_coordinates, float *acoustics);
#endif // HAC_LEGACY_ARGUMENTS_MODE
extern int HACClosePortFwithSrc(int port);
    
#endif // ENABLE_JNI_FOR_ANDROID

#ifdef __cplusplus
}
#endif // __cplusplus

#endif /* HA_CLIENTINTERFACE_H_ */
