Dear all: I need the help desparately. The code is attached below. If you guys don't mind take a look at the code below and see how to fit speex's AEC into it. Help me look at the #defines, and give me some suggestions on the AEC parameters, I totally have no idea about them. Feel free to do anything with the code, if it is by any chance valuable. Any ideas or suggestions or sharing is highly appreciated. I believe someone has already made AEC to work?! But beware, this will be used in my Voip program, so it should be async by nature. /** * com_peterhi_Speex.h */ #include <jni.h> #ifndef _Included_com_peterhi_Speex #define _Included_com_peterhi_Speex #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_com_peterhi_Speex_encoder__(JNIEnv *, jclass); JNIEXPORT jint JNICALL Java_com_peterhi_Speex_decoder__(JNIEnv *, jclass); JNIEXPORT void JNICALL Java_com_peterhi_Speex_encoder__I(JNIEnv *, jclass, jint); JNIEXPORT void JNICALL Java_com_peterhi_Speex_decoder__I(JNIEnv *, jclass, jint); JNIEXPORT jint JNICALL Java_com_peterhi_Speex_encode(JNIEnv *, jclass, jint, jbyteArray, jbyteArray); JNIEXPORT void JNICALL Java_com_peterhi_Speex_decode(JNIEnv *, jclass, jint, jbyteArray, jint, jbyteArray); #ifdef __cplusplus } #endif #endif /************************************************************************************************************/ /** * com_peterhi_Speex.c */ #include <speex/speex.h> #include <speex/speex_preprocess.h> #include <speex/speex_resampler.h> #include "com_peterhi_Speex.h" #define TYPE_ENCODE 1 #define TYPE_DECODE 2 #define DSP_FRAME_SIZE 160 #define ENC_FRAME_SIZE 320 #define FRAME_RATE 8000 int yes = 1; int quality = 10; float rate = 8000; typedef struct { int type; SpeexBits bits; void* pSt; SpeexPreprocessState* pPre; // Perhaps the echo state here? } Codec; /** * Creates a new encoder state */ JNIEXPORT jint JNICALL Java_com_peterhi_Speex_encoder__(JNIEnv* env, jclass c) { Codec* pCodec = malloc(sizeof(Codec)); speex_bits_init(&pCodec->bits); pCodec->type = TYPE_ENCODE; pCodec->pSt = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); pCodec->pPre = speex_preprocess_state_init(DSP_FRAME_SIZE, FRAME_RATE); speex_encoder_ctl(pCodec->pSt, SPEEX_SET_QUALITY, &quality); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_AGC, &yes); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_AGC_LEVEL, &rate); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_DEREVERB, &yes); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &yes); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &yes); speex_preprocess_ctl(pCodec->pPre, SPEEX_PREPROCESS_SET_DENOISE, &yes); // Any idea how to setup AEC here? return (jint )pCodec; } /** * Creates a new decoder state */ JNIEXPORT jint JNICALL Java_com_peterhi_Speex_decoder__(JNIEnv* env, jclass c) { Codec* pCodec = malloc(sizeof(Codec)); speex_bits_init(&pCodec->bits); pCodec->type = TYPE_DECODE; pCodec->pSt = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); return (jint )pCodec; } /** * Destroys a new encoder state */ JNIEXPORT void JNICALL Java_com_peterhi_Speex_encoder__I(JNIEnv* env, jclass c, jint p) { Codec* pCodec = (Codec* )p; if (pCodec->type != TYPE_ENCODE) { return; } speex_preprocess_state_destroy(pCodec->pPre); speex_encoder_destroy(pCodec->pSt); speex_bits_destroy(&pCodec->bits); free(pCodec); } /** * Destroys a new decoder state */ JNIEXPORT void JNICALL Java_com_peterhi_Speex_decoder__I(JNIEnv* env, jclass c, jint p) { Codec* pCodec = (Codec* )p; if (pCodec->type != TYPE_DECODE) { return; } speex_bits_destroy(&pCodec->bits); speex_decoder_destroy(pCodec->pSt); free(pCodec); } /** * Encode a byte array. */ JNIEXPORT jint JNICALL Java_com_peterhi_Speex_encode(JNIEnv* env, jclass c, jint p, jbyteArray buf1, jbyteArray buf2) { jbyte* bytes1 = (*env)->GetByteArrayElements(env, buf1, JNI_FALSE); jbyte* bytes2 = (*env)->GetByteArrayElements(env, buf2, JNI_FALSE); int len1 = (*env)->GetArrayLength(env, buf1); int len2 = (*env)->GetArrayLength(env, buf2); jint ret = 0; Codec* pCodec = (Codec* )p; if (pCodec->type != TYPE_ENCODE) { return ret; } // How to use AEC to cancel? speex_preprocess_run(pCodec->pPre, (spx_int16_t* )bytes1); speex_bits_reset(&pCodec->bits); speex_encode_int(pCodec->pSt, (spx_int16_t* )bytes1, &pCodec->bits); ret = speex_bits_write(&pCodec->bits, bytes2, len2); (*env)->SetByteArrayRegion(env, buf1, 0, len1, bytes1); (*env)->SetByteArrayRegion(env, buf2, 0, len2, bytes2); (*env)->ReleaseByteArrayElements(env, buf1, bytes1, 0); (*env)->ReleaseByteArrayElements(env, buf2, bytes2, 0); return ret; } /** * Decode a byte array. */ JNIEXPORT void JNICALL Java_com_peterhi_Speex_decode(JNIEnv* env, jclass c, jint p, jbyteArray buf1, jint len, jbyteArray buf2) { jbyte* bytes1 = (*env)->GetByteArrayElements(env, buf1, JNI_FALSE); jbyte* bytes2 = (*env)->GetByteArrayElements(env, buf2, JNI_FALSE); int len1 = (*env)->GetArrayLength(env, buf1); int len2 = (*env)->GetArrayLength(env, buf2); Codec* pCodec = (Codec* )p; if (pCodec->type != TYPE_DECODE) { return; } speex_bits_read_from(&pCodec->bits, bytes1, len); speex_decode_int(pCodec->pSt, &pCodec->bits, (spx_int16_t* )bytes2); (*env)->SetByteArrayRegion(env, buf1, 0, len1, bytes1); (*env)->SetByteArrayRegion(env, buf2, 0, len2, bytes2); (*env)->ReleaseByteArrayElements(env, buf1, bytes1, 0); (*env)->ReleaseByteArrayElements(env, buf2, bytes2, 0); } /**************************************************************************************/ /* * Speex.java * * 21 May 2008 * * copyright : (C) 2008 by Yun Tao Hai and Beijing Teng Yun Software Inc. * email : hytparadisee at gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ package com.peterhi; public class Speex { static { System.loadLibrary("speexjni"); } public static native int encoder(); public static native int decoder(); public static native void encoder(int peer); public static native void decoder(int peer); public static native int encode(int peer, byte[] in, byte[] out); public static native void decode(int peer, byte[] in, int len, byte[] out); } _________________________________________________________________ Discover the new Windows Vista http://search.msn.com/results.aspx?q=windows+vista&mkt=en-US&form=QBRE -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20080529/c8c5ce4b/attachment.htm