Jump to content

ZTE Blade FM Radio chipset + CM7


Guest t0mm13b

Recommended Posts

Guest Simon O
I have worked on the code a little now, I had issues with the band and the step, also the Java app sends frequencies like 87500 and we need to send 8750 to the device, all this done, now it works! with the nice GUI of CM FM Radio app!

I cannot distribute an APK though since the changes are in a system C library, I'll submit the changes to the CM maintainers.

Big issue though, it keeps going off unless you change the volume, any idea about that?

I think andorko had a similar issue when he was making his own FM Radio app which kallt_kaffe fixed with a small kernel patch. The CM7 kernel will need this adding:

http://android.modaco.com/content-page/327...0/#entry1567478

Link to comment
Share on other sites

Guest _amano

Stephane! Thanks for stepping up ;)

Please contact Androko because he is pretty sure that the Blade actually provides the si4709 chip and not the si4708 chip (thus he got RDS working on Froyo ROMS, a feature that is not present for the si4708). ZTE just shipped a driver for the si4708 chip in their stock kernel and therefore it SEEMED to be a 4708 chip when it was actually a 4709 hardware-wise).

I might be wrong though but that was my impression from this story. Andorko had to adapt the ZTE kernel to use the modified 4709 driver. Thus some things should have to be added on the kernel side. See Flibblesan's comment.

Edited by _amano
Link to comment
Share on other sites

Guest Stephane K.

I am not entirely sure what chip we have but I know that the Si4709 code does not work.

In CM we have kernel 2.6.32 for the blade for a reason I don't know. We don't have the Si470* driver from stock linux, we have a weird driver that presents a device file outside v4l, it shows as /dev/si4708 . I have no idea why we have that kernel version and not the latest one in CM (2.6.37 or 38). I am not building the kernel and I am not sure where to get it from.

The C header provided at the top of this thread does not have any RDS related call anyway. I coded around that header which seems to have the right IOCTLs for the driver that is in CM's blade kernel. It works so, that's the right combination of driver + user space calls, now if we use a newer kernel with the proper linux driver, this user space code will stop working as the IOCTLs are different.

The following goes in frameworks/base/core/jni/android_hardware_fm_si4708.cpp and you need to modify the makefiles too.

(I have to paste here, the forum does not let me upload)

/*

* Copyright © 2009, Code Aurora Forum. All rights reserved.

* Copyright © 2011, The CyanogenMod Project

*

* Redistribution and use in source and binary forms, with or without

* modification, are permitted provided that the following conditions are met:

* * Redistributions of source code must retain the above copyright

* notice, this list of conditions and the following disclaimer.

* * Redistributions in binary form must reproduce the above copyright

* notice, this list of conditions and the following disclaimer in the

* documentation and/or other materials provided with the distribution.

* * Neither the name of Code Aurora nor

* the names of its contributors may be used to endorse or promote

* products derived from this software without specific prior written

* permission.

*

* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,

* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;

* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,

* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR

* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF

* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/

#define LOG_NDEBUG 0

#define LOG_TAG "fmradio_si4708"

#include "jni.h"

#include "nativehelper/JNIHelp.h"

#include "utils/Log.h"

#include <sys/ioctl.h>

#include <fcntl.h>

#include "android_runtime/AndroidRuntime.h"

#define FM_JNI_SUCCESS 0L

#define FM_JNI_FAILURE -1L

/* Magic values from the framework

* they have to match the values in FMTransiver.java

* */

#define JAVA_FM_CHSPACE_200_KHZ 0

#define JAVA_FM_CHSPACE_100_KHZ 1

#define JAVA_FM_CHSPACE_50_KHZ 2

#define FM_RDS_STD_NONE 2

#define FM_DE_EMP75 0

#define FM_DE_EMP50 1

#define V4L2_CID_PRIVATE_BASE 0x8000000

#define V4L2_CID_PRIVATE_TAVARUA_REGION V4L2_CID_PRIVATE_BASE + 7

#define V4L2_CID_PRIVATE_TAVARUA_EMPHASIS V4L2_CID_PRIVATE_BASE + 12

#define V4L2_CID_PRIVATE_TAVARUA_RDS_STD V4L2_CID_PRIVATE_BASE + 13

#define V4L2_CID_PRIVATE_TAVARUA_SPACING V4L2_CID_PRIVATE_BASE + 14

struct rssi_snr_t

{

uint8_t curr_rssi;

uint8_t curr_rssi_th;

uint8_t curr_snr;

};

/*dev settings*/

/*band*/

#define BAND_87500_108000_kHz 0

#define BAND_76000_108000_kHz 2

#define BAND_76000_90000_kHz 1

/*channel spacing*/

#define CHAN_SPACING_200_kHz 0 /*US*/

#define CHAN_SPACING_100_kHz 1 /*Europe,Japan*/

#define CHAN_SPACING_50_kHz 2

/*DE-emphasis Time Constant*/

#define DE_TIME_CONSTANT_50 1 /*Europe,Japan,Australia*/

#define DE_TIME_CONSTANT_75 0 /*US*/

/*****************IOCTLS******************/

/*magic no*/

#define Si4708_IOC_MAGIC 'k'

/*commands*/

#define Si4708_IOC_POWERUP _IO(Si4708_IOC_MAGIC, 1)

#define Si4708_IOC_POWERDOWN _IO(Si4708_IOC_MAGIC, 2)

#define Si4708_IOC_BAND_SET _IOW(Si4708_IOC_MAGIC, 12, int)

#define Si4708_IOC_CHAN_SPACING_SET _IOW(Si4708_IOC_MAGIC, 14, int)

#define Si4708_IOC_CHAN_SELECT _IOW(Si4708_IOC_MAGIC, 4, int)

#define Si4708_IOC_CHAN_GET _IOR(Si4708_IOC_MAGIC, 17, int)

#define Si4708_IOC_CUR_RSSI_GET _IOR(Si4708_IOC_MAGIC, 12, rssi_snr_t)

#define Si4708_IOC_VOLUME_SET _IOW(Si4708_IOC_MAGIC, 8, int)

#define Si4708_IOC_RDS_ENABLE _IO(Si4708_IOC_MAGIC, 23)

#define Si4708_IOC_RDS_DISABLE _IO(Si4708_IOC_MAGIC, 24)

#define Si4708_IOC_DE_SET _IOW(Si4708_IOC_MAGIC,32,uint8_t) /*Setting DE-emphasis Time Constant. For DE=0,TC=50us(Europe,Japan,Australia) and DE=1,TC=75us(USA)*/

//Extra

#define Si4708_IOC_SET_AUDIOTRACK _IOW(Si4708_IOC_MAGIC, 16, int)

/*****************************************/

int setFreq(int freq, int fd);

int radioOn(int fd);

int radioOff(int fd);

bool radioEnabled = false;

static int lastFreq = 0;

static int lastVolume = 15;

int radioOn(int fd)

{

LOGV("%s", __func__);

LOGE("%s: enabling radio", __func__);

// if (radioEnabled) {

// return FM_JNI_SUCCESS;

// }

int ret;

ret = ioctl(fd, Si4708_IOC_POWERUP);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_POWERUP failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

radioEnabled = true;

if (lastFreq != 0) {

setFreq(lastFreq, fd);

}

lastVolume = 10;

ioctl(fd, Si4708_IOC_VOLUME_SET, &lastVolume);

return FM_JNI_SUCCESS;

}

int radioOff(int fd)

{

LOGV("%s", __func__);

LOGE("%s: disabling radio", __func__);

//if (!radioEnabled) {

// return FM_JNI_SUCCESS;

//}

int ret;

ret = ioctl(fd, Si4708_IOC_POWERDOWN);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_POWERDOWN failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

radioEnabled = false;

return FM_JNI_SUCCESS;

}

int setFreq(int freq, int fd)

{

LOGV("%s", __func__);

LOGE("%s: setting freq: %d", __func__, freq);

int ret;

int f2 = freq / 10;

LOGE("%s: setting freq: %d", __func__, f2);

ret = ioctl(fd, Si4708_IOC_CHAN_SELECT, &f2);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_CHAN_SELECT failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

lastFreq = freq;

return FM_JNI_SUCCESS;

}

int setFreqSpacing(int spacing, int fd)

{

int nativeSpacing, ret;

switch(spacing) {

case JAVA_FM_CHSPACE_200_KHZ:

nativeSpacing = CHAN_SPACING_200_kHz;

break;

case JAVA_FM_CHSPACE_100_KHZ:

nativeSpacing = CHAN_SPACING_100_kHz;

break;

case JAVA_FM_CHSPACE_50_KHZ:

nativeSpacing = CHAN_SPACING_50_kHz;

break;

default:

LOGE("%s : ERROR invalid Freqency spacing %d", __func__, spacing);

return FM_JNI_FAILURE;

}

LOGV("%s: spacing is %d", __func__, nativeSpacing);

LOGE("%s: set spacing", __func__);

ret = ioctl(fd, Si4708_IOC_CHAN_SPACING_SET, &nativeSpacing);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_CHAN_SPACING_SET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return FM_JNI_SUCCESS;

}

int setMute(int mute, int fd)

{

LOGV("%s", __func__);

LOGE("%s: setting mute %d", __func__, mute);

int ret;

int zero = 0;

int notMute= 15;

if(mute)

ret = ioctl(fd, Si4708_IOC_VOLUME_SET, &zero);

else

ret = ioctl(fd, Si4708_IOC_VOLUME_SET, &notMute);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_MUTE failed failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return FM_JNI_SUCCESS;

}

int setRDSMode(int rdsMode, int fd)

{

return FM_JNI_SUCCESS;

/*

int nativeMode;

int ret;

if (rdsMode == FM_RDS_STD_NONE)

ret = ioctl(fd, Si4708_IOC_RDS_DISABLE);

else

ret = ioctl(fd, Si4708_IOC_RDS_ENABLE);

LOGV("%s: rdsMode is %d", __func__, rdsMode);

if (ret < 0)

{

LOGE("%s: IOCTL Si4708_IOC_RDS failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return FM_JNI_SUCCESS;

*/

}

int setEmphais(int emphais, int fd)

{

return FM_JNI_SUCCESS;

/*

int nativeEmphais, ret;

switch(emphais) {

case FM_DE_EMP75:

nativeEmphais = DE_TIME_CONSTANT_75;

break;

case FM_DE_EMP50:

nativeEmphais = DE_TIME_CONSTANT_50;

break;

default:

LOGE("%s : ERROR invalid Freqency spacing %d", __func__, emphais);

return FM_JNI_FAILURE;

}

LOGV("%s: spacing is %d", __func__, nativeEmphais);

ret = ioctl(fd, Si4708_IOC_DE_SET, &nativeEmphais);

if (ret < 0)

{

LOGE("%s: IOCTL Si4708_IOC_DE_SET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return FM_JNI_SUCCESS;

*/

}

using namespace android;

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_setControlNative

(JNIEnv * env, jobject thiz, jint fd, jint id, jint value)

{

LOGV("%s : fd = %d id = %d value = %d", __func__, fd, id, value);

switch(id) {

case V4L2_CID_PRIVATE_TAVARUA_SPACING:

return setFreqSpacing(value, fd);

break;

case V4L2_CID_PRIVATE_TAVARUA_RDS_STD:

return setRDSMode(value, fd);

break;

case V4L2_CID_PRIVATE_TAVARUA_EMPHASIS:

return setEmphais(value, fd);

break;

default:

switch (value) {

case 1:

return radioOn(fd);

break;

case 2:

return radioOff(fd);

break;

case 3:

return setMute(1, fd);

break;

case 4:

return setMute(0, fd);

break;

}

return FM_JNI_SUCCESS;

}

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getFreqNative

(JNIEnv * env, jobject thiz, jint fd)

{

LOGV("%s", __func__);

LOGE("%s: getting channel", __func__);

int ret;

uint32_t freq;

int freq2;

ret = ioctl(fd, Si4708_IOC_CHAN_GET, &freq2);

LOGE("%s: IOCTL Si4708_IOC_CHAN_GET: %d", __func__, freq2);

freq = freq2;

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_CHAN_GET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return freq;

}

/*native interface */

static jint android_hardware_fmradio_FmReceiverJNI_setFreqNative

(JNIEnv * env, jobject thiz, jint fd, jint freq)

{

return setFreq(freq, fd);

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_acquireFdNative

(JNIEnv *env, jobject thiz, jstring path)

{

jboolean iscopy;

const char *nativeString = env->GetStringUTFChars(path, &iscopy);

LOGD("%s : opening %s", __func__, nativeString);

return open("/dev/si4708", O_RDWR);

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_closeFdNative

(JNIEnv * env, jobject thiz, jint fd)

{

return close(fd);

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getControlNative

(JNIEnv * env, jobject thiz, jint fd, jint id)

{

return FM_JNI_SUCCESS;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_startSearchNative

(JNIEnv * env, jobject thiz, jint fd, jint dir)

{

LOGD("startSearchNative() %d", dir);

return FM_JNI_SUCCESS;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_cancelSearchNative

(JNIEnv * env, jobject thiz, jint fd)

{

LOGD("cancelSearchNative()");

return FM_JNI_SUCCESS;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getRSSINative

(JNIEnv * env, jobject thiz, jint fd)

{

return FM_JNI_FAILURE;

/*

//FIXME

struct rssi_snr_t rssi;

int ret;

LOGV("%s", __func__);

ret = ioctl(fd, Si4708_IOC_CUR_RSSI_GET, &rssi);

if (ret < 0)

{

LOGE("%s: IOCTL Si4708_IOC_CUR_RSSI_GET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

LOGD("getRSSINative(), %d", rssi.curr_rssi);

return rssi.curr_rssi;

*/

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_setBandNative

(JNIEnv * env, jobject thiz, jint fd, jint low, jint high)

{

LOGV("%s", __func__);

int ret;

int spacing, de, band;

if (low == 76000 && high == 90000)

band = BAND_76000_90000_kHz;

else if (low == 87500 && high == 107900)

band = BAND_87500_108000_kHz;

else

band = BAND_76000_108000_kHz;

LOGV("%s: band is %d", __func__, band);

LOGE("%s: Setting band %d", __func__, band);

ret = ioctl(fd, Si4708_IOC_BAND_SET, &band);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_BAND_SET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

return FM_JNI_SUCCESS;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getLowerBandNative

(JNIEnv * env, jobject thiz, jint fd)

{

LOGD("getLowerBandNative()");

return FM_JNI_SUCCESS;

}

static jint android_hardware_fmradio_FmReceiverJNI_setMonoStereoNative

(JNIEnv * env, jobject thiz, jint fd, jint val)

{

LOGV("%s", __func__);

LOGE("%s: setting audio track failed %d", __func__, val);

int ret;

if (val == 1) {

int stereo = 0;

ret = ioctl(fd, Si4708_IOC_SET_AUDIOTRACK, &stereo);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_STEREO_SET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

} else {

int mono = 1;

ret = ioctl(fd, Si4708_IOC_SET_AUDIOTRACK, &mono);

if (ret != 0)

{

LOGE("%s: IOCTL Si4708_IOC_MONO_SET failed %d", __func__, ret);

return FM_JNI_FAILURE;

}

}

return FM_JNI_SUCCESS;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getBufferNative

(JNIEnv * env, jobject thiz, jint fd, jbooleanArray buff, jint index)

{

LOGD("getBufferNative() %d", index);

return index;

}

/* native interface */

static jint android_hardware_fmradio_FmReceiverJNI_getRawRdsNative

(JNIEnv * env, jobject thiz, jint fd, jbooleanArray buff, jint count)

{

LOGD("getRawRdsNative() %d", count);

return FM_JNI_SUCCESS;

}

/*

* JNI registration.

*/

static JNINativeMethod gMethods[] = {

/* name, signature, funcPtr */

{ "acquireFdNative", "(Ljava/lang/String;)I",

(void*)android_hardware_fmradio_FmReceiverJNI_acquireFdNative},

{ "closeFdNative", "(I)I",

(void*)android_hardware_fmradio_FmReceiverJNI_closeFdNative},

{ "getFreqNative", "(I)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getFreqNative},

{ "setFreqNative", "(II)I",

(void*)android_hardware_fmradio_FmReceiverJNI_setFreqNative},

{ "getControlNative", "(II)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getControlNative},

{ "setControlNative", "(III)I",

(void*)android_hardware_fmradio_FmReceiverJNI_setControlNative},

{ "startSearchNative", "(II)I",

(void*)android_hardware_fmradio_FmReceiverJNI_startSearchNative},

{ "cancelSearchNative", "(I)I",

(void*)android_hardware_fmradio_FmReceiverJNI_cancelSearchNative},

{ "getRSSINative", "(I)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getRSSINative},

{ "setBandNative", "(III)I",

(void*)android_hardware_fmradio_FmReceiverJNI_setBandNative},

{ "getLowerBandNative", "(I)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getLowerBandNative},

{ "getBufferNative", "(I[bI)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getBufferNative},

{ "setMonoStereoNative", "(II)I",

(void*)android_hardware_fmradio_FmReceiverJNI_setMonoStereoNative},

{ "getRawRdsNative", "(I[bI)I",

(void*)android_hardware_fmradio_FmReceiverJNI_getRawRdsNative},

};

int register_android_hardware_fm_fmradio(JNIEnv* env)

{

return jniRegisterNativeMethods(env, "android/hardware/fmradio/FmReceiverJNI", gMethods, NELEM(gMethods));

}

Link to comment
Share on other sites

Guest Grain
In CM we have kernel 2.6.32 for the blade for a reason I don't know.

The kernel used in CM is basically the kernel ZTE released for the Froyo firmware. It includes lots of ZTE specific changes. The git for the CM Blade kernel is here. Tom_G creates images every now and then and submits the image for inclusion in the normal Cyanogen Blade device tree.

Discussing further steps is probably easiest on IRC, see the PM I sent you.

Link to comment
Share on other sites

Guest t0mm13b
The kernel used in CM is basically the kernel ZTE released for the Froyo firmware. It includes lots of ZTE specific changes. The git for the CM Blade kernel is here. Tom_G creates images every now and then and submits the image for inclusion in the normal Cyanogen Blade device tree.

Discussing further steps is probably easiest on IRC, see the PM I sent you.

That's great to hear - a load of help - kudos to Stephane, a lil tip - use pastebin and refer to the linky on that site.... job will be much easier to copy/paste!

The weird thing is this:

Silicon Labs have the sources to Si4708 - for some obscure reason, Andorko managed to get RDS going on this chipset driver (don't ask my why) - the bizarre thing is - there's a Si4709 which does have RDS built into the driver - why hack it up on Si4708 - that's the part I do not understand...

So is the blade using a Si4708 or is it really a Si4709 but then again... ZTE made a lovely mess of the code in the .32 kernel but I digress...

It'll be great to see this going on the CM7... ;)

Link to comment
Share on other sites

Guest Stephane K.

OK then, I thought we were using the ZTE kernel. So, my code works with the included driver. Anyone tested?

It would be interesting to see if we can move to a newer kernel, it may be a massive task depending on how many changes ZTE put in.

Link to comment
Share on other sites

Guest Stephane K.

Tom G is working on it now, and he got the sound to stay on, it is all very promising.

On the other hand I am looking at using the Linux included driver instead of the ZTE one, with no luck thus far, but I am not giving up.

If the code is soon accepted, it will be in the nightly then.

Link to comment
Share on other sites

Guest burstlam
Tom G is working on it now, and he got the sound to stay on, it is all very promising.

On the other hand I am looking at using the Linux included driver instead of the ZTE one, with no luck thus far, but I am not giving up.

If the code is soon accepted, it will be in the nightly then.

manually build the rom. FM function is fine except that the fm app cause screen lockup and volume control not working

Link to comment
Share on other sites

It turned out that andorko's RDS FM Radio was a huge battery drainer in all Froyo ROMs. Whilst the stock non RDS FM radio was fine battery wise.

Link to comment
Share on other sites

Guest burstlam
It turned out that andorko's RDS FM Radio was a huge battery drainer in all Froyo ROMs. Whilst the stock non RDS FM radio was fine battery wise.

yes it drains even in sleep mode.

I prefer using non rds base version.... if we could have one like the stock version.

Edited by burstlam
Link to comment
Share on other sites

Guest burstlam
Hi,

It's all submitted for review now, sound works fine, and I added volume control tonight, there are quite a few patches. libaudio, FM app, jni...

Check gerrit for the patches.

http://review.cyanogenmod.com

It seems to work fine for me. See what you get.

volume control works fine. now only with the touchscreen non responsive issue with the fm audio app

Edited by burstlam
Link to comment
Share on other sites

Guest _amano

burstlam, did you compile a new build?

Burstlam added a link to his current test build in the nightly thread.

Edited by _amano
Link to comment
Share on other sites

Guest xmaxxmax
burstlam, did you compile a new build?

Burstlam added a link to his current test build in the nightly thread.

Hi, the fm app in that build don't accept every frequency.

For example i can't select 96.6 but it jump from 96.5 to 96.7.

Can somebody check this?

****************************

Sorry ;). It Works.

I've selected the corrected country in settings menu. Thanks.

Edited by xmaxxmax
Link to comment
Share on other sites

Guest wishmasterf

Whats the current state of FM-Radio for CM7? i read the CM7 thread and that thread but could not find out if there will be anything

in official CM7. Do the guys of cm7 for blade accept the code? Are there still problems?

Link to comment
Share on other sites

Guest hedgepigdaniel
Whats the current state of FM-Radio for CM7? i read the CM7 thread and that thread but could not find out if there will be anything

in official CM7. Do the guys of cm7 for blade accept the code? Are there still problems?

the patches are on gerrit, being worked on/approved

Link to comment
Share on other sites

Guest Tarot

Compiling the Build with patch from review.cyanogenmod.com. Does anyone still there is a background noise in FM? Does anyone lost sound radio when you install PowerAMP?

Link to comment
Share on other sites

Guest kallt_kaffe

I just want to say thanks to those involved in this. I'm currently compiling CM7 for the ZTE V9/Light/Optus MyTab with the new FM radio changes. I suspect that it will work although it's still compiling.

Link to comment
Share on other sites

Guest whatcolour
I just want to say thanks to those involved in this. I'm currently compiling CM7 for the ZTE V9/Light/Optus MyTab with the new FM radio changes. I suspect that it will work although it's still compiling.

@KK, planning to do sth about the new GB blade leak? :-)

Link to comment
Share on other sites

Guest kallt_kaffe
@KK, planning to do sth about the new GB blade leak? :-)

Well, I just heard about it... Dunno yet... The time I can spare for these kind if things right now I put on the ZTE Light...

Link to comment
Share on other sites

  • 3 weeks later...
Guest Holehouse

I was glad that FM was working in CM7 so I've flashed nightly 126. However, if I change the region to Europe or UK (or anything not North America) the scan for stations doesn't work properly. if I use the scan for higher frequencies button it just goes to 87.5 (even if I was on a higher frequency) and stays there whenever I press the scan frequencies buttons. It only works if I move manually to the top frequency and scan downwards. If the region is set to North America the scan works fine but misses stations on the .even frequencies.

Any ideas as to why this is and does this affect anyone else?

Link to comment
Share on other sites

Guest sm4tik
I was glad that FM was working in CM7 so I've flashed nightly 126. However, if I change the region to Europe or UK (or anything not North America) the scan for stations doesn't work properly. if I use the scan for higher frequencies button it just goes to 87.5 (even if I was on a higher frequency) and stays there whenever I press the scan frequencies buttons. It only works if I move manually to the top frequency and scan downwards. If the region is set to North America the scan works fine but misses stations on the .even frequencies.

Any ideas as to why this is and does this affect anyone else?

As Holehouse confirmed this in the CM7 thread, I'll double confirm this here as these things tend to get buried quite quickly there.

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.