1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2010 Jonathan Gordon
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
28 #include "buffering.h"
31 #include "string-extra.h"
34 #define MAX_RADIOART_IMAGES 10
39 char name
[MAX_FMPRESET_LEN
+1];
42 static struct radioart radioart
[MAX_RADIOART_IMAGES
];
44 static bool allow_buffer_access
= true; /* If we are recording dont touch the buffers! */
46 static int find_oldest_image(void)
49 long oldest_tick
= radioart
[0].last_tick
;
51 for(i
=1;i
<MAX_RADIOART_IMAGES
;i
++)
53 if (radioart
[i
].last_tick
< oldest_tick
)
55 oldest_tick
= radioart
[i
].last_tick
;
61 static int load_radioart_image(struct radioart
*ra
, const char* preset_name
,
65 #ifndef HAVE_NOISY_IDLE_MODE
68 snprintf(path
, sizeof(path
), FMPRESET_PATH
"/%s.bmp",preset_name
);
69 if (!file_exists(path
))
70 snprintf(path
, sizeof(path
), FMPRESET_PATH
"/%s.jpg",preset_name
);
71 if (!file_exists(path
))
73 #ifndef HAVE_NOISY_IDLE_MODE
78 strlcpy(ra
->name
, preset_name
, MAX_FMPRESET_LEN
+1);
79 ra
->dim
.height
= dim
->height
;
80 ra
->dim
.width
= dim
->width
;
81 ra
->last_tick
= current_tick
;
82 ra
->handle
= bufopen(path
, 0, TYPE_BITMAP
, &ra
->dim
);
83 if (ra
->handle
== ERR_BUFFER_FULL
)
85 int i
= find_oldest_image();
87 ra
->handle
= bufopen(path
, 0, TYPE_BITMAP
, &ra
->dim
);
89 #ifndef HAVE_NOISY_IDLE_MODE
94 int radio_get_art_hid(struct dim
*requested_dim
)
96 int preset
= radio_current_preset();
98 const char* preset_name
;
99 if (radio_scan_mode() || preset
< 0)
101 #ifdef HAVE_RECORDING
102 if (!allow_buffer_access
)
105 preset_name
= radio_get_preset_name(preset
);
106 for(i
=0;i
<MAX_RADIOART_IMAGES
;i
++)
108 if (radioart
[i
].handle
< 0)
112 else if (!strcmp(radioart
[i
].name
, preset_name
) &&
113 radioart
[i
].dim
.width
== requested_dim
->width
&&
114 radioart
[i
].dim
.height
== requested_dim
->height
)
116 radioart
[i
].last_tick
= current_tick
;
117 return radioart
[i
].handle
;
122 return load_radioart_image(&radioart
[free_idx
],
123 preset_name
, requested_dim
);
127 int i
= find_oldest_image();
128 bufclose(radioart
[i
].handle
);
129 return load_radioart_image(&radioart
[i
],
130 preset_name
, requested_dim
);
135 static void playback_restarting_handler(void *data
)
139 for(i
=0;i
<MAX_RADIOART_IMAGES
;i
++)
141 if (radioart
[i
].handle
>= 0)
142 bufclose(radioart
[i
].handle
);
143 radioart
[i
].handle
= -1;
144 radioart
[i
].name
[0] = '\0';
147 #ifdef HAVE_RECORDING
148 static void recording_started_handler(void *data
)
151 allow_buffer_access
= false;
152 playback_restarting_handler(NULL
);
154 static void recording_stopped_handler(void *data
)
157 allow_buffer_access
= true;
161 void radioart_init(bool entering_screen
)
166 for(i
=0;i
<MAX_RADIOART_IMAGES
;i
++)
168 radioart
[i
].handle
= -1;
169 radioart
[i
].name
[0] = '\0';
171 add_event(PLAYBACK_EVENT_START_PLAYBACK
, true, playback_restarting_handler
);
175 #if defined(HAVE_RECORDING)
176 add_event(RECORDING_EVENT_START
, false, recording_started_handler
);
177 add_event(RECORDING_EVENT_STOP
, false, recording_stopped_handler
);