use core_alloc for Radio Presets
rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]> Sat, 20 Jun 2026 11:23:56 -0400
| Newsgroups | gmane.comp.systems.archos.rockbox.cvs |
|---|---|
| Message-ID | <[email protected]> |
commit 81962808a24af63a021f6b55a8d42e3d395f677d Author: William Wilgus <[email protected]> Date: Fri Jun 19 14:24:53 2026 -0400 use core_alloc for Radio Presets saves around 1.2k off the top & allocates a movable alloc when FM radio used Change-Id: I0ea8c646f919fc8e62de2b02c1c089620e7ef020 diff --git a/apps/gui/skin_engine/skin_tokens.c b/apps/gui/skin_engine/skin_tokens.c index 42455f64e3..e09c0ed224 100644 --- a/apps/gui/skin_engine/skin_tokens.c +++ b/apps/gui/skin_engine/skin_tokens.c @@ -509,7 +509,7 @@ const char *get_radio_token(struct wps_token *token, int preset_offset, if (preset < 0) preset += preset_count; if (token->type == SKIN_TOKEN_PRESET_NAME) - snprintf(buf, buf_size, "%s", radio_get_preset_name(preset)); + radio_get_preset_name(preset, buf, buf_size); else if (token->type == SKIN_TOKEN_PRESET_FREQ) format_freq_MHz(radio_get_preset_freq(preset), region_data->freq_step, buf, buf_size); diff --git a/apps/radio/presets.c b/apps/radio/presets.c index 525a7d0295..244c7e130e 100644 --- a/apps/radio/presets.c +++ b/apps/radio/presets.c @@ -42,6 +42,7 @@ #include "filetree.h" #include "dir.h" #include "presets.h" +#include "core_alloc.h" static int curr_preset = -1; @@ -52,16 +53,41 @@ void remember_frequency(void); #define MAX_PRESETS 64 static bool presets_loaded = false; static bool presets_changed = false; +static int preset_handle = 0; +static int num_presets = 0; /* The number of presets in the preset list */ -static struct fmstation +struct fmstation { int frequency; /* In Hz */ char name[MAX_FMPRESET_LEN+1]; -} presets[MAX_PRESETS]; +}; +struct fmstation_buf /* Allocd on first use of presets */ +{ + struct fmstation fmstation[MAX_PRESETS]; + char filepreset[MAX_PATH]; +}; -static char filepreset[MAX_PATH]; /* preset filename variable */ -static int num_presets = 0; /* The number of presets in the preset list */ +static struct fmstation_buf *presets_get(void) +{ + if (preset_handle <= 0) + { + preset_handle = core_alloc(sizeof(struct fmstation_buf)); + } + if (preset_handle > 0) + { + return core_get_data_pinned(preset_handle); + } + return NULL; +} + +static void presets_put(struct fmstation_buf *presets) +{ + if (presets != NULL) + { + core_put_data_pinned(presets); + } +} int radio_current_preset(void) { @@ -81,16 +107,24 @@ bool presets_have_changed(void) /* Find a matching preset to freq */ int preset_find(int freq) { + int ret = -1; int i; if(num_presets < 1) return -1; - for(i = 0;i < MAX_PRESETS;i++) + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) { - if(freq == presets[i].frequency) - return i; + for(i = 0;i < MAX_PRESETS;i++) + { + if(freq == presets->fmstation[i].frequency) + { + ret = i; + break; + } + } + presets_put(presets); } - - return -1; + return ret; } /* Return the closest preset encountered in the search direction with @@ -105,41 +139,47 @@ static int find_closest_preset(int freq, int direction) if (direction == 0) /* direction == 0 isn't really used */ return 0; - for (i = 0; i < num_presets; i++) + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) { - int f = presets[i].frequency; - if (f == freq) - return i; /* Exact match = stop */ - - /* remember the highest and lowest presets for wraparound */ - if (f < presets[lowpreset].frequency) - lowpreset = i; - if (f > presets[highpreset].frequency) - highpreset = i; - - /* find the closest preset in the given direction */ - if (direction > 0 && f > freq) + for (i = 0; i < num_presets; i++) { - if (closest < 0 || f < presets[closest].frequency) - closest = i; + int f = presets->fmstation[i].frequency; + if (f == freq) + { + closest = i; /* Exact match = stop */ + break; + } + /* remember the highest and lowest presets for wraparound */ + if (f < presets->fmstation[lowpreset].frequency) + lowpreset = i; + if (f > presets->fmstation[highpreset].frequency) + highpreset = i; + + /* find the closest preset in the given direction */ + if (direction > 0 && f > freq) + { + if (closest < 0 || f < presets->fmstation[closest].frequency) + closest = i; + } + else if (direction < 0 && f < freq) + { + if (closest < 0 || f > presets->fmstation[closest].frequency) + closest = i; + } } - else if (direction < 0 && f < freq) + + if (closest < 0) { - if (closest < 0 || f > presets[closest].frequency) - closest = i; + /* no presets in the given direction */ + /* wrap around depending on direction */ + if (direction < 0) + closest = highpreset; + else + closest = lowpreset; } + presets_put(presets); } - - if (closest < 0) - { - /* no presets in the given direction */ - /* wrap around depending on direction */ - if (direction < 0) - closest = highpreset; - else - closest = lowpreset; - } - return closest; } @@ -148,18 +188,23 @@ void preset_next(int direction) if (num_presets < 1) return; - int curr_freq = radio_get_current_frequency(); + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + int curr_freq = radio_get_current_frequency(); - if (curr_preset == -1) - curr_preset = find_closest_preset(curr_freq, direction); - else - curr_preset = (curr_preset + direction + num_presets) % num_presets; + if (curr_preset == -1) + curr_preset = find_closest_preset(curr_freq, direction); + else + curr_preset = (curr_preset + direction + num_presets) % num_presets; - /* Must stay on the current grid for the region */ - curr_freq = snap_freq_to_grid(presets[curr_preset].frequency); - radio_set_current_frequency(curr_freq); - tuner_set(RADIO_FREQUENCY, curr_freq); - remember_frequency(); + /* Must stay on the current grid for the region */ + curr_freq = snap_freq_to_grid(presets->fmstation[curr_preset].frequency); + radio_set_current_frequency(curr_freq); + tuner_set(RADIO_FREQUENCY, curr_freq); + remember_frequency(); + presets_put(presets); + } } void preset_set_current(int preset) @@ -174,10 +219,15 @@ void preset_talk(int preset, bool fallback, bool enqueue) talk_number(preset + 1, enqueue); else { /* spell */ - if(presets[preset].name[0]) - talk_spell(presets[preset].name, enqueue); - else if(fallback) - talk_value_decimal(presets[preset].frequency, UNIT_INT, 6, enqueue); + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + if(presets->fmstation[preset].name[0]) + talk_spell(presets->fmstation[preset].name, enqueue); + else if(fallback) + talk_value_decimal(presets->fmstation[preset].frequency, UNIT_INT, 6, enqueue); + presets_put(presets); + } } } @@ -186,22 +236,28 @@ void radio_save_presets(void) int fd; int i; - fd = creat(filepreset, 0666); - if(fd >= 0) + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) { - for(i = 0;i < num_presets;i++) + char *filepreset = presets->filepreset; + fd = creat(filepreset, 0666); + if(fd >= 0) { - fdprintf(fd, "%d:%s\n", presets[i].frequency, presets[i].name); - } - close(fd); + for(i = 0;i < num_presets;i++) + { + fdprintf(fd, "%d:%s\n", presets->fmstation[i].frequency, presets->fmstation[i].name); + } + close(fd); - if (strcasestr(filepreset, FMPRESET_PATH)) - set_file(filepreset, global_settings.fmr_file); - presets_changed = false; - } - else - { - splash(HZ, ID2P(LANG_FM_PRESET_SAVE_FAILED)); + if (strcasestr(filepreset, FMPRESET_PATH)) + set_file(filepreset, global_settings.fmr_file); + presets_changed = false; + } + else + { + splash(HZ, ID2P(LANG_FM_PRESET_SAVE_FAILED)); + } + presets_put(presets); } } @@ -215,13 +271,20 @@ void radio_load_presets(const char *filename) bool done = false; int f; - memset(presets, 0, sizeof(presets)); num_presets = 0; + struct fmstation_buf *presets = presets_get(); + if (presets == NULL) + return; + + memset(presets->fmstation, 0, sizeof(presets->fmstation)); + + char *filepreset = presets->filepreset; /* No Preset in configuration. */ if(filename[0] == '\0' || filename[0] == '-') { filepreset[0] = '\0'; + presets_put(presets); return; } @@ -229,12 +292,12 @@ void radio_load_presets(const char *filename) if(filename[0] != '/') /* Preset within radio screen */ { - snprintf(filepreset, sizeof(filepreset), "%s/%s.fmr", + snprintf(filepreset, MAX_PATH, "%s/%s.fmr", FMPRESET_PATH, filename);; } else { - strmemccpy(filepreset, filename, sizeof(filepreset)); + strmemccpy(filepreset, filename, MAX_PATH); } /* Preset inside the default folder? */ @@ -255,7 +318,7 @@ void radio_load_presets(const char *filename) f = atoi(freq); if(f) /* For backwards compatibility */ { - struct fmstation * const fms = &presets[num_presets]; + struct fmstation * const fms = &presets->fmstation[num_presets]; fms->frequency = f; strmemccpy(fms->name, name, MAX_FMPRESET_LEN+1); num_presets++; @@ -272,46 +335,53 @@ void radio_load_presets(const char *filename) presets_loaded = num_presets > 0; presets_changed = false; + presets_put(presets); } int radio_get_preset_freq(int preset) { - if (preset < num_presets) - return presets[preset].frequency; - return -1; -} + int freq = -1; + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + if (preset < num_presets) + freq = presets->fmstation[preset].frequency; -const char* radio_get_preset_name(int preset) -{ - if (preset < num_presets) - return presets[preset].name; - return NULL; + presets_put(presets); + } + return freq; } int handle_radio_add_preset(void) { + int ret = 0; char buf[MAX_FMPRESET_LEN + 1]; - if(num_presets < MAX_PRESETS) + if(preset_handle > 0 && num_presets < MAX_PRESETS) { - buf[0] = '\0'; - - if (!kbd_input(buf, MAX_FMPRESET_LEN + 1, NULL)) + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) { - struct fmstation * const fms = &presets[num_presets]; - strcpy(fms->name, buf); - fms->frequency = radio_get_current_frequency(); - num_presets++; - presets_changed = true; - presets_loaded = num_presets > 0; - return true; + buf[0] = '\0'; + if (!kbd_input(buf, sizeof(buf), NULL)) + { + struct fmstation * const fms = &presets->fmstation[num_presets]; + strcpy(fms->name, buf); + fms->frequency = radio_get_current_frequency(); + num_presets++; + presets_changed = true; + presets_loaded = num_presets > 0; + ret = 1; + } + presets_put(presets); } } else { splash(HZ, ID2P(LANG_FM_NO_FREE_PRESETS)); } - return false; + + return ret; } /* needed to know which preset we are edit/delete-ing */ @@ -322,14 +392,19 @@ static int radio_edit_preset(void) if (num_presets > 0) { - struct fmstation * const fms = &presets[selected_preset]; + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + struct fmstation * const fms = &presets->fmstation[selected_preset]; - strcpy(buf, fms->name); + strcpy(buf, fms->name); - if (!kbd_input(buf, MAX_FMPRESET_LEN + 1, NULL)) - { - strcpy(fms->name, buf); - presets_changed = true; + if (!kbd_input(buf, MAX_FMPRESET_LEN + 1, NULL)) + { + strcpy(fms->name, buf); + presets_changed = true; + } + presets_put(presets); } } @@ -340,16 +415,21 @@ static int radio_delete_preset(void) { if (num_presets > 0) { - struct fmstation * const fms = &presets[selected_preset]; + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + struct fmstation * const fms = &presets->fmstation[selected_preset]; - if (selected_preset >= --num_presets) - selected_preset = num_presets - 1; + if (selected_preset >= --num_presets) + selected_preset = num_presets - 1; - memmove(fms, fms + 1, (uintptr_t)(fms + num_presets) - - (uintptr_t)fms); + memmove(fms, fms + 1, (uintptr_t)(fms + num_presets) - + (uintptr_t)fms); - if (curr_preset >= num_presets) - --curr_preset; + if (curr_preset >= num_presets) + --curr_preset; + presets_put(presets); + } } /* Don't ask to save when all presets are deleted. */ @@ -391,12 +471,15 @@ int preset_list_save(void) if(!dir_exists(FMPRESET_PATH)) /* Check if there is preset folder */ mkdir(FMPRESET_PATH); + struct fmstation_buf *p = presets_get(); + char *filepreset = p->filepreset; + create_numbered_filename(filepreset, FMPRESET_PATH, "preset", ".fmr", 2 IF_CNFN_NUM_(, NULL)); while(bad_file_name) { - if(!kbd_input(filepreset, sizeof(filepreset), NULL)) + if(!kbd_input(filepreset, MAX_PATH, NULL)) { /* check the name: max MAX_FILENAME (20) chars */ char* p2; @@ -425,30 +508,37 @@ int preset_list_save(void) else { /* user aborted */ - return false; + break; } } + presets_put(p); } else splash(HZ, ID2P(LANG_FM_NO_PRESETS)); - return true; + return 0; } int preset_list_clear(void) { - /* Clear all the preset entries */ - memset(presets, 0, sizeof (presets)); + if (preset_handle <= 0) + return 0; + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + /* Clear all the preset entries */ + memset(presets->fmstation, 0, sizeof(presets->fmstation)); - num_presets = 0; - presets_loaded = false; - /* The preset list will be cleared switch to Scan Mode. */ - radio_set_mode(RADIO_SCAN_MODE); - curr_preset = -1; - presets_changed = false; /* Don't ask to save when clearing the list. */ - global_settings.fmr_file[0] = '-'; - - return true; + num_presets = 0; + presets_loaded = false; + /* The preset list will be cleared switch to Scan Mode. */ + radio_set_mode(RADIO_SCAN_MODE); + curr_preset = -1; + presets_changed = false; /* Don't ask to save when clearing the list. */ + global_settings.fmr_file[0] = '-'; + presets_put(presets); + } + return 0; } MENUITEM_FUNCTION(radio_edit_preset_item, MENU_FUNC_CHECK_RETVAL, @@ -474,15 +564,21 @@ MAKE_MENU(handle_radio_preset_menu, ID2P(LANG_PRESET), static const char* presets_get_name(int selected_item, void *data, char *buffer, size_t buffer_len) { - (void)data; - struct fmstation *p = &presets[selected_item]; + struct fmstation * stations = (struct fmstation *) data; + + struct fmstation *p = &stations[selected_item]; if(p->name[0]) - return p->name; - int freq = p->frequency / FREQ_DISP_DIVISOR; - int frac = freq % 100; - freq /= 100; - snprintf(buffer, buffer_len, - str(LANG_FM_DEFAULT_PRESET_NAME), freq, frac); + { + snprintf(buffer, buffer_len, "%s", p->name); + } + else + { + int freq = p->frequency / FREQ_DISP_DIVISOR; + int frac = freq % 100; + freq /= 100; + snprintf(buffer, buffer_len, + str(LANG_FM_DEFAULT_PRESET_NAME), freq, frac); + } return buffer; } @@ -493,6 +589,19 @@ static int presets_speak_name(int selected_item, void * data) return 0; } +const char* radio_get_preset_name(int preset, char *buffer, size_t buffer_len) +{ + buffer[0] = '\0'; /* skin_tokens.c get_radio_token() doesn't check for success */ + struct fmstation_buf *presets = presets_get(); + if (presets != NULL) + { + presets_get_name(preset, presets->fmstation, buffer, buffer_len); + presets_put(presets); + return buffer; + } + return NULL; +} + int handle_radio_presets(void) { struct gui_synclist lists; @@ -502,7 +611,11 @@ int handle_radio_presets(void) if(presets_loaded == false) return result; - gui_synclist_init(&lists, presets_get_name, NULL, false, 1, NULL); + struct fmstation_buf *presets = presets_get(); + if (presets == NULL) + return result; + + gui_synclist_init(&lists, presets_get_name, presets->fmstation, false, 1, NULL); gui_synclist_set_title(&lists, str(LANG_PRESET), NOICON); if(global_settings.talk_file) gui_synclist_set_voice_callback(&lists, presets_speak_name); @@ -521,14 +634,14 @@ int handle_radio_presets(void) { gui_synclist_set_nb_items(&lists, num_presets); gui_synclist_select_item(&lists, num_presets - 1); - } + } break; case ACTION_STD_CANCEL: result = 1; break; case ACTION_STD_OK: curr_preset = gui_synclist_get_sel_pos(&lists); - radio_set_current_frequency(presets[curr_preset].frequency); + radio_set_current_frequency(presets->fmstation[curr_preset].frequency); next_station(0); result = 1; break; @@ -544,6 +657,7 @@ int handle_radio_presets(void) result = 2; } } + presets_put(presets); return result - 1; } @@ -562,12 +676,15 @@ int presets_scan(void *viewports) if(do_scan) { + struct fmstation_buf *presets = presets_get(); + if (presets == NULL) + return 1; const struct fm_region_data * const fmr = &fm_region_data[global_settings.fm_region]; curr_freq = fmr->freq_min; num_presets = 0; - memset(presets, 0, sizeof(presets)); + memset(presets->fmstation, 0, sizeof(presets->fmstation)); tuner_set(RADIO_MUTE, 1); @@ -594,8 +711,8 @@ int presets_scan(void *viewports) if(tuner_set(RADIO_SCAN_FREQUENCY, curr_freq)) { /* add preset */ - presets[num_presets].name[0] = '\0'; - presets[num_presets].frequency = curr_freq; + presets->fmstation[num_presets].name[0] = '\0'; + presets->fmstation[num_presets].frequency = curr_freq; num_presets++; } @@ -618,7 +735,7 @@ int presets_scan(void *viewports) if(num_presets > 0) { - radio_set_current_frequency(presets[0].frequency); + radio_set_current_frequency(presets->fmstation[0].frequency); radio_set_mode(RADIO_PRESET_MODE); presets_loaded = true; next_station(0); @@ -629,17 +746,24 @@ int presets_scan(void *viewports) presets_loaded = false; next_station(1); } + presets_put(presets); } - return true; + + return 1; } void presets_save(void) { - if(filepreset[0] == '\0') - preset_list_save(); - else - radio_save_presets(); + struct fmstation_buf *p = presets_get(); + if (p != NULL) + { + if(p->filepreset[0] == '\0') + preset_list_save(); + else + radio_save_presets(); + presets_put(p); + } } #if 0 /* disabled in draw_progressbar() */ diff --git a/apps/radio/radio.h b/apps/radio/radio.h index 0172ca6589..283edfb8dd 100644 --- a/apps/radio/radio.h +++ b/apps/radio/radio.h @@ -60,7 +60,7 @@ void toggle_mono_mode(bool mono); #define MAX_FMPRESET_LEN 27 int radio_get_preset_freq(int preset); -const char* radio_get_preset_name(int preset); +const char* radio_get_preset_name(int preset, char *buffer, size_t buffer_len); #if 0 /* disabled in draw_progressbar() */ void presets_draw_markers(struct screen *screen, int x, int y, int w, int h); #endif diff --git a/apps/radio/radioart.c b/apps/radio/radioart.c index 720b8144a4..d750d69d60 100644 --- a/apps/radio/radioart.c +++ b/apps/radio/radioart.c @@ -111,37 +111,40 @@ int radio_get_art_hid(struct dim *requested_dim) if (!buf || (radio_get_mode() == RADIO_SCAN_MODE) || preset < 0) return -1; - preset_name = radio_get_preset_name(preset); - for (int i=0; i<MAX_RADIOART_IMAGES; i++) + char buffer[MAX_FMPRESET_LEN + 1]; + preset_name = radio_get_preset_name(preset, buffer, sizeof(buffer)); + if (preset_name != NULL) { - if (radioart[i].handle < 0) + for (int i=0; i<MAX_RADIOART_IMAGES; i++) { - free_idx = i; + if (radioart[i].handle < 0) + { + free_idx = i; + } + else if (!strcmp(radioart[i].name, 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; + } } - else if (!strcmp(radioart[i].name, preset_name) && - radioart[i].dim.width == requested_dim->width && - radioart[i].dim.height == requested_dim->height) + if (free_idx >= 0) { - radioart[i].last_tick = current_tick; - return radioart[i].handle; + return load_radioart_image(&radioart[free_idx], + preset_name, requested_dim); } - } - if (free_idx >= 0) - { - return load_radioart_image(&radioart[free_idx], - preset_name, requested_dim); - } - else - { - int i = find_oldest_image_index(); - if (i != -1) + else { - bufclose(radioart[i].handle); - return load_radioart_image(&radioart[i], - preset_name, requested_dim); + int i = find_oldest_image_index(); + if (i != -1) + { + bufclose(radioart[i].handle); + return load_radioart_image(&radioart[i], + preset_name, requested_dim); + } } } - return -1; } -- rockbox-cvs mailing list [email protected] https://lists.haxx.se/mailman/listinfo/rockbox-cvs