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