FS#11263 - Radio Art support! %C and %Cl tags work in the radio screen and Base Skin when the radio is running.

put your station images in .rockbox/fmpresets/<preset name>.bmp or .jpg. Must be in preset mode and the preset name must match the filename


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26078 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jonathan Gordon 2010-05-16 11:13:42 +00:00
parent c785722fec
commit 7d5e0d7375
10 changed files with 181 additions and 7 deletions

View file

@ -31,7 +31,8 @@
/** Playback events **/
enum {
PLAYBACK_EVENT_TRACK_BUFFER = (EVENT_CLASS_PLAYBACK|1),
PLAYBACK_EVENT_START_PLAYBACK = (EVENT_CLASS_PLAYBACK|1),
PLAYBACK_EVENT_TRACK_BUFFER,
PLAYBACK_EVENT_TRACK_FINISH,
PLAYBACK_EVENT_TRACK_CHANGE,
PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE,
@ -53,6 +54,11 @@ enum {
GUI_EVENT_THEME_CHANGED,
};
/** Recording events **/
enum {
RECORDING_EVENT_START = (EVENT_CLASS_RECORDING|1),
RECORDING_EVENT_STOP,
};
#endif

View file

@ -1007,7 +1007,6 @@ int bufopen(const char *file, size_t offset, enum data_type type,
}
/* Other cases: there is a little more work. */
int fd = open(file, O_RDONLY);
if (fd < 0)
return ERR_FILE_ERROR;

View file

@ -443,8 +443,15 @@ static void wps_display_images(struct gui_wps *gwps, struct viewport* vp)
if (data->albumart && data->albumart->vp == vp
&& data->albumart->draw)
{
draw_album_art(gwps, playback_current_aa_hid(data->playback_aa_slot),
false);
int handle = playback_current_aa_hid(data->playback_aa_slot);
#if CONFIG_TUNER
if (in_radio_screen())
{
struct dim dim = {data->albumart->width, data->albumart->height};
handle = radio_get_art_hid(&dim);
}
#endif
draw_album_art(gwps, handle, false);
data->albumart->draw = false;
}
#endif

View file

@ -577,8 +577,18 @@ const char *get_token_value(struct gui_wps *gwps,
return buf;
#ifdef HAVE_ALBUMART
case WPS_TOKEN_ALBUMART_FOUND:
if (data->albumart) {
if (playback_current_aa_hid(data->playback_aa_slot) >= 0)
if (data->albumart)
{
int handle = -1;
handle = playback_current_aa_hid(data->playback_aa_slot);
#if CONFIG_TUNER
if (in_radio_screen() || (get_radio_status() != FMRADIO_OFF))
{
struct dim dim = {data->albumart->width, data->albumart->height};
handle = radio_get_art_hid(&dim);
}
#endif
if (handle >= 0)
return "C";
}
return NULL;

View file

@ -1709,6 +1709,7 @@ static void audio_play_start(size_t offset)
{
int i;
send_event(PLAYBACK_EVENT_START_PLAYBACK, NULL);
#if INPUT_SRC_CAPS != 0
audio_set_input_source(AUDIO_SRC_PLAYBACK, SRCF_PLAYBACK);
audio_set_output_source(AUDIO_SRC_PLAYBACK);

View file

@ -31,6 +31,7 @@
#include "audio.h"
#include "sound.h"
#include "metadata.h"
#include "appevents.h"
#ifdef HAVE_SPDIF_IN
#include "spdif.h"
#endif
@ -1127,6 +1128,7 @@ static void pcmrec_new_stream(const char *filename, /* next file name */
static void pcmrec_init(void)
{
unsigned char *buffer;
send_event(RECORDING_EVENT_START, NULL);
/* warings and errors */
warnings =
@ -1183,6 +1185,7 @@ static void pcmrec_close(void)
pcm_close_recording();
reset_hardware();
audio_remove_encoder();
send_event(RECORDING_EVENT_STOP, NULL);
} /* pcmrec_close */
/* PCMREC_OPTIONS */

View file

@ -69,6 +69,7 @@
#include "viewport.h"
#include "skin_engine/skin_engine.h"
#include "statusbar-skinned.h"
#include "buffering.h"
#if CONFIG_TUNER
@ -199,10 +200,18 @@ static bool yesno_pop(const char* text)
return ret;
}
#if defined(HAVE_RECORDING) && defined(HAVE_ALBUMART)
static void recording_started_handler(void *data);
static void recording_stopped_handler(void *data);
#endif
void radio_init(void)
{
tuner_init();
radio_off();
#if defined(HAVE_RECORDING) && defined(HAVE_ALBUMART)
add_event(RECORDING_EVENT_START, false, recording_started_handler);
add_event(RECORDING_EVENT_STOP, false, recording_stopped_handler);
#endif
}
int get_radio_status(void)
@ -504,6 +513,131 @@ static struct gui_wps fms_skin[NB_SCREENS] = {{ .data = NULL }};
static struct wps_data fms_skin_data[NB_SCREENS] = {{ .wps_loaded = 0 }};
static struct wps_sync_data fms_skin_sync_data = { .do_full_update = false };
#ifdef HAVE_ALBUMART
#define MAX_RADIOART_IMAGES 10
struct radioart {
int handle;
long last_tick;
struct dim dim;
char name[MAX_FMPRESET_LEN+1];
};
static struct radioart radioart[MAX_RADIOART_IMAGES];
#ifdef HAVE_RECORDING
static bool allow_buffer_access = true; /* If we are recording dont touch the buffers! */
#endif
static int find_oldest_image(void)
{
int i;
long oldest_tick = radioart[0].last_tick;
int oldest_idx = 0;
for(i=1;i<MAX_RADIOART_IMAGES;i++)
{
if (radioart[i].last_tick < oldest_tick)
{
oldest_tick = radioart[i].last_tick;
oldest_idx = i;
}
}
return oldest_idx;
}
static int load_radioart_image(struct radioart *ra, char* preset_name, struct dim *dim)
{
char path[MAX_PATH];
#ifndef HAVE_NOISY_IDLE_MODE
cpu_idle_mode(false);
#endif
snprintf(path, sizeof(path), FMPRESET_PATH "/%s.bmp",preset_name);
if (!file_exists(path))
snprintf(path, sizeof(path), FMPRESET_PATH "/%s.jpg",preset_name);
if (!file_exists(path))
{
#ifndef HAVE_NOISY_IDLE_MODE
cpu_idle_mode(true);
#endif
return -1;
}
strlcpy(ra->name, preset_name, MAX_FMPRESET_LEN+1);
ra->dim.height = dim->height;
ra->dim.width = dim->width;
ra->last_tick = current_tick;
ra->handle = bufopen(path, 0, TYPE_BITMAP, &ra->dim);
if (ra->handle == ERR_BUFFER_FULL)
{
int i = find_oldest_image();
bufclose(i);
ra->handle = bufopen(path, 0, TYPE_BITMAP, &ra->dim);
}
#ifndef HAVE_NOISY_IDLE_MODE
cpu_idle_mode(true);
#endif
return ra->handle;
}
int radio_get_art_hid(struct dim *requested_dim)
{
int preset = radio_current_preset();
int i, free_idx = -1;
if ((radio_mode != RADIO_PRESET_MODE) || preset < 0)
return -1;
#ifdef HAVE_RECORDING
if (!allow_buffer_access)
return -1;
#endif
for(i=0;i<MAX_RADIOART_IMAGES;i++)
{
if (radioart[i].handle < 0)
{
free_idx = i;
}
else if (!strcmp(radioart[i].name, presets[preset].name) &&
radioart[i].dim.width == requested_dim->width &&
radioart[i].dim.height == requested_dim->height)
{
radioart[i].last_tick = current_tick;
return radioart[i].handle;
}
}
if (free_idx >= 0)
{
return load_radioart_image(&radioart[free_idx],
presets[preset].name, requested_dim);
}
else
{
int i = find_oldest_image();
bufclose(radioart[i].handle);
return load_radioart_image(&radioart[i],
presets[preset].name, requested_dim);
}
return -1;
}
static void playback_restarting_handler(void *data)
{
(void)data;
int i;
for(i=0;i<MAX_RADIOART_IMAGES;i++)
{
if (radioart[i].handle >= 0)
bufclose(radioart[i].handle);
radioart[i].handle = -1;
radioart[i].name[0] = '\0';
}
}
#ifdef HAVE_RECORDING
static void recording_started_handler(void *data)
{
(void)data;
allow_buffer_access = false;
playback_restarting_handler(NULL);
}
static void recording_stopped_handler(void *data)
{
(void)data;
allow_buffer_access = true;
}
#endif
#endif
void fms_data_load(enum screen_type screen, const char *buf, bool isfile)
{
@ -613,9 +747,18 @@ int radio_screen(void)
{
radio_load_presets(global_settings.fmr_file);
}
#ifdef HAVE_ALBUMART
for(i=0;i<MAX_RADIOART_IMAGES;i++)
{
radioart[i].handle = -1;
radioart[i].name[0] = '\0';
}
add_event(PLAYBACK_EVENT_START_PLAYBACK, true, playback_restarting_handler);
#endif
if(radio_status == FMRADIO_OFF)
audio_stop();
#ifndef SIMULATOR
#if CONFIG_CODEC != SWCODEC

View file

@ -59,6 +59,10 @@ struct fmstation
char name[MAX_FMPRESET_LEN+1];
};
#ifdef HAVE_ALBUMART
int radio_get_art_hid(struct dim *requested_dim);
#endif
#endif /* CONFIG_TUNER */
#endif /* RADIO_H */

View file

@ -37,6 +37,7 @@
#define EVENT_CLASS_PLAYBACK 0x0200
#define EVENT_CLASS_BUFFERING 0x0400
#define EVENT_CLASS_GUI 0x0800
#define EVENT_CLASS_RECORDING 0x1000
#define EVENT_CLASS_LCD 0xf000
bool add_event(unsigned short id, bool oneshot, void (*handler)(void *data));

View file

@ -26,7 +26,7 @@ builddir="${RBDEV_BUILD:-/tmp/rbdev-build}"
if [ -f "`which gmake 2>/dev/null`" ]; then
make="gmake"
else
make="make"
make="make -j4"
fi
if [ -z $GNU_MIRROR ] ; then