kopia lustrzana https://github.com/sh123/codec2_talkie
Add JNI wrappers for freedv raw data operations
rodzic
f6480ac927
commit
2e48935c67
|
@ -33,6 +33,8 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
struct freedv *freeDv;
|
struct freedv *freeDv;
|
||||||
short *speechSamples;
|
short *speechSamples;
|
||||||
short *modemSamples;
|
short *modemSamples;
|
||||||
|
short *rawDataSamples;
|
||||||
|
unsigned char *rawData;
|
||||||
};
|
};
|
||||||
|
|
||||||
static Context *getContext(jlong jp) {
|
static Context *getContext(jlong jp) {
|
||||||
|
@ -101,10 +103,17 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
struct ContextFreedv *conFreedv;
|
struct ContextFreedv *conFreedv;
|
||||||
conFreedv = (struct ContextFreedv *) malloc(sizeof(struct ContextFreedv));
|
conFreedv = (struct ContextFreedv *) malloc(sizeof(struct ContextFreedv));
|
||||||
conFreedv->freeDv = freedv_open(mode);
|
conFreedv->freeDv = freedv_open(mode);
|
||||||
|
// speech
|
||||||
conFreedv->speechSamples = static_cast<short *>(malloc(
|
conFreedv->speechSamples = static_cast<short *>(malloc(
|
||||||
freedv_get_n_max_speech_samples(conFreedv->freeDv) * sizeof(short)));
|
freedv_get_n_max_speech_samples(conFreedv->freeDv) * sizeof(short)));
|
||||||
conFreedv->modemSamples = static_cast<short *>(malloc(
|
conFreedv->modemSamples = static_cast<short *>(malloc(
|
||||||
freedv_get_n_max_modem_samples(conFreedv->freeDv) * sizeof(short)));
|
freedv_get_n_max_modem_samples(conFreedv->freeDv) * sizeof(short)));
|
||||||
|
// data
|
||||||
|
conFreedv->rawData = static_cast<unsigned char *>(malloc(
|
||||||
|
freedv_get_bits_per_modem_frame(conFreedv->freeDv) / 8));
|
||||||
|
conFreedv->rawDataSamples = static_cast<short *>(malloc(
|
||||||
|
freedv_get_n_tx_modem_samples(conFreedv->freeDv)));
|
||||||
|
// squelch
|
||||||
freedv_set_squelch_en(conFreedv->freeDv, isSquelchEnabled);
|
freedv_set_squelch_en(conFreedv->freeDv, isSquelchEnabled);
|
||||||
freedv_set_snr_squelch_thresh(conFreedv->freeDv, squelchSnr);
|
freedv_set_snr_squelch_thresh(conFreedv->freeDv, squelchSnr);
|
||||||
return reinterpret_cast<jlong>(conFreedv);
|
return reinterpret_cast<jlong>(conFreedv);
|
||||||
|
@ -170,6 +179,16 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
return freedv_get_n_nom_modem_samples(conFreedv->freeDv);
|
return freedv_get_n_nom_modem_samples(conFreedv->freeDv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jint freedvGetBitsPerModemFrame(JNIEnv * env, jclass clazz, jlong n) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
return freedv_get_bits_per_modem_frame(conFreedv->freeDv);
|
||||||
|
}
|
||||||
|
|
||||||
|
static jint freedvGetNTxSamples(JNIEnv * env, jclass clazz, jlong n) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
return freedv_get_n_tx_modem_samples(conFreedv->freeDv);
|
||||||
|
}
|
||||||
|
|
||||||
static jint freedvNin(JNIEnv * env, jclass clazz, jlong n) {
|
static jint freedvNin(JNIEnv * env, jclass clazz, jlong n) {
|
||||||
ContextFreedv *conFreedv = getContextFreedv(n);
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
return freedv_nin(conFreedv->freeDv);
|
return freedv_nin(conFreedv->freeDv);
|
||||||
|
@ -201,6 +220,8 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
freedv_close(conFreedv->freeDv);
|
freedv_close(conFreedv->freeDv);
|
||||||
free(conFreedv->modemSamples);
|
free(conFreedv->modemSamples);
|
||||||
free(conFreedv->speechSamples);
|
free(conFreedv->speechSamples);
|
||||||
|
free(conFreedv->rawDataSamples);
|
||||||
|
free(conFreedv->rawData);
|
||||||
free(conFreedv);
|
free(conFreedv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -247,6 +268,36 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
return cntModemSamples;
|
return cntModemSamples;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jlong freedvRawDataTx(JNIEnv *env, jclass clazz, jlong n, jshortArray outputModemSamples, jbyteArray inputData) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
int cntBytes = freedv_get_bits_per_modem_frame(conFreedv->freeDv) / 8;
|
||||||
|
env->GetByteArrayRegion(inputData, 0, cntBytes,
|
||||||
|
reinterpret_cast<jbyte *>(conFreedv->rawData));
|
||||||
|
uint16_t crc16 = freedv_gen_crc16(conFreedv->rawData, cntBytes - 2);
|
||||||
|
conFreedv->rawData[cntBytes-2] = crc16 >> 8;
|
||||||
|
conFreedv->rawData[cntBytes-1] = crc16 & 0xff;
|
||||||
|
freedv_rawdatatx(conFreedv->freeDv, conFreedv->rawDataSamples, conFreedv->rawData);
|
||||||
|
int cntSamples = freedv_get_n_tx_modem_samples(conFreedv->freeDv);
|
||||||
|
env->SetShortArrayRegion(outputModemSamples, 0, cntSamples, conFreedv->modemSamples);
|
||||||
|
return cntSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
static jlong freedvRawDataPreambleTx(JNIEnv *env, jclass clazz, jlong n, jshortArray outputModemSamples) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
freedv_rawdatapreambletx(conFreedv->freeDv, conFreedv->rawDataSamples);
|
||||||
|
int cntSamples = freedv_get_n_tx_modem_samples(conFreedv->freeDv);
|
||||||
|
env->SetShortArrayRegion(outputModemSamples, 0, cntSamples, conFreedv->modemSamples);
|
||||||
|
return cntSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
static jlong freedvRawDataPostambleTx(JNIEnv *env, jclass clazz, jlong n, jshortArray outputModemSamples) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
freedv_rawdatapostambletx(conFreedv->freeDv, conFreedv->rawDataSamples);
|
||||||
|
int cntSamples = freedv_get_n_tx_modem_samples(conFreedv->freeDv);
|
||||||
|
env->SetShortArrayRegion(outputModemSamples, 0, cntSamples, conFreedv->modemSamples);
|
||||||
|
return cntSamples;
|
||||||
|
}
|
||||||
|
|
||||||
static jlong decode(JNIEnv *env, jclass clazz, jlong n, jshortArray outputSamples, jbyteArray inputBits) {
|
static jlong decode(JNIEnv *env, jclass clazz, jlong n, jshortArray outputSamples, jbyteArray inputBits) {
|
||||||
Context *con = getContext(n);
|
Context *con = getContext(n);
|
||||||
env->GetByteArrayRegion(inputBits, 0, con->nbyte, reinterpret_cast<jbyte*>(con->bits));
|
env->GetByteArrayRegion(inputBits, 0, con->nbyte, reinterpret_cast<jbyte*>(con->bits));
|
||||||
|
@ -277,6 +328,16 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
return cntRead;
|
return cntRead;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static jlong freedvRawDataRx(JNIEnv *env, jclass clazz, jlong n, jbyteArray outputRawData, jshortArray inputModemSamples) {
|
||||||
|
ContextFreedv *conFreedv = getContextFreedv(n);
|
||||||
|
int nin = freedv_nin(conFreedv->freeDv);
|
||||||
|
env->GetShortArrayRegion(inputModemSamples, 0, nin, conFreedv->rawDataSamples);
|
||||||
|
int cntRead = freedv_rawdatarx(conFreedv->freeDv, conFreedv->rawData, conFreedv->rawDataSamples);
|
||||||
|
env->SetByteArrayRegion(outputRawData, 0, nin,
|
||||||
|
reinterpret_cast<const jbyte *>(conFreedv->rawData));
|
||||||
|
return cntRead;
|
||||||
|
}
|
||||||
|
|
||||||
static JNINativeMethod method_table[] = {
|
static JNINativeMethod method_table[] = {
|
||||||
// codec2
|
// codec2
|
||||||
{"create", "(I)J", (void *) create},
|
{"create", "(I)J", (void *) create},
|
||||||
|
@ -305,7 +366,14 @@ namespace Java_com_ustadmobile_codec2_Codec2 {
|
||||||
{"freedvGetNomModemSamples", "(J)I", (void *)freedvGetNomModemSamples},
|
{"freedvGetNomModemSamples", "(J)I", (void *)freedvGetNomModemSamples},
|
||||||
{"freedvNin", "(J)I", (void *)freedvNin},
|
{"freedvNin", "(J)I", (void *)freedvNin},
|
||||||
{"freedvTx", "(J[S[S)J", (void *)freedvTx},
|
{"freedvTx", "(J[S[S)J", (void *)freedvTx},
|
||||||
{"freedvRx", "(J[S[S)J", (void *)freedvRx}
|
{"freedvRx", "(J[S[S)J", (void *)freedvRx},
|
||||||
|
// freedv raw data
|
||||||
|
{"freedvRawDataRx", "(J[B[S)J", (void*)freedvRawDataRx},
|
||||||
|
{"freedvRawDataTx", "(J[S[B)J", (void*)freedvRawDataTx},
|
||||||
|
{"freedvRawDataPreambleTx", "(J[S)J", (void*)freedvRawDataPreambleTx},
|
||||||
|
{"freedvRawDataPostambleTx", "(J[S)J", (void*)freedvRawDataPostambleTx},
|
||||||
|
{"freedvGetBitsPerModemFrame", "(J)I", (void*)freedvGetBitsPerModemFrame},
|
||||||
|
{"freedvGetNTxSamples", "(J)I", (void*)freedvGetNTxSamples}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,6 +72,16 @@ public class Codec2 {
|
||||||
public native static int freedvGetNomModemSamples(long conFreedv);
|
public native static int freedvGetNomModemSamples(long conFreedv);
|
||||||
public native static int freedvNin(long conFreedv);
|
public native static int freedvNin(long conFreedv);
|
||||||
|
|
||||||
public native static long freedvTx(long conFsk, short[] outputModemSamples, short[] inputSpeechSamples);
|
public native static long freedvTx(long conFreedv, short[] outputModemSamples, short[] inputSpeechSamples);
|
||||||
public native static long freedvRx(long conFsk, short[] outputSpeechSamples, short[] inputModemSamples);
|
public native static long freedvRx(long conFreedv, short[] outputSpeechSamples, short[] inputModemSamples);
|
||||||
|
|
||||||
|
// freedv raw data
|
||||||
|
public native static int freedvGetBitsPerModemFrame(long conFreedv);
|
||||||
|
public native static int freedvGetNTxSamples(long conFreedv);
|
||||||
|
|
||||||
|
public native static long freedvRawDataRx(long conFreedv, byte[] outputRawData, short[] inputDataSamples);
|
||||||
|
public native static long freedvRawDataTx(long conFreedv, short[] outputDataSamples, byte[] inputRawData);
|
||||||
|
public native static long freedvRawDataPreambleTx(long conFreedv, short[] outputDataSamples);
|
||||||
|
public native static long freedvRawDataPostambleTx(long conFreedv, short[] outputDataSamples);
|
||||||
|
|
||||||
}
|
}
|
Ładowanie…
Reference in New Issue