/* * * Copyright 2001-2011 Texas Instruments, Inc. - http://www.ti.com/ * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "android_runtime/AndroidRuntime.h" #include "jni.h" #include "JNIHelp.h" #include "v4l2_JbtlLog.h" #include "JFmTxNative.h" #include <stdlib.h> #define LOG_TAG "JFmTxNative" #include <cutils/properties.h> using namespace android; static int radio_fd; extern long jContext; #undef VIDIOC_S_MODULATOR #define VIDIOC_S_MODULATOR 1078220343 extern "C" { #include <stdio.h> #include <fcntl.h> #include <asoundlib.h> #include <linux/videodev.h> #include <math.h> #include <pthread.h> #include <errno.h> #include <string.h> void nativeJFmTx_Callback(long context, int status, int command, long value); extern void MCP_HAL_LOG_EnableLogToAndroid(const char *app_name); } //extern "C" static jclass _sJClass; static JavaVM *g_jVM = NULL; static jmethodID _sMethodId_nativeCb_fmTxCmdEnable; static jmethodID _sMethodId_nativeCb_fmTxCmdDisable; static jmethodID _sMethodId_nativeCb_fmTxCmdDestroy; static jmethodID _sMethodId_nativeCb_fmTxCmdTune; static jmethodID _sMethodId_nativeCb_fmTxCmdGetTunedFrequency; static jmethodID _sMethodId_nativeCb_fmTxCmdStartTransmission; static jmethodID _sMethodId_nativeCb_fmTxCmdStopTransmission; static jmethodID _sMethodId_nativeCb_fmTxCmdEnableRds; static jmethodID _sMethodId_nativeCb_fmTxCmdDisableRds; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg; /* static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode; // static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg; static jmethodID _sMethodId_nativeCb_fmTxCmdWriteRdsRawData; static jmethodID _sMethodId_nativeCb_fmTxCmdReadRdsRawData; static jmethodID _sMethodId_nativeCb_fmTxCmdChangeAudioSource; */ static jmethodID _sMethodId_nativeCb_fmTxCmdSetInterruptMask; static jmethodID _sMethodId_nativeCb_fmTxCmdSetMonoStereoMode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetMonoStereoMode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetPowerLevel; static jmethodID _sMethodId_nativeCb_fmTxCmdGetPowerLevel; static jmethodID _sMethodId_nativeCb_fmTxCmdSetMuteMode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetMuteMode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsAfCode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsAfCode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPiCode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPiCode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPtyCode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPtyCode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag ; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag ; static jmethodID _sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter; static jmethodID _sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter; static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode; static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode; static jmethodID _sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration; int fm_read_transmitter_capabilities(int radio_fd) { struct v4l2_capability cap; int res; res = ioctl(radio_fd,VIDIOC_QUERYCAP,&cap); if(res < 0) { V4L2_JBTL_LOGD("Failed to read %s capabilities\n",DEFAULT_RADIO_DEVICE); return FM_FAILED; } if((cap.capabilities & V4L2_CAP_RADIO) == 0) { V4L2_JBTL_LOGD("%s is not radio devcie",DEFAULT_RADIO_DEVICE); return FM_FAILED; } V4L2_JBTL_LOGD("\n***%s Info ****\n",DEFAULT_RADIO_DEVICE); V4L2_JBTL_LOGD("Driver : %s\n",cap.driver); V4L2_JBTL_LOGD("Card : %s\n",cap.card); V4L2_JBTL_LOGD("Bus : %s\n",cap.bus_info); V4L2_JBTL_LOGD("Capabilities : 0x%x\n",cap.capabilities); return FM_SUCCESS; } static int nativeJFmTx_Create(JNIEnv *env,jobject obj,jobject jContextValue) { int fmStatus ; V4L2_JBTL_LOGD("Java_JFmRx_nativeJFmRx_Create(): Entered"); radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR); if(radio_fd < 0) { V4L2_JBTL_LOGD("Unable to open %s ..\n",DEFAULT_RADIO_DEVICE); jniThrowIOException(env, errno); return FM_FAILED; } fmStatus = fm_read_transmitter_capabilities(radio_fd); if(fmStatus< 0) { close(radio_fd); return fmStatus; } V4L2_JBTL_LOGD("nativeJFmRx_create:Exiting Successfully"); return fmStatus; return 0; } static jint nativeJFmTx_Destroy(JNIEnv *env, jobject obj,jlong jContextValue) { return 0; } static int nativeJFmTx_Enable(JNIEnv *env, jobject obj, jlong jContextValue) { int status ; struct v4l2_modulator vm; V4L2_JBTL_LOGD("nativeJFmRx_enable(): Entered"); jContext = jContextValue; vm.index = 0; status = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vm); if(status < 0) { V4L2_JBTL_LOGD("Failed to Enable FM\n"); return status; } V4L2_JBTL_LOGD("nativeJFmRx_enable: FM_RX_Enable() returned %d",(int)status); nativeJFmTx_Callback(jContext,status,FM_TX_CMD_ENABLE,status); V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit"); return status; } static int nativeJFmTx_Disable(JNIEnv *env, jobject obj, jlong jContextValue) { V4L2_JBTL_LOGD("nativeJFmTx_disable(): Entered"); jContext = jContextValue; close(radio_fd); nativeJFmTx_Callback(jContext,0,FM_TX_CMD_DISABLE,0); V4L2_JBTL_LOGD("nativeJFmTx_disable(): Exit");; return FM_SUCCESS; } static int nativeJFmTx_Tune(JNIEnv *env, jobject obj,jlong jContextValue,jlong user_freq) { struct v4l2_frequency vf; struct v4l2_tuner vt; int status, div; V4L2_JBTL_LOGD("nativeJFmRx_tune(): Entered"); vf.tuner = 0; vf.frequency = rint(user_freq * 16 + 0.5); status = ioctl(radio_fd, VIDIOC_S_FREQUENCY, &vf); if(status < 0) { V4L2_JBTL_LOGD("Failed to tune to frequency %d\n",user_freq); return FM_FAILED; } V4L2_JBTL_LOGD("Tuned to frequency %2.1f MHz\n",user_freq); jContext = jContextValue; nativeJFmTx_Callback(jContext,status,FM_TX_CMD_TUNE,user_freq); V4L2_JBTL_LOGD("nativeJFmRx_Tune(): Exit"); return FM_PENDING; } static int nativeJFmTx_GetTunedFrequency(JNIEnv *env, jobject obj,jlong jContextValue) { return 0; } static int nativeJFmTx_StartTransmission(JNIEnv *env, jobject obj, jlong jContextValue) { V4L2_JBTL_LOGD("nativeJFmRx_enable(): Init"); jContext = jContextValue; nativeJFmTx_Callback(jContext,0,FM_TX_CMD_START_TRANSMISSION,0); V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit"); return 0; } static int nativeJFmTx_StopTransmission(JNIEnv *env, jobject obj, jlong jContextValue) { V4L2_JBTL_LOGD("nativeJFmRx_enable(): Init"); jContext = jContextValue; nativeJFmTx_Callback(jContext,0,FM_TX_CMD_STOP_TRANSMISSION,0); V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit"); return 0; } static int nativeJFmTx_EnableRds(JNIEnv *env, jobject obj, jlong jContextValue) { struct v4l2_modulator vmod; int ret; V4L2_JBTL_LOGD("nativeJFmTx_EnableRds(): Init"); vmod.index = 0; ret = ioctl(radio_fd, VIDIOC_G_MODULATOR, &vmod); if(ret < 0) { printf("Failed to get TX mode\n"); return -1; } vmod.txsubchans = vmod.txsubchans | V4L2_TUNER_SUB_RDS; ret = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vmod); if(ret < 0) { printf("Failed to set TX mode\n"); return -1; } jContext = jContextValue; nativeJFmTx_Callback(jContext,0,FM_TX_CMD_ENABLE_RDS,0); V4L2_JBTL_LOGD("nativeJFmTx_EnableRds(): Exit");; return 0; } static int nativeJFmTx_DisableRds(JNIEnv *env, jobject obj, jlong jContextValue) { struct v4l2_modulator vmod; int ret; V4L2_JBTL_LOGD("nativeJFmTx_DisableRds(): Init"); vmod.index = 0; ret = ioctl(radio_fd, VIDIOC_G_MODULATOR, &vmod); if(ret < 0) { printf("Failed to get TX mode\n"); return -1; } vmod.txsubchans = vmod.txsubchans & ~V4L2_TUNER_SUB_RDS; ret = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vmod); if(ret < 0) { printf("Failed to set TX mode\n"); return -1; } jContext = jContextValue; nativeJFmTx_Callback(jContext,0,FM_TX_CMD_DISABLE_RDS,0); V4L2_JBTL_LOGD("nativeJFmTx_DisableRds(): Exit");; return 0; } static int nativeJFmTx_SetRdsTransmissionMode(JNIEnv *env, jobject obj, jlong jContextValue,jint mode) { /* FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsTransmissionMode(): Entered"); FmTxStatus status =FM_TX_SetRdsTransmissionMode(fmTxContext,(FmTxRdsTransmissionMode)mode); ALOGD("nativeJFmTx_SetRdsTransmissionMode: FM_TX_SetRdsTransmissionMode() returned %d",(int)status); */ ALOGD("nativeJFmTx_SetRdsTransmissionMode(): Exit"); return 0; } /* static int nativeJFmTx_GetRdsTransmissionMode(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsTransmissionMode(): Entered"); FmTxStatus status =FM_TX_GetRdsTransmissionMode(fmTxContext); ALOGD("nativeJFmTx_GetRdsTransmissionMode: FM_TX_GetRdsTransmissionMode() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsTransmissionMode(): Exit"); return status; } */ static int nativeJFmTx_SetRdsTextPsMsg(JNIEnv *env, jobject obj, jlong jContextValue,jstring psString,jint length) { /* FmTxContext * fmTxContext = (FmTxContext *)jContextValue; const char *psStr = (char*) env->GetStringUTFChars(psString, &iscopy); ALOGD("nativeJFmTx_SetRdsTextPsMsg(): Entered"); ALOGD("nativeJFmTx_SetRdsTextPsMsg():--> psStr= %s",psStr); FmTxStatus status =FM_TX_SetRdsTextPsMsg(fmTxContext,(const FMC_U8 *)psStr,(FMC_UINT)length); ALOGD("nativeJFmTx_SetRdsTextPsMsg: FM_TX_SetRdsTextPsMsg() returned %d",(int)status); */ struct v4l2_ext_controls_kfmapp vec; struct v4l2_ext_control_kfmapp vctrls; jboolean iscopy; int res; char rds_text[100]; vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX; vec.count = 1; vctrls.id = V4L2_CID_RDS_TX_PS_NAME; vctrls.string = (char*) env->GetStringUTFChars(psString, &iscopy); vctrls.size = strlen(rds_text) + 1; vec.controls = &vctrls; ALOGE("Entered RDS PS Name is - %s\n",vctrls.string); res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec); if(res < 0) { ALOGE("Failed to set FM Tx RDS Radio PS Name\n"); return res; } ALOGD("nativeJFmTx_SetRdsTextPsMsg(): Exit"); return res; } /* static int nativeJFmTx_GetRdsTextPsMsg(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsTextPsMsg(): Entered"); FmTxStatus status =FM_TX_GetRdsTextPsMsg(fmTxContext); ALOGD("nativeJFmTx_GetRdsTextPsMsg: FM_TX_GetRdsTextPsMsg() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsTextPsMsg(): Exit"); return status; } static int nativeJFmTx_WriteRdsRawData(JNIEnv *env, jobject obj, jlong jContextValue,jstring msg,jint length) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_WriteRdsRawData(): Entered"); jboolean iscopy; const char *rawData = (char*) env->GetStringUTFChars(msg, &iscopy); FmTxStatus status =FM_TX_WriteRdsRawData(fmTxContext,(const FMC_U8 *)rawData,(FMC_UINT)length); ALOGD("nativeJFmTx_WriteRdsRawData: FM_TX_WriteRdsRawData() returned %d",(int)status); ALOGD("nativeJFmTx_WriteRdsRawData(): Exit"); return status; } static int nativeJFmTx_ReadRdsRawData(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_ReadRdsRawData(): Entered"); FmTxStatus status =FM_TX_ReadRdsRawData(fmTxContext); ALOGD("nativeJFmTx_ReadRdsRawData: FM_TX_ReadRdsRawData() returned %d",(int)status); ALOGD("nativeJFmTx_ReadRdsRawData(): Exit"); return status; } */ static int nativeJFmTx_SetMuteMode(JNIEnv *env, jobject obj, jlong jContextValue,jint mode) { struct v4l2_control vt; int status; ALOGD("nativeJFmTx_SetMuteMode(): Entered"); vt.id = V4L2_CID_AUDIO_MUTE; if (mode == 0) vt.value = FM_MUTE_OFF; else vt.value = FM_MUTE_ON; status = ioctl(radio_fd,VIDIOC_S_CTRL,&vt); if(status < 0) { ALOGD("nativeJFmTx_SetMuteMode(): Faile returned %d\n", status); return status; } ALOGD("nativeJFmTx_SetMuteMode(): Exit"); return status; } static int nativeJFmTx_GetMuteMode(JNIEnv *env, jobject obj, jlong jContextValue) { ALOGD("nativeJFmTx_GetMuteMode(): Entered"); ALOGD("nativeJFmTx_GetMuteMode(): Exit"); return 0; } /* static int nativeJFmTx_SetRdsPsDisplayMode(JNIEnv *env, jobject obj, jlong jContextValue, jint displayMode) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsPsDisplayMode(): Entered"); FmTxStatus status =FM_TX_SetRdsPsDisplayMode(fmTxContext,(FmcRdsPsDisplayMode)displayMode); ALOGD("nativeJFmTx_SetRdsPsDisplayMode: FM_TX_SetRdsPsDisplayMode() returned %d",(int)status); ALOGD("nativeJFmTx_SetRdsPsDisplayMode(): Exit"); return status; } static int nativeJFmTx_GetRdsPsDisplayMode(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsPsDisplayMode(): Entered"); FmTxStatus status =FM_TX_GetRdsPsDisplayMode(fmTxContext); ALOGD("nativeJFmTx_GetRdsPsDisplayMode: FM_TX_GetRdsPsDisplayMode() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsPsDisplayMode(): Exit"); return status; } */ static int nativeJFmTx_SetRdsTextRtMsg(JNIEnv *env, jobject obj, jlong jContextValue, jint msgType,jstring msg,jint length) { // FmTxContext * fmTxContext = (FmTxContext *)jContextValue; jboolean iscopy; const char *rtMsg = (char*) env->GetStringUTFChars(msg, &iscopy); struct v4l2_ext_controls_kfmapp vec; struct v4l2_ext_control_kfmapp vctrls; int res; char rds_text[100]; ALOGD("nativeJFmTx_SetRdsTextRtMsg(): Entered"); vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX; vec.count = 1; vctrls.id = V4L2_CID_RDS_TX_RADIO_TEXT; vctrls.string = (char*) env->GetStringUTFChars(msg, &iscopy); vctrls.size = strlen(rtMsg) + 1; vec.controls = &vctrls; ALOGD("nativeJFmTx_SetRdsTextRtMsg():--> RTMsg = %s",vctrls.string); res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec); if(res < 0) { ALOGE("Failed to set FM Tx RDS Radio text"); return res; } // FmTxStatus status =FM_TX_SetRdsTextRtMsg(fmTxContext,(FmcRdsRtMsgType)msgType,(const FMC_U8 *)rtMsg,(FMC_UINT)length); // ALOGD("nativeJFmTx_SetRdsTextRtMsg: FM_TX_SetRdsTextRtMsg() returned %d",(int)status); ALOGD("nativeJFmTx_SetRdsTextRtMsg(): Exit"); return 0; } /* static int nativeJFmTx_GetRdsTextRtMsg(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsTextRtMsg(): Entered"); FmTxStatus status =FM_TX_GetRdsTextRtMsg(fmTxContext); ALOGD("nativeJFmTx_GetRdsTextRtMsg: FM_TX_SetRdsTextRtMsg() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsTextRtMsg(): Exit"); return status; } */ static int nativeJFmTx_SetRdsTransmittedGroupsMask(JNIEnv *env, jobject obj, jlong jContextValue, jlong fieldMask) { /* FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask(): Entered"); FmTxStatus status =FM_TX_SetRdsTransmittedGroupsMask(fmTxContext,(FmTxRdsTransmittedGroupsMask)fieldMask); ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask: FM_TX_SetRdsTransmittedGroupsMask() returned %d",(int)status); */ ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask(): Exit"); return 0; } /* static int nativeJFmTx_GetRdsTransmittedGroupsMask(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask(): Entered"); FmTxStatus status =FM_TX_GetRdsTransmittedGroupsMask(fmTxContext); ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask: FM_TX_GetRdsTransmittedGroupsMask() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask(): Exit"); return status; } static int nativeJFmTx_SetRdsTrafficCodes(JNIEnv *env, jobject obj, jlong jContextValue, jint taCode,jint tpCode) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsTrafficCodes(): Entered"); FmTxStatus status =FM_TX_SetRdsTrafficCodes(fmTxContext,(FmcRdsTaCode)taCode,(FmcRdsTpCode)tpCode); ALOGD("nativeJFmTx_SetRdsTrafficCodes: FM_TX_SetRdsTrafficCodes() returned %d",(int)status); ALOGD("nativeJFmTx_SetRdsTrafficCodes(): Exit"); return status; } static int nativeJFmTx_GetRdsTrafficCodes(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsTrafficCodes(): Entered"); FmTxStatus status =FM_TX_GetRdsTrafficCodes(fmTxContext); ALOGD("nativeJFmTx_GetRdsTrafficCodes: FM_TX_GetRdsTrafficCodes() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsTrafficCodes(): Exit"); return status; } static int nativeJFmTx_SetRdsMusicSpeechFlag(JNIEnv *env, jobject obj, jlong jContextValue, jint musicSpeechFlag) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag(): Entered"); FmTxStatus status =FM_TX_SetRdsMusicSpeechFlag(fmTxContext,(FmcRdsMusicSpeechFlag)musicSpeechFlag); ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag: FM_TX_SetRdsMusicSpeechFlag() returned %d",(int)status); ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag(): Exit"); return status; } static int nativeJFmTx_GetRdsMusicSpeechFlag(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag(): Entered"); FmTxStatus status =FM_TX_GetRdsMusicSpeechFlag(fmTxContext); ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag: FM_TX_GetRdsMusicSpeechFlag() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag(): Exit"); return status; } static int nativeJFmTx_SetRdsExtendedCountryCode(JNIEnv *env, jobject obj, jlong jContextValue, jint ecc) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_SetRdsExtendedCountryCode(): Entered"); FmTxStatus status =FM_TX_SetRdsECC(fmTxContext,(FmcRdsExtendedCountryCode)ecc); ALOGD("nativeJFmTx_SetRdsExtendedCountryCode: FM_TX_SetRdsECC() returned %d",(int)status); ALOGD("nativeJFmTx_SetRdsExtendedCountryCode(): Exit"); return status; } static int nativeJFmTx_GetRdsExtendedCountryCode(JNIEnv *env, jobject obj, jlong jContextValue) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_GetRdsExtendedCountryCode(): Entered"); FmTxStatus status =FM_TX_GetRdsECC(fmTxContext); ALOGD("nativeJFmTx_GetRdsExtendedCountryCode: FM_TX_GetRdsECC() returned %d",(int)status); ALOGD("nativeJFmTx_GetRdsExtendedCountryCode(): Exit"); return status; } static int nativeJFmTx_ChangeAudioSource(JNIEnv *env, jobject obj, jlong jContextValue,jint txSource,jint eSampleFreq) { FmTxContext * fmTxContext = (FmTxContext *)jContextValue; ALOGD("nativeJFmTx_ChangeAudioSource(): Entered"); ALOGD(" txSource = %d , Sampling frequency = %d ",(int) txSource, (int) eSampleFreq); FmTxStatus status =FM_TX_ChangeAudioSource(fmTxContext,(FmTxAudioSource)txSource,(ECAL_SampleFrequency)eSampleFreq); ALOGD("nativeJFmTx_ChangeAudioSource: FM_TX_ChangeAudioSource() returned %d",(int)status); ALOGD("nativeJFmTx_ChangeAudioSource(): Exit"); return status; } */ static int nativeJFmTx_ChangeDigitalSourceConfiguration(JNIEnv *env, jobject obj, jlong jContextValue,jint eSampleFreq) { return 0; } static int nativeJFmTx_SetRdsTextRepertoire(JNIEnv *env, jobject obj, jlong jContextValue,jint repertoire) { return 0; } static int nativeJFmTx_GetRdsTextRepertoire(JNIEnv *env, jobject obj, jlong jContextValue,jint repertoire) { return 0; } static int nativeJFmTx_SetRdsPtyCode(JNIEnv *env, jobject obj, jlong jContextValue,jint ptyCode) { int user_val; int res; struct v4l2_ext_controls_kfmapp vec; struct v4l2_ext_control_kfmapp vctrls; ALOGE("nativeJFmTx_SetRdsPtyCode(): Entered"); vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX; vec.count = 1; vctrls.id = V4L2_CID_RDS_TX_PTY; vctrls.value = ptyCode; vctrls.size = 0; vec.controls = &vctrls; res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec); if(res < 0) { ALOGE("Failed to set FM Tx RDS PTY\n"); return res; } ALOGE("nativeJFmTx_SetRdsPtyCode(): Exit"); return res; } static int nativeJFmTx_GetRdsPtyCode(JNIEnv *env, jobject obj, jlong jContextValue,jint ptyCode) { return 0; } static int nativeJFmTx_SetRdsPiCode(JNIEnv *env, jobject obj, jlong jContextValue,jint piCode) { struct v4l2_ext_controls_kfmapp vec; struct v4l2_ext_control_kfmapp vctrls; int res; ALOGD("nativeJFmTx_SetRdsPiCode(): Enter"); vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX; vec.count = 1; vctrls.id = V4L2_CID_RDS_TX_PI; vctrls.value = piCode; vctrls.size = 0; vec.controls = &vctrls; res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec); if(res < 0) { ALOGE("Failed to set FM Tx RDS PI Code\n"); return res; } ALOGD("Setting FM Tx RDS PI Code is Succesful\n"); return res; } static int nativeJFmTx_GetRdsPiCode(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } static int nativeJFmTx_SetRdsAfCode(JNIEnv *env, jobject obj, jlong jContextValue,jint afCode) { int fd, res; char str[10]; sprintf(str, "%d", afCode); ALOGD("nativeJFmTx_SetRdsAfCode(): Enter"); fd = open(FMTX_RDS_AF_SYSFS_ENTRY, O_RDWR); if (fd < 0) { ALOGD("Can't open %s", FMTX_RDS_AF_SYSFS_ENTRY); return -1; } /* Need max 6 cahrs to set AF between 75000 KHz to 108000 KHz */ res = write(fd, str, 6); if(res <= 0) { ALOGD("Failed to set FM TX RDS AF Frequency\n"); goto exit; } ALOGD("FM RDS Alternate Frequency Set is succesfull\n"); exit: close(fd); return res; } static int nativeJFmTx_GetRdsAfCode(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } static int nativeJFmTx_SetMonoStereoMode(JNIEnv *env, jobject obj, jlong jContextValue,jint monoStereoMode) { return 0; } static int nativeJFmTx_GetMonoStereoMode(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } static int nativeJFmTx_SetPowerLevel(JNIEnv *env, jobject obj, jlong jContextValue,jint powerLevel) { struct v4l2_ext_controls_kfmapp vec; struct v4l2_ext_control_kfmapp vctrls; int res; ALOGD("nativeJFmTx_SetPowerLevel(): Enter and power level = %d\n",powerLevel); vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX; vec.count = 1; vctrls.id = V4L2_CID_TUNE_POWER_LEVEL; vctrls.value = 122 - powerLevel; vctrls.size = 0; vec.controls = &vctrls; res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec); if(res < 0) { ALOGE("Failed to set FM Tx power level\n"); return res; } ALOGE("Setting FM Tx Power level to ---> %d\n", 122 - vctrls.value); return res; } static int nativeJFmTx_GetPowerLevel(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } static int nativeJFmTx_SetPreEmphasisFilter(JNIEnv *env, jobject obj, jlong jContextValue,jint preEmpFilter) { return 0; } static int nativeJFmTx_GetPreEmphasisFilter(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } static int nativeJFmTx_SetRdsPsScrollSpeed(JNIEnv *env, jobject obj, jlong jContextValue,jint scrollSpeed) { return 0; } static int nativeJFmTx_GetRdsPsScrollSpeed(JNIEnv *env, jobject obj, jlong jContextValue) { return 0; } //################################################################################ // SIGNALS //############################################################################### void nativeJFmTx_Callback(long context, int status, int command, long value) { V4L2_JBTL_LOGI("nativeJFmTx_Callback: Entered, "); JNIEnv* env = NULL; bool attachedThread = false; int jRet ; jRet = g_jVM->GetEnv((void **)&env,JNI_VERSION_1_4); if(jRet < 0) { V4L2_JBTL_LOGI("failed to get JNI env,assuming native thread"); jRet = g_jVM->AttachCurrentThread((&env), NULL); if(jRet != JNI_OK) { V4L2_JBTL_LOGI("failed to atatch to current thread %d",jRet); return ; } attachedThread = true; } if(env == NULL) { V4L2_JBTL_LOGD("nativeJFmRx_Callback: Entered, env is null"); } switch (command) { case FM_TX_CMD_ENABLE: V4L2_JBTL_LOGI("FM_TX_CMD_ENABLE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdEnable, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_DISABLE: V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdDisable, (jlong)context, (jint)status, (jint)value); break; /* case FM_TX_CMD_SET_INTERRUPT_MASK: V4L2_JBTL_LOGI("FM_TX_CMD_SET_INTERRUPT_MASK:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetInterruptMask, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_INTERRUPT_STATUS: V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetInterruptMask, (jlong)context, (jint)status, (jint)value); break; */ case FM_TX_CMD_START_TRANSMISSION: V4L2_JBTL_LOGI("FM_TX_CMD_START_TRANSMISSION:Status: %d ",status); // lptUnavailResources = (jclass *)event->p.cmdDone.v.audioOperation.ptUnavailResources; env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdStartTransmission, (jlong)context, (jint)status); break; case FM_TX_CMD_STOP_TRANSMISSION: V4L2_JBTL_LOGI("FM_TX_CMD_STOP_TRANSMISSION:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdStopTransmission, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_TUNE: V4L2_JBTL_LOGI("FM_TX_CMD_TUNE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdTune, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_TUNED_FREQUENCY: V4L2_JBTL_LOGI("FM_TX_CMD_GET_TUNED_FREQUENCY:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetTunedFrequency, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_MONO_STEREO_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_MONO_STEREO_MODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetMonoStereoMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_MONO_STEREO_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_MONO_STEREO_MODE:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetMonoStereoMode, (jlong)context, (jint)status, (jint)value); break; /* case FM_TX_CMD_SET_POWER_LEVEL: V4L2_JBTL_LOGI("FM_TX_CMD_SET_POWER_LEVEL:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetPowerLevel, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_POWER_LEVEL: V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetPowerLevel, (jlong)context, (jint)status, (jint)value); break; */ case FM_TX_CMD_SET_MUTE_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_MUTE_MODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetMuteMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_MUTE_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_MUTE_MODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetMuteMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_ENABLE_RDS: V4L2_JBTL_LOGI("FM_TX_CMD_ENABLE_RDS:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdEnableRds, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_DISABLE_RDS: V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE_RDS:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdDisableRds, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_TEXT_RT_MSG: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_RT_MSG:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_TEXT_PS_MSG: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_PS_MSG:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_PTY_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PI_CODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPtyCode, (jlong)context, (jint)status, (jint)value); break; /* case FM_TX_CMD_SET_RDS_TRANSMISSION_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRANSMISSION_MODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_TRANSMISSION_MODE V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode, (jlong)context, (jint)status, (jint)value); break; */ case FM_TX_CMD_SET_RDS_AF_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_AF_CODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsAfCode, (jlong)context, (jint)status, (jint)value); break; /* case FM_TX_CMD_GET_RDS_AF_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsAfCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_PI_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PI_CODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPiCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_PI_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PI_CODE:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPiCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_PTY_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PTY_CODE:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPtyCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_TEXT_REPERTOIRE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_REPERTOIRE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_TEXT_REPERTOIRE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_REPERTOIRE:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_PS_DISPLAY_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PS_DISPLAY_MODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_PS_DISPLAY_MODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PS_DISPLAY_MODE:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_PS_DISPLAY_SPEED: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PS_DISPLAY_SPEED:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_PS_DISPLAY_SPEED: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PS_DISPLAY_SPEED:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_TEXT_PS_MSG: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_PS_MSG:Status: %d ",status); jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.psMsg.len); if (jRadioTextMsg == NULL) { V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_PS_MSG: Failed converting elements"); goto EXCEPTION; } env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.psMsg.len,(jbyte*)event->p.cmdDone.v.psMsg.msg); if (env->ExceptionOccurred()) { V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_PS_MSG: env->SetByteArrayRegion failed"); goto EXCEPTION; } env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.psMsg.len, jRadioTextMsg); break; case FM_TX_CMD_GET_RDS_TEXT_RT_MSG: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_RT_MSG:Status: %d ",status); jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rtMsg.len); if (jRadioTextMsg == NULL) { V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_RT_MSG: Failed converting elements"); goto EXCEPTION; } env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rtMsg.len,(jbyte*)event->p.cmdDone.v.rtMsg.msg); if (env->ExceptionOccurred()) { V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_RT_MSG: env->SetByteArrayRegion failed"); goto EXCEPTION; } env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.rtMsg.rtMsgType, (jint)event->p.cmdDone.v.rtMsg.len, jRadioTextMsg); break; case FM_TX_CMD_SET_RDS_TRANSMITTED_MASK: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRANSMITTED_MASK:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_TRANSMITTED_MASK: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TRANSMITTED_MASK:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_TRAFFIC_CODES: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRAFFIC_CODES:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.trafficCodes.taCode, (jint)event->p.cmdDone.v.trafficCodes.tpCode); break; case FM_TX_CMD_GET_RDS_TRAFFIC_CODES: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TRAFFIC_CODES:Status: %d , taCode: %d ,tpCode: %d ",status,event->p.cmdDone.v.trafficCodes.taCode,event->p.cmdDone.v.trafficCodes.tpCode); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.trafficCodes.taCode, (jint)event->p.cmdDone.v.trafficCodes.tpCode); break; case FM_TX_CMD_SET_RDS_MUSIC_SPEECH_FLAG: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_MUSIC_SPEECH_FLAG:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_MUSIC_SPEECH_FLAG: V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_MUSIC_SPEECH_FLAG:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_PRE_EMPHASIS_FILTER: V4L2_JBTL_LOGI("FM_TX_CMD_SET_PRE_EMPHASIS_FILTER:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_PRE_EMPHASIS_FILTER: V4L2_JBTL_LOGI("FM_TX_CMD_GET_PRE_EMPHASIS_FILTER:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_SET_RDS_EXTENDED_COUNTRY_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_EXTENDED_COUNTRY_CODE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_GET_RDS_EXTENDED_COUNTRY_CODE: V4L2_JBTL_LOGI("FM_TX_CMD_GET_PRE_EMPHASIS_FILTER:Status: %d,Value: %d ",status,value); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode, (jlong)context, (jint)status, (jint)value); break; case FM_TX_CMD_WRITE_RDS_RAW_DATA: V4L2_JBTL_LOGI("FM_TX_CMD_WRITE_RDS_RAW_DATA:Status: %d ",status); jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rawRds.len); if (jRadioTextMsg == NULL) { V4L2_JBTL_LOGE("FM_TX_CMD_WRITE_RDS_RAW_DATA: Failed converting elements"); goto EXCEPTION; } env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rawRds.len,(jbyte*)event->p.cmdDone.v.rawRds.data); if (env->ExceptionOccurred()) { V4L2_JBTL_LOGE("FM_TX_CMD_WRITE_RDS_RAW_DATA: env->SetByteArrayRegion failed"); goto EXCEPTION; } env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdWriteRdsRawData, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.rawRds.len, jRadioTextMsg); break; case FM_TX_CMD_READ_RDS_RAW_DATA: V4L2_JBTL_LOGI("FM_TX_CMD_READ_RDS_RAW_DATA:Status: %d ",status); jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rawRds.len); if (jRadioTextMsg == NULL) { V4L2_JBTL_LOGE("FM_TX_CMD_READ_RDS_RAW_DATA: Failed converting elements"); goto EXCEPTION; } env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rawRds.len,(jbyte*)event->p.cmdDone.v.rawRds.data); if (env->ExceptionOccurred()) { V4L2_JBTL_LOGE("FM_TX_CMD_READ_RDS_RAW_DATA: env->SetByteArrayRegion failed"); goto EXCEPTION; } env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdReadRdsRawData, (jlong)context, (jint)status, (jint)event->p.cmdDone.v.rawRds.len, jRadioTextMsg); break; case FM_TX_CMD_CHANGE_AUDIO_SOURCE: V4L2_JBTL_LOGI("FM_TX_CMD_CHANGE_AUDIO_SOURCE:Status: %d ",status); lptUnavailResources = (jclass *)event->p.cmdDone.v.audioOperation.ptUnavailResources; env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdChangeAudioSource, (jlong)context, (jint)status, (jclass)lptUnavailResources); break; */ case FM_TX_CMD_CHANGE_DIGITAL_AUDIO_CONFIGURATION: V4L2_JBTL_LOGI("FM_TX_CMD_CHANGE_AUDIO_SOURCE:Status: %d ",status); env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration, (jlong)context, (jint)status, (jint)value); break; default: V4L2_JBTL_LOGE("nativeJFmTx_Callback():EVENT cmdType-------------->default"); // V4L2_JBTL_LOGE("unhandled fm cmdType %d", event->p.cmdDone.cmdType); break; } //end switch if (env->ExceptionOccurred()) { V4L2_JBTL_LOGE("nativeJFmTx_Callback: ExceptionOccurred"); goto EXCEPTION; } /*Delete the local references if (jRadioTextMsg!= NULL) env->DeleteLocalRef(jRadioTextMsg); */ V4L2_JBTL_LOGD("nativeJFmTx_Callback: Exiting, Calling DetachCurrentThread at the END"); // g_jVM->DetachCurrentThread(); return; EXCEPTION: V4L2_JBTL_LOGE("nativeJFmTx_Callback: Exiting due to failure"); /* if (jRadioTextMsg!= NULL) env->DeleteLocalRef(jRadioTextMsg); */ if (env->ExceptionOccurred()) { env->ExceptionDescribe(); env->ExceptionClear(); } g_jVM->DetachCurrentThread(); return; } /********************************************************************** * Callback registration ***********************************************************************/ #define VERIFY_METHOD_ID(methodId) \ if (!_VerifyMethodId(methodId, #methodId)) { \ V4L2_JBTL_LOGE("Error obtaining method id for %s", #methodId); \ return; \ } static bool _VerifyMethodId(jmethodID methodId, const char *name) { bool result = true; if (methodId == NULL) { V4L2_JBTL_LOGE("_VerifyMethodId: Failed getting method id of %s", name); result = false; } return result; } void nativeJFmTx_ClassInitNative(JNIEnv* env, jclass clazz){ V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Entered"); if (NULL == env) { V4L2_JBTL_LOGE("nativeJFmRx_ClassInitNative: NULL == env"); } env->GetJavaVM(&g_jVM); /* Save class information in global reference in order to prevent class unloading */ _sJClass = (jclass)env->NewGlobalRef(clazz); /* Initialize structure of RBTL callbacks */ V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Initializing FMTX callback structure"); V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Obtaining method IDs"); _sMethodId_nativeCb_fmTxCmdEnable = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdEnable", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdEnable); _sMethodId_nativeCb_fmTxCmdDisable = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdDisable", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDisable); _sMethodId_nativeCb_fmTxCmdDestroy = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdDestroy", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDestroy); _sMethodId_nativeCb_fmTxCmdTune = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdTune", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdTune); _sMethodId_nativeCb_fmTxCmdGetTunedFrequency= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetTunedFrequency", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetTunedFrequency); _sMethodId_nativeCb_fmTxCmdStartTransmission = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdStartTransmission", "(JI)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdStartTransmission); _sMethodId_nativeCb_fmTxCmdStopTransmission = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdStopTransmission", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdStopTransmission); _sMethodId_nativeCb_fmTxCmdEnableRds = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdEnableRds", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdEnableRds); _sMethodId_nativeCb_fmTxCmdDisableRds = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdDisableRds", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDisableRds); _sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTextRtMsg", "(JIII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg); /* _sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTransmissionMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode); _sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTransmissionMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode); _sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTrafficCodes", "(JIII)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes); _sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTrafficCodes", "(JIII)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes); */ _sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTextPsMsg", "(JII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg); /* _sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTextPsMsg", "(JII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg); _sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTextRtMsg", "(JIII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg); _sMethodId_nativeCb_fmTxCmdWriteRdsRawData= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdWriteRdsRawData", "(JII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdWriteRdsRawData); _sMethodId_nativeCb_fmTxCmdReadRdsRawData= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdReadRdsRawData", "(JII[B)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdReadRdsRawData); */ _sMethodId_nativeCb_fmTxCmdSetInterruptMask= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetInterruptMask", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetInterruptMask); /* _sMethodId_nativeCb_fmTxCmdGetInterruptMask= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetInterruptMask", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetInterruptMask); */ _sMethodId_nativeCb_fmTxCmdSetMonoStereoMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetMonoStereoMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetMonoStereoMode); _sMethodId_nativeCb_fmTxCmdGetMonoStereoMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetMonoStereoMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetMonoStereoMode); _sMethodId_nativeCb_fmTxCmdSetPowerLevel= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetPowerLevel", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetPowerLevel); _sMethodId_nativeCb_fmTxCmdGetPowerLevel= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetPowerLevel", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetPowerLevel); _sMethodId_nativeCb_fmTxCmdSetMuteMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetMuteMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetMuteMode); _sMethodId_nativeCb_fmTxCmdGetMuteMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetMuteMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetMuteMode); _sMethodId_nativeCb_fmTxCmdSetRdsAfCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsAfCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsAfCode); _sMethodId_nativeCb_fmTxCmdGetRdsAfCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsAfCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsAfCode); _sMethodId_nativeCb_fmTxCmdSetRdsPiCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsPiCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPiCode); _sMethodId_nativeCb_fmTxCmdGetRdsPiCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsPiCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPiCode); _sMethodId_nativeCb_fmTxCmdSetRdsPtyCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsPtyCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPtyCode); _sMethodId_nativeCb_fmTxCmdGetRdsPtyCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsPtyCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPtyCode); _sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsPsDispalyMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode); _sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsPsDispalyMode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode); _sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsPsDisplaySpeed", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed); _sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsPsDisplaySpeed", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed); _sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTransmittedMask", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask); _sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTransmittedMask", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask); _sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsMusicSpeechFlag", "(JIJ)V") ; VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag); _sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag = env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsMusicSpeechFlag", "(JIJ)V") ; VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag); _sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetPreEmphasisFilter", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter); _sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetPreEmphasisFilter", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter); _sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsExtendedCountryCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode); _sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsExtendedCountryCode", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode); _sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdChangeDigitalAudioConfiguration", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration); /* _sMethodId_nativeCb_fmTxCmdChangeAudioSource= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdChangeAudioSource", "(JILcom/ti/jfm/core/JFmCcmVacUnavailResourceList;)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdChangeAudioSource); */ _sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdSetRdsTextRepertoire", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire); _sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire= env->GetStaticMethodID(clazz, "nativeCb_fmTxCmdGetRdsTextRepertoire", "(JIJ)V"); VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire); V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative:Exiting"); } JNINativeMethod JFmTxNative_sMethods[] = { /* name, signature, funcPtr */ {"nativeJFmTx_ClassInitNative", "()V", (void*)nativeJFmTx_ClassInitNative}, {"nativeJFmTx_Create","(Lcom/ti/jfm/core/JFmContext;)I", (void*)nativeJFmTx_Create}, {"nativeJFmTx_Destroy","(J)I", (void*)nativeJFmTx_Destroy}, {"nativeJFmTx_Enable","(J)I", (void*)nativeJFmTx_Enable}, {"nativeJFmTx_Disable","(J)I", (void*)nativeJFmTx_Disable}, {"nativeJFmTx_Tune","(JJ)I", (void*)nativeJFmTx_Tune}, {"nativeJFmTx_StopTransmission","(J)I", (void*)nativeJFmTx_StopTransmission}, {"nativeJFmTx_StartTransmission","(J)I", (void*)nativeJFmTx_StartTransmission}, {"nativeJFmTx_EnableRds","(J)I", (void*)nativeJFmTx_EnableRds}, {"nativeJFmTx_DisableRds","(J)I", (void*)nativeJFmTx_DisableRds}, {"nativeJFmTx_SetRdsTransmissionMode","(JI)I", (void*)nativeJFmTx_SetRdsTransmissionMode}, {"nativeJFmTx_SetRdsTextPsMsg","(JLjava/lang/String;I)I", (void*)nativeJFmTx_SetRdsTextPsMsg}, /* {"nativeJFmTx_GetRdsTextPsMsg","(J)I", (void*)nativeJFmTx_GetRdsTextPsMsg}, {"nativeJFmTx_WriteRdsRawData","(JLjava/lang/String;I)I", (void*)nativeJFmTx_WriteRdsRawData}, */ {"nativeJFmTx_SetMuteMode","(JI)I", (void*)nativeJFmTx_SetMuteMode}, {"nativeJFmTx_GetMuteMode","(J)I", (void*)nativeJFmTx_GetMuteMode}, {"nativeJFmTx_SetRdsTextRtMsg","(JILjava/lang/String;I)I", (void*)nativeJFmTx_SetRdsTextRtMsg}, {"nativeJFmTx_SetRdsTransmittedGroupsMask","(JJ)I", (void*)nativeJFmTx_SetRdsTransmittedGroupsMask}, /* {"nativeJFmTx_SetRdsPsDisplayMode","(JI)I", (void*)nativeJFmTx_SetRdsPsDisplayMode}, {"nativeJFmTx_GetRdsPsDisplayMode","(J)I", (void*)nativeJFmTx_GetRdsPsDisplayMode}, {"nativeJFmTx_GetRdsTextRtMsg","(J)I", (void*)nativeJFmTx_GetRdsTextRtMsg}, {"nativeJFmTx_GetRdsTransmittedGroupsMask","(J)I", (void*)nativeJFmTx_GetRdsTransmittedGroupsMask}, {"nativeJFmTx_SetRdsTrafficCodes","(JII)I", (void*)nativeJFmTx_SetRdsTrafficCodes}, {"nativeJFmTx_GetRdsTrafficCodes","(J)I", (void*)nativeJFmTx_GetRdsTrafficCodes}, {"nativeJFmTx_SetRdsMusicSpeechFlag","(JI)I", (void*)nativeJFmTx_SetRdsMusicSpeechFlag}, {"nativeJFmTx_GetRdsMusicSpeechFlag","(J)I", (void*)nativeJFmTx_GetRdsMusicSpeechFlag}, {"nativeJFmTx_SetRdsExtendedCountryCode","(JI)I", (void*)nativeJFmTx_SetRdsExtendedCountryCode}, {"nativeJFmTx_GetRdsExtendedCountryCode","(J)I", (void*)nativeJFmTx_GetRdsExtendedCountryCode}, {"nativeJFmTx_ReadRdsRawData","(J)I", (void*)nativeJFmTx_ReadRdsRawData}, {"nativeJFmTx_ChangeAudioSource","(JII)I", (void*)nativeJFmTx_ChangeAudioSource}, */ {"nativeJFmTx_ChangeDigitalSourceConfiguration","(JI)I", (void*)nativeJFmTx_ChangeDigitalSourceConfiguration}, {"nativeJFmTx_SetRdsTextRepertoire","(JI)I", (void*)nativeJFmTx_SetRdsTextRepertoire}, {"nativeJFmTx_GetRdsTextRepertoire","(J)I", (void*)nativeJFmTx_GetRdsTextRepertoire}, {"nativeJFmTx_SetRdsPtyCode","(JI)I", (void*)nativeJFmTx_SetRdsPtyCode}, {"nativeJFmTx_GetRdsPtyCode","(J)I", (void*)nativeJFmTx_GetRdsPtyCode}, {"nativeJFmTx_SetRdsPiCode","(JI)I", (void*)nativeJFmTx_SetRdsPiCode}, {"nativeJFmTx_GetRdsPiCode","(J)I", (void*)nativeJFmTx_GetRdsPiCode}, {"nativeJFmTx_SetRdsAfCode","(JI)I", (void*)nativeJFmTx_SetRdsAfCode}, {"nativeJFmTx_GetRdsAfCode","(J)I", (void*)nativeJFmTx_GetRdsAfCode}, {"nativeJFmTx_SetMonoStereoMode","(JI)I", (void*)nativeJFmTx_SetMonoStereoMode}, {"nativeJFmTx_GetMonoStereoMode","(J)I", (void*)nativeJFmTx_GetMonoStereoMode}, {"nativeJFmTx_SetPowerLevel","(JI)I", (void*)nativeJFmTx_SetPowerLevel}, {"nativeJFmTx_GetPowerLevel","(J)I", (void*)nativeJFmTx_GetPowerLevel}, {"nativeJFmTx_SetPreEmphasisFilter","(JI)I", (void*)nativeJFmTx_SetPreEmphasisFilter}, {"nativeJFmTx_GetPreEmphasisFilter","(J)I", (void*)nativeJFmTx_GetPreEmphasisFilter}, {"nativeJFmTx_SetRdsPsScrollSpeed","(JI)I", (void*)nativeJFmTx_SetRdsPsScrollSpeed}, {"nativeJFmTx_GetRdsPsScrollSpeed","(J)I", (void*)nativeJFmTx_GetRdsPsScrollSpeed} }; /* * Register several native methods for one class. */ int getTxNativeSize() { return NELEM(JFmTxNative_sMethods); }