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 branch 'Rockbox:master' into master

authored by

Tsiry Sandratraina and committed by
GitHub
513a5156 6de9b4e4

+1774 -271
+2
apps/gui/wps.c
··· 829 829 if (retval == ONPLAY_MAINMENU 830 830 || !audio_status()) 831 831 return GO_TO_ROOT; 832 + else if (retval == ONPLAY_REVEAL_FILE) 833 + return GO_TO_FILEBROWSER; 832 834 else if (retval == ONPLAY_PLAYLIST) 833 835 return GO_TO_PLAYLIST_VIEWER; 834 836 else if (retval == ONPLAY_PLUGIN)
+11 -8
apps/keymaps/keymap-fiiom3k.c
··· 185 185 186 186 static const struct button_mapping button_context_pitchscreen[] = { 187 187 {ACTION_PS_INC_SMALL, BUTTON_UP, BUTTON_NONE}, 188 - {ACTION_PS_INC_SMALL, BUTTON_SCROLL_BACK, BUTTON_NONE}, 189 - {ACTION_PS_INC_BIG, BUTTON_VOL_UP, BUTTON_NONE}, 188 + {ACTION_PS_INC_BIG, BUTTON_UP|BUTTON_REPEAT, BUTTON_NONE}, 189 + {ACTION_PS_INC_BIG, BUTTON_SCROLL_BACK, BUTTON_NONE}, 190 + {ACTION_PS_INC_BIG, BUTTON_SCROLL_BACK|BUTTON_REPEAT, BUTTON_NONE}, 190 191 {ACTION_PS_DEC_SMALL, BUTTON_DOWN, BUTTON_NONE}, 191 - {ACTION_PS_DEC_SMALL, BUTTON_SCROLL_FWD, BUTTON_NONE}, 192 - {ACTION_PS_DEC_BIG, BUTTON_VOL_DOWN, BUTTON_NONE}, 192 + {ACTION_PS_DEC_BIG, BUTTON_DOWN|BUTTON_REPEAT, BUTTON_NONE}, 193 + {ACTION_PS_DEC_BIG, BUTTON_SCROLL_FWD, BUTTON_NONE}, 194 + {ACTION_PS_DEC_BIG, BUTTON_SCROLL_FWD|BUTTON_REPEAT, BUTTON_NONE}, 193 195 {ACTION_PS_NUDGE_LEFT, BUTTON_LEFT, BUTTON_NONE}, 194 196 {ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE}, 195 197 {ACTION_PS_NUDGE_LEFTOFF, BUTTON_LEFT|BUTTON_REL, BUTTON_NONE}, 196 198 {ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE}, 197 - {ACTION_PS_TOGGLE_MODE, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, 199 + {ACTION_PS_TOGGLE_MODE, BUTTON_MENU, BUTTON_NONE}, 200 + {ACTION_PS_EXIT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, 198 201 {ACTION_PS_RESET, BUTTON_SELECT|BUTTON_REPEAT, BUTTON_SELECT}, 199 - {ACTION_PS_EXIT, BUTTON_POWER, BUTTON_NONE}, 200 - {ACTION_PS_FASTER, BUTTON_BACK, BUTTON_NONE}, 201 - {ACTION_PS_SLOWER, BUTTON_MENU, BUTTON_NONE}, 202 + {ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE}, 203 + {ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE}, 204 + {ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE}, 202 205 LAST_ITEM_IN_LIST 203 206 }; /* button_context_pitchscreen */ 204 207
+3 -2
apps/keymaps/keymap-ipod.c
··· 151 151 { ACTION_PS_NUDGE_RIGHT, BUTTON_RIGHT, BUTTON_NONE }, 152 152 { ACTION_PS_NUDGE_RIGHTOFF, BUTTON_RIGHT|BUTTON_REL, BUTTON_NONE }, 153 153 { ACTION_PS_TOGGLE_MODE, BUTTON_PLAY, BUTTON_NONE }, 154 - { ACTION_PS_RESET, BUTTON_MENU, BUTTON_NONE }, 155 - { ACTION_PS_EXIT, BUTTON_SELECT, BUTTON_NONE }, 154 + { ACTION_PS_EXIT, BUTTON_MENU, BUTTON_NONE }, 155 + { ACTION_PS_EXIT, BUTTON_SELECT|BUTTON_REL, BUTTON_SELECT}, 156 + { ACTION_PS_RESET, BUTTON_SELECT|BUTTON_REPEAT,BUTTON_SELECT}, 156 157 { ACTION_PS_SLOWER, BUTTON_LEFT|BUTTON_REPEAT, BUTTON_NONE }, 157 158 { ACTION_PS_FASTER, BUTTON_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, 158 159
+3 -3
apps/lang/bulgarian.lang
··· 14597 14597 </voice> 14598 14598 </phrase> 14599 14599 <phrase> 14600 - id: LANG_HIDE_ALBUM_TITLE_NEW 14601 - desc: in the pictureflow settings 14600 + id: LANG_HIDE_INFO 14601 + desc: Hide Information 14602 14602 user: core 14603 14603 <source> 14604 - *: "Hide information" 14604 + *: "Hide Information" 14605 14605 </source> 14606 14606 <dest> 14607 14607 *: "Скриване на информацията"
+151 -11
apps/lang/chinese-simp.lang
··· 14601 14601 </voice> 14602 14602 </phrase> 14603 14603 <phrase> 14604 - id: LANG_HIDE_ALBUM_TITLE_NEW 14605 - desc: in the pictureflow settings 14604 + id: LANG_HIDE_INFO 14605 + desc: Hide Information 14606 14606 user: core 14607 14607 <source> 14608 - *: "Hide information" 14608 + *: "Hide Information" 14609 14609 </source> 14610 14610 <dest> 14611 14611 *: "隐藏信息" ··· 14676 14676 user: core 14677 14677 <source> 14678 14678 *: "Press LEFT to cancel." 14679 - android,hifietma*,zenvision: "Press BACK to cancel." 14679 + android,hifietma*: "Press BACK to cancel." 14680 14680 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." 14681 14681 ihifi760,ihifi960: "Double tap RETURN to cancel." 14682 14682 ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." ··· 14691 14691 </source> 14692 14692 <dest> 14693 14693 *: "请按LEFT键取消。" 14694 - android,hifietma*,zenvision: "请按BACK键取消。" 14694 + android,hifietma*: "请按BACK键取消。" 14695 14695 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "请按POWER键取消。" 14696 14696 ihifi760,ihifi960: "双击RETURN键取消。" 14697 14697 ihifi770,ihifi770c,ihifi800: "请按HOME键取消。" ··· 14707 14707 </dest> 14708 14708 <voice> 14709 14709 *: "请按LEFT键取消" 14710 - android,hifietma*,zenvision: "请按BACK键取消" 14710 + android,hifietma*: "请按BACK键取消" 14711 14711 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "请按POWER键取消" 14712 14712 ihifi760,ihifi960: "双击RETURN键取消" 14713 14713 ihifi770,ihifi770c,ihifi800: "请按HOME键取消" ··· 15202 15202 </phrase> 15203 15203 <phrase> 15204 15204 id: LANG_VOICED_DATE_FORMAT 15205 - desc: format string for how dates will be read back. Y == 4-digit year, A == month name, m == numeric month, d == numeric day. For example, "AdY" will read "January 21 2021" 15205 + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one 15206 15206 user: core 15207 15207 <source> 15208 15208 *: "dAY" ··· 15811 15811 </phrase> 15812 15812 <phrase> 15813 15813 id: LANG_DEFAULT_BROWSER 15814 - desc: in Settings 15814 + desc: deprecated 15815 15815 user: core 15816 15816 <source> 15817 - *: "Default Browser" 15817 + *: "" 15818 15818 </source> 15819 15819 <dest> 15820 - *: "默认浏览器" 15820 + *: "" 15821 15821 </dest> 15822 15822 <voice> 15823 - *: "默认浏览器" 15823 + *: "" 15824 15824 </voice> 15825 15825 </phrase> 15826 15826 <phrase> ··· 16967 16967 *: "~U S B" 16968 16968 </voice> 16969 16969 </phrase> 16970 + <phrase> 16971 + id: LANG_ANNOUNCE_STATUS 16972 + desc: announnnce_status plugin 16973 + user: core 16974 + <source> 16975 + *: "Announce Status" 16976 + </source> 16977 + <dest> 16978 + *: "播报状态" 16979 + </dest> 16980 + <voice> 16981 + *: "播报状态" 16982 + </voice> 16983 + </phrase> 16984 + <phrase> 16985 + id: LANG_KEEP_DIRECTORY 16986 + desc: file browser setting 16987 + user: core 16988 + <source> 16989 + *: "Always remember last folder" 16990 + </source> 16991 + <dest> 16992 + *: "总是记住上次的文件夹" 16993 + </dest> 16994 + <voice> 16995 + *: "总是记住上次的文件夹" 16996 + </voice> 16997 + </phrase> 16998 + <phrase> 16999 + id: LANG_FILE_NOT_FOUND 17000 + desc: When file does not exist 17001 + user: core 17002 + <source> 17003 + *: "File not found" 17004 + </source> 17005 + <dest> 17006 + *: "找不到文件" 17007 + </dest> 17008 + <voice> 17009 + *: "找不到文件" 17010 + </voice> 17011 + </phrase> 17012 + <phrase> 17013 + id: LANG_SHOW_IN_FILES 17014 + desc: Reveal item in File Browser 17015 + user: core 17016 + <source> 17017 + *: "Show in Files" 17018 + </source> 17019 + <dest> 17020 + *: "按文件展示" 17021 + </dest> 17022 + <voice> 17023 + *: "按文件展示" 17024 + </voice> 17025 + </phrase> 17026 + <phrase> 17027 + id: LANG_CHANNEL_SWAP 17028 + desc: in sound_settings 17029 + user: core 17030 + <source> 17031 + *: "Swap Left & Right" 17032 + </source> 17033 + <dest> 17034 + *: "切换左&右" 17035 + </dest> 17036 + <voice> 17037 + *: "切换左右" 17038 + </voice> 17039 + </phrase> 17040 + <phrase> 17041 + id: LANG_COUNTDOWN_TIMER_SET 17042 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17043 + user: core 17044 + <source> 17045 + *: "SET TIMER" 17046 + </source> 17047 + <dest> 17048 + *: "设定计时器" 17049 + </dest> 17050 + <voice> 17051 + *: "设定计时器" 17052 + </voice> 17053 + </phrase> 17054 + <phrase> 17055 + id: LANG_COUNTDOWN_TIMER_RUNNING 17056 + desc: countdown_timer plugin - status label shown while the countdown is active 17057 + user: core 17058 + <source> 17059 + *: "RUNNING" 17060 + </source> 17061 + <dest> 17062 + *: "运行中" 17063 + </dest> 17064 + <voice> 17065 + *: "运行中" 17066 + </voice> 17067 + </phrase> 17068 + <phrase> 17069 + id: LANG_COUNTDOWN_TIMER_PAUSED 17070 + desc: countdown_timer plugin - status label shown while the countdown is paused 17071 + user: core 17072 + <source> 17073 + *: "PAUSED" 17074 + </source> 17075 + <dest> 17076 + *: "暂停" 17077 + </dest> 17078 + <voice> 17079 + *: "暂停" 17080 + </voice> 17081 + </phrase> 17082 + <phrase> 17083 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17084 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17085 + user: core 17086 + <source> 17087 + *: "OVERTIME" 17088 + </source> 17089 + <dest> 17090 + *: "超时" 17091 + </dest> 17092 + <voice> 17093 + *: "超时" 17094 + </voice> 17095 + </phrase> 17096 + <phrase> 17097 + id: LANG_COUNTDOWN_TIMER_FINISHED 17098 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17099 + user: core 17100 + <source> 17101 + *: "FINISHED" 17102 + </source> 17103 + <dest> 17104 + *: "完成" 17105 + </dest> 17106 + <voice> 17107 + *: "完成" 17108 + </voice> 17109 + </phrase>
+3 -3
apps/lang/deutsch.lang
··· 14615 14615 </voice> 14616 14616 </phrase> 14617 14617 <phrase> 14618 - id: LANG_HIDE_ALBUM_TITLE_NEW 14619 - desc: in the pictureflow settings 14618 + id: LANG_HIDE_INFO 14619 + desc: Hide Information 14620 14620 user: core 14621 14621 <source> 14622 - *: "Hide information" 14622 + *: "Hide Information" 14623 14623 </source> 14624 14624 <dest> 14625 14625 *: "Information verbergen"
+121 -9
apps/lang/english-us.lang
··· 14591 14591 </voice> 14592 14592 </phrase> 14593 14593 <phrase> 14594 - id: LANG_HIDE_ALBUM_TITLE_NEW 14595 - desc: in the pictureflow settings 14594 + id: LANG_HIDE_INFO 14595 + desc: Hide Information 14596 14596 user: core 14597 14597 <source> 14598 - *: "Hide information" 14598 + *: "Hide Information" 14599 14599 </source> 14600 14600 <dest> 14601 - *: "Hide information" 14601 + *: "Hide Information" 14602 14602 </dest> 14603 14603 <voice> 14604 - *: "Hide information" 14604 + *: "Hide Information" 14605 14605 </voice> 14606 14606 </phrase> 14607 14607 <phrase> ··· 15800 15800 </phrase> 15801 15801 <phrase> 15802 15802 id: LANG_DEFAULT_BROWSER 15803 - desc: in Settings 15803 + desc: deprecated 15804 15804 user: core 15805 15805 <source> 15806 - *: "Default Browser" 15806 + *: "" 15807 15807 </source> 15808 15808 <dest> 15809 - *: "Default Browser" 15809 + *: "" 15810 15810 </dest> 15811 15811 <voice> 15812 - *: "Default Browser" 15812 + *: "" 15813 15813 </voice> 15814 15814 </phrase> 15815 15815 <phrase> ··· 16984 16984 *: "U S B" 16985 16985 </voice> 16986 16986 </phrase> 16987 + <phrase> 16988 + id: LANG_COUNTDOWN_TIMER_SET 16989 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 16990 + user: core 16991 + <source> 16992 + *: "SET TIMER" 16993 + </source> 16994 + <dest> 16995 + *: "SET TIMER" 16996 + </dest> 16997 + <voice> 16998 + *: "Set timer" 16999 + </voice> 17000 + </phrase> 17001 + <phrase> 17002 + id: LANG_COUNTDOWN_TIMER_RUNNING 17003 + desc: countdown_timer plugin - status label shown while the countdown is active 17004 + user: core 17005 + <source> 17006 + *: "RUNNING" 17007 + </source> 17008 + <dest> 17009 + *: "RUNNING" 17010 + </dest> 17011 + <voice> 17012 + *: "Running" 17013 + </voice> 17014 + </phrase> 17015 + <phrase> 17016 + id: LANG_COUNTDOWN_TIMER_PAUSED 17017 + desc: countdown_timer plugin - status label shown while the countdown is paused 17018 + user: core 17019 + <source> 17020 + *: "PAUSED" 17021 + </source> 17022 + <dest> 17023 + *: "PAUSED" 17024 + </dest> 17025 + <voice> 17026 + *: "Paused" 17027 + </voice> 17028 + </phrase> 17029 + <phrase> 17030 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17031 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17032 + user: core 17033 + <source> 17034 + *: "OVERTIME" 17035 + </source> 17036 + <dest> 17037 + *: "OVERTIME" 17038 + </dest> 17039 + <voice> 17040 + *: "Overtime" 17041 + </voice> 17042 + </phrase> 17043 + <phrase> 17044 + id: LANG_COUNTDOWN_TIMER_FINISHED 17045 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17046 + user: core 17047 + <source> 17048 + *: "FINISHED" 17049 + </source> 17050 + <dest> 17051 + *: "FINISHED" 17052 + </dest> 17053 + <voice> 17054 + *: "Finished" 17055 + </voice> 17056 + </phrase> 17057 + <phrase> 17058 + id: LANG_FILE_NOT_FOUND 17059 + desc: When file does not exist 17060 + user: core 17061 + <source> 17062 + *: "File not found" 17063 + </source> 17064 + <dest> 17065 + *: "File not found" 17066 + </dest> 17067 + <voice> 17068 + *: "File not found" 17069 + </voice> 17070 + </phrase> 17071 + <phrase> 17072 + id: LANG_SHOW_IN_FILES 17073 + desc: Reveal item in File Browser 17074 + user: core 17075 + <source> 17076 + *: "Show in Files" 17077 + </source> 17078 + <dest> 17079 + *: "Show in Files" 17080 + </dest> 17081 + <voice> 17082 + *: "Show in Files" 17083 + </voice> 17084 + </phrase> 17085 + <phrase> 17086 + id: LANG_CHANNEL_SWAP 17087 + desc: in sound_settings 17088 + user: core 17089 + <source> 17090 + *: "Swap Left & Right" 17091 + </source> 17092 + <dest> 17093 + *: "Swap Left & Right" 17094 + </dest> 17095 + <voice> 17096 + *: "Swap Left & Right" 17097 + </voice> 17098 + </phrase>
+117 -5
apps/lang/english.lang
··· 14844 14844 </voice> 14845 14845 </phrase> 14846 14846 <phrase> 14847 - id: LANG_HIDE_ALBUM_TITLE_NEW 14848 - desc: in the pictureflow settings 14847 + id: LANG_HIDE_INFO 14848 + desc: Hide Information 14849 14849 user: core 14850 14850 <source> 14851 - *: "Hide information" 14851 + *: "Hide Information" 14852 14852 </source> 14853 14853 <dest> 14854 - *: "Hide information" 14854 + *: "Hide Information" 14855 14855 </dest> 14856 14856 <voice> 14857 - *: "Hide information" 14857 + *: "Hide Information" 14858 14858 </voice> 14859 14859 </phrase> 14860 14860 <phrase> ··· 17057 17057 *: "U S B" 17058 17058 </voice> 17059 17059 </phrase> 17060 + <phrase> 17061 + id: LANG_FILE_NOT_FOUND 17062 + desc: When file does not exist 17063 + user: core 17064 + <source> 17065 + *: "File not found" 17066 + </source> 17067 + <dest> 17068 + *: "File not found" 17069 + </dest> 17070 + <voice> 17071 + *: "File not found" 17072 + </voice> 17073 + </phrase> 17074 + <phrase> 17075 + id: LANG_SHOW_IN_FILES 17076 + desc: Reveal item in File Browser 17077 + user: core 17078 + <source> 17079 + *: "Show in Files" 17080 + </source> 17081 + <dest> 17082 + *: "Show in Files" 17083 + </dest> 17084 + <voice> 17085 + *: "Show in Files" 17086 + </voice> 17087 + </phrase> 17088 + <phrase> 17089 + id: LANG_CHANNEL_SWAP 17090 + desc: in sound_settings 17091 + user: core 17092 + <source> 17093 + *: "Swap Left & Right" 17094 + </source> 17095 + <dest> 17096 + *: "Swap Left & Right" 17097 + </dest> 17098 + <voice> 17099 + *: "Swap Left & Right" 17100 + </voice> 17101 + </phrase> 17102 + <phrase> 17103 + id: LANG_COUNTDOWN_TIMER_SET 17104 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17105 + user: core 17106 + <source> 17107 + *: "SET TIMER" 17108 + </source> 17109 + <dest> 17110 + *: "SET TIMER" 17111 + </dest> 17112 + <voice> 17113 + *: "Set timer" 17114 + </voice> 17115 + </phrase> 17116 + <phrase> 17117 + id: LANG_COUNTDOWN_TIMER_RUNNING 17118 + desc: countdown_timer plugin - status label shown while the countdown is active 17119 + user: core 17120 + <source> 17121 + *: "RUNNING" 17122 + </source> 17123 + <dest> 17124 + *: "RUNNING" 17125 + </dest> 17126 + <voice> 17127 + *: "Running" 17128 + </voice> 17129 + </phrase> 17130 + <phrase> 17131 + id: LANG_COUNTDOWN_TIMER_PAUSED 17132 + desc: countdown_timer plugin - status label shown while the countdown is paused 17133 + user: core 17134 + <source> 17135 + *: "PAUSED" 17136 + </source> 17137 + <dest> 17138 + *: "PAUSED" 17139 + </dest> 17140 + <voice> 17141 + *: "Paused" 17142 + </voice> 17143 + </phrase> 17144 + <phrase> 17145 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17146 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17147 + user: core 17148 + <source> 17149 + *: "OVERTIME" 17150 + </source> 17151 + <dest> 17152 + *: "OVERTIME" 17153 + </dest> 17154 + <voice> 17155 + *: "Overtime" 17156 + </voice> 17157 + </phrase> 17158 + <phrase> 17159 + id: LANG_COUNTDOWN_TIMER_FINISHED 17160 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17161 + user: core 17162 + <source> 17163 + *: "FINISHED" 17164 + </source> 17165 + <dest> 17166 + *: "FINISHED" 17167 + </dest> 17168 + <voice> 17169 + *: "Finished" 17170 + </voice> 17171 + </phrase>
+3 -3
apps/lang/espanol.lang
··· 14701 14701 </voice> 14702 14702 </phrase> 14703 14703 <phrase> 14704 - id: LANG_HIDE_ALBUM_TITLE_NEW 14705 - desc: in the pictureflow settings 14704 + id: LANG_HIDE_INFO 14705 + desc: Hide Information 14706 14706 user: core 14707 14707 <source> 14708 - *: "Hide information" 14708 + *: "Hide Information" 14709 14709 </source> 14710 14710 <dest> 14711 14711 *: "Ocultar información"
+3 -3
apps/lang/francais.lang
··· 12290 12290 </voice> 12291 12291 </phrase> 12292 12292 <phrase> 12293 - id: LANG_HIDE_ALBUM_TITLE_NEW 12294 - desc: in the pictureflow settings 12293 + id: LANG_HIDE_INFO 12294 + desc: Hide Information 12295 12295 user: core 12296 12296 <source> 12297 - *: "Hide information" 12297 + *: "Hide Information" 12298 12298 </source> 12299 12299 <dest> 12300 12300 *: "Masquer les informations"
+119 -7
apps/lang/italiano.lang
··· 14300 14300 </voice> 14301 14301 </phrase> 14302 14302 <phrase> 14303 - id: LANG_HIDE_ALBUM_TITLE_NEW 14304 - desc: in the pictureflow settings 14303 + id: LANG_HIDE_INFO 14304 + desc: Hide Information 14305 14305 user: core 14306 14306 <source> 14307 - *: "Hide information" 14307 + *: "Hide Information" 14308 14308 </source> 14309 14309 <dest> 14310 14310 *: "Nascondere le informazioni" ··· 15804 15804 </phrase> 15805 15805 <phrase> 15806 15806 id: LANG_DEFAULT_BROWSER 15807 - desc: in Settings 15807 + desc: deprecated 15808 15808 user: core 15809 15809 <source> 15810 - *: "Default Browser" 15810 + *: "" 15811 15811 </source> 15812 15812 <dest> 15813 - *: "Browser Predefinito" 15813 + *: "" 15814 15814 </dest> 15815 15815 <voice> 15816 - *: "Browser Predefinito" 15816 + *: "" 15817 15817 </voice> 15818 15818 </phrase> 15819 15819 <phrase> ··· 16988 16988 *: "~U S B" 16989 16989 </voice> 16990 16990 </phrase> 16991 + <phrase> 16992 + id: LANG_FILE_NOT_FOUND 16993 + desc: When file does not exist 16994 + user: core 16995 + <source> 16996 + *: "File not found" 16997 + </source> 16998 + <dest> 16999 + *: "File non trovato" 17000 + </dest> 17001 + <voice> 17002 + *: "File non trovato" 17003 + </voice> 17004 + </phrase> 17005 + <phrase> 17006 + id: LANG_SHOW_IN_FILES 17007 + desc: Reveal item in File Browser 17008 + user: core 17009 + <source> 17010 + *: "Show in Files" 17011 + </source> 17012 + <dest> 17013 + *: "Mostra nei file" 17014 + </dest> 17015 + <voice> 17016 + *: "Mostra nei file" 17017 + </voice> 17018 + </phrase> 17019 + <phrase> 17020 + id: LANG_CHANNEL_SWAP 17021 + desc: in sound_settings 17022 + user: core 17023 + <source> 17024 + *: "Swap Left & Right" 17025 + </source> 17026 + <dest> 17027 + *: "Scambia sinistro & destro" 17028 + </dest> 17029 + <voice> 17030 + *: "Scambia sinistro e destro" 17031 + </voice> 17032 + </phrase> 17033 + <phrase> 17034 + id: LANG_COUNTDOWN_TIMER_SET 17035 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17036 + user: core 17037 + <source> 17038 + *: "SET TIMER" 17039 + </source> 17040 + <dest> 17041 + *: "IMPOSTA TIMER" 17042 + </dest> 17043 + <voice> 17044 + *: "Imposta timer" 17045 + </voice> 17046 + </phrase> 17047 + <phrase> 17048 + id: LANG_COUNTDOWN_TIMER_RUNNING 17049 + desc: countdown_timer plugin - status label shown while the countdown is active 17050 + user: core 17051 + <source> 17052 + *: "RUNNING" 17053 + </source> 17054 + <dest> 17055 + *: "IN CORSO" 17056 + </dest> 17057 + <voice> 17058 + *: "In corso" 17059 + </voice> 17060 + </phrase> 17061 + <phrase> 17062 + id: LANG_COUNTDOWN_TIMER_PAUSED 17063 + desc: countdown_timer plugin - status label shown while the countdown is paused 17064 + user: core 17065 + <source> 17066 + *: "PAUSED" 17067 + </source> 17068 + <dest> 17069 + *: "IN PAUSA" 17070 + </dest> 17071 + <voice> 17072 + *: "In pausa" 17073 + </voice> 17074 + </phrase> 17075 + <phrase> 17076 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17077 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17078 + user: core 17079 + <source> 17080 + *: "OVERTIME" 17081 + </source> 17082 + <dest> 17083 + *: "TEMPO SUPPLEMENTARE" 17084 + </dest> 17085 + <voice> 17086 + *: "Tempo supplementare" 17087 + </voice> 17088 + </phrase> 17089 + <phrase> 17090 + id: LANG_COUNTDOWN_TIMER_FINISHED 17091 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17092 + user: core 17093 + <source> 17094 + *: "FINISHED" 17095 + </source> 17096 + <dest> 17097 + *: "TERMINATO" 17098 + </dest> 17099 + <voice> 17100 + *: "Terminato" 17101 + </voice> 17102 + </phrase>
+3 -3
apps/lang/japanese.lang
··· 14794 14794 </voice> 14795 14795 </phrase> 14796 14796 <phrase> 14797 - id: LANG_HIDE_ALBUM_TITLE_NEW 14798 - desc: in the pictureflow settings 14797 + id: LANG_HIDE_INFO 14798 + desc: Hide Information 14799 14799 user: core 14800 14800 <source> 14801 - *: "Hide information" 14801 + *: "Hide Information" 14802 14802 </source> 14803 14803 <dest> 14804 14804 *: "情報を隠す"
+119 -7
apps/lang/korean.lang
··· 14609 14609 </voice> 14610 14610 </phrase> 14611 14611 <phrase> 14612 - id: LANG_HIDE_ALBUM_TITLE_NEW 14613 - desc: in the pictureflow settings 14612 + id: LANG_HIDE_INFO 14613 + desc: Hide Information 14614 14614 user: core 14615 14615 <source> 14616 - *: "Hide information" 14616 + *: "Hide Information" 14617 14617 </source> 14618 14618 <dest> 14619 14619 *: "정보 숨기기" ··· 15818 15818 </phrase> 15819 15819 <phrase> 15820 15820 id: LANG_DEFAULT_BROWSER 15821 - desc: in Settings 15821 + desc: deprecated 15822 15822 user: core 15823 15823 <source> 15824 - *: "Default Browser" 15824 + *: "" 15825 15825 </source> 15826 15826 <dest> 15827 - *: "기본 탐색기" 15827 + *: "" 15828 15828 </dest> 15829 15829 <voice> 15830 - *: "기본 탐색기" 15830 + *: "" 15831 15831 </voice> 15832 15832 </phrase> 15833 15833 <phrase> ··· 17002 17002 *: "~U S B" 17003 17003 </voice> 17004 17004 </phrase> 17005 + <phrase> 17006 + id: LANG_FILE_NOT_FOUND 17007 + desc: When file does not exist 17008 + user: core 17009 + <source> 17010 + *: "File not found" 17011 + </source> 17012 + <dest> 17013 + *: "파일을 찾을 수 없음" 17014 + </dest> 17015 + <voice> 17016 + *: "파일을 찾을 수 없음" 17017 + </voice> 17018 + </phrase> 17019 + <phrase> 17020 + id: LANG_SHOW_IN_FILES 17021 + desc: Reveal item in File Browser 17022 + user: core 17023 + <source> 17024 + *: "Show in Files" 17025 + </source> 17026 + <dest> 17027 + *: "파일에서 표시" 17028 + </dest> 17029 + <voice> 17030 + *: "파일에서 표시" 17031 + </voice> 17032 + </phrase> 17033 + <phrase> 17034 + id: LANG_CHANNEL_SWAP 17035 + desc: in sound_settings 17036 + user: core 17037 + <source> 17038 + *: "Swap Left & Right" 17039 + </source> 17040 + <dest> 17041 + *: "왼쪽과 오른쪽 바꾸기" 17042 + </dest> 17043 + <voice> 17044 + *: "왼쪽과 오른쪽 바꾸기" 17045 + </voice> 17046 + </phrase> 17047 + <phrase> 17048 + id: LANG_COUNTDOWN_TIMER_SET 17049 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17050 + user: core 17051 + <source> 17052 + *: "SET TIMER" 17053 + </source> 17054 + <dest> 17055 + *: "타이머 설정" 17056 + </dest> 17057 + <voice> 17058 + *: "타이머 설정" 17059 + </voice> 17060 + </phrase> 17061 + <phrase> 17062 + id: LANG_COUNTDOWN_TIMER_RUNNING 17063 + desc: countdown_timer plugin - status label shown while the countdown is active 17064 + user: core 17065 + <source> 17066 + *: "RUNNING" 17067 + </source> 17068 + <dest> 17069 + *: "실행 중" 17070 + </dest> 17071 + <voice> 17072 + *: "실행 중" 17073 + </voice> 17074 + </phrase> 17075 + <phrase> 17076 + id: LANG_COUNTDOWN_TIMER_PAUSED 17077 + desc: countdown_timer plugin - status label shown while the countdown is paused 17078 + user: core 17079 + <source> 17080 + *: "PAUSED" 17081 + </source> 17082 + <dest> 17083 + *: "일시 중지" 17084 + </dest> 17085 + <voice> 17086 + *: "일시 중지" 17087 + </voice> 17088 + </phrase> 17089 + <phrase> 17090 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17091 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17092 + user: core 17093 + <source> 17094 + *: "OVERTIME" 17095 + </source> 17096 + <dest> 17097 + *: "초과 시간" 17098 + </dest> 17099 + <voice> 17100 + *: "초과 시간" 17101 + </voice> 17102 + </phrase> 17103 + <phrase> 17104 + id: LANG_COUNTDOWN_TIMER_FINISHED 17105 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17106 + user: core 17107 + <source> 17108 + *: "FINISHED" 17109 + </source> 17110 + <dest> 17111 + *: "완료" 17112 + </dest> 17113 + <voice> 17114 + *: "완료" 17115 + </voice> 17116 + </phrase>
+3 -3
apps/lang/latviesu.lang
··· 14706 14706 </voice> 14707 14707 </phrase> 14708 14708 <phrase> 14709 - id: LANG_HIDE_ALBUM_TITLE_NEW 14710 - desc: in the pictureflow settings 14709 + id: LANG_HIDE_INFO 14710 + desc: Hide Information 14711 14711 user: core 14712 14712 <source> 14713 - *: "Hide information" 14713 + *: "Hide Information" 14714 14714 </source> 14715 14715 <dest> 14716 14716 *: "Paslēpt informāciju"
+3 -3
apps/lang/magyar.lang
··· 14709 14709 </voice> 14710 14710 </phrase> 14711 14711 <phrase> 14712 - id: LANG_HIDE_ALBUM_TITLE_NEW 14713 - desc: in the pictureflow settings 14712 + id: LANG_HIDE_INFO 14713 + desc: Hide Information 14714 14714 user: core 14715 14715 <source> 14716 - *: "Hide information" 14716 + *: "Hide Information" 14717 14717 </source> 14718 14718 <dest> 14719 14719 *: "Információ elrejtése"
+3 -3
apps/lang/moldoveneste.lang
··· 14712 14712 </voice> 14713 14713 </phrase> 14714 14714 <phrase> 14715 - id: LANG_HIDE_ALBUM_TITLE_NEW 14716 - desc: in the pictureflow settings 14715 + id: LANG_HIDE_INFO 14716 + desc: Hide Information 14717 14717 user: core 14718 14718 <source> 14719 - *: "Hide information" 14719 + *: "Hide Information" 14720 14720 </source> 14721 14721 <dest> 14722 14722 *: "Ascunde informațiile"
+3 -3
apps/lang/nederlands.lang
··· 14360 14360 </voice> 14361 14361 </phrase> 14362 14362 <phrase> 14363 - id: LANG_HIDE_ALBUM_TITLE_NEW 14364 - desc: in the pictureflow settings 14363 + id: LANG_HIDE_INFO 14364 + desc: Hide Information 14365 14365 user: core 14366 14366 <source> 14367 - *: "Hide information" 14367 + *: "Hide Information" 14368 14368 </source> 14369 14369 <dest> 14370 14370 *: "Verberg informatie"
+3 -3
apps/lang/norsk-nynorsk.lang
··· 14779 14779 </voice> 14780 14780 </phrase> 14781 14781 <phrase> 14782 - id: LANG_HIDE_ALBUM_TITLE_NEW 14783 - desc: in the pictureflow settings 14782 + id: LANG_HIDE_INFO 14783 + desc: Hide Information 14784 14784 user: core 14785 14785 <source> 14786 - *: "Hide information" 14786 + *: "Hide Information" 14787 14787 </source> 14788 14788 <dest> 14789 14789 *: "Gøym informasjon"
+119 -7
apps/lang/polski.lang
··· 14306 14306 </voice> 14307 14307 </phrase> 14308 14308 <phrase> 14309 - id: LANG_HIDE_ALBUM_TITLE_NEW 14310 - desc: in the pictureflow settings 14309 + id: LANG_HIDE_INFO 14310 + desc: Hide Information 14311 14311 user: core 14312 14312 <source> 14313 - *: "Hide information" 14313 + *: "Hide Information" 14314 14314 </source> 14315 14315 <dest> 14316 14316 *: "Ukryj informacje" ··· 15810 15810 </phrase> 15811 15811 <phrase> 15812 15812 id: LANG_DEFAULT_BROWSER 15813 - desc: in Settings 15813 + desc: deprecated 15814 15814 user: core 15815 15815 <source> 15816 - *: "Default Browser" 15816 + *: "" 15817 15817 </source> 15818 15818 <dest> 15819 - *: "Przeglądarka domyślna" 15819 + *: "" 15820 15820 </dest> 15821 15821 <voice> 15822 - *: "Przeglądarka domyślna" 15822 + *: "" 15823 15823 </voice> 15824 15824 </phrase> 15825 15825 <phrase> ··· 16994 16994 *: "u es be" 16995 16995 </voice> 16996 16996 </phrase> 16997 + <phrase> 16998 + id: LANG_FILE_NOT_FOUND 16999 + desc: When file does not exist 17000 + user: core 17001 + <source> 17002 + *: "File not found" 17003 + </source> 17004 + <dest> 17005 + *: "Plik nie został znaleziony" 17006 + </dest> 17007 + <voice> 17008 + *: "Plik nie został znaleziony" 17009 + </voice> 17010 + </phrase> 17011 + <phrase> 17012 + id: LANG_SHOW_IN_FILES 17013 + desc: Reveal item in File Browser 17014 + user: core 17015 + <source> 17016 + *: "Show in Files" 17017 + </source> 17018 + <dest> 17019 + *: "Pokaż w plikach" 17020 + </dest> 17021 + <voice> 17022 + *: "Pokaż w plikach" 17023 + </voice> 17024 + </phrase> 17025 + <phrase> 17026 + id: LANG_CHANNEL_SWAP 17027 + desc: in sound_settings 17028 + user: core 17029 + <source> 17030 + *: "Swap Left & Right" 17031 + </source> 17032 + <dest> 17033 + *: "Zamień lewy i prawy" 17034 + </dest> 17035 + <voice> 17036 + *: "Zamień lewy i prawy" 17037 + </voice> 17038 + </phrase> 17039 + <phrase> 17040 + id: LANG_COUNTDOWN_TIMER_SET 17041 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17042 + user: core 17043 + <source> 17044 + *: "SET TIMER" 17045 + </source> 17046 + <dest> 17047 + *: "USTAW MINUTNIK" 17048 + </dest> 17049 + <voice> 17050 + *: "Ustaw minutnik" 17051 + </voice> 17052 + </phrase> 17053 + <phrase> 17054 + id: LANG_COUNTDOWN_TIMER_RUNNING 17055 + desc: countdown_timer plugin - status label shown while the countdown is active 17056 + user: core 17057 + <source> 17058 + *: "RUNNING" 17059 + </source> 17060 + <dest> 17061 + *: "URUCHOMIONO" 17062 + </dest> 17063 + <voice> 17064 + *: "Uruchomiono" 17065 + </voice> 17066 + </phrase> 17067 + <phrase> 17068 + id: LANG_COUNTDOWN_TIMER_PAUSED 17069 + desc: countdown_timer plugin - status label shown while the countdown is paused 17070 + user: core 17071 + <source> 17072 + *: "PAUSED" 17073 + </source> 17074 + <dest> 17075 + *: "WSTRZYMANO" 17076 + </dest> 17077 + <voice> 17078 + *: "Wstrzymano" 17079 + </voice> 17080 + </phrase> 17081 + <phrase> 17082 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17083 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17084 + user: core 17085 + <source> 17086 + *: "OVERTIME" 17087 + </source> 17088 + <dest> 17089 + *: "PRZEDŁUŻONO" 17090 + </dest> 17091 + <voice> 17092 + *: "Przedłużno" 17093 + </voice> 17094 + </phrase> 17095 + <phrase> 17096 + id: LANG_COUNTDOWN_TIMER_FINISHED 17097 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17098 + user: core 17099 + <source> 17100 + *: "FINISHED" 17101 + </source> 17102 + <dest> 17103 + *: "UKOŃCZONO" 17104 + </dest> 17105 + <voice> 17106 + *: "Ukończono" 17107 + </voice> 17108 + </phrase>
+3 -3
apps/lang/portugues-brasileiro.lang
··· 14817 14817 </voice> 14818 14818 </phrase> 14819 14819 <phrase> 14820 - id: LANG_HIDE_ALBUM_TITLE_NEW 14821 - desc: in the pictureflow settings 14820 + id: LANG_HIDE_INFO 14821 + desc: Hide Information 14822 14822 user: core 14823 14823 <source> 14824 - *: "Hide information" 14824 + *: "Hide Information" 14825 14825 </source> 14826 14826 <dest> 14827 14827 *: "Ocultar informações"
+3 -3
apps/lang/romaneste.lang
··· 14712 14712 </voice> 14713 14713 </phrase> 14714 14714 <phrase> 14715 - id: LANG_HIDE_ALBUM_TITLE_NEW 14716 - desc: in the pictureflow settings 14715 + id: LANG_HIDE_INFO 14716 + desc: Hide Information 14717 14717 user: core 14718 14718 <source> 14719 - *: "Hide information" 14719 + *: "Hide Information" 14720 14720 </source> 14721 14721 <dest> 14722 14722 *: "Ascunde informațiile"
+3 -3
apps/lang/russian.lang
··· 14328 14328 </voice> 14329 14329 </phrase> 14330 14330 <phrase> 14331 - id: LANG_HIDE_ALBUM_TITLE_NEW 14332 - desc: in the pictureflow settings 14331 + id: LANG_HIDE_INFO 14332 + desc: Hide Information 14333 14333 user: core 14334 14334 <source> 14335 - *: "Hide information" 14335 + *: "Hide Information" 14336 14336 </source> 14337 14337 <dest> 14338 14338 *: "Ничего не показывать"
+119 -7
apps/lang/slovak.lang
··· 14326 14326 </voice> 14327 14327 </phrase> 14328 14328 <phrase> 14329 - id: LANG_HIDE_ALBUM_TITLE_NEW 14330 - desc: in the pictureflow settings 14329 + id: LANG_HIDE_INFO 14330 + desc: Hide Information 14331 14331 user: core 14332 14332 <source> 14333 - *: "Hide information" 14333 + *: "Hide Information" 14334 14334 </source> 14335 14335 <dest> 14336 14336 *: "Skryť info" ··· 15930 15930 </phrase> 15931 15931 <phrase> 15932 15932 id: LANG_DEFAULT_BROWSER 15933 - desc: in Settings 15933 + desc: deprecated 15934 15934 user: core 15935 15935 <source> 15936 - *: "Default Browser" 15936 + *: "" 15937 15937 </source> 15938 15938 <dest> 15939 - *: "Predvolený prehliadač" 15939 + *: "" 15940 15940 </dest> 15941 15941 <voice> 15942 - *: "Predvolený prehliadač" 15942 + *: "" 15943 15943 </voice> 15944 15944 </phrase> 15945 15945 <phrase> ··· 16988 16988 *: "~U S B" 16989 16989 </voice> 16990 16990 </phrase> 16991 + <phrase> 16992 + id: LANG_FILE_NOT_FOUND 16993 + desc: When file does not exist 16994 + user: core 16995 + <source> 16996 + *: "File not found" 16997 + </source> 16998 + <dest> 16999 + *: "Súbor nebol nájdený" 17000 + </dest> 17001 + <voice> 17002 + *: "Súbor nebol nájdený" 17003 + </voice> 17004 + </phrase> 17005 + <phrase> 17006 + id: LANG_SHOW_IN_FILES 17007 + desc: Reveal item in File Browser 17008 + user: core 17009 + <source> 17010 + *: "Show in Files" 17011 + </source> 17012 + <dest> 17013 + *: "Ukázať v Súboroch" 17014 + </dest> 17015 + <voice> 17016 + *: "Ukázať v Súboroch" 17017 + </voice> 17018 + </phrase> 17019 + <phrase> 17020 + id: LANG_CHANNEL_SWAP 17021 + desc: in sound_settings 17022 + user: core 17023 + <source> 17024 + *: "Swap Left & Right" 17025 + </source> 17026 + <dest> 17027 + *: "Zameniť ľavý a pravý" 17028 + </dest> 17029 + <voice> 17030 + *: "Zameniť ľavý a pravý" 17031 + </voice> 17032 + </phrase> 17033 + <phrase> 17034 + id: LANG_COUNTDOWN_TIMER_SET 17035 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17036 + user: core 17037 + <source> 17038 + *: "SET TIMER" 17039 + </source> 17040 + <dest> 17041 + *: "NASTAVIŤ ČASOVAČ" 17042 + </dest> 17043 + <voice> 17044 + *: "Nastaviť časovač" 17045 + </voice> 17046 + </phrase> 17047 + <phrase> 17048 + id: LANG_COUNTDOWN_TIMER_RUNNING 17049 + desc: countdown_timer plugin - status label shown while the countdown is active 17050 + user: core 17051 + <source> 17052 + *: "RUNNING" 17053 + </source> 17054 + <dest> 17055 + *: "BEŽÍ" 17056 + </dest> 17057 + <voice> 17058 + *: "Beží" 17059 + </voice> 17060 + </phrase> 17061 + <phrase> 17062 + id: LANG_COUNTDOWN_TIMER_PAUSED 17063 + desc: countdown_timer plugin - status label shown while the countdown is paused 17064 + user: core 17065 + <source> 17066 + *: "PAUSED" 17067 + </source> 17068 + <dest> 17069 + *: "POZASTAVENÝ" 17070 + </dest> 17071 + <voice> 17072 + *: "Pozastavený" 17073 + </voice> 17074 + </phrase> 17075 + <phrase> 17076 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17077 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17078 + user: core 17079 + <source> 17080 + *: "OVERTIME" 17081 + </source> 17082 + <dest> 17083 + *: "NADČAS" 17084 + </dest> 17085 + <voice> 17086 + *: "Nadčas" 17087 + </voice> 17088 + </phrase> 17089 + <phrase> 17090 + id: LANG_COUNTDOWN_TIMER_FINISHED 17091 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17092 + user: core 17093 + <source> 17094 + *: "FINISHED" 17095 + </source> 17096 + <dest> 17097 + *: "UKONČENÝ" 17098 + </dest> 17099 + <voice> 17100 + *: "Ukončený" 17101 + </voice> 17102 + </phrase>
+3 -3
apps/lang/srpski.lang
··· 14705 14705 </voice> 14706 14706 </phrase> 14707 14707 <phrase> 14708 - id: LANG_HIDE_ALBUM_TITLE_NEW 14709 - desc: in the pictureflow settings 14708 + id: LANG_HIDE_INFO 14709 + desc: Hide Information 14710 14710 user: core 14711 14711 <source> 14712 - *: "Hide information" 14712 + *: "Hide Information" 14713 14713 </source> 14714 14714 <dest> 14715 14715 *: "Сакриј информације"
+152 -12
apps/lang/svenska.lang
··· 14714 14714 </voice> 14715 14715 </phrase> 14716 14716 <phrase> 14717 - id: LANG_HIDE_ALBUM_TITLE_NEW 14718 - desc: in the pictureflow settings 14717 + id: LANG_HIDE_INFO 14718 + desc: Hide Information 14719 14719 user: core 14720 14720 <source> 14721 - *: "Hide information" 14721 + *: "Hide Information" 14722 14722 </source> 14723 14723 <dest> 14724 14724 *: "Göm information" ··· 14789 14789 user: core 14790 14790 <source> 14791 14791 *: "Press LEFT to cancel." 14792 - android,hifietma*,zenvision: "Press BACK to cancel." 14792 + android,hifietma*: "Press BACK to cancel." 14793 14793 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." 14794 14794 ihifi760,ihifi960: "Double tap RETURN to cancel." 14795 14795 ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." ··· 14804 14804 </source> 14805 14805 <dest> 14806 14806 *: "Tryck på VÄNSTER för att avbryta." 14807 - android,hifietma*,zenvision: "Tryck på TILLBAKA för att avbryta." 14807 + android,hifietma*: "Tryck på TILLBAKA för att avbryta." 14808 14808 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Tryck på POWER för att avbryta." 14809 14809 ihifi760,ihifi960: "Dubbelklicka på RETURN för att avbryta." 14810 14810 ihifi770,ihifi770c,ihifi800: "Tryck på HOME för att avbryta." ··· 14819 14819 </dest> 14820 14820 <voice> 14821 14821 *: "Tryck på VÄNSTER för att avbryta." 14822 - android,hifietma*,zenvision: "Tryck på TILLBAKA för att avbryta." 14822 + android,hifietma*: "Tryck på TILLBAKA för att avbryta." 14823 14823 cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Tryck på POWER för att avbryta." 14824 14824 ihifi760,ihifi960: "Dubbelklicka på RETURN för att avbryta." 14825 14825 ihifi770,ihifi770c,ihifi800: "Tryck på HOME för att avbryta." ··· 15314 15314 </phrase> 15315 15315 <phrase> 15316 15316 id: LANG_VOICED_DATE_FORMAT 15317 - desc: format string for how dates will be read back. Y == 4-digit year, A == month name, m == numeric month, d == numeric day. For example, "AdY" will read "January 21 2021" 15317 + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one 15318 15318 user: core 15319 15319 <source> 15320 15320 *: "dAY" 15321 15321 </source> 15322 15322 <dest> 15323 - *: "dAY" 15323 + *: "~dAY" 15324 15324 </dest> 15325 15325 <voice> 15326 15326 *: "" ··· 15923 15923 </phrase> 15924 15924 <phrase> 15925 15925 id: LANG_DEFAULT_BROWSER 15926 - desc: in Settings 15926 + desc: deprecated 15927 15927 user: core 15928 15928 <source> 15929 - *: "Default Browser" 15929 + *: "" 15930 15930 </source> 15931 15931 <dest> 15932 - *: "Standardwebbläsare" 15932 + *: "" 15933 15933 </dest> 15934 15934 <voice> 15935 - *: "Standardwebbläsare" 15935 + *: "" 15936 15936 </voice> 15937 15937 </phrase> 15938 15938 <phrase> ··· 16967 16967 *: "~U S B" 16968 16968 </voice> 16969 16969 </phrase> 16970 + <phrase> 16971 + id: LANG_ANNOUNCE_STATUS 16972 + desc: announnnce_status plugin 16973 + user: core 16974 + <source> 16975 + *: "Announce Status" 16976 + </source> 16977 + <dest> 16978 + *: "Meddela status" 16979 + </dest> 16980 + <voice> 16981 + *: "Meddela status" 16982 + </voice> 16983 + </phrase> 16984 + <phrase> 16985 + id: LANG_KEEP_DIRECTORY 16986 + desc: file browser setting 16987 + user: core 16988 + <source> 16989 + *: "Always remember last folder" 16990 + </source> 16991 + <dest> 16992 + *: "Kom alltid ihåg senaste mappen" 16993 + </dest> 16994 + <voice> 16995 + *: "Kom alltid ihåg senaste mappen" 16996 + </voice> 16997 + </phrase> 16998 + <phrase> 16999 + id: LANG_FILE_NOT_FOUND 17000 + desc: When file does not exist 17001 + user: core 17002 + <source> 17003 + *: "File not found" 17004 + </source> 17005 + <dest> 17006 + *: "Filen hittades inte" 17007 + </dest> 17008 + <voice> 17009 + *: "Filen hittades inte" 17010 + </voice> 17011 + </phrase> 17012 + <phrase> 17013 + id: LANG_SHOW_IN_FILES 17014 + desc: Reveal item in File Browser 17015 + user: core 17016 + <source> 17017 + *: "Show in Files" 17018 + </source> 17019 + <dest> 17020 + *: "Visa i Filer" 17021 + </dest> 17022 + <voice> 17023 + *: "Visa i Filer" 17024 + </voice> 17025 + </phrase> 17026 + <phrase> 17027 + id: LANG_CHANNEL_SWAP 17028 + desc: in sound_settings 17029 + user: core 17030 + <source> 17031 + *: "Swap Left & Right" 17032 + </source> 17033 + <dest> 17034 + *: "Byt vänster och höger" 17035 + </dest> 17036 + <voice> 17037 + *: "Byt vänster och höger" 17038 + </voice> 17039 + </phrase> 17040 + <phrase> 17041 + id: LANG_COUNTDOWN_TIMER_SET 17042 + desc: countdown_timer plugin - header shown on the setup screen where the user enters the countdown duration 17043 + user: core 17044 + <source> 17045 + *: "SET TIMER" 17046 + </source> 17047 + <dest> 17048 + *: "Ställ in timer" 17049 + </dest> 17050 + <voice> 17051 + *: "Ställ in timer" 17052 + </voice> 17053 + </phrase> 17054 + <phrase> 17055 + id: LANG_COUNTDOWN_TIMER_RUNNING 17056 + desc: countdown_timer plugin - status label shown while the countdown is active 17057 + user: core 17058 + <source> 17059 + *: "RUNNING" 17060 + </source> 17061 + <dest> 17062 + *: "Pågår" 17063 + </dest> 17064 + <voice> 17065 + *: "Pågår" 17066 + </voice> 17067 + </phrase> 17068 + <phrase> 17069 + id: LANG_COUNTDOWN_TIMER_PAUSED 17070 + desc: countdown_timer plugin - status label shown while the countdown is paused 17071 + user: core 17072 + <source> 17073 + *: "PAUSED" 17074 + </source> 17075 + <dest> 17076 + *: "PAUSAD" 17077 + </dest> 17078 + <voice> 17079 + *: "Pausad" 17080 + </voice> 17081 + </phrase> 17082 + <phrase> 17083 + id: LANG_COUNTDOWN_TIMER_OVERTIME 17084 + desc: countdown_timer plugin - status label shown when the countdown has passed zero and is counting up 17085 + user: core 17086 + <source> 17087 + *: "OVERTIME" 17088 + </source> 17089 + <dest> 17090 + *: "ÖVERTID" 17091 + </dest> 17092 + <voice> 17093 + *: "Övertid" 17094 + </voice> 17095 + </phrase> 17096 + <phrase> 17097 + id: LANG_COUNTDOWN_TIMER_FINISHED 17098 + desc: countdown_timer plugin - status label shown at the moment the countdown expires 17099 + user: core 17100 + <source> 17101 + *: "FINISHED" 17102 + </source> 17103 + <dest> 17104 + *: "SLUTFÖRD" 17105 + </dest> 17106 + <voice> 17107 + *: "Slutförd" 17108 + </voice> 17109 + </phrase>
+3 -3
apps/lang/turkce.lang
··· 14597 14597 </voice> 14598 14598 </phrase> 14599 14599 <phrase> 14600 - id: LANG_HIDE_ALBUM_TITLE_NEW 14601 - desc: in the pictureflow settings 14600 + id: LANG_HIDE_INFO 14601 + desc: Hide Information 14602 14602 user: core 14603 14603 <source> 14604 - *: "Hide information" 14604 + *: "Hide Information" 14605 14605 </source> 14606 14606 <dest> 14607 14607 *: "Bilgileri gizle"
+3 -3
apps/lang/ukrainian.lang
··· 14706 14706 </voice> 14707 14707 </phrase> 14708 14708 <phrase> 14709 - id: LANG_HIDE_ALBUM_TITLE_NEW 14710 - desc: in the pictureflow settings 14709 + id: LANG_HIDE_INFO 14710 + desc: Hide Information 14711 14711 user: core 14712 14712 <source> 14713 - *: "Hide information" 14713 + *: "Hide Information" 14714 14714 </source> 14715 14715 <dest> 14716 14716 *: "Приховати інформацію"
+3 -3
apps/lang/vietnamese.lang
··· 14615 14615 </voice> 14616 14616 </phrase> 14617 14617 <phrase> 14618 - id: LANG_HIDE_ALBUM_TITLE_NEW 14619 - desc: in the pictureflow settings 14618 + id: LANG_HIDE_INFO 14619 + desc: Hide Information 14620 14620 user: core 14621 14621 <source> 14622 - *: "Hide information" 14622 + *: "Hide Information" 14623 14623 </source> 14624 14624 <dest> 14625 14625 *: "Ẩn thông tin"
+28 -4
apps/onplay.c
··· 897 897 return false; 898 898 } 899 899 900 + static int reveal(void) 901 + { 902 + #ifdef HAVE_TAGCACHE 903 + if (!prepare_database_sel(NULL)) 904 + return 0; 905 + #endif 906 + if (!file_exists(selected_file.path)) 907 + { 908 + splash(HZ*2, ID2P(LANG_FILE_NOT_FOUND)); 909 + return 0; 910 + } 911 + 912 + strmemccpy(global_status.browse_last_folder, selected_file.path, 913 + sizeof global_status.browse_last_folder); 914 + onplay_result = ONPLAY_REVEAL_FILE; 915 + return 0; 916 + } 917 + 918 + MENUITEM_FUNCTION(reveal_item, 0, ID2P(LANG_SHOW_IN_FILES), 919 + reveal, clipboard_callback, Icon_file_view_menu); 900 920 MENUITEM_FUNCTION(list_viewers_item, 0, ID2P(LANG_ONPLAY_OPEN_WITH), 901 921 list_viewers, clipboard_callback, Icon_NOICON); 902 922 MENUITEM_FUNCTION_W_PARAM(properties_item, 0, ID2P(LANG_PROPERTIES), ··· 1033 1053 if (selected_file.context == CONTEXT_ID3DB) 1034 1054 { 1035 1055 if (this_item == &track_info_item || 1036 - this_item == &pictureflow_item) 1056 + this_item == &pictureflow_item || 1057 + this_item == &reveal_item) 1037 1058 return action; 1038 1059 return ACTION_EXIT_MENUITEM; 1039 1060 } ··· 1088 1109 if (*tree_get_context()->dirfilter != SHOW_M3U) 1089 1110 return action; 1090 1111 } 1091 - else if (this_item == &delete_file_item) 1112 + else if (this_item == &delete_file_item || 1113 + (this_item == &reveal_item && 1114 + selected_file.context == CONTEXT_WPS)) 1092 1115 return action; 1093 1116 #if LCD_DEPTH > 1 1094 1117 else if (this_item == &set_backdrop_item) ··· 1124 1147 #endif 1125 1148 &bookmark_menu, 1126 1149 &plugin_item, 1127 - &browse_id3_item, &list_viewers_item, 1128 - &delete_file_item, &view_cue_item, 1150 + &browse_id3_item, 1151 + &reveal_item, &view_cue_item, 1129 1152 #ifdef HAVE_PITCHCONTROL 1130 1153 &pitch_menu, 1131 1154 #endif ··· 1162 1185 &rename_file_item, &clipboard_cut_item, &clipboard_copy_item, 1163 1186 &clipboard_paste_item, &delete_file_item, &delete_dir_item, 1164 1187 &list_viewers_item, &create_dir_item, &properties_item, &track_info_item, 1188 + &reveal_item, 1165 1189 #ifdef HAVE_TAGCACHE 1166 1190 &pictureflow_item, 1167 1191 #endif
+1
apps/onplay.h
··· 38 38 ONPLAY_MAINMENU = -1, 39 39 ONPLAY_OK = 0, 40 40 ONPLAY_RELOAD_DIR, 41 + ONPLAY_REVEAL_FILE, 41 42 ONPLAY_START_PLAY, 42 43 ONPLAY_PLAYLIST, 43 44 ONPLAY_PLUGIN,
+13 -5
apps/playlist_viewer.c
··· 515 515 int len) 516 516 { 517 517 char *id3viewc = NULL; 518 - char *skipped = ""; 518 + char *skipped, *prefix, *suffix; 519 + skipped = prefix = suffix = ""; 519 520 if (track->attr & PLAYLIST_ATTR_SKIPPED) 520 521 skipped = "(ERR) "; 522 + if (track->index == viewer.current_playing_track) 523 + { 524 + prefix = "["; 525 + suffix = "]"; 526 + } 521 527 if (!(track->attr & PLAYLIST_ATTR_RETRIEVE_ID3_ATTEMPTED) && 522 528 (global_settings.playlist_viewer_track_display == 523 529 PLAYLIST_VIEWER_ENTRY_SHOW_ID3_TITLE_AND_ALBUM || ··· 591 597 format_name(name, track->name, sizeof(name)); 592 598 if (global_settings.playlist_viewer_indices) 593 599 /* Display playlist index */ 594 - snprintf(str, len, "%d. %s%s", track->display_index, skipped, name); 600 + snprintf(str, len, "%s%d. %s%s%s", 601 + prefix, track->display_index, skipped, name, suffix); 595 602 else 596 - snprintf(str, len, "%s%s", skipped, name); 603 + snprintf(str, len, "%s%s%s%s", prefix, skipped, name, suffix); 597 604 } 598 605 else 599 606 { ··· 603 610 } 604 611 if (global_settings.playlist_viewer_indices) 605 612 /* Display playlist index */ 606 - snprintf(str, len, "%d. %s%s", track->display_index, skipped, id3viewc); 613 + snprintf(str, len, "%s%d. %s%s%s", 614 + prefix, track->display_index, skipped, id3viewc, suffix); 607 615 else 608 - snprintf(str, len, "%s%s", skipped, id3viewc); 616 + snprintf(str, len, "%s%s%s%s", prefix, skipped, id3viewc, suffix); 609 617 } 610 618 } 611 619
+1
apps/plugins/CATEGORIES
··· 21 21 clix,games 22 22 clock,apps 23 23 codebuster,games 24 + countdown_timer,apps 24 25 credits,viewers 25 26 cube,demos 26 27 cue_playlist,viewers
+1
apps/plugins/SOURCES
··· 7 7 tagcache/tagcache.c 8 8 #endif 9 9 chessclock.c 10 + countdown_timer.c 10 11 credits.c 11 12 cube.c 12 13 cue_playlist.c
+242
apps/plugins/countdown_timer.c
··· 1 + /*************************************************************************** 2 + * __________ __ ___. 3 + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 + * \/ \/ \/ \/ \/ 8 + * $Id$ 9 + * 10 + * Copyright (C) 2026 Teun van Dalen 11 + * 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. 16 + * 17 + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 + * KIND, either express or implied. 19 + * 20 + ****************************************************************************/ 21 + 22 + #include "plugin.h" 23 + #include "lib/pluginlib_actions.h" 24 + #include "lib/pluginlib_exit.h" 25 + 26 + const struct button_mapping *plugin_contexts[] = { pla_main_ctx }; 27 + 28 + #define MAX_MINUTES 99 29 + #define MAX_SECONDS 59 30 + 31 + typedef enum { 32 + STATE_SETUP, 33 + STATE_RUNNING, 34 + STATE_PAUSED, 35 + STATE_FINISHED, 36 + } timer_state_t; 37 + 38 + typedef struct { 39 + int set_minutes; 40 + int set_seconds; 41 + int current_field; 42 + long remaining_ticks; 43 + long last_tick; 44 + timer_state_t state; 45 + } timer_ctx_t; 46 + 47 + static inline int get_button(void) 48 + { 49 + return pluginlib_getaction(HZ / 10, plugin_contexts, 50 + ARRAYLEN(plugin_contexts)); 51 + } 52 + 53 + static void draw(const timer_ctx_t *ctx) 54 + { 55 + char time_str[12]; 56 + const char *status_str; 57 + int disp_min, disp_sec; 58 + int w, h, x, y; 59 + 60 + rb->lcd_clear_display(); 61 + 62 + if (ctx->state == STATE_SETUP) { 63 + disp_min = ctx->set_minutes; 64 + disp_sec = ctx->set_seconds; 65 + if (ctx->current_field == 0) 66 + rb->snprintf(time_str, sizeof(time_str), "[%02d]:%02d", 67 + disp_min, disp_sec); 68 + else 69 + rb->snprintf(time_str, sizeof(time_str), "%02d:[%02d]", 70 + disp_min, disp_sec); 71 + status_str = rb->str(LANG_COUNTDOWN_TIMER_SET); 72 + } else if (ctx->state == STATE_FINISHED) { 73 + rb->snprintf(time_str, sizeof(time_str), "00:00"); 74 + status_str = rb->str(LANG_COUNTDOWN_TIMER_FINISHED); 75 + } else { 76 + if (ctx->remaining_ticks >= 0) { 77 + int remaining_secs = (ctx->remaining_ticks + HZ - 1) / HZ; 78 + disp_min = remaining_secs / 60; 79 + disp_sec = remaining_secs % 60; 80 + rb->snprintf(time_str, sizeof(time_str), "%02d:%02d", 81 + disp_min, disp_sec); 82 + } else { 83 + int over_secs = ((-ctx->remaining_ticks) + HZ - 1) / HZ; 84 + disp_min = over_secs / 60; 85 + disp_sec = over_secs % 60; 86 + rb->snprintf(time_str, sizeof(time_str), "-%02d:%02d", 87 + disp_min, disp_sec); 88 + } 89 + 90 + if (ctx->state == STATE_RUNNING && ctx->remaining_ticks < 0) 91 + status_str = rb->str(LANG_COUNTDOWN_TIMER_OVERTIME); 92 + else if (ctx->state == STATE_RUNNING) 93 + status_str = rb->str(LANG_COUNTDOWN_TIMER_RUNNING); 94 + else 95 + status_str = rb->str(LANG_COUNTDOWN_TIMER_PAUSED); 96 + } 97 + 98 + /* Draw status string above center */ 99 + rb->lcd_getstringsize(status_str, &w, &h); 100 + x = (LCD_WIDTH - w) / 2; 101 + y = (LCD_HEIGHT / 2) - h - 2; 102 + rb->lcd_putsxy(x, y, status_str); 103 + 104 + /* Draw time string at center */ 105 + rb->lcd_getstringsize(time_str, &w, &h); 106 + x = (LCD_WIDTH - w) / 2; 107 + y = LCD_HEIGHT / 2; 108 + rb->lcd_putsxy(x, y, time_str); 109 + 110 + rb->lcd_update(); 111 + } 112 + 113 + enum plugin_status plugin_start(const void *parameter) 114 + { 115 + timer_ctx_t ctx = { 116 + .set_minutes = 10, 117 + .set_seconds = 0, 118 + .current_field = 0, 119 + .remaining_ticks = 60 * HZ, 120 + .last_tick = 0, 121 + .state = STATE_SETUP, 122 + }; 123 + bool overtime_alerted = false; 124 + int button; 125 + 126 + (void)parameter; 127 + 128 + while (true) { 129 + if (ctx.state == STATE_RUNNING) { 130 + long now = *rb->current_tick; 131 + ctx.remaining_ticks -= now - ctx.last_tick; 132 + ctx.last_tick = now; 133 + 134 + if (ctx.remaining_ticks < 0 && !overtime_alerted) { 135 + overtime_alerted = true; 136 + ctx.state = STATE_FINISHED; 137 + draw(&ctx); 138 + rb->audio_pause(); 139 + #ifdef HAVE_BACKLIGHT 140 + rb->backlight_on(); 141 + #endif 142 + rb->beep_play(1000, 200, 1000); 143 + rb->sleep(HZ / 4); 144 + rb->beep_play(1000, 200, 1000); 145 + rb->sleep(HZ / 4); 146 + rb->beep_play(1000, 400, 1000); 147 + rb->sleep(HZ + HZ / 2); 148 + rb->audio_resume(); 149 + ctx.state = STATE_RUNNING; 150 + /* Reset last_tick so the beep/sleep time is not counted 151 + * against remaining_ticks on the next iteration. */ 152 + ctx.last_tick = *rb->current_tick; 153 + } 154 + } 155 + 156 + draw(&ctx); 157 + button = get_button(); 158 + 159 + switch (ctx.state) { 160 + case STATE_SETUP: { 161 + bool time_changed = false; 162 + switch (button) { 163 + #ifdef HAVE_SCROLLWHEEL 164 + case PLA_SCROLL_FWD: 165 + case PLA_SCROLL_FWD_REPEAT: 166 + #endif 167 + case PLA_UP: 168 + case PLA_UP_REPEAT: 169 + if (ctx.current_field == 0) 170 + ctx.set_minutes = (ctx.set_minutes + 1) % (MAX_MINUTES + 1); 171 + else 172 + ctx.set_seconds = (ctx.set_seconds + 1) % (MAX_SECONDS + 1); 173 + time_changed = true; 174 + break; 175 + #ifdef HAVE_SCROLLWHEEL 176 + case PLA_SCROLL_BACK: 177 + case PLA_SCROLL_BACK_REPEAT: 178 + #endif 179 + case PLA_DOWN: 180 + case PLA_DOWN_REPEAT: 181 + if (ctx.current_field == 0) 182 + ctx.set_minutes = (ctx.set_minutes + MAX_MINUTES) % (MAX_MINUTES + 1); 183 + else 184 + ctx.set_seconds = (ctx.set_seconds + MAX_SECONDS) % (MAX_SECONDS + 1); 185 + time_changed = true; 186 + break; 187 + case PLA_LEFT: 188 + case PLA_LEFT_REPEAT: 189 + case PLA_RIGHT: 190 + case PLA_RIGHT_REPEAT: 191 + ctx.current_field = (ctx.current_field + 1) % 2; 192 + break; 193 + case PLA_SELECT: 194 + if (ctx.set_minutes > 0 || ctx.set_seconds > 0) { 195 + ctx.remaining_ticks = (ctx.set_minutes * 60 + ctx.set_seconds) * HZ; 196 + ctx.last_tick = *rb->current_tick; 197 + ctx.state = STATE_RUNNING; 198 + } 199 + break; 200 + default: 201 + exit_on_usb(button); 202 + break; 203 + } 204 + if (time_changed) 205 + ctx.remaining_ticks = (ctx.set_minutes * 60 + ctx.set_seconds) * HZ; 206 + break; 207 + } 208 + 209 + case STATE_RUNNING: 210 + switch (button) { 211 + case PLA_SELECT: 212 + ctx.state = STATE_PAUSED; 213 + break; 214 + default: 215 + exit_on_usb(button); 216 + break; 217 + } 218 + break; 219 + 220 + case STATE_FINISHED: 221 + exit_on_usb(button); 222 + break; 223 + 224 + case STATE_PAUSED: 225 + switch (button) { 226 + case PLA_SELECT: 227 + ctx.last_tick = *rb->current_tick; 228 + ctx.state = STATE_RUNNING; 229 + break; 230 + case PLA_UP: 231 + case PLA_UP_REPEAT: 232 + case PLA_CANCEL: 233 + case PLA_EXIT: 234 + return PLUGIN_OK; 235 + default: 236 + exit_on_usb(button); 237 + break; 238 + } 239 + break; 240 + } 241 + } 242 + }
+6 -3
apps/plugins/imageviewer/bmp/bmp.c
··· 176 176 return PLUGIN_OUTOFMEM; 177 177 } 178 178 179 - if (!iv->running_slideshow) 179 + if (!iv->settings->hide_info && 180 + !iv->running_slideshow) 180 181 { 181 182 rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); 182 183 rb->lcd_putsf(0, 1, "loading %dx%d%s", ··· 206 207 return PLUGIN_ERROR; 207 208 } 208 209 209 - if (!iv->running_slideshow) 210 + if (!iv->settings->hide_info && 211 + !iv->running_slideshow) 210 212 { 211 213 rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); 212 214 rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ ··· 225 227 buf_images = buf_root = buf + size; 226 228 buf_images_size = root_size = *buf_size - size; 227 229 228 - if (!iv->running_slideshow) 230 + if (!iv->settings->hide_info && 231 + !iv->running_slideshow) 229 232 { 230 233 rb->lcd_putsf(0, 2, "image %dx%d", bmp.width, bmp.height); 231 234 rb->lcd_update();
+10 -5
apps/plugins/imageviewer/gif/gif.c
··· 56 56 57 57 #ifdef HAVE_LCD_COLOR 58 58 rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, 59 - STRIDE(SCREEN_MAIN, info->width, info->height), 59 + STRIDE(SCREEN_MAIN, info->width, info->height), 60 60 x + MAX(0, (LCD_WIDTH-info->width)/2), 61 61 y + MAX(0, (LCD_HEIGHT-info->height)/2), 62 62 width, height); ··· 100 100 } 101 101 #endif 102 102 103 - /* initialize decoder context struct, set buffer decoder is free 103 + /* initialize decoder context struct, set buffer decoder is free 104 104 * to use. 105 105 */ 106 106 gif_decoder_init(p_decoder, memory, memory_size); ··· 111 111 if (!p_decoder->error) 112 112 { 113 113 114 - if (!iv->running_slideshow) 114 + if (!iv->settings->hide_info && 115 + !iv->running_slideshow) 115 116 { 116 117 rb->lcd_putsf(0, 2, "file: %s", 117 118 filename); ··· 137 138 138 139 gif_decoder_destroy_memory_pool(p_decoder); 139 140 140 - if (!iv->running_slideshow && !p_decoder->error) 141 + if (!iv->settings->hide_info && 142 + !iv->running_slideshow && 143 + !p_decoder->error) 141 144 { 142 145 rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); 143 146 rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ ··· 215 218 /* assign image buffer */ 216 219 if (ds > 1) 217 220 { 218 - if (!iv->running_slideshow && (info->frames_count == 1)) 221 + if (!iv->settings->hide_info && 222 + !iv->running_slideshow && 223 + (info->frames_count == 1)) 219 224 { 220 225 rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); 221 226 rb->lcd_update();
+23 -5
apps/plugins/imageviewer/imageviewer.c
··· 64 64 COLOURMODE_COLOUR, 65 65 DITHER_NONE, 66 66 #endif 67 - SS_DEFAULT_TIMEOUT 67 + SS_DEFAULT_TIMEOUT, 68 + true 68 69 }; 69 70 static struct imgview_settings old_settings; 70 71 ··· 78 79 #endif 79 80 { TYPE_INT, SS_MIN_TIMEOUT, SS_MAX_TIMEOUT, 80 81 { .int_p = &settings.ss_timeout }, "Slideshow Time", NULL }, 82 + { TYPE_BOOL, 0, 1, { .bool_p = &settings.hide_info }, "Hide Info", NULL }, 81 83 }; 82 84 83 85 static void cb_progress(int current, int total); ··· 244 246 return false; 245 247 } 246 248 249 + static bool set_option_hide_info(void) 250 + { 251 + rb->set_bool(rb->str(LANG_HIDE_INFO), &settings.hide_info); 252 + return false; 253 + } 254 + 247 255 MENUITEM_FUNCTION(grayscale_item, 0, ID2P(LANG_GRAYSCALE), 248 256 set_option_grayscale, NULL, Icon_NOICON); 249 257 MENUITEM_FUNCTION(dithering_item, 0, ID2P(LANG_DITHERING), 250 258 set_option_dithering, NULL, Icon_NOICON); 251 - MAKE_MENU(display_menu, "Display Options", NULL, Icon_NOICON, 252 - &grayscale_item, &dithering_item); 259 + MENUITEM_FUNCTION(hide_info_item, 0, ID2P(LANG_HIDE_INFO), 260 + set_option_hide_info, NULL, Icon_NOICON); 261 + MAKE_MENU(display_menu, ID2P(LANG_MENU_DISPLAY_OPTIONS), NULL, Icon_NOICON, 262 + &grayscale_item, 263 + &dithering_item, 264 + &hide_info_item); 253 265 254 266 static void display_options(void) 255 267 { ··· 451 463 { 452 464 /* do not yield or update the progress bar if we did so too recently */ 453 465 long now = *rb->current_tick; 466 + 467 + if (total == 0) 468 + next_progress_tick = now + HZ/4; /* delay by 250ms initially */ 469 + 454 470 if(!TIME_AFTER(now, next_progress_tick)) 455 471 return; 456 472 ··· 965 981 bool initial_frame = true; 966 982 do /* loop the image prepare and decoding when zoomed */ 967 983 { 984 + cb_progress(0, 0); /* delay showing progress bar*/ 968 985 status = imgdec->get_image(info, frame, ds); /* decode or fetch from cache */ 969 986 if (status == PLUGIN_ERROR) 970 987 { ··· 973 990 } 974 991 975 992 set_view(info, cx, cy); 976 - 977 - if(!iv_api.running_slideshow && (info->frames_count == 1)) 993 + if(!settings.hide_info && 994 + !iv_api.running_slideshow && 995 + (info->frames_count == 1)) 978 996 { 979 997 rb->lcd_putsf(0, 3, "showing %dx%d", info->width, info->height); 980 998 rb->lcd_update();
+1
apps/plugins/imageviewer/imageviewer.h
··· 77 77 int jpeg_dither_mode; 78 78 #endif 79 79 int ss_timeout; 80 + bool hide_info; 80 81 }; 81 82 82 83 /* structure passed to image decoder. */
+10 -5
apps/plugins/imageviewer/jpeg/jpeg.c
··· 150 150 return PLUGIN_OUTOFMEM; 151 151 } 152 152 153 - if(!iv->running_slideshow) 153 + if(!iv->settings->hide_info && 154 + !iv->running_slideshow) 154 155 { 155 156 rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); 156 157 rb->lcd_putsf(0, 1, "loading %d bytes", filesize); ··· 160 161 rb->read(fd, buf_jpeg, filesize); 161 162 rb->close(fd); 162 163 163 - if(!iv->running_slideshow) 164 + if(!iv->settings->hide_info && 165 + !iv->running_slideshow) 164 166 { 165 167 rb->lcd_puts(0, 2, "decoding markers"); 166 168 rb->lcd_update(); ··· 190 192 default_huff_tbl(p_jpg); /* use default */ 191 193 build_lut(p_jpg); /* derive Huffman and other lookup-tables */ 192 194 193 - if(!iv->running_slideshow) 195 + if(!iv->settings->hide_info && 196 + !iv->running_slideshow) 194 197 { 195 198 rb->lcd_putsf(0, 2, "image %dx%d", p_jpg->x_size, p_jpg->y_size); 196 199 rb->lcd_update(); ··· 263 266 buf_images += size; 264 267 buf_images_size -= size; 265 268 266 - if(!iv->running_slideshow) 269 + if(!iv->settings->hide_info && 270 + !iv->running_slideshow) 267 271 { 268 272 rb->lcd_putsf(0, 3, "decoding %d*%d", info->width, info->height); 269 273 rb->lcd_update(); ··· 288 292 } 289 293 time = *rb->current_tick - time; 290 294 291 - if(!iv->running_slideshow) 295 + if(!iv->settings->hide_info && 296 + !iv->running_slideshow) 292 297 { 293 298 rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); 294 299 rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */
+5 -3
apps/plugins/imageviewer/jpegp/jpegp.c
··· 117 117 POS(offset); 118 118 } 119 119 120 - if (!iv->running_slideshow) 120 + if (!iv->settings->hide_info && 121 + !iv->running_slideshow) 121 122 { 122 123 rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); 123 124 rb->lcd_puts(0, 2, "decoding..."); ··· 142 143 return PLUGIN_ERROR; 143 144 } 144 145 145 - if (!iv->running_slideshow) 146 + if (!iv->settings->hide_info && 147 + !iv->running_slideshow) 146 148 { 147 149 rb->lcd_putsf(0, 2, "image %dx%d", p_jpg->X, p_jpg->Y); 148 150 int w, h; /* used to center output */ ··· 262 264 c2 = (sumV + area/2) / area; 263 265 } 264 266 265 - // ITU BT.601 full-range YUV-to-RGB integer approximation 267 + // ITU BT.601 full-range YUV-to-RGB integer approximation 266 268 { 267 269 int y = (c0 << 5) + 16; 268 270 int u = c1 - 128;
+18 -9
apps/plugins/imageviewer/png/png.c
··· 62 62 63 63 #ifdef HAVE_LCD_COLOR 64 64 rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, 65 - STRIDE(SCREEN_MAIN, info->width, info->height), 65 + STRIDE(SCREEN_MAIN, info->width, info->height), 66 66 x + MAX(0, (LCD_WIDTH-info->width)/2), 67 67 y + MAX(0, (LCD_HEIGHT-info->height)/2), 68 68 width, height); ··· 82 82 #ifdef USEGSLIB 83 83 return (p_decoder->infoPng.width/ds) * (p_decoder->infoPng.height/ds); 84 84 #else 85 - return (p_decoder->infoPng.width/ds) * 86 - (p_decoder->infoPng.height/ds) * 85 + return (p_decoder->infoPng.width/ds) * 86 + (p_decoder->infoPng.height/ds) * 87 87 FB_DATA_SZ; 88 88 #endif 89 89 } ··· 126 126 127 127 DEBUGF("reading file '%s'\n", filename); 128 128 129 - if (!iv->running_slideshow) { 129 + if (!iv->settings->hide_info && 130 + !iv->running_slideshow) 131 + { 130 132 rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); 131 133 rb->lcd_update(); 132 134 } ··· 136 138 rb->close(fd); 137 139 138 140 } else { 139 - if (!iv->running_slideshow) { 141 + if (!iv->settings->hide_info && 142 + !iv->running_slideshow) 143 + { 140 144 rb->lcd_putsf(0, 1, "loading %zu bytes", file_size); 141 145 rb->lcd_update(); 142 146 } ··· 146 150 rb->read(fd, image, file_size); 147 151 rb->close(fd); 148 152 149 - if (!iv->running_slideshow) { 153 + if (!iv->settings->hide_info && 154 + !iv->running_slideshow) 155 + { 150 156 rb->lcd_puts(0, 2, "decoding image"); 151 157 rb->lcd_update(); 152 158 } ··· 171 177 172 178 if (!p_decoder->error) { 173 179 174 - if (!iv->running_slideshow) { 180 + if (!iv->settings->hide_info && 181 + !iv->running_slideshow) { 175 182 rb->lcd_putsf(0, 2, "image %dx%d", 176 183 p_decoder->infoPng.width, 177 184 p_decoder->infoPng.height); ··· 194 201 } 195 202 } 196 203 197 - if (!iv->running_slideshow && !p_decoder->error) 204 + if (!iv->settings->hide_info && 205 + !iv->running_slideshow && !p_decoder->error) 198 206 { 199 207 rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); 200 208 rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ ··· 253 261 254 262 /* assign image buffer */ 255 263 if (ds > 1) { 256 - if (!iv->running_slideshow) 264 + if (!iv->settings->hide_info && 265 + !iv->running_slideshow) 257 266 { 258 267 rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); 259 268 rb->lcd_update();
+7 -4
apps/plugins/imageviewer/ppm/ppm.c
··· 51 51 52 52 #ifdef HAVE_LCD_COLOR 53 53 rb->lcd_bitmap_part((fb_data *)*pdisp, info->x + x, info->y + y, 54 - STRIDE(SCREEN_MAIN, info->width, info->height), 54 + STRIDE(SCREEN_MAIN, info->width, info->height), 55 55 x + MAX(0, (LCD_WIDTH-info->width)/2), 56 56 y + MAX(0, (LCD_HEIGHT-info->height)/2), 57 57 width, height); ··· 111 111 } 112 112 DEBUGF("reading file '%s'\n", filename); 113 113 114 - if (!iv->running_slideshow) 114 + if (!iv->settings->hide_info && 115 + !iv->running_slideshow) 115 116 { 116 117 rb->lcd_puts(0, 0, rb->strrchr(filename,'/')+1); 117 118 rb->lcd_putsf(0, 1, "loading %zu bytes", filesize); ··· 140 141 return rc; 141 142 } 142 143 143 - if (!iv->running_slideshow) 144 + if (!iv->settings->hide_info && 145 + !iv->running_slideshow) 144 146 { 145 147 rb->snprintf(print, sizeof(print), " %ld.%02ld sec ", time/HZ, time%HZ); 146 148 rb->lcd_getstringsize(print, &w, &h); /* centered in progress bar */ ··· 177 179 /* assign image buffer */ 178 180 if (ds > 1) 179 181 { 180 - if (!iv->running_slideshow) 182 + if (!iv->settings->hide_info && 183 + !iv->running_slideshow) 181 184 { 182 185 rb->lcd_putsf(0, 3, "resizing %d*%d", info->width, info->height); 183 186 rb->lcd_update();
+1 -1
apps/plugins/pictureflow/pictureflow.c
··· 3619 3619 ID2P(LANG_DISPLAY)); 3620 3620 3621 3621 static const struct opt_items album_name_options[] = { 3622 - { STR(LANG_HIDE_ALBUM_TITLE_NEW) }, 3622 + { STR(LANG_HIDE_INFO) }, 3623 3623 { STR(LANG_SHOW_AT_THE_BOTTOM_NEW) }, 3624 3624 { STR(LANG_SHOW_AT_THE_TOP_NEW) }, 3625 3625 { STR(LANG_SHOW_ALL_AT_THE_TOP) },
+4 -3
apps/settings_list.c
··· 1060 1060 /* 3-d enhancement effect */ 1061 1061 CHOICE_SETTING(0, channel_config, LANG_CHANNEL_CONFIGURATION, 1062 1062 0,"channels", 1063 - "stereo,mono,custom,mono left,mono right,karaoke", 1064 - sound_set_channels, 6, 1063 + "stereo,mono,custom,mono left,mono right,karaoke,swap", 1064 + sound_set_channels, 7, 1065 1065 ID2P(LANG_CHANNEL_STEREO), ID2P(LANG_CHANNEL_MONO), 1066 1066 ID2P(LANG_CHANNEL_CUSTOM), ID2P(LANG_CHANNEL_LEFT), 1067 - ID2P(LANG_CHANNEL_RIGHT), ID2P(LANG_CHANNEL_KARAOKE)), 1067 + ID2P(LANG_CHANNEL_RIGHT), ID2P(LANG_CHANNEL_KARAOKE), 1068 + ID2P(LANG_CHANNEL_SWAP)), 1068 1069 SOUND_SETTING(0, stereo_width, LANG_STEREO_WIDTH, 1069 1070 "stereo_width", SOUND_STEREO_WIDTH), 1070 1071 #ifdef AUDIOHW_HAVE_DEPTH_3D
+1 -1
apps/talk.c
··· 765 765 do_enqueue(enqueue); /* cut off all the pending stuff */ 766 766 767 767 const char *last = spell; 768 - size_t len0 = len - 1; 768 + size_t len0 = len; 769 769 /* Tokenize into UTF8 codepoints */ 770 770 while ((spell = utf8decode(spell, &c)), c != '\0') 771 771 {
+4
apps/tree.c
··· 978 978 return exit_to_new_screen(GO_TO_ROOT); 979 979 break; 980 980 981 + case ONPLAY_REVEAL_FILE: 982 + return exit_to_new_screen(GO_TO_FILEBROWSER); 983 + break; 984 + 981 985 case ONPLAY_OK: 982 986 restore = do_restore_display; 983 987 break;
+18 -1
docs/CONTRIBUTING
··· 72 72 See https://www.rockbox.org/wiki/UsingGit for details on how to setup your 73 73 environment and how to upload a change you have made for review. 74 74 75 - We'd prefer that you don't submit patches to the bug tracker any more, 75 + We strongly prefer that you don't submit patches to the bug tracker, 76 76 as it's much harder to read and discuss them there. 77 77 78 78 Credits ··· 80 80 We believe in crediting all contributors by name. Before committing a patch to 81 81 Git, we ask that you give us your full real name (no pseudonyms or nicknames) 82 82 for adding to the credits list. 83 + 84 + Generative AI 85 + ------------- 86 + We are highly unlikely to review or accept AI-generated or "vibe coded" 87 + code; our time is very limited, and we need to know that *you* understand 88 + exactly what the code is doing and why, so that we can review it 89 + effectively with you. 90 + 91 + Code is of no value to Rockbox if it is not maintainable, and it cannot 92 + be maintained if it is not understood. Quality is more important than 93 + quantity. 94 + 95 + If you really *must* submit AI-generated code, you will need to include 96 + prompt provenance including the model used, dates and full content of 97 + prompts, and the unedited LLM output. See the article "Track Prompt 98 + Provenance in Version Control" at https://medium.com/@psluaces/track-prompt-provenance-in-version-control-8746e2bad3c2) 99 + by Pablo Santos Luaces.
+1
docs/CREDITS
··· 760 760 Javier Gutiérrez Gertrúdix 761 761 Sergey Puskov 762 762 Eivind Ødegård 763 + Teun van Dalen 763 764 764 765 The libmad team 765 766 The wavpack team
+1
firmware/export/audiohw.h
··· 674 674 SOUND_CHAN_MONO_LEFT, 675 675 SOUND_CHAN_MONO_RIGHT, 676 676 SOUND_CHAN_KARAOKE, 677 + SOUND_CHAN_SWAP, 677 678 SOUND_CHAN_NUM_MODES, 678 679 }; 679 680
+1
firmware/export/pcm.h
··· 64 64 65 65 enum pcm_sink_ids pcm_current_sink(void); 66 66 const struct pcm_sink_caps* pcm_sink_caps(enum pcm_sink_ids sink); 67 + bool pcm_switch_sink(enum pcm_sink_ids sink); 67 68 68 69 /* shortcut for plugins */ 69 70 const struct pcm_sink_caps* pcm_current_sink_caps(void);
+4
firmware/export/pcm_mixer.h
··· 23 23 #define PCM_MIXER_H 24 24 25 25 #include <sys/types.h> 26 + #include "pcm_sink.h" 26 27 27 28 /** Simple config **/ 28 29 ··· 110 111 111 112 /* Stop playback on a channel */ 112 113 void mixer_channel_stop(enum pcm_mixer_channel channel); 114 + 115 + /* Switch playback sink */ 116 + bool mixer_switch_sink(enum pcm_sink_ids sink); 113 117 114 118 /* Set channel's amplitude factor */ 115 119 void mixer_channel_set_amplitude(enum pcm_mixer_channel channel,
+1
firmware/export/pcm_sink.h
··· 52 52 53 53 enum pcm_sink_ids { 54 54 PCM_SINK_BUILTIN = 0, 55 + PCM_SINK_NUM 55 56 }; 56 57 57 58 /* defined in each platform pcm source */
+52 -3
firmware/pcm.c
··· 21 21 #include <stdlib.h> 22 22 #include "system.h" 23 23 #include "kernel.h" 24 + #include "panic.h" 24 25 25 26 /* Define LOGF_ENABLE to enable logf output in this file */ 26 27 //#define LOGF_ENABLE ··· 76 77 * 77 78 */ 78 79 79 - static struct pcm_sink* sinks[1] = { 80 + static struct pcm_sink* sinks[PCM_SINK_NUM] = { 80 81 [PCM_SINK_BUILTIN] = &builtin_pcm_sink, 81 82 }; 82 83 static enum pcm_sink_ids cur_sink = PCM_SINK_BUILTIN; ··· 247 248 { 248 249 logf("pcm_init"); 249 250 250 - for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { 251 + for(size_t i = 0; i < PCM_SINK_NUM; i += 1) { 251 252 struct pcm_sink* sink = sinks[i]; 252 253 sink->pending_freq = sink->caps.default_freq; 253 254 sink->configured_freq = -1U; ··· 261 262 { 262 263 logf("pcm_postinit"); 263 264 264 - for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { 265 + for(size_t i = 0; i < PCM_SINK_NUM; i += 1) { 265 266 struct pcm_sink* sink = sinks[i]; 266 267 sink->ops.postinit(); 267 268 sink->pcm_is_ready = true; ··· 289 290 const struct pcm_sink_caps* pcm_current_sink_caps(void) 290 291 { 291 292 return pcm_sink_caps(pcm_current_sink()); 293 + } 294 + 295 + bool pcm_switch_sink(enum pcm_sink_ids sink) 296 + { 297 + logf("pcm_switch_sink %d to %d", cur_sink, sink); 298 + if(sink >= PCM_SINK_NUM) { 299 + return false; 300 + } 301 + 302 + if(cur_sink == sink) { 303 + return true; 304 + } 305 + 306 + /* This should not be possible but it silences 307 + a false warning that only occurs with with GCC9.5 on bare metal ARM. 308 + */ 309 + #if __GNUC__ == 9 && defined(CPU_ARM) 310 + #pragma GCC diagnostic push 311 + #pragma GCC diagnostic ignored "-Warray-bounds" 312 + #endif 313 + 314 + /* save current sink before switching */ 315 + struct pcm_sink* old_sink = sinks[cur_sink]; 316 + 317 + #if __GNUC__ == 9 318 + #pragma GCC diagnostic pop 319 + #endif 320 + 321 + /* update sink index */ 322 + cur_sink = sink; 323 + /* synchronize frequency */ 324 + unsigned long cur_sampr = old_sink->caps.samprs[old_sink->pending_freq]; 325 + pcm_set_frequency(cur_sampr); 326 + pcm_apply_settings(); 327 + /* when playing, continue playing on new sink */ 328 + if(pcm_playing) { 329 + old_sink->ops.stop(); 330 + /* need more */ 331 + const void *start; 332 + size_t size; 333 + if(pcm_get_more_int(&start, &size)) { 334 + pcm_play_dma_start_int(start, size); 335 + } else { 336 + pcm_play_stop_int(); 337 + } 338 + } 339 + 340 + return true; 292 341 } 293 342 294 343 void pcm_play_data(pcm_play_callback_type get_more,
+64 -47
firmware/pcm_mixer.c
··· 286 286 start, mix_frame_size); 287 287 } 288 288 289 + /* Notify users of samplerate change */ 290 + static void mixer_handle_sampr_change(unsigned int sampr) 291 + { 292 + for (size_t i = 0; i < ARRAYLEN(active_channels) && active_channels[i]; i += 1) 293 + { 294 + struct mixer_channel* chan = active_channels[i]; 295 + 296 + /* Notify upstreams */ 297 + if (chan->play_cbs) 298 + { 299 + if (chan->play_cbs->sampr_changed) 300 + { 301 + chan->play_cbs->sampr_changed(sampr); 302 + } 303 + if (chan->play_cbs->get_more) 304 + { 305 + /* Remake buffer */ 306 + const void *start = NULL; 307 + size_t size; 308 + chan->play_cbs->get_more(&start, &size); 309 + if (start && size) { 310 + chan->start = start; 311 + chan->size = size; 312 + chan->last_size = 0; 313 + } else { 314 + channel_stopped(chan); 315 + } 316 + } 317 + } 318 + /* Notify buffer monitor */ 319 + if (chan->buf_cbs) 320 + { 321 + if (chan->buf_cbs->sampr_changed) 322 + { 323 + chan->buf_cbs->sampr_changed(sampr); 324 + } 325 + } 326 + } 327 + 328 + /* Work out how much space we really need */ 329 + if (sampr > SAMPR_96) 330 + mix_frame_size = 4; 331 + else if (sampr > SAMPR_48) 332 + mix_frame_size = 2; 333 + else 334 + mix_frame_size = 1; 335 + 336 + mix_frame_size *= MIX_FRAME_SAMPLES * 4; 337 + } 338 + 289 339 /** Public interfaces **/ 290 340 291 341 /* Start playback on a channel */ ··· 371 421 pcm_play_unlock(); 372 422 } 373 423 424 + /* Switch playback sink */ 425 + bool mixer_switch_sink(enum pcm_sink_ids sink) 426 + { 427 + if(pcm_current_sink() == sink) 428 + return true; 429 + 430 + if(!pcm_switch_sink(sink)) 431 + return false; 432 + 433 + mixer_handle_sampr_change(SAMPR_NUM(pcm_get_frequency())); 434 + return true; 435 + } 436 + 374 437 /* Set channel's amplitude factor */ 375 438 void mixer_channel_set_amplitude(enum pcm_mixer_channel channel, 376 439 unsigned int amplitude) ··· 461 524 return; 462 525 463 526 pcm_set_frequency(samplerate); 464 - 465 - for (size_t i = 0; i < ARRAYLEN(active_channels) && active_channels[i]; i += 1) 466 - { 467 - struct mixer_channel* chan = active_channels[i]; 468 - 469 - /* Notify upstreams */ 470 - if (chan->play_cbs) 471 - { 472 - if (chan->play_cbs->sampr_changed) 473 - { 474 - chan->play_cbs->sampr_changed(SAMPR_NUM(samplerate)); 475 - } 476 - if (chan->play_cbs->get_more) 477 - { 478 - /* Remake buffer */ 479 - const void *start = NULL; 480 - size_t size; 481 - chan->play_cbs->get_more(&start, &size); 482 - if (start && size) { 483 - chan->start = start; 484 - chan->size = size; 485 - chan->last_size = 0; 486 - } else { 487 - channel_stopped(chan); 488 - } 489 - } 490 - } 491 - /* Notify buffer monitor */ 492 - if (chan->buf_cbs) 493 - { 494 - if (chan->buf_cbs->sampr_changed) 495 - { 496 - chan->buf_cbs->sampr_changed(SAMPR_NUM(samplerate)); 497 - } 498 - } 499 - } 500 - 501 - /* Work out how much space we really need */ 502 - if (SAMPR_NUM(samplerate) > SAMPR_96) 503 - mix_frame_size = 4; 504 - else if (SAMPR_NUM(samplerate) > SAMPR_48) 505 - mix_frame_size = 2; 506 - else 507 - mix_frame_size = 1; 508 - 509 - mix_frame_size *= MIX_FRAME_SAMPLES * 4; 510 - 527 + mixer_handle_sampr_change(SAMPR_NUM(pcm_get_frequency())); 511 528 if (pcm_is_initialized()) 512 529 pcm_apply_settings(); 513 530 }
+43 -20
firmware/target/hosted/button-devinput.c
··· 21 21 ****************************************************************************/ 22 22 #include <poll.h> 23 23 #include <errno.h> 24 + #include <stdio.h> 24 25 #include <unistd.h> 25 26 #include <sys/types.h> 26 27 #include <linux/input.h> ··· 49 50 * Compute to angular velocity (degrees per second) 50 51 51 52 */ 52 - #define NR_POLL_DESC 4 53 + #define NR_POLL_DESC 5 53 54 54 55 static int num_devices = 0; 55 56 static struct pollfd poll_fds[NR_POLL_DESC]; 56 57 57 - void button_init_device(void) 58 + void button_add_input_device(int i) 58 59 { 59 - const char * const input_devs[NR_POLL_DESC] = { 60 - "/dev/input/event0", 61 - "/dev/input/event1", 62 - "/dev/input/event2", 63 - "/dev/input/event3", 64 - }; 60 + int fd = poll_fds[i].fd; 61 + if (fd >= 0) 62 + close(fd); 65 63 64 + char path[32]; 65 + snprintf(path, sizeof(path), "/dev/input/event%d", i); 66 + fd = open(path, O_RDONLY | O_CLOEXEC | O_NONBLOCK); 67 + poll_fds[i].fd = fd >= 0 ? fd : -1; 68 + if(fd >= 0) 69 + { 70 + poll_fds[i].events = POLLIN; 71 + poll_fds[i].revents = 0; 72 + if (num_devices <= i) 73 + num_devices = i + 1; 74 + } 75 + } 76 + 77 + void button_init_device(void) 78 + { 66 79 for(int i = 0; i < NR_POLL_DESC; i++) 67 80 { 68 - int fd = open(input_devs[i], O_RDONLY | O_CLOEXEC); 81 + poll_fds[i].fd = -1; 82 + button_add_input_device(i); 83 + } 84 + } 85 + 86 + void button_remove_input_device(int i) 87 + { 88 + int fd = poll_fds[i].fd; 89 + if (fd < 0) 90 + return; 91 + 92 + if (i == num_devices - 1) 93 + num_devices = i; 69 94 70 - if(fd >= 0) 71 - { 72 - poll_fds[num_devices].fd = fd; 73 - poll_fds[num_devices].events = POLLIN; 74 - poll_fds[num_devices].revents = 0; 75 - num_devices++; 76 - } 77 - } 95 + close(fd); 96 + poll_fds[i].fd = -1; 78 97 } 79 98 80 99 void button_close_device(void) 81 100 { 101 + num_devices = 0; 82 102 /* close descriptors */ 83 - for(int i = 0; i < num_devices; i++) 103 + for(int i = 0; i < NR_POLL_DESC; i++) 84 104 { 85 - close(poll_fds[i].fd); 105 + button_remove_input_device(i); 86 106 } 87 - num_devices = 0; 88 107 } 89 108 90 109 #ifdef BUTTON_DELAY_RELEASE ··· 260 279 break; 261 280 } 262 281 } 282 + } 283 + /* device was removed/disconnected — close it to stop poll returning POLLHUP forever */ 284 + else if (poll_fds[i].revents & (POLLERR | POLLHUP)) { 285 + button_remove_input_device(i); 263 286 } 264 287 } 265 288 }
+28
firmware/target/hosted/button-devinput.h
··· 1 + /*************************************************************************** 2 + * __________ __ ___ 3 + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 + * \/ \/ \/ \/ \/ 8 + * 9 + * Copyright (C) 2026 by Roman Artiukhin 10 + * 11 + * This program is free software; you can redistribute it and/or 12 + * modify it under the terms of the GNU General Public License 13 + * as published by the Free Software Foundation; either version 2 14 + * of the License, or (at your option) any later version. 15 + * 16 + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 17 + * KIND, either express or implied. 18 + ****************************************************************************/ 19 + 20 + 21 + #ifndef __BUTTON_DEVINPUT_H__ 22 + #define __BUTTON_DEVINPUT_H__ 23 + 24 + void button_close_device(void); 25 + void button_add_input_device(int i); 26 + void button_remove_input_device(int i); 27 + 28 + #endif
+2
firmware/target/hosted/system-hosted.c
··· 29 29 #include "font.h" 30 30 #include "power.h" 31 31 #include "button.h" 32 + #include "button-devinput.h" 32 33 #include "backlight-target.h" 33 34 #include "lcd.h" 34 35 #include "filesystem-hosted.h" ··· 92 93 void power_off(void) 93 94 { 94 95 backlight_hw_off(); 96 + button_close_device(); 95 97 sync(); 96 98 system("/sbin/poweroff"); 97 99 while (1) {
+22
lib/rbcodec/dsp/channel_mode.c
··· 43 43 struct dsp_buffer **buf_p); 44 44 void channel_mode_proc_karaoke(struct dsp_proc_entry *this, 45 45 struct dsp_buffer **buf_p); 46 + void channel_mode_proc_swap(struct dsp_proc_entry *this, 47 + struct dsp_buffer **buf_p); 46 48 47 49 static struct channel_mode_data 48 50 { ··· 131 133 } 132 134 #endif /* CPU */ 133 135 136 + void channel_mode_proc_swap(struct dsp_proc_entry *this, 137 + struct dsp_buffer **buf_p) 138 + { 139 + struct dsp_buffer *buf = *buf_p; 140 + int32_t *sl = buf->p32[0]; 141 + int32_t *sr = buf->p32[1]; 142 + int count = buf->remcount; 143 + 144 + do 145 + { 146 + int32_t l = *sl; 147 + *sl++ = *sr; 148 + *sr++ = l; 149 + } 150 + while (--count > 0); 151 + 152 + (void)this; 153 + } 154 + 134 155 void channel_mode_proc_mono_left(struct dsp_proc_entry *this, 135 156 struct dsp_buffer **buf_p) 136 157 { ··· 194 215 [SOUND_CHAN_MONO_LEFT] = channel_mode_proc_mono_left, 195 216 [SOUND_CHAN_MONO_RIGHT] = channel_mode_proc_mono_right, 196 217 [SOUND_CHAN_KARAOKE] = channel_mode_proc_karaoke, 218 + [SOUND_CHAN_SWAP] = channel_mode_proc_swap, 197 219 }; 198 220 199 221 this->process = fns[((struct channel_mode_data *)this->data)->mode];
+3
manual/configure_rockbox/sound_settings.tex
··· 178 178 to make the singer sound centrally placed, this often (but not 179 179 always) has the effect of removing the voice track from a song. This 180 180 setting also very often has other undesirable effects on the sound. 181 + \item[Swap Left \& Right.] 182 + Plays the left channel in the right stereo channel, and the right 183 + channel in the left stereo channel. 181 184 \end{description} 182 185 183 186 \section{Stereo Width}
+8 -8
manual/platform/keymap-fiiom3k.tex
··· 78 78 \newcommand{\ActionKbdAbort}{\ButtonPower} 79 79 80 80 %Button actions, Pitch Screen context 81 - \newcommand{\ActionPsToggleMode}{\ButtonSelect} 82 - \newcommand{\ActionPsIncSmall}{\ButtonUp{} or \ButtonScrollBack} 83 - \newcommand{\ActionPsDecSmall}{\ButtonDown{} or \ButtonScrollFwd} 84 - \newcommand{\ActionPsIncBig}{\ButtonVolUp} 85 - \newcommand{\ActionPsDecBig}{\ButtonVolDown} 81 + \newcommand{\ActionPsToggleMode}{\ButtonMenu} 82 + \newcommand{\ActionPsIncSmall}{\ButtonUp} 83 + \newcommand{\ActionPsDecSmall}{\ButtonDown} 84 + \newcommand{\ActionPsIncBig}{Long \ButtonUp{} or \ButtonScrollBack} 85 + \newcommand{\ActionPsDecBig}{Long \ButtonDown {} or \ButtonScrollFwd} 86 86 \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} 87 87 \newcommand{\ActionPsNudgeRight}{\ButtonRight} 88 88 \newcommand{\ActionPsReset}{Long \ButtonSelect} 89 - \newcommand{\ActionPsExit}{\ButtonPower} 90 - \newcommand{\ActionPsFaster}{\ButtonBack} 91 - \newcommand{\ActionPsSlower}{\ButtonMenu} 89 + \newcommand{\ActionPsExit}{\ButtonBack{} or \ButtonSelect} 90 + \newcommand{\ActionPsFaster}{Long \ButtonRight} 91 + \newcommand{\ActionPsSlower}{Long \ButtonLeft} 92 92 93 93 %Button actions, Bookmark screen context 94 94 \newcommand{\ActionBmDelete}{\ButtonPlay}
+2 -2
manual/platform/keymap-ipod1g2g.tex
··· 77 77 \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} 78 78 \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} 79 79 \newcommand{\ActionPsNudgeRight}{\ButtonRight} 80 - \newcommand{\ActionPsReset}{\ButtonMenu} 81 - \newcommand{\ActionPsExit}{\ButtonSelect} 80 + \newcommand{\ActionPsReset}{Long \ButtonSelect} 81 + \newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} 82 82 83 83 %Button actions, Bookmark screen context 84 84 \newcommand{\ActionBmDelete}{Long \ButtonMenu}
+2 -2
manual/platform/keymap-ipod3g.tex
··· 77 77 \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} 78 78 \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} 79 79 \newcommand{\ActionPsNudgeRight}{\ButtonRight} 80 - \newcommand{\ActionPsReset}{\ButtonMenu} 81 - \newcommand{\ActionPsExit}{\ButtonSelect} 80 + \newcommand{\ActionPsReset}{Long \ButtonSelect} 81 + \newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} 82 82 83 83 %Button actions, Bookmark screen context 84 84 \newcommand{\ActionBmDelete}{Long \ButtonMenu}
+2 -2
manual/platform/keymap-ipod4g.tex
··· 78 78 \newcommand{\ActionPsDecBig}{Long \ButtonScrollBack} 79 79 \newcommand{\ActionPsNudgeLeft}{\ButtonLeft} 80 80 \newcommand{\ActionPsNudgeRight}{\ButtonRight} 81 - \newcommand{\ActionPsReset}{\ButtonMenu} 82 - \newcommand{\ActionPsExit}{\ButtonSelect} 81 + \newcommand{\ActionPsReset}{Long \ButtonSelect} 82 + \newcommand{\ActionPsExit}{\ButtonMenu{} or \ButtonSelect} 83 83 84 84 %Button actions, Recording screen context 85 85 \newcommand{\ActionRecPause}{\ButtonPlay}
+51
manual/plugins/countdown_timer.tex
··· 1 + % $Id$ % 2 + \subsection{Countdown_timer} 3 + 4 + A countdown timer. Set the desired duration, start the countdown, and the 5 + \dap{} will alert you with a beep sequence when time is up. The timer 6 + defaults to 10 minutes on launch. 7 + 8 + \subsubsection{Setting the timer} 9 + 10 + When the plugin starts, the display shows the time to count down from with 11 + the active field highlighted in brackets (e.g.\ \texttt{[10]:00}). 12 + 13 + \begin{btnmap} 14 + \opt{scrollwheel}{\PluginScrollFwd{} / \PluginScrollBack{} or } 15 + \PluginUp{} / \PluginDown 16 + \opt{HAVEREMOTEKEYMAP}{& \PluginRCUp{} / \PluginRCDown} 17 + & Increase / decrease the selected field \\ 18 + 19 + \PluginLeft{} / \PluginRight 20 + \opt{HAVEREMOTEKEYMAP}{& \PluginRCLeft{} / \PluginRCRight} 21 + & Switch between the minutes and seconds fields \\ 22 + 23 + \PluginSelect 24 + \opt{HAVEREMOTEKEYMAP}{& \PluginRCSelect} 25 + & Start the countdown \\ 26 + \end{btnmap} 27 + 28 + Minutes can be set from 0 to 99 and seconds from 0 to 59. The timer cannot 29 + be started if both fields are zero. Values wrap around when incremented or 30 + decremented past their limits. 31 + 32 + \subsubsection{Running the timer} 33 + 34 + Once started, the remaining time counts down in \texttt{MM:SS} format. 35 + 36 + \begin{btnmap} 37 + \PluginSelect 38 + \opt{HAVEREMOTEKEYMAP}{& \PluginRCSelect} 39 + & Pause / resume the timer \\ 40 + 41 + \nopt{IPOD_4G_PAD,IPOD_3G_PAD}{\PluginCancel} 42 + \opt{IPOD_4G_PAD,IPOD_3G_PAD}{\ButtonMenu} 43 + \opt{HAVEREMOTEKEYMAP}{& \PluginRCCancel} 44 + & Quit (only available while paused) \\ 45 + \end{btnmap} 46 + 47 + When the countdown reaches zero the \dap{} pauses playback, turns on the 48 + backlight, and plays three beeps. After the alert the timer continues 49 + running into overtime, displaying the elapsed overtime as 50 + \texttt{-MM:SS}. Playback resumes automatically after the beep sequence. 51 + The timer can be quit by pausing it and pressing the quit button.
+2
manual/plugins/main.tex
··· 297 297 \input{plugins/stopwatch.tex} 298 298 299 299 \input{plugins/text_editor.tex} 300 + 301 + \input{plugins/countdown_timer.tex}
+3 -1
manual/rockbox_interface/browsing_and_playing.tex
··· 143 143 Deletes the currently selected file. This option applies only to files, and 144 144 not to directories. Rockbox will ask for confirmation before deleting a file. 145 145 Press \ActionYesNoAccept{} 146 - to confirm deletion or any other key to cancel. 146 + to confirm deletion or any other key to cancel. When deleting a currently 147 + playing file, the part of the file that has already been buffered (i.e. read 148 + into the \daps\ memory) will continue playing. This may even be the whole track. 147 149 \item [Delete Directory.] 148 150 Deletes the currently selected directory and all of the files and subdirectories 149 151 it may contain. Deleted directories cannot be recovered. Use this feature with
+2 -9
manual/rockbox_interface/wps.tex
··· 254 254 \setting{Context Menu}. Then select \setting{Show Track Info}. The same steps 255 255 work in the Playlist Viewer as well.} 256 256 257 - \subsubsection{Open With...} 258 - This \setting{Open With} function is the same as the \setting{Open With} 259 - function in the file browser's \setting{Context Menu}. 260 - 261 - \subsubsection{Delete} 262 - Delete the currently playing file. The file will be deleted but the playback 263 - of the file will not stop immediately. Instead, the part of the file that 264 - has already been buffered (i.e. read into the \daps\ memory) will be played. 265 - This may even be the whole track. 257 + \subsubsection{Show in Files} 258 + Reveal the currently playing track in the \setting{File Browser}. 266 259 267 260 \opt{pitchscreen}{ 268 261 \subsubsection{\label{sec:pitchscreen}Pitch}
+1 -1
utils/jztool/Makefile
··· 21 21 22 22 CPPDEFINES := $(shell echo foo | $(CROSS)$(CC) -dM -E -) 23 23 24 - ifeq ($(findstring WIN32,$(CPPDEFINES)),WIN32) 24 + ifeq ($(findstring __WIN32__,$(CPPDEFINES)),__WIN32__) 25 25 # TODO: support Windows 26 26 else 27 27 ifeq ($(findstring APPLE,$(CPPDEFINES)),APPLE)
+1 -1
utils/mks5lboot/Makefile
··· 18 18 19 19 CPPDEFINES := $(shell echo foo | $(CROSS)$(CC) -dM -E -) 20 20 21 - ifeq ($(findstring WIN32,$(CPPDEFINES)),WIN32) 21 + ifeq ($(findstring __WIN32__,$(CPPDEFINES)),__WIN32__) 22 22 LDOPTS += -lsetupapi 23 23 # optional libusb support (needed for WinUSB and libusbK drivers) 24 24 ifeq ($(findstring MINGW,$(CPPDEFINES)),MINGW)