Rockbox open source high quality audio player as a Music Player Daemon
mpris rockbox mpd libadwaita audio rust zig deno
2
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #45 from tsirysndr/fix/repeat

api: fix shuffle/repeat playlist

authored by

Tsiry Sandratraina and committed by
GitHub
7a77e387 2b8adce6

+65 -14
-2
apps/broker_thread.c
··· 33 33 34 34 extern void start_broker(void); 35 35 36 - extern void debugfn(const char *fmt); 37 - 38 36 static void broker_thread(void) { 39 37 start_broker(); 40 38 }
+10
apps/playlist.c
··· 3055 3055 return result; 3056 3056 } 3057 3057 3058 + int playlist_randomise_current(unsigned int seed, bool start_current) 3059 + { 3060 + return playlist_randomise(NULL, seed, start_current); 3061 + } 3062 + 3058 3063 /* 3059 3064 * Removes all tracks, from the playlist, leaving the presently playing 3060 3065 * track queued. ··· 3693 3698 playlist_write_unlock(playlist); 3694 3699 dc_thread_start(playlist, true); 3695 3700 return result; 3701 + } 3702 + 3703 + int playlist_sort_current(bool start_current) 3704 + { 3705 + return playlist_sort(NULL, start_current); 3696 3706 } 3697 3707 3698 3708 /* start playing current playlist at specified index/offset */
-2
apps/server_thread.c
··· 34 34 extern void start_server(void); 35 35 extern void start_servers(void); 36 36 37 - extern void debugfn(const char *fmt); 38 - 39 37 static void server_thread(void) { 40 38 start_server(); 41 39 }
+8
apps/settings.c
··· 1217 1217 return NULL; 1218 1218 } 1219 1219 1220 + void set_repeat_mode(int mode) { 1221 + global_settings.repeat_mode = mode; 1222 + struct settings_list *setting = find_setting(&global_settings.repeat_mode); 1223 + int *value = setting->setting; 1224 + if (value) 1225 + *value = mode; 1226 + } 1227 + 1220 1228 const struct settings_list* find_setting_by_cfgname(const char* name) 1221 1229 { 1222 1230 logf("Searching for Setting: '%s'",name);
+3 -2
crates/server/src/lib.rs
··· 11 11 use std::{ 12 12 collections::HashMap, 13 13 ffi::c_char, 14 + ffi::c_int, 14 15 sync::{Arc, Mutex}, 15 16 thread, 16 17 }; ··· 25 26 ]; 26 27 27 28 #[no_mangle] 28 - pub extern "C" fn debugfn(args: *const c_char) { 29 + pub extern "C" fn debugfn(args: *const c_char, value: c_int) { 29 30 let c_str = unsafe { std::ffi::CStr::from_ptr(args) }; 30 31 let str_slice = c_str.to_str().unwrap(); 31 - println!("{}", str_slice); 32 + println!("{} {}", str_slice, value); 32 33 } 33 34 34 35 #[no_mangle]
+3 -3
crates/settings/src/lib.rs
··· 1 1 use anyhow::Error; 2 2 use rockbox_sys::{self as rb, types::user_settings::NewGlobalSettings}; 3 3 4 - pub fn load_settings(settings: Option<NewGlobalSettings>) -> Result<(), Error> { 5 - let settings: NewGlobalSettings = match settings { 4 + pub fn load_settings(new_settings: Option<NewGlobalSettings>) -> Result<(), Error> { 5 + let settings: NewGlobalSettings = match new_settings.clone() { 6 6 Some(settings) => settings, 7 7 None => { 8 8 let home = std::env::var("HOME")?; ··· 21 21 } 22 22 } 23 23 24 - rb::settings::save_settings(settings.clone()); 24 + rb::settings::save_settings(settings.clone(), new_settings.is_none()); 25 25 26 26 rb::settings::apply_audio_settings(); 27 27
+3
crates/sys/src/lib.rs
··· 1121 1121 fn playlist_sync(playlist: *mut PlaylistInfo); 1122 1122 fn playlist_create(dir: *const c_char, file: *const c_char) -> c_int; 1123 1123 fn playlist_shuffle(random_seed: c_int, start_index: c_int) -> c_int; 1124 + fn playlist_randomise_current(seed: c_uint, start_current: c_uchar) -> c_int; 1125 + fn playlist_sort_current(start_current: c_uchar) -> c_int; 1124 1126 fn rb_playlist_index() -> i32; 1125 1127 fn rb_playlist_first_index() -> i32; 1126 1128 fn rb_playlist_last_insert_pos() -> i32; ··· 1360 1362 ); 1361 1363 fn set_bool(string: *const c_char, variable: *const c_uchar) -> c_uchar; 1362 1364 fn rb_get_crossfade_mode() -> i32; 1365 + fn set_repeat_mode(mode: c_int); 1363 1366 1364 1367 // Misc 1365 1368 fn codec_load_file();
+6
crates/sys/src/playback.rs
··· 87 87 crate::audio_hard_stop(); 88 88 } 89 89 } 90 + 91 + pub fn set_repeat_mode(mode: i32) { 92 + unsafe { 93 + crate::set_repeat_mode(mode); 94 + } 95 + }
+8
crates/sys/src/playlist.rs
··· 148 148 pub fn max_playlist_size() -> i32 { 149 149 unsafe { crate::rb_max_playlist_size() } 150 150 } 151 + 152 + pub fn randomise_current(seed: u32, start_current: bool) -> i32 { 153 + unsafe { crate::playlist_randomise_current(seed, if start_current { 1 } else { 0 }) } 154 + } 155 + 156 + pub fn sort_current(start_current: bool) -> i32 { 157 + unsafe { crate::playlist_sort_current(if start_current { 1 } else { 0 }) } 158 + }
+24 -5
crates/sys/src/settings.rs
··· 135 135 unsafe { crate::rb_get_crossfade_mode() } 136 136 } 137 137 138 - pub fn save_settings(settings: NewGlobalSettings) { 138 + pub fn save_settings(settings: NewGlobalSettings, from_disk: bool) { 139 139 unsafe { 140 140 set_value_setting!( 141 141 settings.playlist_shuffle, 142 142 crate::global_settings.playlist_shuffle 143 143 ); 144 + if let Some(playlist_shuffle) = settings.playlist_shuffle { 145 + if !from_disk { 146 + let seed = crate::system::current_tick(); 147 + match playlist_shuffle { 148 + true => crate::playlist_randomise_current(seed as u32, 1), 149 + false => crate::playlist_sort_current(1), 150 + }; 151 + } 152 + } 153 + 144 154 set_value_setting!(settings.repeat_mode, crate::global_settings.repeat_mode); 155 + if let Some(repeat_mode) = settings.repeat_mode { 156 + crate::set_repeat_mode(repeat_mode); 157 + } 158 + 145 159 set_value_setting!(settings.bass, crate::global_settings.bass); 146 160 set_value_setting!(settings.treble, crate::global_settings.treble); 147 161 set_value_setting!(settings.bass_cutoff, crate::global_settings.bass_cutoff); 148 162 set_value_setting!(settings.treble_cutoff, crate::global_settings.treble_cutoff); 149 163 150 164 set_value_setting!(settings.crossfade, crate::global_settings.crossfade); 151 - crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 165 + if settings.crossfade.is_some() { 166 + crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 167 + } 152 168 153 169 set_value_setting!(settings.fade_on_stop, crate::global_settings.fade_on_stop); 154 170 ··· 165 181 settings.fade_out_delay, 166 182 crate::global_settings.crossfade_fade_out_delay 167 183 ); 168 - crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 184 + if settings.fade_out_delay.is_some() { 185 + crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 186 + } 169 187 170 188 set_value_setting!( 171 189 settings.fade_out_duration, 172 190 crate::global_settings.crossfade_fade_out_duration 173 191 ); 174 - 175 - crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 192 + if settings.fade_out_duration.is_some() { 193 + crate::sound::audio_set_crossfade(crate::global_settings.crossfade); 194 + } 176 195 177 196 set_value_setting!( 178 197 settings.fade_out_mixmode,