summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/drivers/tuner/si4700.c2
-rw-r--r--uisimulator/common/fmradio.c56
2 files changed, 45 insertions, 13 deletions
diff --git a/firmware/drivers/tuner/si4700.c b/firmware/drivers/tuner/si4700.c
index c7d942f293..af5795a83f 100644
--- a/firmware/drivers/tuner/si4700.c
+++ b/firmware/drivers/tuner/si4700.c
@@ -28,7 +28,9 @@
#include "tuner.h" /* tuner abstraction interface */
#include "fmradio.h"
#include "fmradio_i2c.h" /* physical interface driver */
+#ifdef HAVE_RDS_CAP
#include "rds.h"
+#endif
#if defined(SANSA_CLIP) || defined(SANSA_E200V2) || defined(SANSA_FUZE) || defined(SANSA_C200V2) \
|| defined(SANSA_FUZEPLUS)
diff --git a/uisimulator/common/fmradio.c b/uisimulator/common/fmradio.c
index 6f6b0f914f..a18db819f2 100644
--- a/uisimulator/common/fmradio.c
+++ b/uisimulator/common/fmradio.c
@@ -23,6 +23,11 @@
#include "config.h"
#include "debug.h"
#include "tuner.h"
+#ifdef HAVE_RDS_CAP
+#include <strlcpy.h>
+#include "system.h"
+#include "rds.h"
+#endif
#if CONFIG_TUNER
@@ -124,21 +129,46 @@ bool tuner_power(bool status)
}
#ifdef HAVE_RDS_CAP
-char* tuner_get_rds_info(int setting)
+size_t tuner_get_rds_info(int setting, void *dst, size_t dstsize)
{
- char *text = NULL;
-
- switch(setting)
+ /* TODO: integrate this into tuner_get/set */
+ static const unsigned char info_id_tbl[] =
{
- case RADIO_RDS_NAME:
- text = "Rockbox Radio";
- break;
+ [RADIO_RDS_NAME] = RDS_INFO_PS,
+ [RADIO_RDS_TEXT] = RDS_INFO_RT,
+ [RADIO_RDS_PROGRAM_INFO] = RDS_INFO_PI,
+ [RADIO_RDS_CURRENT_TIME] = RDS_INFO_CT,
+ };
- case RADIO_RDS_TEXT:
- text = "http://www.rockbox.org" ;
- break;
+ if ((unsigned int)setting >= ARRAYLEN(info_id_tbl))
+ return 0;
+
+ switch (info_id_tbl[setting])
+ {
+ case RDS_INFO_PI:
+ if (dstsize >= sizeof (uint16_t)) {
+ *(uint16_t *)dst = 0;
+ }
+ dstsize = sizeof (uint16_t);
+ break;
+ case RDS_INFO_PS:
+ dstsize = strlcpy(dst, "Rockbox Radio", dstsize);
+ break;
+ case RDS_INFO_RT:
+ dstsize = strlcpy(dst, "http://www.rockbox.org", dstsize);
+ break;
+ case RDS_INFO_CT:
+ if (dstsize >= sizeof (time_t)) {
+ *(time_t *)dst = 0;
+ }
+ dstsize = sizeof (time_t);
+ break;
+
+ default:
+ dstsize = 0;
}
- return text;
+
+ return dstsize;
}
-#endif
-#endif
+#endif /* HAVE_RDS_CAP */
+#endif /* CONFIG_TUNER */