diff options
Diffstat (limited to 'apps/gui/skin_engine/skin_display.c')
-rw-r--r-- | apps/gui/skin_engine/skin_display.c | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/apps/gui/skin_engine/skin_display.c b/apps/gui/skin_engine/skin_display.c index e63b078d37..e90ac4c4ce 100644 --- a/apps/gui/skin_engine/skin_display.c +++ b/apps/gui/skin_engine/skin_display.c | |||
@@ -169,17 +169,20 @@ bool audio_peek_track(struct mp3entry* id3, int offset); | |||
169 | static void draw_playlist_viewer_list(struct gui_wps *gwps, | 169 | static void draw_playlist_viewer_list(struct gui_wps *gwps, |
170 | struct playlistviewer *viewer) | 170 | struct playlistviewer *viewer) |
171 | { | 171 | { |
172 | struct wps_state *state = gwps->state; | ||
172 | int lines = viewport_get_nb_lines(viewer->vp); | 173 | int lines = viewport_get_nb_lines(viewer->vp); |
173 | int line_height = font_get(viewer->vp->font)->height; | 174 | int line_height = font_get(viewer->vp->font)->height; |
174 | int cur_playlist_pos = playlist_get_display_index(); | 175 | int cur_playlist_pos = playlist_get_display_index(); |
175 | int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); | 176 | int start_item = MAX(0, cur_playlist_pos + viewer->start_offset); |
176 | int i; | 177 | int i; |
178 | struct wps_token token; | ||
177 | 179 | ||
178 | struct mp3entry *pid3; | 180 | struct mp3entry *pid3; |
179 | #if CONFIG_CODEC == SWCODEC | 181 | #if CONFIG_CODEC == SWCODEC |
180 | struct mp3entry id3; | 182 | struct mp3entry id3; |
181 | #endif | 183 | #endif |
182 | char buf[MAX_PATH*2], tempbuf[MAX_PATH]; | 184 | char buf[MAX_PATH*2], tempbuf[MAX_PATH]; |
185 | unsigned int buf_used = 0; | ||
183 | 186 | ||
184 | 187 | ||
185 | gwps->display->set_viewport(viewer->vp); | 188 | gwps->display->set_viewport(viewer->vp); |
@@ -187,11 +190,11 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps, | |||
187 | { | 190 | { |
188 | if (i == cur_playlist_pos) | 191 | if (i == cur_playlist_pos) |
189 | { | 192 | { |
190 | pid3 = audio_current_track(); | 193 | pid3 = state->id3; |
191 | } | 194 | } |
192 | else if (i == cur_playlist_pos+1) | 195 | else if (i == cur_playlist_pos+1) |
193 | { | 196 | { |
194 | pid3 = audio_next_track(); | 197 | pid3 = state->nid3; |
195 | } | 198 | } |
196 | #if CONFIG_CODEC == SWCODEC | 199 | #if CONFIG_CODEC == SWCODEC |
197 | else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) | 200 | else if ((i>cur_playlist_pos) && audio_peek_track(&id3, i-cur_playlist_pos)) |
@@ -200,51 +203,56 @@ static void draw_playlist_viewer_list(struct gui_wps *gwps, | |||
200 | } | 203 | } |
201 | #endif | 204 | #endif |
202 | else | 205 | else |
206 | { | ||
203 | pid3 = NULL; | 207 | pid3 = NULL; |
208 | } | ||
204 | 209 | ||
205 | int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; | 210 | int line = pid3 ? TRACK_HAS_INFO : TRACK_HAS_NO_INFO; |
206 | int token = 0, cur_string = 0; | 211 | int j = 0, cur_string = 0; |
207 | char *filename = playlist_peek(i-cur_playlist_pos); | 212 | char *filename = playlist_peek(i-cur_playlist_pos); |
208 | buf[0] = '\0'; | 213 | buf[0] = '\0'; |
209 | while (token < viewer->lines[line].count) | 214 | buf_used = 0; |
215 | while (j < viewer->lines[line].count && (buf_used<sizeof(buf))) | ||
210 | { | 216 | { |
211 | switch (viewer->lines[line].tokens[token]) | 217 | const char *out = NULL; |
218 | token.type = viewer->lines[line].tokens[j]; | ||
219 | token.value.i = 0; | ||
220 | token.next = false; | ||
221 | out = get_id3_token(&token, pid3, tempbuf, sizeof(tempbuf), -1, NULL); | ||
222 | if (out) | ||
223 | { | ||
224 | snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", out); | ||
225 | buf_used += strlen(out); | ||
226 | j++; | ||
227 | continue; | ||
228 | } | ||
229 | switch (viewer->lines[line].tokens[j]) | ||
212 | { | 230 | { |
213 | case WPS_TOKEN_STRING: | 231 | case WPS_TOKEN_STRING: |
214 | case WPS_TOKEN_CHARACTER: | 232 | case WPS_TOKEN_CHARACTER: |
215 | strcat(buf, viewer->lines[line].strings[cur_string++]); | 233 | snprintf(tempbuf, sizeof(tempbuf), "%s", |
234 | viewer->lines[line].strings[cur_string]); | ||
235 | cur_string++; | ||
216 | break; | 236 | break; |
217 | case WPS_TOKEN_PLAYLIST_POSITION: | 237 | case WPS_TOKEN_PLAYLIST_POSITION: |
218 | snprintf(tempbuf, sizeof(tempbuf), "%d", i); | 238 | snprintf(tempbuf, sizeof(tempbuf), "%d", i); |
219 | strcat(buf, tempbuf); | ||
220 | break; | 239 | break; |
221 | case WPS_TOKEN_FILE_NAME: | 240 | case WPS_TOKEN_FILE_NAME: |
222 | get_dir(tempbuf, sizeof(tempbuf), filename, 0); | 241 | get_dir(tempbuf, sizeof(tempbuf), filename, 0); |
223 | strcat(buf, tempbuf); | ||
224 | break; | 242 | break; |
225 | case WPS_TOKEN_FILE_PATH: | 243 | case WPS_TOKEN_FILE_PATH: |
226 | strcat(buf, filename); | 244 | snprintf(tempbuf, sizeof(tempbuf), "%s", filename); |
227 | break; | ||
228 | case WPS_TOKEN_METADATA_ARTIST: | ||
229 | if (pid3) | ||
230 | strcat(buf, pid3->artist ? pid3->artist : ""); | ||
231 | break; | 245 | break; |
232 | case WPS_TOKEN_METADATA_TRACK_TITLE: | ||
233 | if (pid3) | ||
234 | strcat(buf, pid3->title ? pid3->title : ""); | ||
235 | break; | ||
236 | case WPS_TOKEN_TRACK_LENGTH: | ||
237 | if (pid3) | ||
238 | { | ||
239 | format_time(tempbuf, sizeof(tempbuf), pid3->length); | ||
240 | strcat(buf, tempbuf); | ||
241 | } | ||
242 | break; | ||
243 | |||
244 | default: | 246 | default: |
247 | tempbuf[0] = '\0'; | ||
245 | break; | 248 | break; |
246 | } | 249 | } |
247 | token++; | 250 | if (tempbuf[0]) |
251 | { | ||
252 | snprintf(&buf[buf_used], sizeof(buf)-buf_used, "%s", tempbuf); | ||
253 | buf_used += strlen(tempbuf); | ||
254 | } | ||
255 | j++; | ||
248 | } | 256 | } |
249 | 257 | ||
250 | if (viewer->lines[line].scroll) | 258 | if (viewer->lines[line].scroll) |