1/*
2 *
3 * Copyright 2001-2011 Texas Instruments, Inc. - http://www.ti.com/
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include "android_runtime/AndroidRuntime.h"
19#include "jni.h"
20#include "JNIHelp.h"
21#include "v4l2_JbtlLog.h"
22#include "JFmTxNative.h"
23
24#include <stdlib.h>
25
26#define LOG_TAG "JFmTxNative"
27#include <cutils/properties.h>
28
29using namespace android;
30static int radio_fd;
31extern long jContext;
32
33#undef VIDIOC_S_MODULATOR
34#define VIDIOC_S_MODULATOR    1078220343
35
36extern "C" {
37#include <stdio.h>
38#include <fcntl.h>
39#include <asoundlib.h>
40#include <linux/videodev.h>
41#include <math.h>
42#include <pthread.h>
43#include <errno.h>
44#include <string.h>
45
46void nativeJFmTx_Callback(long context, int status,
47                        int command, long value);
48extern void MCP_HAL_LOG_EnableLogToAndroid(const char *app_name);
49
50} //extern "C"
51
52static jclass _sJClass;
53static JavaVM *g_jVM = NULL;
54
55static jmethodID _sMethodId_nativeCb_fmTxCmdEnable;
56static jmethodID _sMethodId_nativeCb_fmTxCmdDisable;
57static jmethodID _sMethodId_nativeCb_fmTxCmdDestroy;
58static jmethodID _sMethodId_nativeCb_fmTxCmdTune;
59static jmethodID _sMethodId_nativeCb_fmTxCmdGetTunedFrequency;
60static jmethodID _sMethodId_nativeCb_fmTxCmdStartTransmission;
61static jmethodID _sMethodId_nativeCb_fmTxCmdStopTransmission;
62static jmethodID _sMethodId_nativeCb_fmTxCmdEnableRds;
63static jmethodID _sMethodId_nativeCb_fmTxCmdDisableRds;
64static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg;
65static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg;
66/*
67static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode;
68//  static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode;
69static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes;
70static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes;
71static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg;
72static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg;
73static jmethodID _sMethodId_nativeCb_fmTxCmdWriteRdsRawData;
74static jmethodID _sMethodId_nativeCb_fmTxCmdReadRdsRawData;
75static jmethodID _sMethodId_nativeCb_fmTxCmdChangeAudioSource;
76*/
77static jmethodID _sMethodId_nativeCb_fmTxCmdSetInterruptMask;
78static jmethodID _sMethodId_nativeCb_fmTxCmdSetMonoStereoMode;
79static jmethodID _sMethodId_nativeCb_fmTxCmdGetMonoStereoMode;
80static jmethodID _sMethodId_nativeCb_fmTxCmdSetPowerLevel;
81static jmethodID _sMethodId_nativeCb_fmTxCmdGetPowerLevel;
82static jmethodID _sMethodId_nativeCb_fmTxCmdSetMuteMode;
83static jmethodID _sMethodId_nativeCb_fmTxCmdGetMuteMode;
84static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsAfCode;
85static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsAfCode;
86static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPiCode;
87static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPiCode;
88static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPtyCode;
89static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPtyCode;
90static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire;
91static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire;
92static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode;
93static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode;
94static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed;
95static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed;
96static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask;
97static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask;
98static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag  ;
99static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag  ;
100static jmethodID _sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter;
101static jmethodID _sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter;
102static jmethodID _sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode;
103static jmethodID _sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode;
104static jmethodID _sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration;
105
106
107
108int fm_read_transmitter_capabilities(int radio_fd)
109{
110  struct v4l2_capability cap;
111  int res;
112
113  res = ioctl(radio_fd,VIDIOC_QUERYCAP,&cap);
114  if(res < 0)
115  {
116    V4L2_JBTL_LOGD("Failed to read %s capabilities\n",DEFAULT_RADIO_DEVICE);
117    return FM_FAILED;
118  }
119  if((cap.capabilities & V4L2_CAP_RADIO) == 0)
120  {
121    V4L2_JBTL_LOGD("%s is not radio devcie",DEFAULT_RADIO_DEVICE);
122    return FM_FAILED;
123  }
124  V4L2_JBTL_LOGD("\n***%s Info ****\n",DEFAULT_RADIO_DEVICE);
125  V4L2_JBTL_LOGD("Driver       : %s\n",cap.driver);
126  V4L2_JBTL_LOGD("Card         : %s\n",cap.card);
127  V4L2_JBTL_LOGD("Bus          : %s\n",cap.bus_info);
128  V4L2_JBTL_LOGD("Capabilities : 0x%x\n",cap.capabilities);
129
130  return FM_SUCCESS;
131}
132
133static int nativeJFmTx_Create(JNIEnv *env,jobject obj,jobject jContextValue)
134{
135    int fmStatus ;
136
137   V4L2_JBTL_LOGD("Java_JFmRx_nativeJFmRx_Create(): Entered");
138
139   radio_fd = open(DEFAULT_RADIO_DEVICE, O_RDWR);
140   if(radio_fd < 0)
141   {
142       V4L2_JBTL_LOGD("Unable to open %s ..\n",DEFAULT_RADIO_DEVICE);
143      jniThrowIOException(env, errno);
144       return FM_FAILED;
145   }
146
147   fmStatus = fm_read_transmitter_capabilities(radio_fd);
148   if(fmStatus< 0)
149   {
150     close(radio_fd);
151     return fmStatus;
152   }
153
154    V4L2_JBTL_LOGD("nativeJFmRx_create:Exiting Successfully");
155
156    return fmStatus;
157return 0;
158}
159
160static jint nativeJFmTx_Destroy(JNIEnv *env, jobject obj,jlong jContextValue)
161{
162
163return 0;
164
165}
166
167
168
169static int nativeJFmTx_Enable(JNIEnv *env, jobject obj, jlong jContextValue)
170{
171   int  status ;
172   struct v4l2_modulator vm;
173
174   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Entered");
175
176   jContext = jContextValue;
177   vm.index = 0;
178
179   status = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vm);
180   if(status < 0)
181   {
182     V4L2_JBTL_LOGD("Failed to Enable FM\n");
183     return status;
184   }
185
186   V4L2_JBTL_LOGD("nativeJFmRx_enable: FM_RX_Enable() returned %d",(int)status);
187   nativeJFmTx_Callback(jContext,status,FM_TX_CMD_ENABLE,status);
188   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit");
189
190   return status;
191}
192
193
194static int nativeJFmTx_Disable(JNIEnv *env, jobject obj, jlong jContextValue)
195{
196    V4L2_JBTL_LOGD("nativeJFmTx_disable(): Entered");
197
198   jContext = jContextValue;
199    close(radio_fd);
200    nativeJFmTx_Callback(jContext,0,FM_TX_CMD_DISABLE,0);
201
202    V4L2_JBTL_LOGD("nativeJFmTx_disable(): Exit");;
203
204    return FM_SUCCESS;
205}
206
207
208static int nativeJFmTx_Tune(JNIEnv *env, jobject obj,jlong jContextValue,jlong user_freq)
209{
210    struct v4l2_frequency vf;
211    struct v4l2_tuner vt;
212    int status, div;
213
214    V4L2_JBTL_LOGD("nativeJFmRx_tune(): Entered");
215
216    vf.tuner = 0;
217    vf.frequency = rint(user_freq * 16 + 0.5);
218
219    status = ioctl(radio_fd, VIDIOC_S_FREQUENCY, &vf);
220    if(status < 0)
221    {
222        V4L2_JBTL_LOGD("Failed to tune to frequency %d\n",user_freq);
223        return FM_FAILED;
224    }
225    V4L2_JBTL_LOGD("Tuned to frequency %2.1f MHz\n",user_freq);
226
227   jContext = jContextValue;
228nativeJFmTx_Callback(jContext,status,FM_TX_CMD_TUNE,user_freq);
229
230    V4L2_JBTL_LOGD("nativeJFmRx_Tune(): Exit");
231     return FM_PENDING;
232
233}
234
235static int nativeJFmTx_GetTunedFrequency(JNIEnv *env, jobject obj,jlong jContextValue)
236{
237return 0;
238
239}
240static int nativeJFmTx_StartTransmission(JNIEnv *env, jobject obj, jlong jContextValue)
241{
242   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Init");
243   jContext = jContextValue;
244   nativeJFmTx_Callback(jContext,0,FM_TX_CMD_START_TRANSMISSION,0);
245   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit");
246
247return 0;
248
249}
250
251static int nativeJFmTx_StopTransmission(JNIEnv *env, jobject obj, jlong jContextValue)
252{
253   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Init");
254   jContext = jContextValue;
255   nativeJFmTx_Callback(jContext,0,FM_TX_CMD_STOP_TRANSMISSION,0);
256   V4L2_JBTL_LOGD("nativeJFmRx_enable(): Exit");
257return 0;
258
259}
260
261
262static int nativeJFmTx_EnableRds(JNIEnv *env, jobject obj, jlong jContextValue)
263{
264  struct v4l2_modulator vmod;
265  int ret;
266
267  V4L2_JBTL_LOGD("nativeJFmTx_EnableRds(): Init");
268  vmod.index = 0;
269  ret = ioctl(radio_fd, VIDIOC_G_MODULATOR, &vmod);
270  if(ret < 0)
271  {
272      printf("Failed to get TX mode\n");
273      return -1;
274  }
275  vmod.txsubchans = vmod.txsubchans | V4L2_TUNER_SUB_RDS;
276
277  ret = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vmod);
278  if(ret < 0)
279  {
280      printf("Failed to set TX mode\n");
281      return -1;
282  }
283
284   jContext = jContextValue;
285  nativeJFmTx_Callback(jContext,0,FM_TX_CMD_ENABLE_RDS,0);
286
287    V4L2_JBTL_LOGD("nativeJFmTx_EnableRds(): Exit");;
288
289return 0;
290
291}
292
293
294static int nativeJFmTx_DisableRds(JNIEnv *env, jobject obj, jlong jContextValue)
295{
296  struct v4l2_modulator vmod;
297  int ret;
298
299  V4L2_JBTL_LOGD("nativeJFmTx_DisableRds(): Init");
300  vmod.index = 0;
301  ret = ioctl(radio_fd, VIDIOC_G_MODULATOR, &vmod);
302  if(ret < 0)
303  {
304      printf("Failed to get TX mode\n");
305      return -1;
306  }
307  vmod.txsubchans = vmod.txsubchans & ~V4L2_TUNER_SUB_RDS;
308
309  ret = ioctl(radio_fd, VIDIOC_S_MODULATOR, &vmod);
310  if(ret < 0)
311  {
312      printf("Failed to set TX mode\n");
313      return -1;
314  }
315
316  jContext = jContextValue;
317  nativeJFmTx_Callback(jContext,0,FM_TX_CMD_DISABLE_RDS,0);
318
319    V4L2_JBTL_LOGD("nativeJFmTx_DisableRds(): Exit");;
320
321return 0;
322}
323
324static int nativeJFmTx_SetRdsTransmissionMode(JNIEnv *env, jobject obj, jlong jContextValue,jint mode)
325{
326
327/*    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
328    ALOGD("nativeJFmTx_SetRdsTransmissionMode(): Entered");
329
330    FmTxStatus  status =FM_TX_SetRdsTransmissionMode(fmTxContext,(FmTxRdsTransmissionMode)mode);
331    ALOGD("nativeJFmTx_SetRdsTransmissionMode: FM_TX_SetRdsTransmissionMode() returned %d",(int)status);
332*/
333    ALOGD("nativeJFmTx_SetRdsTransmissionMode(): Exit");
334    return 0;
335}
336
337/*
338static int nativeJFmTx_GetRdsTransmissionMode(JNIEnv *env, jobject obj, jlong jContextValue)
339{
340
341    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
342    ALOGD("nativeJFmTx_GetRdsTransmissionMode(): Entered");
343
344    FmTxStatus  status =FM_TX_GetRdsTransmissionMode(fmTxContext);
345    ALOGD("nativeJFmTx_GetRdsTransmissionMode: FM_TX_GetRdsTransmissionMode() returned %d",(int)status);
346
347    ALOGD("nativeJFmTx_GetRdsTransmissionMode(): Exit");
348    return status;
349}
350
351*/
352static int nativeJFmTx_SetRdsTextPsMsg(JNIEnv *env, jobject obj, jlong jContextValue,jstring psString,jint length)
353{
354
355/*    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
356    const char *psStr = (char*) env->GetStringUTFChars(psString, &iscopy);
357
358    ALOGD("nativeJFmTx_SetRdsTextPsMsg(): Entered");
359    ALOGD("nativeJFmTx_SetRdsTextPsMsg():--> psStr= %s",psStr);
360
361    FmTxStatus  status =FM_TX_SetRdsTextPsMsg(fmTxContext,(const FMC_U8 *)psStr,(FMC_UINT)length);
362    ALOGD("nativeJFmTx_SetRdsTextPsMsg: FM_TX_SetRdsTextPsMsg() returned %d",(int)status);
363*/
364    struct v4l2_ext_controls_kfmapp vec;
365    struct v4l2_ext_control_kfmapp vctrls;
366        jboolean iscopy;
367    int res;
368    char rds_text[100];
369
370    vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
371    vec.count = 1;
372    vctrls.id = V4L2_CID_RDS_TX_PS_NAME;
373    vctrls.string = (char*) env->GetStringUTFChars(psString, &iscopy);
374    vctrls.size = strlen(rds_text) + 1;
375    vec.controls = &vctrls;
376
377    ALOGE("Entered RDS  PS Name is - %s\n",vctrls.string);
378    res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec);
379    if(res < 0)
380    {
381        ALOGE("Failed to set FM Tx RDS Radio PS Name\n");
382        return res;
383    }
384
385    ALOGD("nativeJFmTx_SetRdsTextPsMsg(): Exit");
386
387    return res;
388}
389/*
390static int nativeJFmTx_GetRdsTextPsMsg(JNIEnv *env, jobject obj, jlong jContextValue)
391{
392
393    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
394    ALOGD("nativeJFmTx_GetRdsTextPsMsg(): Entered");
395
396    FmTxStatus  status =FM_TX_GetRdsTextPsMsg(fmTxContext);
397    ALOGD("nativeJFmTx_GetRdsTextPsMsg: FM_TX_GetRdsTextPsMsg() returned %d",(int)status);
398
399    ALOGD("nativeJFmTx_GetRdsTextPsMsg(): Exit");
400
401    return status;
402}
403
404static int nativeJFmTx_WriteRdsRawData(JNIEnv *env, jobject obj, jlong jContextValue,jstring msg,jint length)
405{
406
407    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
408    ALOGD("nativeJFmTx_WriteRdsRawData(): Entered");
409
410    jboolean iscopy;
411    const char *rawData = (char*) env->GetStringUTFChars(msg, &iscopy);
412
413
414    FmTxStatus  status =FM_TX_WriteRdsRawData(fmTxContext,(const FMC_U8 *)rawData,(FMC_UINT)length);
415    ALOGD("nativeJFmTx_WriteRdsRawData: FM_TX_WriteRdsRawData() returned %d",(int)status);
416
417    ALOGD("nativeJFmTx_WriteRdsRawData(): Exit");
418    return status;
419}
420
421
422static int nativeJFmTx_ReadRdsRawData(JNIEnv *env, jobject obj, jlong jContextValue)
423{
424
425    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
426    ALOGD("nativeJFmTx_ReadRdsRawData(): Entered");
427
428    FmTxStatus  status =FM_TX_ReadRdsRawData(fmTxContext);
429    ALOGD("nativeJFmTx_ReadRdsRawData: FM_TX_ReadRdsRawData() returned %d",(int)status);
430
431    ALOGD("nativeJFmTx_ReadRdsRawData(): Exit");
432    return status;
433}
434*/
435static int nativeJFmTx_SetMuteMode(JNIEnv *env, jobject obj, jlong jContextValue,jint mode)
436{
437
438   struct v4l2_control vt;
439   int status;
440
441   ALOGD("nativeJFmTx_SetMuteMode(): Entered");
442   vt.id = V4L2_CID_AUDIO_MUTE;
443
444   if (mode == 0)
445       vt.value = FM_MUTE_OFF;
446   else
447    vt.value = FM_MUTE_ON;
448
449   status = ioctl(radio_fd,VIDIOC_S_CTRL,&vt);
450   if(status < 0)
451   {
452     ALOGD("nativeJFmTx_SetMuteMode(): Faile returned %d\n", status);
453     return status;
454   }
455
456    ALOGD("nativeJFmTx_SetMuteMode(): Exit");
457    return status;
458}
459
460static int nativeJFmTx_GetMuteMode(JNIEnv *env, jobject obj, jlong jContextValue)
461{
462    ALOGD("nativeJFmTx_GetMuteMode(): Entered");
463
464    ALOGD("nativeJFmTx_GetMuteMode(): Exit");
465    return 0;
466}
467/*
468static int nativeJFmTx_SetRdsPsDisplayMode(JNIEnv *env, jobject obj, jlong jContextValue, jint displayMode)
469{
470
471    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
472    ALOGD("nativeJFmTx_SetRdsPsDisplayMode(): Entered");
473
474    FmTxStatus  status =FM_TX_SetRdsPsDisplayMode(fmTxContext,(FmcRdsPsDisplayMode)displayMode);
475    ALOGD("nativeJFmTx_SetRdsPsDisplayMode: FM_TX_SetRdsPsDisplayMode() returned %d",(int)status);
476
477    ALOGD("nativeJFmTx_SetRdsPsDisplayMode(): Exit");
478    return status;
479}
480
481
482static int nativeJFmTx_GetRdsPsDisplayMode(JNIEnv *env, jobject obj, jlong jContextValue)
483{
484
485    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
486    ALOGD("nativeJFmTx_GetRdsPsDisplayMode(): Entered");
487
488    FmTxStatus  status =FM_TX_GetRdsPsDisplayMode(fmTxContext);
489    ALOGD("nativeJFmTx_GetRdsPsDisplayMode: FM_TX_GetRdsPsDisplayMode() returned %d",(int)status);
490
491    ALOGD("nativeJFmTx_GetRdsPsDisplayMode(): Exit");
492    return status;
493}
494
495*/
496static int nativeJFmTx_SetRdsTextRtMsg(JNIEnv *env, jobject obj, jlong jContextValue, jint msgType,jstring msg,jint length)
497{
498
499 //   FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
500
501    jboolean iscopy;
502    const char *rtMsg = (char*) env->GetStringUTFChars(msg, &iscopy);
503    struct v4l2_ext_controls_kfmapp vec;
504    struct v4l2_ext_control_kfmapp vctrls;
505    int res;
506    char rds_text[100];
507
508    ALOGD("nativeJFmTx_SetRdsTextRtMsg(): Entered");
509
510
511    vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
512    vec.count = 1;
513    vctrls.id = V4L2_CID_RDS_TX_RADIO_TEXT;
514    vctrls.string = (char*) env->GetStringUTFChars(msg, &iscopy);
515    vctrls.size = strlen(rtMsg) + 1;
516    vec.controls = &vctrls;
517
518    ALOGD("nativeJFmTx_SetRdsTextRtMsg():--> RTMsg = %s",vctrls.string);
519    res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec);
520    if(res < 0)
521    {
522            ALOGE("Failed to set FM Tx RDS Radio text");
523        return res;
524    }
525
526    //    FmTxStatus  status =FM_TX_SetRdsTextRtMsg(fmTxContext,(FmcRdsRtMsgType)msgType,(const FMC_U8 *)rtMsg,(FMC_UINT)length);
527    //    ALOGD("nativeJFmTx_SetRdsTextRtMsg: FM_TX_SetRdsTextRtMsg() returned %d",(int)status);
528
529    ALOGD("nativeJFmTx_SetRdsTextRtMsg(): Exit");
530    return 0;
531}
532
533/*
534static int nativeJFmTx_GetRdsTextRtMsg(JNIEnv *env, jobject obj, jlong jContextValue)
535{
536
537    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
538    ALOGD("nativeJFmTx_GetRdsTextRtMsg(): Entered");
539    FmTxStatus  status =FM_TX_GetRdsTextRtMsg(fmTxContext);
540    ALOGD("nativeJFmTx_GetRdsTextRtMsg: FM_TX_SetRdsTextRtMsg() returned %d",(int)status);
541
542    ALOGD("nativeJFmTx_GetRdsTextRtMsg(): Exit");
543    return status;
544}
545
546*/
547static int nativeJFmTx_SetRdsTransmittedGroupsMask(JNIEnv *env, jobject obj, jlong jContextValue, jlong fieldMask)
548{
549
550/*    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
551    ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask(): Entered");
552
553    FmTxStatus  status =FM_TX_SetRdsTransmittedGroupsMask(fmTxContext,(FmTxRdsTransmittedGroupsMask)fieldMask);
554    ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask: FM_TX_SetRdsTransmittedGroupsMask() returned %d",(int)status);
555*/
556    ALOGD("nativeJFmTx_SetRdsTransmittedGroupsMask(): Exit");
557    return 0;
558}
559
560/*
561static int nativeJFmTx_GetRdsTransmittedGroupsMask(JNIEnv *env, jobject obj, jlong jContextValue)
562{
563
564    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
565    ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask(): Entered");
566
567    FmTxStatus  status =FM_TX_GetRdsTransmittedGroupsMask(fmTxContext);
568    ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask: FM_TX_GetRdsTransmittedGroupsMask() returned %d",(int)status);
569
570    ALOGD("nativeJFmTx_GetRdsTransmittedGroupsMask(): Exit");
571    return status;
572}
573
574static int nativeJFmTx_SetRdsTrafficCodes(JNIEnv *env, jobject obj, jlong jContextValue, jint taCode,jint tpCode)
575{
576
577    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
578    ALOGD("nativeJFmTx_SetRdsTrafficCodes(): Entered");
579
580    FmTxStatus  status =FM_TX_SetRdsTrafficCodes(fmTxContext,(FmcRdsTaCode)taCode,(FmcRdsTpCode)tpCode);
581    ALOGD("nativeJFmTx_SetRdsTrafficCodes: FM_TX_SetRdsTrafficCodes() returned %d",(int)status);
582
583    ALOGD("nativeJFmTx_SetRdsTrafficCodes(): Exit");
584    return status;
585}
586
587static int nativeJFmTx_GetRdsTrafficCodes(JNIEnv *env, jobject obj, jlong jContextValue)
588{
589
590    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
591    ALOGD("nativeJFmTx_GetRdsTrafficCodes(): Entered");
592
593    FmTxStatus  status =FM_TX_GetRdsTrafficCodes(fmTxContext);
594    ALOGD("nativeJFmTx_GetRdsTrafficCodes: FM_TX_GetRdsTrafficCodes() returned %d",(int)status);
595
596    ALOGD("nativeJFmTx_GetRdsTrafficCodes(): Exit");
597    return status;
598}
599
600static int nativeJFmTx_SetRdsMusicSpeechFlag(JNIEnv *env, jobject obj, jlong jContextValue, jint musicSpeechFlag)
601{
602
603    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
604    ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag(): Entered");
605
606    FmTxStatus  status =FM_TX_SetRdsMusicSpeechFlag(fmTxContext,(FmcRdsMusicSpeechFlag)musicSpeechFlag);
607    ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag: FM_TX_SetRdsMusicSpeechFlag() returned %d",(int)status);
608
609    ALOGD("nativeJFmTx_SetRdsMusicSpeechFlag(): Exit");
610    return status;
611}
612
613
614static int nativeJFmTx_GetRdsMusicSpeechFlag(JNIEnv *env, jobject obj, jlong jContextValue)
615{
616
617    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
618    ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag(): Entered");
619
620    FmTxStatus  status =FM_TX_GetRdsMusicSpeechFlag(fmTxContext);
621    ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag: FM_TX_GetRdsMusicSpeechFlag() returned %d",(int)status);
622
623    ALOGD("nativeJFmTx_GetRdsMusicSpeechFlag(): Exit");
624    return status;
625}
626
627static int nativeJFmTx_SetRdsExtendedCountryCode(JNIEnv *env, jobject obj, jlong jContextValue, jint ecc)
628{
629
630    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
631    ALOGD("nativeJFmTx_SetRdsExtendedCountryCode(): Entered");
632
633    FmTxStatus  status =FM_TX_SetRdsECC(fmTxContext,(FmcRdsExtendedCountryCode)ecc);
634    ALOGD("nativeJFmTx_SetRdsExtendedCountryCode: FM_TX_SetRdsECC() returned %d",(int)status);
635
636    ALOGD("nativeJFmTx_SetRdsExtendedCountryCode(): Exit");
637    return status;
638}
639
640static int nativeJFmTx_GetRdsExtendedCountryCode(JNIEnv *env, jobject obj, jlong jContextValue)
641{
642
643    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
644    ALOGD("nativeJFmTx_GetRdsExtendedCountryCode(): Entered");
645
646    FmTxStatus  status =FM_TX_GetRdsECC(fmTxContext);
647    ALOGD("nativeJFmTx_GetRdsExtendedCountryCode: FM_TX_GetRdsECC() returned %d",(int)status);
648
649    ALOGD("nativeJFmTx_GetRdsExtendedCountryCode(): Exit");
650    return status;
651}
652
653static int nativeJFmTx_ChangeAudioSource(JNIEnv *env, jobject obj, jlong jContextValue,jint txSource,jint eSampleFreq)
654{
655
656    FmTxContext * fmTxContext = (FmTxContext *)jContextValue;
657    ALOGD("nativeJFmTx_ChangeAudioSource(): Entered");
658
659    ALOGD(" txSource = %d , Sampling frequency = %d ",(int) txSource, (int) eSampleFreq);
660    FmTxStatus  status =FM_TX_ChangeAudioSource(fmTxContext,(FmTxAudioSource)txSource,(ECAL_SampleFrequency)eSampleFreq);
661    ALOGD("nativeJFmTx_ChangeAudioSource: FM_TX_ChangeAudioSource() returned %d",(int)status);
662
663    ALOGD("nativeJFmTx_ChangeAudioSource(): Exit");
664    return status;
665}
666*/
667
668static int nativeJFmTx_ChangeDigitalSourceConfiguration(JNIEnv *env, jobject obj, jlong jContextValue,jint eSampleFreq)
669{
670return 0;
671
672}
673
674
675static int nativeJFmTx_SetRdsTextRepertoire(JNIEnv *env, jobject obj, jlong jContextValue,jint repertoire)
676{
677return 0;
678
679}
680
681
682static int nativeJFmTx_GetRdsTextRepertoire(JNIEnv *env, jobject obj, jlong jContextValue,jint repertoire)
683{
684return 0;
685}
686
687static int nativeJFmTx_SetRdsPtyCode(JNIEnv *env, jobject obj, jlong jContextValue,jint ptyCode)
688{
689	int user_val;
690	int res;
691	struct v4l2_ext_controls_kfmapp vec;
692	struct v4l2_ext_control_kfmapp vctrls;
693
694	ALOGE("nativeJFmTx_SetRdsPtyCode(): Entered");
695
696	vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
697	vec.count = 1;
698	vctrls.id = V4L2_CID_RDS_TX_PTY;
699	vctrls.value = ptyCode;
700	vctrls.size = 0;
701	vec.controls = &vctrls;
702
703	res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec);
704	if(res < 0)
705	{
706		ALOGE("Failed to set FM Tx RDS PTY\n");
707		return res;
708	}
709
710	ALOGE("nativeJFmTx_SetRdsPtyCode(): Exit");
711
712	return res;
713}
714
715static int nativeJFmTx_GetRdsPtyCode(JNIEnv *env, jobject obj, jlong jContextValue,jint ptyCode)
716{
717	return 0;
718}
719
720static int nativeJFmTx_SetRdsPiCode(JNIEnv *env, jobject obj, jlong jContextValue,jint piCode)
721{
722	struct v4l2_ext_controls_kfmapp vec;
723	struct v4l2_ext_control_kfmapp vctrls;
724	int res;
725
726	ALOGD("nativeJFmTx_SetRdsPiCode(): Enter");
727
728	vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
729	vec.count = 1;
730	vctrls.id = V4L2_CID_RDS_TX_PI;
731	vctrls.value = piCode;
732	vctrls.size = 0;
733	vec.controls = &vctrls;
734
735	res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec);
736	if(res < 0)
737	{
738		ALOGE("Failed to set FM Tx RDS PI Code\n");
739		return res;
740	}
741
742	ALOGD("Setting FM Tx RDS PI Code is Succesful\n");
743
744	return res;
745}
746
747static int nativeJFmTx_GetRdsPiCode(JNIEnv *env, jobject obj, jlong jContextValue)
748{
749return 0;
750}
751static int nativeJFmTx_SetRdsAfCode(JNIEnv *env, jobject obj, jlong jContextValue,jint afCode)
752{
753    int fd, res;
754    char str[10];
755
756    sprintf(str, "%d", afCode);
757
758    ALOGD("nativeJFmTx_SetRdsAfCode(): Enter");
759
760    fd = open(FMTX_RDS_AF_SYSFS_ENTRY, O_RDWR);
761    if (fd < 0) {
762        ALOGD("Can't open %s", FMTX_RDS_AF_SYSFS_ENTRY);
763        return -1;
764    }
765
766    /* Need max 6 cahrs to set AF between 75000 KHz to 108000 KHz */
767    res = write(fd, str, 6);
768    if(res <= 0) {
769        ALOGD("Failed to set FM TX RDS AF Frequency\n");
770        goto exit;
771    }
772
773    ALOGD("FM RDS Alternate Frequency Set is succesfull\n");
774exit:
775    close(fd);
776    return res;
777}
778
779static int nativeJFmTx_GetRdsAfCode(JNIEnv *env, jobject obj, jlong jContextValue)
780{
781    return 0;
782}
783
784static int nativeJFmTx_SetMonoStereoMode(JNIEnv *env, jobject obj, jlong jContextValue,jint monoStereoMode)
785{
786return 0;
787}
788
789static int nativeJFmTx_GetMonoStereoMode(JNIEnv *env, jobject obj, jlong jContextValue)
790{
791return 0;
792
793}
794
795static int nativeJFmTx_SetPowerLevel(JNIEnv *env, jobject obj, jlong jContextValue,jint powerLevel)
796{
797	struct v4l2_ext_controls_kfmapp vec;
798	struct v4l2_ext_control_kfmapp vctrls;
799	int res;
800
801	ALOGD("nativeJFmTx_SetPowerLevel(): Enter and power level = %d\n",powerLevel);
802
803	vec.ctrl_class = V4L2_CTRL_CLASS_FM_TX;
804	vec.count = 1;
805	vctrls.id = V4L2_CID_TUNE_POWER_LEVEL;
806	vctrls.value = 122 - powerLevel;
807	vctrls.size = 0;
808	vec.controls = &vctrls;
809
810	res = ioctl(radio_fd, VIDIOC_S_EXT_CTRLS, &vec);
811	if(res < 0)
812	{
813		ALOGE("Failed to set FM Tx power level\n");
814		return res;
815	}
816
817	ALOGE("Setting FM Tx Power level to ---> %d\n", 122 - vctrls.value);
818
819	return res;
820}
821
822static int nativeJFmTx_GetPowerLevel(JNIEnv *env, jobject obj, jlong jContextValue)
823{
824return 0;
825
826}
827
828static int nativeJFmTx_SetPreEmphasisFilter(JNIEnv *env, jobject obj, jlong jContextValue,jint preEmpFilter)
829{
830return 0;
831}
832
833
834static int nativeJFmTx_GetPreEmphasisFilter(JNIEnv *env, jobject obj, jlong jContextValue)
835{
836return 0;
837
838}
839
840static int nativeJFmTx_SetRdsPsScrollSpeed(JNIEnv *env, jobject obj, jlong jContextValue,jint scrollSpeed)
841{
842return 0;
843
844}
845
846static int nativeJFmTx_GetRdsPsScrollSpeed(JNIEnv *env, jobject obj, jlong jContextValue)
847{
848return 0;
849
850}
851//################################################################################
852
853//                                 SIGNALS
854
855//###############################################################################
856
857    void nativeJFmTx_Callback(long context, int status,
858                        int command, long value)
859    {
860
861        V4L2_JBTL_LOGI("nativeJFmTx_Callback: Entered, ");
862
863        JNIEnv* env = NULL;
864        bool attachedThread = false;
865        int jRet ;
866
867    jRet = g_jVM->GetEnv((void **)&env,JNI_VERSION_1_4);
868
869
870        if(jRet < 0)
871        {
872                 V4L2_JBTL_LOGI("failed to get JNI env,assuming native thread");
873                jRet = g_jVM->AttachCurrentThread((&env), NULL);
874
875                if(jRet != JNI_OK)
876                {
877                         V4L2_JBTL_LOGI("failed to atatch to current thread %d",jRet);
878                        return ;
879                }
880
881                attachedThread = true;
882        }
883
884        if(env == NULL)
885        {
886                 V4L2_JBTL_LOGD("nativeJFmRx_Callback: Entered, env is null");
887        }
888
889
890        switch (command) {
891
892        case FM_TX_CMD_ENABLE:
893            V4L2_JBTL_LOGI("FM_TX_CMD_ENABLE:Status: %d ",status);
894            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdEnable,
895                                      (jlong)context,
896                                      (jint)status,
897                                      (jint)value);
898            break;
899
900        case FM_TX_CMD_DISABLE:
901            V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE:Status: %d ",status);
902            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdDisable,
903                                      (jlong)context,
904                                      (jint)status,
905                                      (jint)value);
906            break;
907/*
908        case FM_TX_CMD_SET_INTERRUPT_MASK:
909            V4L2_JBTL_LOGI("FM_TX_CMD_SET_INTERRUPT_MASK:Status: %d ",status);
910            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetInterruptMask,
911                                      (jlong)context,
912                                      (jint)status,
913                                      (jint)value);
914            break;
915
916        case FM_TX_CMD_GET_INTERRUPT_STATUS:
917            V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE:Status: %d ",status);
918            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetInterruptMask,
919                                     (jlong)context,
920                                     (jint)status,
921                                     (jint)value);
922            break;
923
924            */
925        case FM_TX_CMD_START_TRANSMISSION:
926            V4L2_JBTL_LOGI("FM_TX_CMD_START_TRANSMISSION:Status: %d ",status);
927//            lptUnavailResources = (jclass *)event->p.cmdDone.v.audioOperation.ptUnavailResources;
928            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdStartTransmission,
929                                      (jlong)context,
930                                      (jint)status);
931            break;
932
933        case FM_TX_CMD_STOP_TRANSMISSION:
934            V4L2_JBTL_LOGI("FM_TX_CMD_STOP_TRANSMISSION:Status: %d ",status);
935            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdStopTransmission,
936                                      (jlong)context,
937                                      (jint)status,
938                                      (jint)value);
939            break;
940
941        case FM_TX_CMD_TUNE:
942            V4L2_JBTL_LOGI("FM_TX_CMD_TUNE:Status: %d ",status);
943            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdTune,
944                                      (jlong)context,
945                                      (jint)status,
946                                      (jint)value);
947            break;
948
949        case FM_TX_CMD_GET_TUNED_FREQUENCY:
950            V4L2_JBTL_LOGI("FM_TX_CMD_GET_TUNED_FREQUENCY:Status: %d,Value: %d ",status,value);
951            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetTunedFrequency,
952                                      (jlong)context,
953                                      (jint)status,
954                                      (jint)value);
955            break;
956
957
958        case FM_TX_CMD_SET_MONO_STEREO_MODE:
959            V4L2_JBTL_LOGI("FM_TX_CMD_SET_MONO_STEREO_MODE:Status: %d ",status);
960            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetMonoStereoMode,
961                                      (jlong)context,
962                                      (jint)status,
963                                      (jint)value);
964            break;
965
966        case FM_TX_CMD_GET_MONO_STEREO_MODE:
967            V4L2_JBTL_LOGI("FM_TX_CMD_GET_MONO_STEREO_MODE:Status: %d,Value: %d ",status,value);
968            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetMonoStereoMode,
969                                      (jlong)context,
970                                      (jint)status,
971                                      (jint)value);
972            break;
973
974/*
975        case FM_TX_CMD_SET_POWER_LEVEL:
976            V4L2_JBTL_LOGI("FM_TX_CMD_SET_POWER_LEVEL:Status: %d ",status);
977            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetPowerLevel,
978                                      (jlong)context,
979                                      (jint)status,
980                                      (jint)value);
981            break;
982
983        case FM_TX_CMD_GET_POWER_LEVEL:
984            V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value);
985            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetPowerLevel,
986                                      (jlong)context,
987                                      (jint)status,
988                                      (jint)value);
989            break;
990*/
991        case FM_TX_CMD_SET_MUTE_MODE:
992            V4L2_JBTL_LOGI("FM_TX_CMD_SET_MUTE_MODE:Status: %d ",status);
993            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetMuteMode,
994                                      (jlong)context,
995                                      (jint)status,
996                                      (jint)value);
997            break;
998
999        case FM_TX_CMD_GET_MUTE_MODE:
1000            V4L2_JBTL_LOGI("FM_TX_CMD_SET_MUTE_MODE:Status: %d ",status);
1001            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetMuteMode,
1002                                      (jlong)context,
1003                                      (jint)status,
1004                                      (jint)value);
1005            break;
1006
1007        case FM_TX_CMD_ENABLE_RDS:
1008            V4L2_JBTL_LOGI("FM_TX_CMD_ENABLE_RDS:Status: %d ",status);
1009            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdEnableRds,
1010                                      (jlong)context,
1011                                      (jint)status,
1012                                      (jint)value);
1013            break;
1014
1015        case FM_TX_CMD_DISABLE_RDS:
1016            V4L2_JBTL_LOGI("FM_TX_CMD_DISABLE_RDS:Status: %d ",status);
1017            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdDisableRds,
1018                                      (jlong)context,
1019                                      (jint)status,
1020                                      (jint)value);
1021            break;
1022
1023        case FM_TX_CMD_SET_RDS_TEXT_RT_MSG:
1024            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_RT_MSG:Status: %d ",status);
1025
1026	    env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg,
1027			    (jlong)context,
1028			    (jint)status,
1029			    (jint)value);
1030
1031        break;
1032
1033        case FM_TX_CMD_SET_RDS_TEXT_PS_MSG:
1034	V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_PS_MSG:Status: %d ",status);
1035
1036	env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg,
1037			(jlong)context,
1038			(jint)status,
1039			(jint)value);
1040
1041	break;
1042
1043        case FM_TX_CMD_SET_RDS_PTY_CODE:
1044            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PI_CODE:Status: %d ",status);
1045            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPtyCode,
1046                                      (jlong)context,
1047                                      (jint)status,
1048                                      (jint)value);
1049            break;
1050
1051/*
1052        case FM_TX_CMD_SET_RDS_TRANSMISSION_MODE:
1053            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRANSMISSION_MODE:Status: %d ",status);
1054            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode,
1055                                      (jlong)context,
1056                                      (jint)status,
1057                                      (jint)value);
1058            break;
1059
1060        case FM_TX_CMD_GET_RDS_TRANSMISSION_MODE
1061            V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value);
1062            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode,
1063                                     (jlong)context,
1064                                     (jint)status,
1065                                     (jint)value);
1066            break;
1067*/
1068        case FM_TX_CMD_SET_RDS_AF_CODE:
1069            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_AF_CODE:Status: %d ",status);
1070            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsAfCode,
1071                                      (jlong)context,
1072                                      (jint)status,
1073                                      (jint)value);
1074            break;
1075/*
1076        case FM_TX_CMD_GET_RDS_AF_CODE:
1077            V4L2_JBTL_LOGI("FM_TX_CMD_GET_POWER_LEVEL:Status: %d,Value: %d ",status,value);
1078            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsAfCode,
1079                                      (jlong)context,
1080                                      (jint)status,
1081                                      (jint)value);
1082            break;
1083
1084        case FM_TX_CMD_SET_RDS_PI_CODE:
1085            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PI_CODE:Status: %d ",status);
1086            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPiCode,
1087                                      (jlong)context,
1088                                      (jint)status,
1089                                      (jint)value);
1090            break;
1091
1092        case FM_TX_CMD_GET_RDS_PI_CODE:
1093            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PI_CODE:Status: %d,Value: %d ",status,value);
1094            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPiCode,
1095                                      (jlong)context,
1096                                      (jint)status,
1097                                      (jint)value);
1098            break;
1099
1100        case FM_TX_CMD_GET_RDS_PTY_CODE:
1101            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PTY_CODE:Status: %d,Value: %d ",status,value);
1102            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPtyCode,
1103                                      (jlong)context,
1104                                      (jint)status,
1105                                      (jint)value);
1106            break;
1107
1108        case FM_TX_CMD_SET_RDS_TEXT_REPERTOIRE:
1109            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TEXT_REPERTOIRE:Status: %d ",status);
1110            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire,
1111                                      (jlong)context,
1112                                      (jint)status,
1113                                      (jint)value);
1114            break;
1115
1116        case FM_TX_CMD_GET_RDS_TEXT_REPERTOIRE:
1117            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_REPERTOIRE:Status: %d,Value: %d ",status,value);
1118            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire,
1119                                      (jlong)context,
1120                                      (jint)status,
1121                                      (jint)value);
1122            break;
1123
1124        case FM_TX_CMD_SET_RDS_PS_DISPLAY_MODE:
1125            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PS_DISPLAY_MODE:Status: %d ",status);
1126            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode,
1127                                      (jlong)context,
1128                                      (jint)status,
1129                                      (jint)value);
1130            break;
1131
1132        case FM_TX_CMD_GET_RDS_PS_DISPLAY_MODE:
1133            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PS_DISPLAY_MODE:Status: %d,Value: %d ",status,value);
1134            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode,
1135                                      (jlong)context,
1136                                      (jint)status,
1137                                      (jint)value);
1138            break;
1139
1140        case FM_TX_CMD_SET_RDS_PS_DISPLAY_SPEED:
1141            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_PS_DISPLAY_SPEED:Status: %d ",status);
1142            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed,
1143                                      (jlong)context,
1144                                      (jint)status,
1145                                      (jint)value);
1146            break;
1147
1148        case FM_TX_CMD_GET_RDS_PS_DISPLAY_SPEED:
1149            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_PS_DISPLAY_SPEED:Status: %d,Value: %d ",status,value);
1150            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed,
1151                                      (jlong)context,
1152                                      (jint)status,
1153                                      (jint)value);
1154            break;
1155
1156        case FM_TX_CMD_GET_RDS_TEXT_PS_MSG:
1157            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_PS_MSG:Status: %d ",status);
1158
1159            jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.psMsg.len);
1160
1161            if (jRadioTextMsg == NULL)
1162            {
1163                V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_PS_MSG: Failed converting elements");
1164                goto EXCEPTION;
1165            }
1166
1167            env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.psMsg.len,(jbyte*)event->p.cmdDone.v.psMsg.msg);
1168
1169            if (env->ExceptionOccurred())    {
1170                V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_PS_MSG: env->SetByteArrayRegion failed");
1171                goto EXCEPTION;
1172            }
1173
1174            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg,
1175                                      (jlong)context,
1176                                      (jint)status,
1177                                      (jint)event->p.cmdDone.v.psMsg.len,
1178                                      jRadioTextMsg);
1179            break;
1180
1181        case FM_TX_CMD_GET_RDS_TEXT_RT_MSG:
1182            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TEXT_RT_MSG:Status: %d ",status);
1183
1184            jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rtMsg.len);
1185
1186            if (jRadioTextMsg == NULL)
1187            {
1188                V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_RT_MSG: Failed converting elements");
1189                goto EXCEPTION;
1190            }
1191
1192            env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rtMsg.len,(jbyte*)event->p.cmdDone.v.rtMsg.msg);
1193
1194            if (env->ExceptionOccurred())    {
1195                V4L2_JBTL_LOGE("FM_TX_CMD_GET_RDS_TEXT_RT_MSG: env->SetByteArrayRegion failed");
1196                goto EXCEPTION;
1197            }
1198
1199            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg,
1200                                      (jlong)context,
1201                                      (jint)status,
1202                                      (jint)event->p.cmdDone.v.rtMsg.rtMsgType,
1203                                      (jint)event->p.cmdDone.v.rtMsg.len,
1204                                      jRadioTextMsg);
1205            break;
1206
1207        case FM_TX_CMD_SET_RDS_TRANSMITTED_MASK:
1208            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRANSMITTED_MASK:Status: %d ",status);
1209            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask,
1210                                      (jlong)context,
1211                                      (jint)status,
1212                                      (jint)value);
1213            break;
1214
1215        case FM_TX_CMD_GET_RDS_TRANSMITTED_MASK:
1216            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_TRANSMITTED_MASK:Status: %d ",status);
1217            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask,
1218                                      (jlong)context,
1219                                      (jint)status,
1220                                      (jint)value);
1221            break;
1222
1223        case FM_TX_CMD_SET_RDS_TRAFFIC_CODES:
1224            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_TRAFFIC_CODES:Status: %d ",status);
1225            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes,
1226                                      (jlong)context,
1227                                      (jint)status,
1228                                      (jint)event->p.cmdDone.v.trafficCodes.taCode,
1229                                      (jint)event->p.cmdDone.v.trafficCodes.tpCode);
1230            break;
1231
1232        case FM_TX_CMD_GET_RDS_TRAFFIC_CODES:
1233            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);
1234            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes,
1235                                      (jlong)context,
1236                                      (jint)status,
1237                                      (jint)event->p.cmdDone.v.trafficCodes.taCode,
1238                                      (jint)event->p.cmdDone.v.trafficCodes.tpCode);
1239            break;
1240
1241        case FM_TX_CMD_SET_RDS_MUSIC_SPEECH_FLAG:
1242            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_MUSIC_SPEECH_FLAG:Status: %d ",status);
1243            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag,
1244                                      (jlong)context,
1245                                      (jint)status,
1246                                      (jint)value);
1247            break;
1248
1249        case FM_TX_CMD_GET_RDS_MUSIC_SPEECH_FLAG:
1250            V4L2_JBTL_LOGI("FM_TX_CMD_GET_RDS_MUSIC_SPEECH_FLAG:Status: %d,Value: %d ",status,value);
1251            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag,
1252                                      (jlong)context,
1253                                      (jint)status,
1254                                      (jint)value);
1255            break;
1256
1257        case FM_TX_CMD_SET_PRE_EMPHASIS_FILTER:
1258            V4L2_JBTL_LOGI("FM_TX_CMD_SET_PRE_EMPHASIS_FILTER:Status: %d ",status);
1259            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter,
1260                                      (jlong)context,
1261                                      (jint)status,
1262                                      (jint)value);
1263            break;
1264
1265        case FM_TX_CMD_GET_PRE_EMPHASIS_FILTER:
1266            V4L2_JBTL_LOGI("FM_TX_CMD_GET_PRE_EMPHASIS_FILTER:Status: %d,Value: %d ",status,value);
1267            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter,
1268                                      (jlong)context,
1269                                      (jint)status,
1270                                      (jint)value);
1271            break;
1272
1273        case FM_TX_CMD_SET_RDS_EXTENDED_COUNTRY_CODE:
1274            V4L2_JBTL_LOGI("FM_TX_CMD_SET_RDS_EXTENDED_COUNTRY_CODE:Status: %d ",status);
1275            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode,
1276                                      (jlong)context,
1277                                      (jint)status,
1278                                      (jint)value);
1279            break;
1280
1281        case FM_TX_CMD_GET_RDS_EXTENDED_COUNTRY_CODE:
1282            V4L2_JBTL_LOGI("FM_TX_CMD_GET_PRE_EMPHASIS_FILTER:Status: %d,Value: %d ",status,value);
1283            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode,
1284                                      (jlong)context,
1285                                      (jint)status,
1286                                      (jint)value);
1287            break;
1288
1289        case FM_TX_CMD_WRITE_RDS_RAW_DATA:
1290            V4L2_JBTL_LOGI("FM_TX_CMD_WRITE_RDS_RAW_DATA:Status: %d ",status);
1291            jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rawRds.len);
1292
1293            if (jRadioTextMsg == NULL)
1294            {
1295                V4L2_JBTL_LOGE("FM_TX_CMD_WRITE_RDS_RAW_DATA: Failed converting elements");
1296                goto EXCEPTION;
1297            }
1298
1299            env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rawRds.len,(jbyte*)event->p.cmdDone.v.rawRds.data);
1300
1301            if (env->ExceptionOccurred())    {
1302                V4L2_JBTL_LOGE("FM_TX_CMD_WRITE_RDS_RAW_DATA: env->SetByteArrayRegion failed");
1303                goto EXCEPTION;
1304            }
1305
1306            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdWriteRdsRawData,
1307                                      (jlong)context,
1308                                      (jint)status,
1309                                      (jint)event->p.cmdDone.v.rawRds.len,
1310                                      jRadioTextMsg);
1311            break;
1312
1313        case FM_TX_CMD_READ_RDS_RAW_DATA:
1314            V4L2_JBTL_LOGI("FM_TX_CMD_READ_RDS_RAW_DATA:Status: %d ",status);
1315            jRadioTextMsg = env->NewByteArray(event->p.cmdDone.v.rawRds.len);
1316
1317            if (jRadioTextMsg == NULL)
1318            {
1319                V4L2_JBTL_LOGE("FM_TX_CMD_READ_RDS_RAW_DATA: Failed converting elements");
1320                goto EXCEPTION;
1321            }
1322
1323            env->SetByteArrayRegion(jRadioTextMsg,0,event->p.cmdDone.v.rawRds.len,(jbyte*)event->p.cmdDone.v.rawRds.data);
1324
1325            if (env->ExceptionOccurred())    {
1326                V4L2_JBTL_LOGE("FM_TX_CMD_READ_RDS_RAW_DATA: env->SetByteArrayRegion failed");
1327                goto EXCEPTION;
1328            }
1329
1330            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdReadRdsRawData,
1331                                      (jlong)context,
1332                                      (jint)status,
1333                                      (jint)event->p.cmdDone.v.rawRds.len,
1334                                      jRadioTextMsg);
1335            break;
1336
1337        case FM_TX_CMD_CHANGE_AUDIO_SOURCE:
1338            V4L2_JBTL_LOGI("FM_TX_CMD_CHANGE_AUDIO_SOURCE:Status: %d ",status);
1339            lptUnavailResources = (jclass *)event->p.cmdDone.v.audioOperation.ptUnavailResources;
1340            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdChangeAudioSource,
1341                                      (jlong)context,
1342                                      (jint)status,
1343                                      (jclass)lptUnavailResources);
1344            break;
1345*/
1346        case FM_TX_CMD_CHANGE_DIGITAL_AUDIO_CONFIGURATION:
1347            V4L2_JBTL_LOGI("FM_TX_CMD_CHANGE_AUDIO_SOURCE:Status: %d ",status);
1348            env->CallStaticVoidMethod(_sJClass,_sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration,
1349                                      (jlong)context,
1350                                      (jint)status,
1351                                      (jint)value);
1352            break;
1353
1354        default:
1355            V4L2_JBTL_LOGE("nativeJFmTx_Callback():EVENT cmdType-------------->default");
1356//            V4L2_JBTL_LOGE("unhandled fm cmdType %d", event->p.cmdDone.cmdType);
1357            break;
1358        } //end switch
1359
1360        if (env->ExceptionOccurred())    {
1361            V4L2_JBTL_LOGE("nativeJFmTx_Callback:  ExceptionOccurred");
1362            goto EXCEPTION;
1363        }
1364
1365/*Delete the local references
1366        if (jRadioTextMsg!= NULL)
1367            env->DeleteLocalRef(jRadioTextMsg);
1368*/
1369        V4L2_JBTL_LOGD("nativeJFmTx_Callback: Exiting, Calling DetachCurrentThread at the END");
1370
1371//        g_jVM->DetachCurrentThread();
1372
1373        return;
1374
1375EXCEPTION:
1376        V4L2_JBTL_LOGE("nativeJFmTx_Callback: Exiting due to failure");
1377/*        if (jRadioTextMsg!= NULL)
1378            env->DeleteLocalRef(jRadioTextMsg);
1379*/
1380        if (env->ExceptionOccurred())    {
1381            env->ExceptionDescribe();
1382            env->ExceptionClear();
1383        }
1384
1385        g_jVM->DetachCurrentThread();
1386
1387        return;
1388
1389    }
1390
1391/**********************************************************************
1392*                Callback registration
1393
1394***********************************************************************/
1395#define VERIFY_METHOD_ID(methodId) \
1396        if (!_VerifyMethodId(methodId, #methodId)) { \
1397            V4L2_JBTL_LOGE("Error obtaining method id for %s", #methodId);    \
1398            return;     \
1399        }
1400
1401static bool _VerifyMethodId(jmethodID methodId, const char *name)
1402{
1403    bool result = true;
1404
1405    if (methodId == NULL)
1406    {
1407        V4L2_JBTL_LOGE("_VerifyMethodId: Failed getting method id of %s", name);
1408        result = false;
1409    }
1410
1411    return result;
1412}
1413
1414
1415
1416void nativeJFmTx_ClassInitNative(JNIEnv* env, jclass clazz){
1417    V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Entered");
1418
1419
1420    if (NULL == env)
1421    {
1422        V4L2_JBTL_LOGE("nativeJFmRx_ClassInitNative: NULL == env");
1423    }
1424
1425    env->GetJavaVM(&g_jVM);
1426
1427    /* Save class information in global reference in order to prevent class unloading */
1428    _sJClass = (jclass)env->NewGlobalRef(clazz);
1429
1430    /* Initialize structure of RBTL callbacks */
1431    V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Initializing FMTX callback structure");
1432
1433
1434    V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative: Obtaining method IDs");
1435
1436
1437    _sMethodId_nativeCb_fmTxCmdEnable = env->GetStaticMethodID(clazz,
1438                                        "nativeCb_fmTxCmdEnable",
1439                                        "(JIJ)V");
1440    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdEnable);
1441
1442
1443    _sMethodId_nativeCb_fmTxCmdDisable = env->GetStaticMethodID(clazz,
1444                                         "nativeCb_fmTxCmdDisable",
1445                                         "(JIJ)V");
1446    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDisable);
1447
1448    _sMethodId_nativeCb_fmTxCmdDestroy = env->GetStaticMethodID(clazz,
1449                                         "nativeCb_fmTxCmdDestroy",
1450                                         "(JIJ)V");
1451    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDestroy);
1452
1453
1454    _sMethodId_nativeCb_fmTxCmdTune = env->GetStaticMethodID(clazz,
1455                                      "nativeCb_fmTxCmdTune",
1456                                      "(JIJ)V");
1457    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdTune);
1458
1459
1460    _sMethodId_nativeCb_fmTxCmdGetTunedFrequency= env->GetStaticMethodID(clazz,
1461            "nativeCb_fmTxCmdGetTunedFrequency",
1462            "(JIJ)V");
1463    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetTunedFrequency);
1464
1465
1466
1467    _sMethodId_nativeCb_fmTxCmdStartTransmission = env->GetStaticMethodID(clazz,
1468            "nativeCb_fmTxCmdStartTransmission",
1469            "(JI)V");
1470    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdStartTransmission);
1471
1472
1473    _sMethodId_nativeCb_fmTxCmdStopTransmission = env->GetStaticMethodID(clazz,
1474            "nativeCb_fmTxCmdStopTransmission",
1475            "(JIJ)V");
1476    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdStopTransmission);
1477
1478
1479    _sMethodId_nativeCb_fmTxCmdEnableRds = env->GetStaticMethodID(clazz,
1480                                           "nativeCb_fmTxCmdEnableRds",
1481                                           "(JIJ)V");
1482    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdEnableRds);
1483
1484
1485    _sMethodId_nativeCb_fmTxCmdDisableRds = env->GetStaticMethodID(clazz,
1486                                            "nativeCb_fmTxCmdDisableRds",
1487                                            "(JIJ)V");
1488    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdDisableRds);
1489
1490    _sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg= env->GetStaticMethodID(clazz,
1491            "nativeCb_fmTxCmdSetRdsTextRtMsg",
1492            "(JIII[B)V");
1493    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextRtMsg);
1494
1495
1496/*
1497    _sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode = env->GetStaticMethodID(clazz,
1498            "nativeCb_fmTxCmdSetRdsTransmissionMode",
1499            "(JIJ)V");
1500    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTransmissionMode);
1501    _sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode = env->GetStaticMethodID(clazz,
1502            "nativeCb_fmTxCmdGetRdsTransmissionMode",
1503            "(JIJ)V");
1504    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTransmissionMode);
1505
1506    _sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes= env->GetStaticMethodID(clazz,
1507            "nativeCb_fmTxCmdGetRdsTrafficCodes",
1508            "(JIII)V");
1509    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTrafficCodes);
1510
1511
1512    _sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes= env->GetStaticMethodID(clazz,
1513            "nativeCb_fmTxCmdSetRdsTrafficCodes",
1514            "(JIII)V");
1515    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTrafficCodes);
1516
1517
1518*/
1519    _sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg= env->GetStaticMethodID(clazz,
1520            "nativeCb_fmTxCmdSetRdsTextPsMsg",
1521            "(JII[B)V");
1522    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextPsMsg);
1523
1524/*
1525    _sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg= env->GetStaticMethodID(clazz,
1526            "nativeCb_fmTxCmdGetRdsTextPsMsg",
1527            "(JII[B)V");
1528    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextPsMsg);
1529
1530
1531    _sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg= env->GetStaticMethodID(clazz,
1532            "nativeCb_fmTxCmdGetRdsTextRtMsg",
1533            "(JIII[B)V");
1534    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextRtMsg);
1535
1536
1537    _sMethodId_nativeCb_fmTxCmdWriteRdsRawData= env->GetStaticMethodID(clazz,
1538            "nativeCb_fmTxCmdWriteRdsRawData",
1539            "(JII[B)V");
1540    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdWriteRdsRawData);
1541
1542
1543    _sMethodId_nativeCb_fmTxCmdReadRdsRawData= env->GetStaticMethodID(clazz,
1544            "nativeCb_fmTxCmdReadRdsRawData",
1545            "(JII[B)V");
1546    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdReadRdsRawData);
1547
1548    */
1549
1550    _sMethodId_nativeCb_fmTxCmdSetInterruptMask= env->GetStaticMethodID(clazz,
1551            "nativeCb_fmTxCmdSetInterruptMask",
1552            "(JIJ)V");
1553    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetInterruptMask);
1554
1555    /*
1556    _sMethodId_nativeCb_fmTxCmdGetInterruptMask= env->GetStaticMethodID(clazz,
1557            "nativeCb_fmTxCmdGetInterruptMask",
1558            "(JIJ)V");
1559    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetInterruptMask);
1560    */
1561
1562
1563    _sMethodId_nativeCb_fmTxCmdSetMonoStereoMode= env->GetStaticMethodID(clazz,
1564            "nativeCb_fmTxCmdSetMonoStereoMode",
1565            "(JIJ)V");
1566    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetMonoStereoMode);
1567
1568
1569    _sMethodId_nativeCb_fmTxCmdGetMonoStereoMode= env->GetStaticMethodID(clazz,
1570            "nativeCb_fmTxCmdGetMonoStereoMode",
1571            "(JIJ)V");
1572    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetMonoStereoMode);
1573
1574
1575
1576    _sMethodId_nativeCb_fmTxCmdSetPowerLevel= env->GetStaticMethodID(clazz,
1577            "nativeCb_fmTxCmdSetPowerLevel",
1578            "(JIJ)V");
1579    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetPowerLevel);
1580
1581
1582
1583    _sMethodId_nativeCb_fmTxCmdGetPowerLevel= env->GetStaticMethodID(clazz,
1584            "nativeCb_fmTxCmdGetPowerLevel",
1585            "(JIJ)V");
1586    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetPowerLevel);
1587
1588
1589    _sMethodId_nativeCb_fmTxCmdSetMuteMode= env->GetStaticMethodID(clazz,
1590                                            "nativeCb_fmTxCmdSetMuteMode",
1591                                            "(JIJ)V");
1592    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetMuteMode);
1593
1594
1595    _sMethodId_nativeCb_fmTxCmdGetMuteMode= env->GetStaticMethodID(clazz,
1596                                            "nativeCb_fmTxCmdGetMuteMode",
1597                                            "(JIJ)V");
1598    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetMuteMode);
1599
1600
1601    _sMethodId_nativeCb_fmTxCmdSetRdsAfCode= env->GetStaticMethodID(clazz,
1602            "nativeCb_fmTxCmdSetRdsAfCode",
1603            "(JIJ)V");
1604    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsAfCode);
1605
1606
1607
1608    _sMethodId_nativeCb_fmTxCmdGetRdsAfCode= env->GetStaticMethodID(clazz,
1609            "nativeCb_fmTxCmdGetRdsAfCode",
1610            "(JIJ)V");
1611    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsAfCode);
1612
1613
1614
1615    _sMethodId_nativeCb_fmTxCmdSetRdsPiCode= env->GetStaticMethodID(clazz,
1616            "nativeCb_fmTxCmdSetRdsPiCode",
1617            "(JIJ)V");
1618    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPiCode);
1619
1620
1621    _sMethodId_nativeCb_fmTxCmdGetRdsPiCode= env->GetStaticMethodID(clazz,
1622            "nativeCb_fmTxCmdGetRdsPiCode",
1623            "(JIJ)V");
1624    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPiCode);
1625
1626
1627    _sMethodId_nativeCb_fmTxCmdSetRdsPtyCode= env->GetStaticMethodID(clazz,
1628            "nativeCb_fmTxCmdSetRdsPtyCode",
1629            "(JIJ)V");
1630    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPtyCode);
1631
1632
1633    _sMethodId_nativeCb_fmTxCmdGetRdsPtyCode= env->GetStaticMethodID(clazz,
1634            "nativeCb_fmTxCmdGetRdsPtyCode",
1635            "(JIJ)V");
1636    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPtyCode);
1637
1638
1639
1640    _sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode= env->GetStaticMethodID(clazz,
1641            "nativeCb_fmTxCmdSetRdsPsDispalyMode",
1642            "(JIJ)V");
1643    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPsDispalyMode);
1644
1645
1646
1647    _sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode= env->GetStaticMethodID(clazz,
1648            "nativeCb_fmTxCmdGetRdsPsDispalyMode",
1649            "(JIJ)V");
1650    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPsDispalyMode);
1651
1652
1653
1654    _sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed= env->GetStaticMethodID(clazz,
1655            "nativeCb_fmTxCmdSetRdsPsDisplaySpeed",
1656            "(JIJ)V");
1657    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsPsDisplaySpeed);
1658
1659
1660    _sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed= env->GetStaticMethodID(clazz,
1661            "nativeCb_fmTxCmdGetRdsPsDisplaySpeed",
1662            "(JIJ)V");
1663    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsPsDisplaySpeed);
1664
1665
1666    _sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask= env->GetStaticMethodID(clazz,
1667            "nativeCb_fmTxCmdSetRdsTransmittedMask",
1668            "(JIJ)V");
1669    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTransmittedMask);
1670
1671
1672    _sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask= env->GetStaticMethodID(clazz,
1673            "nativeCb_fmTxCmdGetRdsTransmittedMask",
1674            "(JIJ)V");
1675    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTransmittedMask);
1676
1677
1678    _sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag = env->GetStaticMethodID(clazz,
1679            "nativeCb_fmTxCmdSetRdsMusicSpeechFlag",
1680            "(JIJ)V") ;
1681    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsMusicSpeechFlag);
1682
1683
1684    _sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag = env->GetStaticMethodID(clazz,
1685            "nativeCb_fmTxCmdGetRdsMusicSpeechFlag",
1686            "(JIJ)V") ;
1687    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsMusicSpeechFlag);
1688
1689
1690    _sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter= env->GetStaticMethodID(clazz,
1691            "nativeCb_fmTxCmdSetPreEmphasisFilter",
1692            "(JIJ)V");
1693    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetPreEmphasisFilter);
1694
1695
1696    _sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter= env->GetStaticMethodID(clazz,
1697            "nativeCb_fmTxCmdGetPreEmphasisFilter",
1698            "(JIJ)V");
1699    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetPreEmphasisFilter);
1700
1701
1702
1703    _sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode= env->GetStaticMethodID(clazz,
1704            "nativeCb_fmTxCmdSetRdsExtendedCountryCode",
1705            "(JIJ)V");
1706    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsExtendedCountryCode);
1707
1708
1709    _sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode= env->GetStaticMethodID(clazz,
1710            "nativeCb_fmTxCmdGetRdsExtendedCountryCode",
1711            "(JIJ)V");
1712    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsExtendedCountryCode);
1713
1714
1715    _sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration= env->GetStaticMethodID(clazz,
1716            "nativeCb_fmTxCmdChangeDigitalAudioConfiguration",
1717            "(JIJ)V");
1718    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdChangeDigitalAudioConfiguration);
1719
1720/*
1721    _sMethodId_nativeCb_fmTxCmdChangeAudioSource= env->GetStaticMethodID(clazz,
1722            "nativeCb_fmTxCmdChangeAudioSource",
1723            "(JILcom/ti/jfm/core/JFmCcmVacUnavailResourceList;)V");
1724    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdChangeAudioSource);
1725*/
1726    _sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire= env->GetStaticMethodID(clazz,
1727            "nativeCb_fmTxCmdSetRdsTextRepertoire",
1728            "(JIJ)V");
1729    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdSetRdsTextRepertoire);
1730
1731
1732    _sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire= env->GetStaticMethodID(clazz,
1733            "nativeCb_fmTxCmdGetRdsTextRepertoire",
1734            "(JIJ)V");
1735    VERIFY_METHOD_ID(_sMethodId_nativeCb_fmTxCmdGetRdsTextRepertoire);
1736
1737    V4L2_JBTL_LOGD("nativeJFmTx_ClassInitNative:Exiting");
1738}
1739
1740  JNINativeMethod JFmTxNative_sMethods[] = {
1741    /* name, signature, funcPtr */
1742    {"nativeJFmTx_ClassInitNative", "()V", (void*)nativeJFmTx_ClassInitNative},
1743    {"nativeJFmTx_Create","(Lcom/ti/jfm/core/JFmContext;)I", (void*)nativeJFmTx_Create},
1744    {"nativeJFmTx_Destroy","(J)I", (void*)nativeJFmTx_Destroy},
1745    {"nativeJFmTx_Enable","(J)I", (void*)nativeJFmTx_Enable},
1746    {"nativeJFmTx_Disable","(J)I", (void*)nativeJFmTx_Disable},
1747    {"nativeJFmTx_Tune","(JJ)I", (void*)nativeJFmTx_Tune},
1748    {"nativeJFmTx_StopTransmission","(J)I", (void*)nativeJFmTx_StopTransmission},
1749    {"nativeJFmTx_StartTransmission","(J)I", (void*)nativeJFmTx_StartTransmission},
1750    {"nativeJFmTx_EnableRds","(J)I", (void*)nativeJFmTx_EnableRds},
1751    {"nativeJFmTx_DisableRds","(J)I", (void*)nativeJFmTx_DisableRds},
1752    {"nativeJFmTx_SetRdsTransmissionMode","(JI)I", (void*)nativeJFmTx_SetRdsTransmissionMode},
1753    {"nativeJFmTx_SetRdsTextPsMsg","(JLjava/lang/String;I)I", (void*)nativeJFmTx_SetRdsTextPsMsg},
1754/*
1755    {"nativeJFmTx_GetRdsTextPsMsg","(J)I", (void*)nativeJFmTx_GetRdsTextPsMsg},
1756    {"nativeJFmTx_WriteRdsRawData","(JLjava/lang/String;I)I", (void*)nativeJFmTx_WriteRdsRawData},
1757*/
1758    {"nativeJFmTx_SetMuteMode","(JI)I", (void*)nativeJFmTx_SetMuteMode},
1759    {"nativeJFmTx_GetMuteMode","(J)I", (void*)nativeJFmTx_GetMuteMode},
1760    {"nativeJFmTx_SetRdsTextRtMsg","(JILjava/lang/String;I)I", (void*)nativeJFmTx_SetRdsTextRtMsg},
1761    {"nativeJFmTx_SetRdsTransmittedGroupsMask","(JJ)I", (void*)nativeJFmTx_SetRdsTransmittedGroupsMask},
1762/*
1763    {"nativeJFmTx_SetRdsPsDisplayMode","(JI)I", (void*)nativeJFmTx_SetRdsPsDisplayMode},
1764    {"nativeJFmTx_GetRdsPsDisplayMode","(J)I", (void*)nativeJFmTx_GetRdsPsDisplayMode},
1765    {"nativeJFmTx_GetRdsTextRtMsg","(J)I", (void*)nativeJFmTx_GetRdsTextRtMsg},
1766    {"nativeJFmTx_GetRdsTransmittedGroupsMask","(J)I", (void*)nativeJFmTx_GetRdsTransmittedGroupsMask},
1767    {"nativeJFmTx_SetRdsTrafficCodes","(JII)I", (void*)nativeJFmTx_SetRdsTrafficCodes},
1768    {"nativeJFmTx_GetRdsTrafficCodes","(J)I", (void*)nativeJFmTx_GetRdsTrafficCodes},
1769    {"nativeJFmTx_SetRdsMusicSpeechFlag","(JI)I", (void*)nativeJFmTx_SetRdsMusicSpeechFlag},
1770    {"nativeJFmTx_GetRdsMusicSpeechFlag","(J)I", (void*)nativeJFmTx_GetRdsMusicSpeechFlag},
1771    {"nativeJFmTx_SetRdsExtendedCountryCode","(JI)I", (void*)nativeJFmTx_SetRdsExtendedCountryCode},
1772    {"nativeJFmTx_GetRdsExtendedCountryCode","(J)I", (void*)nativeJFmTx_GetRdsExtendedCountryCode},
1773    {"nativeJFmTx_ReadRdsRawData","(J)I", (void*)nativeJFmTx_ReadRdsRawData},
1774    {"nativeJFmTx_ChangeAudioSource","(JII)I", (void*)nativeJFmTx_ChangeAudioSource},
1775*/
1776    {"nativeJFmTx_ChangeDigitalSourceConfiguration","(JI)I", (void*)nativeJFmTx_ChangeDigitalSourceConfiguration},
1777    {"nativeJFmTx_SetRdsTextRepertoire","(JI)I", (void*)nativeJFmTx_SetRdsTextRepertoire},
1778    {"nativeJFmTx_GetRdsTextRepertoire","(J)I", (void*)nativeJFmTx_GetRdsTextRepertoire},
1779    {"nativeJFmTx_SetRdsPtyCode","(JI)I", (void*)nativeJFmTx_SetRdsPtyCode},
1780    {"nativeJFmTx_GetRdsPtyCode","(J)I", (void*)nativeJFmTx_GetRdsPtyCode},
1781    {"nativeJFmTx_SetRdsPiCode","(JI)I", (void*)nativeJFmTx_SetRdsPiCode},
1782    {"nativeJFmTx_GetRdsPiCode","(J)I", (void*)nativeJFmTx_GetRdsPiCode},
1783    {"nativeJFmTx_SetRdsAfCode","(JI)I", (void*)nativeJFmTx_SetRdsAfCode},
1784    {"nativeJFmTx_GetRdsAfCode","(J)I", (void*)nativeJFmTx_GetRdsAfCode},
1785    {"nativeJFmTx_SetMonoStereoMode","(JI)I", (void*)nativeJFmTx_SetMonoStereoMode},
1786    {"nativeJFmTx_GetMonoStereoMode","(J)I", (void*)nativeJFmTx_GetMonoStereoMode},
1787    {"nativeJFmTx_SetPowerLevel","(JI)I", (void*)nativeJFmTx_SetPowerLevel},
1788    {"nativeJFmTx_GetPowerLevel","(J)I", (void*)nativeJFmTx_GetPowerLevel},
1789    {"nativeJFmTx_SetPreEmphasisFilter","(JI)I", (void*)nativeJFmTx_SetPreEmphasisFilter},
1790    {"nativeJFmTx_GetPreEmphasisFilter","(J)I", (void*)nativeJFmTx_GetPreEmphasisFilter},
1791    {"nativeJFmTx_SetRdsPsScrollSpeed","(JI)I", (void*)nativeJFmTx_SetRdsPsScrollSpeed},
1792    {"nativeJFmTx_GetRdsPsScrollSpeed","(J)I", (void*)nativeJFmTx_GetRdsPsScrollSpeed}
1793
1794};
1795
1796/*
1797 * Register several native methods for one class.
1798 */
1799
1800int getTxNativeSize()
1801{
1802    return NELEM(JFmTxNative_sMethods);
1803}
1804
1805