summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/features.txt7
-rw-r--r--apps/lang/english-us.lang369
-rw-r--r--apps/lang/english.lang20
-rw-r--r--apps/lang/polski.lang199
-rw-r--r--apps/lang/slovak.lang319
-rw-r--r--apps/lang/srpski.lang1000
-rw-r--r--apps/main.c19
-rw-r--r--apps/menus/main_menu.c2
-rw-r--r--apps/menus/settings_menu.c15
-rw-r--r--apps/onplay.c14
-rw-r--r--apps/onplay.h8
-rw-r--r--apps/playlist.c1
-rw-r--r--apps/playlist_viewer.c302
-rw-r--r--apps/plugins/CATEGORIES1
-rw-r--r--apps/plugins/SOURCES1
-rw-r--r--apps/plugins/brickmania.c15
-rw-r--r--apps/plugins/doom/d_deh.c3
-rw-r--r--apps/plugins/doom/i_video.c3
-rw-r--r--apps/plugins/lastfm_scrobbler.c350
-rw-r--r--apps/plugins/pictureflow/pictureflow.c52
-rw-r--r--apps/plugins/properties.c3
-rw-r--r--apps/plugins/sliding_puzzle.c4
-rw-r--r--apps/plugins/spacerocks.c4
-rw-r--r--apps/plugins/test_usb.c136
-rw-r--r--apps/plugins/xworld/engine.c2
-rw-r--r--apps/settings.h6
-rw-r--r--apps/settings_list.c33
-rw-r--r--apps/tagcache.c2
-rw-r--r--apps/tagtree.c7
29 files changed, 2207 insertions, 690 deletions
diff --git a/apps/features.txt b/apps/features.txt
index 45e06e5e64..2262f7502e 100644
--- a/apps/features.txt
+++ b/apps/features.txt
@@ -289,3 +289,10 @@ multi_boot
#if defined(HIBY_LINUX)
hibylinux
#endif
+
+#if defined(BUTTON_REC) || \
+ (CONFIG_KEYPAD == GIGABEAT_PAD) || \
+ (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IRIVER_H10_PAD)
+clear_settings_on_hold
+#endif
diff --git a/apps/lang/english-us.lang b/apps/lang/english-us.lang
index cc35e2b4a0..bf5e9e93ce 100644
--- a/apps/lang/english-us.lang
+++ b/apps/lang/english-us.lang
@@ -254,8 +254,7 @@
<dest>
*: "PLAY = Yes"
cowond2*: "MENU, or top-right = Yes"
- creativezen*: "SELECT = Yes"
- gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes"
+ creativezen*,gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes"
iriverh100,iriverh120,iriverh300: "NAVI = Yes"
mrobe500: "PLAY, POWER, or top-right = Yes"
vibe500: "OK = Yes"
@@ -1695,12 +1694,18 @@
*: "Random"
</voice>
</phrase>
+### The 'desc' field for 'LANG_AUDIOSCROBBLER' differs from the english!
+### the previously used desc is commented below:
+### desc: "Last.fm Log" in the playback menu
+### The <source> section for 'LANG_AUDIOSCROBBLER:*' differs from the english!
+### the previously used one is commented below:
+### Last.fm Logger
<phrase>
id: LANG_AUDIOSCROBBLER
- desc: "Last.fm Log" in the playback menu
+ desc: "Last.fm Logger" in Plugin/apps/scrobbler
user: core
<source>
- *: "Last.fm Log"
+ *: "Last.fm Logger"
</source>
<dest>
*: "Last.fm Log"
@@ -4108,31 +4113,16 @@
</phrase>
<phrase>
id: LANG_ALARM_MOD_KEYS
- desc: Shown key functions in alarm menu (for the RTC alarm mod).
+ desc: deprecated
user: core
<source>
- *: none
- alarm: "PLAY=Set OFF=Cancel"
- gigabeats: "SELECT=Set POWER=Cancel"
- ipod*: "SELECT=Set MENU=Cancel"
- iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
- mpiohd300: "ENTER=Set MENU=Cancel"
- sansafuzeplus: "SELECT=Set BACK=Cancel"
- vibe500: "OK=Set C=Cancel"
+ *: ""
</source>
<dest>
- *: none
- alarm: "PLAY=Set OFF=Cancel"
- gigabeats: "SELECT=Set POWER=Cancel"
- ipod*: "SELECT=Set MENU=Cancel"
- iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
- mpiohd300: "ENTER=Set MENU=Cancel"
- sansafuzeplus: "SELECT=Set BACK=Cancel"
- vibe500: "OK=Set C=Cancel"
+ *: ""
</dest>
<voice>
- *: none
- alarm,ipod*: ""
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14307,16 +14297,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_TITLE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Title]"
+ *: ""
</source>
<dest>
- *: "[Title]"
+ *: ""
</dest>
<voice>
- *: "Title"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14433,16 +14423,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_DURATION
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Duration]"
+ *: ""
</source>
<dest>
- *: "[Duration]"
+ *: ""
</dest>
<voice>
- *: "Duration"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14489,16 +14479,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Artist]"
+ *: ""
</source>
<dest>
- *: "[Artist]"
+ *: ""
</dest>
<voice>
- *: "Artist"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14545,16 +14535,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album]"
+ *: ""
</source>
<dest>
- *: "[Album]"
+ *: ""
</dest>
<voice>
- *: "Album"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15594,16 +15584,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_NEXT
- desc: in onplay menu. Replace current playlist with selected tracks
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Next"
+ *: ""
</source>
<dest>
- *: "Clear List & Play Next"
+ *: ""
</dest>
<voice>
- *: "Clear List & Play Next"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15664,16 +15654,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
- desc: in onplay menu. Replace current playlist with selected tracks in random order.
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Shuffled"
+ *: ""
</source>
<dest>
- *: "Clear List & Play Shuffled"
+ *: ""
</dest>
<voice>
- *: "Clear List & Play Shuffled"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15887,128 +15877,128 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUMARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album Artist]"
+ *: ""
</source>
<dest>
- *: "[Album Artist]"
+ *: ""
</dest>
<voice>
- *: "Album Artist"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_GENRE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Genre]"
+ *: ""
</source>
<dest>
- *: "[Genre]"
+ *: ""
</dest>
<voice>
- *: "Genre"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMMENT
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Comment]"
+ *: ""
</source>
<dest>
- *: "[Comment]"
+ *: ""
</dest>
<voice>
- *: "Comment"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMPOSER
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Composer]"
+ *: ""
</source>
<dest>
- *: "[Composer]"
+ *: ""
</dest>
<voice>
- *: "Composer"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_YEAR
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Year]"
+ *: ""
</source>
<dest>
- *: "[Year]"
+ *: ""
</dest>
<voice>
- *: "Year"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_TRACKNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Tracknum]"
+ *: ""
</source>
<dest>
- *: "[Tracknum]"
+ *: ""
</dest>
<voice>
- *: "Track number"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_DISCNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Discnum]"
+ *: ""
</source>
<dest>
- *: "[Discnum]"
+ *: ""
</dest>
<voice>
- *: "Disc number"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_FREQUENCY
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Frequency]"
+ *: ""
</source>
<dest>
- *: "[Frequency]"
+ *: ""
</dest>
<voice>
- *: "Frequency"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_BITRATE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Bitrate]"
+ *: ""
</source>
<dest>
- *: "[Bitrate]"
+ *: ""
</dest>
<voice>
- *: "Bit rate"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -16109,3 +16099,216 @@
*: "Descending"
</voice>
</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_ALBUM_ART
+ desc: in Settings
+ user: core
+ <source>
+ *: "Album Art"
+ </source>
+ <dest>
+ *: "Album Art"
+ </dest>
+ <voice>
+ *: "Album Art"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_PREFER_EMBEDDED
+ desc: in Settings
+ user: core
+ <source>
+ *: "Prefer Embedded"
+ </source>
+ <dest>
+ *: "Prefer Embedded"
+ </dest>
+ <voice>
+ *: "Prefer Embedded"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_PREFER_IMAGE_FILE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Prefer Image File"
+ </source>
+ <dest>
+ *: "Prefer Image File"
+ </dest>
+ <voice>
+ *: "Prefer Image File"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_FM_SYNC_RDS_TIME
+ desc: in radio screen and Settings
+ user: core
+ <source>
+ *: none
+ rds: "Sync RDS Time"
+ </source>
+ <dest>
+ *: none
+ rds: "Sync RDS Time"
+ </dest>
+ <voice>
+ *: none
+ rds: "Sync RDS Time"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_SORT_ALBUMS_BY
+ desc: in Settings
+ user: core
+ <source>
+ *: "Sort albums by"
+ </source>
+ <dest>
+ *: "Sort albums by"
+ </dest>
+ <voice>
+ *: "Sort albums by"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_ARTIST_PLUS_NAME
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Name"
+ </source>
+ <dest>
+ *: "Artist + Name"
+ </dest>
+ <voice>
+ *: "Artist And Name"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_ARTIST_PLUS_YEAR
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Year"
+ </source>
+ <dest>
+ *: "Artist + Year"
+ </dest>
+ <voice>
+ *: "Artist And Year"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_YEAR_SORT_ORDER
+ desc: in Settings
+ user: core
+ <source>
+ *: "Year sort order"
+ </source>
+ <dest>
+ *: "Year sort order"
+ </dest>
+ <voice>
+ *: "Year sort order"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_SHOW_YEAR_IN_ALBUM_TITLE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Show year in album title"
+ </source>
+ <dest>
+ *: "Show year in album title"
+ </dest>
+ <voice>
+ *: "Show year in album title"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_WAIT_FOR_CACHE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Cache needs to finish updating first!"
+ </source>
+ <dest>
+ *: "Cache needs to finish updating first!"
+ </dest>
+ <voice>
+ *: "Cache needs to finish updating first!"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_TRACK_INFO
+ desc: Track Info Title
+ user: core
+ <source>
+ *: "Track Info"
+ </source>
+ <dest>
+ *: "Track Info"
+ </dest>
+ <voice>
+ *: "Track Info"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_PLAY
+ desc: play selected file/directory, in playlist context menu
+ user: core
+ <source>
+ *: "Play"
+ </source>
+ <dest>
+ *: "Play"
+ </dest>
+ <voice>
+ *: "Play"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_PLAY_SHUFFLED
+ desc: play selected files in shuffled order, in playlist context menu
+ user: core
+ <source>
+ *: "Play Shuffled"
+ </source>
+ <dest>
+ *: "Play Shuffled"
+ </dest>
+ <voice>
+ *: "Play Shuffled"
+ </voice>
+</phrase>
+### This phrase is missing entirely, copying from english!
+<phrase>
+ id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE
+ desc: used in the playlist settings menu
+ user: core
+ <source>
+ *: "Keep Current Track When Replacing Playlist"
+ </source>
+ <dest>
+ *: "Keep Current Track When Replacing Playlist"
+ </dest>
+ <voice>
+ *: "Keep Current Track When Replacing Playlist"
+ </voice>
+</phrase>
diff --git a/apps/lang/english.lang b/apps/lang/english.lang
index 3b505bb9a2..e8d646b258 100644
--- a/apps/lang/english.lang
+++ b/apps/lang/english.lang
@@ -16368,3 +16368,23 @@
*: "Keep Current Track When Replacing Playlist"
</voice>
</phrase>
+<phrase>
+ id: LANG_CLEAR_SETTINGS_ON_HOLD
+ desc: in the system sub menu
+ user: core
+ <source>
+ *: none
+ ipodcolor,ipodnano1g,ipodvideo,ipod4g,ipodmini1g,ipodmini2g: "Clear settings when hold switch is on during startup"
+ clear_settings_on_hold, iriverh10: "Clear settings when reset button is held during startup"
+ </source>
+ <dest>
+ *: none
+ ipodcolor,ipodnano1g,ipodvideo,ipod4g,ipodmini1g,ipodmini2g: "Clear settings when hold switch is on during startup"
+ clear_settings_on_hold, iriverh10: "Clear settings when reset button is held during startup"
+ </dest>
+ <voice>
+ *: none
+ ipodcolor,ipodnano1g,ipodvideo,ipod4g,ipodmini1g,ipodmini2g: "Clear settings when hold switch is on during startup"
+ clear_settings_on_hold, iriverh10: "Clear settings when reset button is held during startup"
+ </voice>
+</phrase>
diff --git a/apps/lang/polski.lang b/apps/lang/polski.lang
index 91998e8eb1..4cef4ba59a 100644
--- a/apps/lang/polski.lang
+++ b/apps/lang/polski.lang
@@ -4102,31 +4102,16 @@
</phrase>
<phrase>
id: LANG_ALARM_MOD_KEYS
- desc: Shown key functions in alarm menu (for the RTC alarm mod).
+ desc: deprecated
user: core
<source>
- *: none
- alarm: "PLAY=Set OFF=Cancel"
- gigabeats: "SELECT=Set POWER=Cancel"
- ipod*: "SELECT=Set MENU=Cancel"
- iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
- mpiohd300: "ENTER=Set MENU=Cancel"
- sansafuzeplus: "SELECT=Set BACK=Cancel"
- vibe500: "OK=Set C=Cancel"
+ *: ""
</source>
<dest>
- *: none
- alarm: "PLAY=Ustaw OFF=Anuluj"
- gigabeats: "WYBIERZ=Ustaw POWER=Anuluj"
- ipod*: "WYBIERZ=Ustaw MENU=Anuluj"
- iriverh10,iriverh10_5gb: "WYBIERZ=Ustaw COFNIJ=Anuluj"
- mpiohd300: "ENTER=Ustaw MENU=Anuluj"
- sansafuzeplus: "SELECT=Ustaw BACK=Anuluj"
- vibe500: "OK=Ustaw C=Anuluj"
+ *: ""
</dest>
<voice>
- *: none
- alarm,ipod*: ""
+ *: ""
</voice>
</phrase>
<phrase>
@@ -13182,16 +13167,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album]"
+ *: ""
</source>
<dest>
- *: "[Album]"
+ *: ""
</dest>
<voice>
- *: "Album"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -13654,16 +13639,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_DURATION
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Duration]"
+ *: ""
</source>
<dest>
- *: "[Czas trwania]"
+ *: ""
</dest>
<voice>
- *: "Czas trwania"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14224,16 +14209,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Artist]"
+ *: ""
</source>
<dest>
- *: "[Artysta]"
+ *: ""
</dest>
<voice>
- *: "Artysta"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14900,16 +14885,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_TITLE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Title]"
+ *: ""
</source>
<dest>
- *: "[Tytuł]"
+ *: ""
</dest>
<voice>
- *: "Tytuł"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15528,16 +15513,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_NEXT
- desc: in onplay menu. Replace current playlist with selected tracks
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Next"
+ *: ""
</source>
<dest>
- *: "Wyczyść listę i odtwarzaj następne"
+ *: ""
</dest>
<voice>
- *: "Wyczyść listę i odtwarzaj następne"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15598,16 +15583,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
- desc: in onplay menu. Replace current playlist with selected tracks in random order.
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Shuffled"
+ *: ""
</source>
<dest>
- *: "Wyczyść listę i odtwarzaj losowe"
+ *: ""
</dest>
<voice>
- *: "Wyczyść listę i odtwarzaj losowe"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15881,128 +15866,128 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUMARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album Artist]"
+ *: ""
</source>
<dest>
- *: "[Wykonawca albumu]"
+ *: ""
</dest>
<voice>
- *: "Wykonawca albumu"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_GENRE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Genre]"
+ *: ""
</source>
<dest>
- *: "[Gatunek]"
+ *: ""
</dest>
<voice>
- *: "Gatunek"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMMENT
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Comment]"
+ *: ""
</source>
<dest>
- *: "[Komentarz]"
+ *: ""
</dest>
<voice>
- *: "Komentarz"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMPOSER
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Composer]"
+ *: ""
</source>
<dest>
- *: "[Kompozytor]"
+ *: ""
</dest>
<voice>
- *: "Kompozytor"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_YEAR
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Year]"
+ *: ""
</source>
<dest>
- *: "[Rok]"
+ *: ""
</dest>
<voice>
- *: "Rok"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_TRACKNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Tracknum]"
+ *: ""
</source>
<dest>
- *: "[Nr utworu]"
+ *: ""
</dest>
<voice>
- *: "Numer utworu"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_DISCNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Discnum]"
+ *: ""
</source>
<dest>
- *: "[Nr płyty]"
+ *: ""
</dest>
<voice>
- *: "Numer płyty"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_FREQUENCY
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Frequency]"
+ *: ""
</source>
<dest>
- *: "[Częstotliwość]"
+ *: ""
</dest>
<voice>
- *: "Częstotliwość"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_BITRATE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Bitrate]"
+ *: ""
</source>
<dest>
- *: "[Prędkość transmisji]"
+ *: ""
</dest>
<voice>
- *: "Prędkość transmisji"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -16260,3 +16245,59 @@
*: "Pamięć podręczna musi najpierw zakończyć aktualizację!"
</voice>
</phrase>
+<phrase>
+ id: LANG_TRACK_INFO
+ desc: Track Info Title
+ user: core
+ <source>
+ *: "Track Info"
+ </source>
+ <dest>
+ *: "Informacje o utworze"
+ </dest>
+ <voice>
+ *: "Informacje o utworze"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PLAY
+ desc: play selected file/directory, in playlist context menu
+ user: core
+ <source>
+ *: "Play"
+ </source>
+ <dest>
+ *: "Odtwarzaj"
+ </dest>
+ <voice>
+ *: "Odtwarzaj"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PLAY_SHUFFLED
+ desc: play selected files in shuffled order, in playlist context menu
+ user: core
+ <source>
+ *: "Play Shuffled"
+ </source>
+ <dest>
+ *: "Odtwarzaj losowe"
+ </dest>
+ <voice>
+ *: "Odtwarzaj losowe"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE
+ desc: used in the playlist settings menu
+ user: core
+ <source>
+ *: "Keep Current Track When Replacing Playlist"
+ </source>
+ <dest>
+ *: "Zachowaj bieżący utwór podczas zastępowania listy odtwarzania"
+ </dest>
+ <voice>
+ *: "Zachowaj bieżący utwór podczas zastępowania listy odtwarzania"
+ </voice>
+</phrase>
diff --git a/apps/lang/slovak.lang b/apps/lang/slovak.lang
index f68b7e12f8..2efe3b7b35 100644
--- a/apps/lang/slovak.lang
+++ b/apps/lang/slovak.lang
@@ -1683,10 +1683,10 @@
</phrase>
<phrase>
id: LANG_AUDIOSCROBBLER
- desc: "Last.fm Log" in the playback menu
+ desc: "Last.fm Logger" in Plugin/apps/scrobbler
user: core
<source>
- *: "Last.fm Log"
+ *: "Last.fm Logger"
</source>
<dest>
*: "Denník Last.fm"
@@ -3576,7 +3576,7 @@
</dest>
<voice>
*: none
- gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansae200*,gogearsa9200,samsungyh*,iriverh100,iriverh120,iriverh300,rtc: ""
+ gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,samsungyh*,sansac200*,sansae200*: ""
</voice>
</phrase>
<phrase>
@@ -3613,7 +3613,7 @@
</dest>
<voice>
*: none
- gogearsa9200,iaudiom5,iaudiox5,ipod*,sansac200*,iriverh10,iriverh10_5gb,sansae200*,iriverh100,iriverh120,iriverh300,mrobe100,rtc,samsungyh*: ""
+ gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,samsungyh*,sansac200*,sansae200*: ""
</voice>
</phrase>
<phrase>
@@ -4094,31 +4094,16 @@
</phrase>
<phrase>
id: LANG_ALARM_MOD_KEYS
- desc: Shown key functions in alarm menu (for the RTC alarm mod).
+ desc: deprecated
user: core
<source>
- *: none
- alarm: "PLAY=Set OFF=Cancel"
- gigabeats: "SELECT=Set POWER=Cancel"
- ipod*: "SELECT=Set MENU=Cancel"
- iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
- mpiohd300: "ENTER=Set MENU=Cancel"
- sansafuzeplus: "SELECT=Set BACK=Cancel"
- vibe500: "OK=Set C=Cancel"
+ *: ""
</source>
<dest>
- *: none
- alarm: "PLAY=Nastaviť OFF=Zrušiť"
- gigabeats: "SELECT=Nastaviť POWER=Zrušiť"
- ipod*: "SELECT=Nastaviť MENU=Zrušiť"
- iriverh10,iriverh10_5gb: "SELECT=Nastaviť PREV=Zrušiť"
- mpiohd300: "ENTER=Nastaviť MENU=Zrušiť"
- sansafuzeplus: "SELECT=Nastaviť BACK=Zrušiť"
- vibe500: "OK=Nastaviť C=Zrušiť"
+ *: ""
</dest>
<voice>
- *: none
- alarm,ipod*: ""
+ *: ""
</voice>
</phrase>
<phrase>
@@ -7672,10 +7657,10 @@
*: "."
</source>
<dest>
- *: "."
+ *: ","
</dest>
<voice>
- *: "bodka"
+ *: "čiarka"
</voice>
</phrase>
<phrase>
@@ -12664,16 +12649,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_TITLE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Title]"
+ *: ""
</source>
<dest>
- *: "[Názov]"
+ *: ""
</dest>
<voice>
- *: "Názov"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -13419,16 +13404,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_DURATION
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Duration]"
+ *: ""
</source>
<dest>
- *: "[Trvanie]"
+ *: ""
</dest>
<voice>
- *: "Trvanie"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14267,16 +14252,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Artist]"
+ *: ""
</source>
<dest>
- *: "[Interpret]"
+ *: ""
</dest>
<voice>
- *: "Interpret"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -14427,16 +14412,16 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album]"
+ *: ""
</source>
<dest>
- *: "[Album]"
+ *: ""
</dest>
<voice>
- *: "Album"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15313,10 +15298,10 @@
*: "Single Mode"
</source>
<dest>
- *: "Single Mode"
+ *: "Single režim"
</dest>
<voice>
- *: "Single Mode"
+ *: "Single režim"
</voice>
</phrase>
<phrase>
@@ -15588,10 +15573,10 @@
*: "Open Plugin"
</source>
<dest>
- *: "Open Plugin"
+ *: "Otvoriť plugin"
</dest>
<voice>
- *: "Open Plugin"
+ *: "Otvoriť plugin"
</voice>
</phrase>
<phrase>
@@ -15750,16 +15735,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_NEXT
- desc: in onplay menu. Replace current playlist with selected tracks
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Next"
+ *: ""
</source>
<dest>
- *: "Vymazať zoznam a prehrať ako ďalšie"
+ *: ""
</dest>
<voice>
- *: "Vymazať zoznam a prehrať ako ďalšie"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15770,10 +15755,10 @@
*: "Queue..."
</source>
<dest>
- *: "Queue..."
+ *: "Poradovník..."
</dest>
<voice>
- *: "Queue..."
+ *: "Poradovník..."
</voice>
</phrase>
<phrase>
@@ -15784,10 +15769,10 @@
*: "Show Queue Options"
</source>
<dest>
- *: "Show Queue Options"
+ *: "Ukázať voľby poradovníka"
</dest>
<voice>
- *: "Show Queue Options"
+ *: "Ukázať voľby poradovníka"
</voice>
</phrase>
<phrase>
@@ -15798,10 +15783,10 @@
*: "Show Shuffled Adding Options"
</source>
<dest>
- *: "Show Shuffled Adding Options"
+ *: "Ukázať voľby pridávania zamiešane"
</dest>
<voice>
- *: "Show Shuffled Adding Options"
+ *: "Ukázať voľby pridávania zamiešane"
</voice>
</phrase>
<phrase>
@@ -15820,16 +15805,16 @@
</phrase>
<phrase>
id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
- desc: in onplay menu. Replace current playlist with selected tracks in random order.
+ desc: deprecated
user: core
<source>
- *: "Clear List & Play Shuffled"
+ *: ""
</source>
<dest>
- *: "Vymazať zoznam a prehrať zamiešané"
+ *: ""
</dest>
<voice>
- *: "Vymazať zoznam a prehrať zamiešané"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -15890,128 +15875,128 @@
</phrase>
<phrase>
id: LANG_PROPERTIES_ALBUMARTIST
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Album Artist]"
+ *: ""
</source>
<dest>
- *: "[Interpret albumu]"
+ *: ""
</dest>
<voice>
- *: "Interpret albumu"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_GENRE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Genre]"
+ *: ""
</source>
<dest>
- *: "[Žáner]"
+ *: ""
</dest>
<voice>
- *: "Žáner"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMMENT
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Comment]"
+ *: ""
</source>
<dest>
- *: "[Komentár]"
+ *: ""
</dest>
<voice>
- *: "Komentár"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_COMPOSER
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Composer]"
+ *: ""
</source>
<dest>
- *: "[Skladateľ]"
+ *: ""
</dest>
<voice>
- *: "Skladateľ"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_YEAR
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Year]"
+ *: ""
</source>
<dest>
- *: "[Rok]"
+ *: ""
</dest>
<voice>
- *: "Rok"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_TRACKNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Tracknum]"
+ *: ""
</source>
<dest>
- *: "[Čstopy]"
+ *: ""
</dest>
<voice>
- *: "Č. stopy"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_DISCNUM
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Discnum]"
+ *: ""
</source>
<dest>
- *: "[Čdisku]"
+ *: ""
</dest>
<voice>
- *: "Č. disku"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_FREQUENCY
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Frequency]"
+ *: ""
</source>
<dest>
- *: "[Frekvencia]"
+ *: ""
</dest>
<voice>
- *: "Frekvencia"
+ *: ""
</voice>
</phrase>
<phrase>
id: LANG_PROPERTIES_BITRATE
- desc: in properties plugin
+ desc: deprecated
user: core
<source>
- *: "[Bitrate]"
+ *: ""
</source>
<dest>
- *: "[Početbitov]"
+ *: ""
</dest>
<voice>
- *: "Počet bitov"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -16050,10 +16035,10 @@
*: "List Wraparound"
</source>
<dest>
- *: "List Wraparound"
+ *: "Otáčať zoznam"
</dest>
<voice>
- *: "List Wraparound"
+ *: "Otáčať zoznam"
</voice>
</phrase>
<phrase>
@@ -16171,3 +16156,143 @@
rds: "Synchronizovať s časom RDS"
</voice>
</phrase>
+<phrase>
+ id: LANG_SORT_ALBUMS_BY
+ desc: in Settings
+ user: core
+ <source>
+ *: "Sort albums by"
+ </source>
+ <dest>
+ *: "Triediť albumy podľa"
+ </dest>
+ <voice>
+ *: "Triediť albumy podľa"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ARTIST_PLUS_NAME
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Name"
+ </source>
+ <dest>
+ *: "Interpret + názov"
+ </dest>
+ <voice>
+ *: "Interpret a názov"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ARTIST_PLUS_YEAR
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Year"
+ </source>
+ <dest>
+ *: "Interpret + rok"
+ </dest>
+ <voice>
+ *: "Interpret a rok"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_YEAR_SORT_ORDER
+ desc: in Settings
+ user: core
+ <source>
+ *: "Year sort order"
+ </source>
+ <dest>
+ *: "Triediť podľa roku"
+ </dest>
+ <voice>
+ *: "Triediť podľa roku"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SHOW_YEAR_IN_ALBUM_TITLE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Show year in album title"
+ </source>
+ <dest>
+ *: "Ukázať rok v názve albumu"
+ </dest>
+ <voice>
+ *: "Ukázať rok v názve albumu"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_WAIT_FOR_CACHE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Cache needs to finish updating first!"
+ </source>
+ <dest>
+ *: "Najprv sa musí dokončiť aktualizácia cache!"
+ </dest>
+ <voice>
+ *: "Najprv sa musí dokončiť aktualizácia cache!"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_TRACK_INFO
+ desc: Track Info Title
+ user: core
+ <source>
+ *: "Track Info"
+ </source>
+ <dest>
+ *: "Info o stope"
+ </dest>
+ <voice>
+ *: "Info o stope"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PLAY
+ desc: play selected file/directory, in playlist context menu
+ user: core
+ <source>
+ *: "Play"
+ </source>
+ <dest>
+ *: "Prehrať"
+ </dest>
+ <voice>
+ *: "Prehrať"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PLAY_SHUFFLED
+ desc: play selected files in shuffled order, in playlist context menu
+ user: core
+ <source>
+ *: "Play Shuffled"
+ </source>
+ <dest>
+ *: "Prehrať zamiešané"
+ </dest>
+ <voice>
+ *: "Prehrať zamiešané"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE
+ desc: used in the playlist settings menu
+ user: core
+ <source>
+ *: "Keep Current Track When Replacing Playlist"
+ </source>
+ <dest>
+ *: "Ponechať aktuálnu stopu pri nahradení playlistu"
+ </dest>
+ <voice>
+ *: "Ponechať aktuálnu stopu pri nahradení playlistu"
+ </voice>
+</phrase>
diff --git a/apps/lang/srpski.lang b/apps/lang/srpski.lang
index cdd7f51321..8e64e3f938 100644
--- a/apps/lang/srpski.lang
+++ b/apps/lang/srpski.lang
@@ -247,8 +247,7 @@
<source>
*: "PLAY = Yes"
cowond2*: "MENU, or top-right = Yes"
- creativezen*: "SELECT = Yes"
- gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes"
+ creativezen*,gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Yes"
iriverh100,iriverh120,iriverh300: "NAVI = Yes"
mrobe500: "PLAY, POWER, or top-right = Yes"
vibe500: "OK = Yes"
@@ -256,8 +255,7 @@
<dest>
*: "PLAY = Да"
cowond2*: "MENU, или горе-десно = Да"
- creativezen*: "SELECT = Да"
- gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Да"
+ creativezen*,gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Да"
iriverh100,iriverh120,iriverh300: "NAVI = Да"
mrobe500: "PLAY, POWER, или горе-десно = Да"
vibe500: "OK = Да"
@@ -278,7 +276,6 @@
</dest>
<voice>
*: ""
- archosplayer: none
</voice>
</phrase>
<phrase>
@@ -799,10 +796,10 @@
*: "Crossfeed"
</source>
<dest>
- *: "Crossfeed"
+ *: "Кросфид"
</dest>
<voice>
- *: "Crossfeed"
+ *: "Кросфид"
</voice>
</phrase>
<phrase>
@@ -981,7 +978,7 @@
*: "Edit mode: %s"
</source>
<dest>
- *: "Мод подешавања: %s"
+ *: "Режим уређивања: %s"
</dest>
<voice>
*: ""
@@ -1292,10 +1289,10 @@
*: "Party Mode"
</source>
<dest>
- *: "Мод за журке"
+ *: "Режим за журке"
</dest>
<voice>
- *: "Мод за журке"
+ *: "Режим за журке"
</voice>
</phrase>
<phrase>
@@ -1308,11 +1305,11 @@
</source>
<dest>
*: none
- crossfade: "Crossfade"
+ crossfade: "Претапање"
</dest>
<voice>
*: none
- crossfade: "Crossfade"
+ crossfade: "Претапање"
</voice>
</phrase>
<phrase>
@@ -1325,11 +1322,11 @@
</source>
<dest>
*: none
- crossfade: "Укључи Crossfade"
+ crossfade: "Укључи претапање"
</dest>
<voice>
*: none
- crossfade: "Укључи Crossfade"
+ crossfade: "Укључи претапање"
</voice>
</phrase>
<phrase>
@@ -1444,11 +1441,11 @@
</source>
<dest>
*: none
- crossfade: "Fade-Out мод"
+ crossfade: "Fade-Out режим"
</dest>
<voice>
*: none
- crossfade: "Fade-Out мод"
+ crossfade: "Fade-Out режим"
</voice>
</phrase>
<phrase>
@@ -1461,11 +1458,11 @@
</source>
<dest>
*: none
- crossfade: "Mix"
+ crossfade: "Микс"
</dest>
<voice>
*: none
- crossfade: "Mix"
+ crossfade: "Микс"
</voice>
</phrase>
<phrase>
@@ -1669,16 +1666,16 @@
</phrase>
<phrase>
id: LANG_AUDIOSCROBBLER
- desc: "Last.fm Log" in the playback menu
+ desc: "Last.fm Logger" in Plugin/apps/scrobbler
user: core
<source>
- *: "Last.fm Log"
+ *: "Last.fm Logger"
</source>
<dest>
- *: "Last.fm дневник"
+ *: "Креатор Last.fm дневника"
</dest>
<voice>
- *: "Last.fm дневник"
+ *: "Креатор Last.fm дневника"
</voice>
</phrase>
<phrase>
@@ -2376,11 +2373,11 @@
</source>
<dest>
*: none
- lcd_invert,remote_lcd_invert: "LCD мод"
+ lcd_invert,remote_lcd_invert: "LCD режим"
</dest>
<voice>
*: none
- lcd_invert,remote_lcd_invert: "LCD мод"
+ lcd_invert,remote_lcd_invert: "LCD режим"
</voice>
</phrase>
<phrase>
@@ -3599,7 +3596,7 @@
</dest>
<voice>
*: none
- gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,sansac200*,sansae200*: ""
+ gigabeat*,gogearsa9200,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh100,iriverh10_5gb,iriverh120,iriverh300,mrobe100,rtc,samsungyh*,sansac200*,sansae200*: ""
</voice>
</phrase>
<phrase>
@@ -3969,11 +3966,11 @@
</source>
<dest>
*: none
- charging: "Мод за адаптер у аутомобилу"
+ charging: "Режим за адаптер у аутомобилу"
</dest>
<voice>
*: none
- charging: "Мод за адаптер у аутомобилу"
+ charging: "Режим за адаптер у аутомобилу"
</voice>
</phrase>
<phrase>
@@ -4080,31 +4077,16 @@
</phrase>
<phrase>
id: LANG_ALARM_MOD_KEYS
- desc: Shown key functions in alarm menu (for the RTC alarm mod).
+ desc: deprecated
user: core
<source>
- *: none
- alarm: "PLAY=Set OFF=Cancel"
- gigabeats: "SELECT=Set POWER=Cancel"
- ipod*: "SELECT=Set MENU=Cancel"
- iriverh10,iriverh10_5gb: "SELECT=Set PREV=Cancel"
- mpiohd300: "ENTER=Set MENU=Cancel"
- sansafuzeplus: "SELECT=Set BACK=Cancel"
- vibe500: "OK=Set C=Cancel"
+ *: ""
</source>
<dest>
- *: none
- alarm: "PLAY=Постави OFF=Одустани"
- gigabeats: "SELECT=Постави POWER=Одустани"
- ipod*: "SELECT=Постави MENU=Одустани"
- iriverh10,iriverh10_5gb: "SELECT=Постави PREV=Одустани"
- mpiohd300: "ENTER=Постави MENU=Одустани"
- sansafuzeplus: "SELECT=Постави BACK=Одустани"
- vibe500: "OK=Постави C=Одустани"
+ *: ""
</dest>
<voice>
- *: none
- alarm,ipod*: ""
+ *: ""
</voice>
</phrase>
<phrase>
@@ -5974,12 +5956,10 @@
<source>
*: "Battery: %d%% %dh %dm"
ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm"
- iriverifp7xx: "%d%% %dh %dm"
</source>
<dest>
*: "Батерија: %d%% %dч %dм"
ipodmini1g,ipodmini2g,iriverh10: "Бат: %d%% %dч %dм"
- iriverifp7xx: "%d%% %dч %dм"
</dest>
<voice>
*: "Ниво батерије"
@@ -6019,14 +5999,17 @@
user: core
<source>
*: "Int:"
+ hibylinux: "mSD:"
xduoox3: "mSD1:"
</source>
<dest>
*: "Инт:"
+ hibylinux: "mSD:"
xduoox3: "mSD1:"
</dest>
<voice>
*: "Интерни"
+ hibylinux: "мајкро Ес Де"
xduoox3: "мајкро Ес Де 1"
</voice>
</phrase>
@@ -6251,16 +6234,16 @@
</phrase>
<phrase>
id: LANG_REPLACE
- desc: in onplay menu. Replace the current playlist with a new one.
+ desc: deprecated
user: core
<source>
- *: "Play Next"
+ *: ""
</source>
<dest>
- *: "Репродукуј следећу"
+ *: ""
</dest>
<voice>
- *: "Репродукуј следећу"
+ *: ""
</voice>
</phrase>
<phrase>
@@ -7241,10 +7224,10 @@
*: "Mode:"
</source>
<dest>
- *: "Мод:"
+ *: "Режим:"
</dest>
<voice>
- *: "Мод:"
+ *: "Режим:"
</voice>
</phrase>
<phrase>
@@ -7345,7 +7328,7 @@
</dest>
<voice>
*: none
- iaudiom5,iaudiox5,iriverh100,iriverh120,iriverh300,recording,sansac200*,sansae200*: ""
+ iaudiom5,iaudiox5,iriverh100,iriverh120,iriverh300,recording,samsungyh*,sansac200*,sansae200*,vibe500: ""
</voice>
</phrase>
<phrase>
@@ -7483,7 +7466,7 @@
*: "Incompatible model"
</source>
<dest>
- *: "Модел није одговарајући"
+ *: "Овај модел није подржан"
</dest>
<voice>
*: "Неодговарајући модел"
@@ -8304,7 +8287,7 @@
*: ""
</dest>
<voice>
- *: "pixel"
+ *: "пиксела"
</voice>
</phrase>
<phrase>
@@ -8332,7 +8315,7 @@
*: ""
</dest>
<voice>
- *: "херц"
+ *: "херца"
</voice>
</phrase>
<phrase>
@@ -8808,7 +8791,7 @@
*: ""
</dest>
<voice>
- *: "while-playing-screen"
+ *: "екран-током-репродукције"
</voice>
</phrase>
<phrase>
@@ -8864,7 +8847,7 @@
*: ""
</dest>
<voice>
- *: "firmware"
+ *: "фирмвер"
</voice>
</phrase>
<phrase>
@@ -8909,7 +8892,7 @@
*: ""
</dest>
<voice>
- *: "cuesheet"
+ *: "кјулиста"
</voice>
</phrase>
<phrase>
@@ -9108,7 +9091,7 @@
*: ""
</dest>
<voice>
- *: "units per tick"
+ *: "јединица по подеоку"
</voice>
</phrase>
<phrase>
@@ -9122,7 +9105,7 @@
*: ""
</dest>
<voice>
- *: "o'clock"
+ *: "сати"
</voice>
</phrase>
<phrase>
@@ -9136,7 +9119,7 @@
*: ""
</dest>
<voice>
- *: "P M"
+ *: "поподне"
</voice>
</phrase>
<phrase>
@@ -9150,7 +9133,7 @@
*: ""
</dest>
<voice>
- *: "A M"
+ *: "преподне"
</voice>
</phrase>
<phrase>
@@ -9164,7 +9147,7 @@
*: ""
</dest>
<voice>
- *: "oh"
+ *: "о"
</voice>
</phrase>
<phrase>
@@ -9342,7 +9325,7 @@
*: ""
</dest>
<voice>
- *: "Edit"
+ *: "Уреди"
</voice>
</phrase>
<phrase>
@@ -9356,7 +9339,7 @@
*: ""
</dest>
<voice>
- *: "Blank"
+ *: "Празно"
</voice>
</phrase>
<phrase>
@@ -9370,7 +9353,7 @@
*: ""
</dest>
<voice>
- *: "Empty list"
+ *: "Празна листа"
</voice>
</phrase>
<phrase>
@@ -9536,7 +9519,7 @@
*: ""
</dest>
<voice>
- *: "Quick screen"
+ *: "Брзи екран"
</voice>
</phrase>
<phrase>
@@ -9564,7 +9547,7 @@
*: ""
</dest>
<voice>
- *: "OK"
+ *: "О Кеј"
</voice>
</phrase>
<phrase>
@@ -9598,7 +9581,7 @@
</dest>
<voice>
*: none
- recording: ""
+ recording: "величина"
</voice>
</phrase>
<phrase>
@@ -9691,7 +9674,7 @@
</dest>
<voice>
*: none
- recording: ""
+ recording: "време дељења"
</voice>
</phrase>
<phrase>
@@ -9722,7 +9705,7 @@
</dest>
<voice>
*: none
- recording: ""
+ recording: "клип"
</voice>
</phrase>
<phrase>
@@ -9756,7 +9739,7 @@
</dest>
<voice>
*: none
- recording: ""
+ recording: "фајл"
</voice>
</phrase>
<phrase>
@@ -9975,11 +9958,11 @@
</source>
<dest>
*: none
- recording: "Моно мод"
+ recording: "Моно режим"
</dest>
<voice>
*: none
- recording: "Моно мод"
+ recording: "Моно режим"
</voice>
</phrase>
<phrase>
@@ -10201,11 +10184,11 @@
</source>
<dest>
*: none
- touchscreen: "Тачскрин мод"
+ touchscreen: "Тачскрин режим"
</dest>
<voice>
*: none
- touchscreen: "Тачскрин мод"
+ touchscreen: "Тачскрин режим"
</voice>
</phrase>
<phrase>
@@ -10247,7 +10230,7 @@
*: ""
</dest>
<voice>
- *: "statusbar skin"
+ *: "изглед статусне линије"
</voice>
</phrase>
<phrase>
@@ -10337,7 +10320,7 @@
</dest>
<voice>
*: none
- remote: "remote statusbar skin"
+ remote: "изглед удаљене статусне линије"
</voice>
</phrase>
<phrase>
@@ -10348,10 +10331,10 @@
*: "Knee"
</source>
<dest>
- *: "Knee"
+ *: "Колено"
</dest>
<voice>
- *: "Ни"
+ *: "колено"
</voice>
</phrase>
<phrase>
@@ -10390,10 +10373,10 @@
*: "Soft Knee"
</source>
<dest>
- *: "Soft Knee"
+ *: "Меко колено"
</dest>
<voice>
- *: "Софт ни"
+ *: "меко колено"
</voice>
</phrase>
<phrase>
@@ -10434,11 +10417,11 @@
</source>
<dest>
*: none
- usb_hid: "Мод USB тастатуре"
+ usb_hid: "Режим USB тастатуре"
</dest>
<voice>
*: none
- usb_hid: "Мод USB тастатуре"
+ usb_hid: "режим у ес бе тастатуре"
</voice>
</phrase>
<phrase>
@@ -10449,10 +10432,10 @@
*: "Hard Knee"
</source>
<dest>
- *: "Hard Knee"
+ *: "Тврдо колено"
</dest>
<voice>
- *: "Хард ни"
+ *: "тврдо колено"
</voice>
</phrase>
<phrase>
@@ -10813,10 +10796,10 @@
*: "Timestretch"
</source>
<dest>
- *: "Timestretch"
+ *: "Временско растезање"
</dest>
<voice>
- *: "Timestretch"
+ *: "Временско растезање"
</voice>
</phrase>
<phrase>
@@ -10975,11 +10958,11 @@
</source>
<dest>
*: none
- touchscreen: "OK"
+ touchscreen: "ОК"
</dest>
<voice>
*: none
- touchscreen: "OK"
+ touchscreen: "О Кеј"
</voice>
</phrase>
<phrase>
@@ -11979,7 +11962,7 @@
*: "Q"
</dest>
<voice>
- *: "Q"
+ *: "Ку фактор"
</voice>
</phrase>
<phrase>
@@ -12122,13 +12105,13 @@
desc: Selective Actions
user: core
<source>
- *: "Play"
+ *: "Exempt Play"
</source>
<dest>
- *: "Репродукуј"
+ *: "Изузми репродукцију"
</dest>
<voice>
- *: "Репродукуј"
+ *: "Изузми репродукцију"
</voice>
</phrase>
<phrase>
@@ -12136,13 +12119,13 @@
desc: Softlock behaviour setting
user: core
<source>
- *: "Disable Notify"
+ *: "Disable Locked Reminders"
</source>
<dest>
- *: "Онемогући обавештење"
+ *: "Онемогући закључана обавештења"
</dest>
<voice>
- *: "Онемогући обавештење"
+ *: "Онемогући закључана обавештења"
</voice>
</phrase>
<phrase>
@@ -12181,10 +12164,10 @@
*: "USB Mode"
</source>
<dest>
- *: "USB Мод"
+ *: "USB режим"
</dest>
<voice>
- *: "USB Мод"
+ *: "USB режим"
</voice>
</phrase>
<phrase>
@@ -12248,13 +12231,13 @@
desc: Selective Actions
user: core
<source>
- *: "Skip"
+ *: "Exempt Skip"
</source>
<dest>
- *: "Прескочи"
+ *: "Изузми прескакање"
</dest>
<voice>
- *: "Прескочи"
+ *: "Изузми прескакање"
</voice>
</phrase>
<phrase>
@@ -12276,13 +12259,13 @@
desc: Selective Actions
user: core
<source>
- *: "Seek"
+ *: "Exempt Seek"
</source>
<dest>
- *: "Премотај"
+ *: "Изузми премотавање"
</dest>
<voice>
- *: "Премотај"
+ *: "Изузми премотавање"
</voice>
</phrase>
<phrase>
@@ -14299,7 +14282,7 @@
*: ""
</dest>
<voice>
- *: ""
+ *: "Притисните репродукцију за покретање теста батерије или стоп за отказивање"
</voice>
</phrase>
<phrase>
@@ -14583,7 +14566,7 @@
*: ""
</dest>
<voice>
- *: ""
+ *: "Обележено"
</voice>
</phrase>
<phrase>
@@ -15349,7 +15332,6 @@
mpiohd200: "Дупли тап REC за прекид."
mpiohd300: "Дупли тап MENU за прекид."
rx27generic: "Притисните VOLUME за прекид."
- sonynwza860: "Мапе тастера нису комплетне."
touchscreen: "Притисните Middle Left за прекид."
vibe500: "Притисните PREV за прекид."
xduoox20,xduoox3,xduoox3ii: "Дупли тап HOME за прекид."
@@ -15459,3 +15441,799 @@
hotkey: "Објављивање укључено"
</voice>
</phrase>
+<phrase>
+ id: LANG_SINGLE_MODE
+ desc: single mode
+ user: core
+ <source>
+ *: "Single Mode"
+ </source>
+ <dest>
+ *: "Режим само једне"
+ </dest>
+ <voice>
+ *: "режим само једне"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_TALK_MIXER_LEVEL
+ desc: Relative volume of voice prompts
+ user: core
+ <source>
+ *: "Voice prompt volume"
+ </source>
+ <dest>
+ *: "Јачина гласа"
+ </dest>
+ <voice>
+ *: "јачина гласа"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_SHORT_SHARP
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ filter_roll_off: "Short Sharp"
+ </source>
+ <dest>
+ *: none
+ filter_roll_off: "Кратки оштар"
+ </dest>
+ <voice>
+ *: none
+ filter_roll_off: "кратки оштар"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_SHORT_SLOW
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ filter_roll_off: "Short Slow"
+ </source>
+ <dest>
+ *: none
+ filter_roll_off: "Кратки спори"
+ </dest>
+ <voice>
+ *: none
+ filter_roll_off: "Кратки спори"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_SUPER_SLOW
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ filter_roll_off: "Super Slow"
+ </source>
+ <dest>
+ *: none
+ filter_roll_off: "Супер спори"
+ </dest>
+ <voice>
+ *: none
+ filter_roll_off: "Супер спори"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_LINEAR_FAST
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Linear Fast"
+ </source>
+ <dest>
+ *: none
+ es9218: "Линеарни брзи"
+ </dest>
+ <voice>
+ *: none
+ es9218: "линеарни брзи"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_LINEAR_SLOW
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Linear Slow"
+ </source>
+ <dest>
+ *: none
+ es9218: "Линеарни спори"
+ </dest>
+ <voice>
+ *: none
+ es9218: "линеарни спори"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_MINIMUM_FAST
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Minimum Fast"
+ </source>
+ <dest>
+ *: none
+ es9218: "Минимални брзи"
+ </dest>
+ <voice>
+ *: none
+ es9218: "минимални брзи"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_MINIMUM_SLOW
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Minimum Slow"
+ </source>
+ <dest>
+ *: none
+ es9218: "Минимални спори"
+ </dest>
+ <voice>
+ *: none
+ es9218: "минимални спори"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_APODIZING_1
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Apodizing type 1"
+ </source>
+ <dest>
+ *: none
+ es9218: "Аподизацијски тип 1"
+ </dest>
+ <voice>
+ *: none
+ es9218: "Аподизацијски тип 1"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_APODIZING_2
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Apodizing type 2"
+ </source>
+ <dest>
+ *: none
+ es9218: "Аподизацијски тип 2"
+ </dest>
+ <voice>
+ *: none
+ es9218: "Аподизацијски тип 2"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_HYBRID_FAST
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Hybrid Fast"
+ </source>
+ <dest>
+ *: none
+ es9218: "Хибридни брзи"
+ </dest>
+ <voice>
+ *: none
+ es9218: "Хибридни брзи"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FILTER_BRICK_WALL
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ es9218: "Brick Wall"
+ </source>
+ <dest>
+ *: none
+ es9218: "Зид"
+ </dest>
+ <voice>
+ *: none
+ es9218: "Зид"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_DAC_POWER_MODE
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ dac_power_mode: "DAC's power mode"
+ es9218: "DAC's output level"
+ </source>
+ <dest>
+ *: none
+ dac_power_mode: "Режим напајања ДАК"
+ es9218: "Излазни ниво ДАК"
+ </dest>
+ <voice>
+ *: none
+ dac_power_mode: "Режим напајања ДАК"
+ es9218: "Излазни ниво ДАК"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_DAC_POWER_HIGH
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ dac_power_mode: "High performance"
+ es9218: "High Gain (2 Vrms)"
+ </source>
+ <dest>
+ *: none
+ dac_power_mode: "Високе перформансе"
+ es9218: "Високо појачање (2 Vrms)"
+ </dest>
+ <voice>
+ *: none
+ dac_power_mode: "Високе перформансе"
+ es9218: "Високо појачање (2 Vrms)"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_DAC_POWER_LOW
+ desc: in sound settings
+ user: core
+ <source>
+ *: none
+ dac_power_mode: "Save battery"
+ es9218: "Low Gain (1 Vrms)"
+ </source>
+ <dest>
+ *: none
+ dac_power_mode: "Штедња батерије"
+ es9218: "Ниско појачање (1 Vrms)"
+ </dest>
+ <voice>
+ *: none
+ dac_power_mode: "Штедња батерије"
+ es9218: "Ниско појачање (1 Vrms)"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ENTER_USB_STORAGE_MODE_QUERY
+ desc: upon plugging in USB
+ user: core
+ <source>
+ *: "Enter USB mass storage mode?"
+ </source>
+ <dest>
+ *: "Да пређем у режим USB масовне меморије?"
+ </dest>
+ <voice>
+ *: "Да пређем у режим USB масовне меморије?"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_CLEAR_LIST_AND_PLAY_NEXT
+ desc: in onplay menu. Replace current playlist with selected tracks
+ user: core
+ <source>
+ *: "Clear List & Play Next"
+ </source>
+ <dest>
+ *: "Очисти листу & репродукуј наредну"
+ </dest>
+ <voice>
+ *: "Очисти листу и репродукуј наредну"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_QUEUE_MENU
+ desc: in onplay menu
+ user: core
+ <source>
+ *: "Queue..."
+ </source>
+ <dest>
+ *: "Ред..."
+ </dest>
+ <voice>
+ *: "ред..."
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SHOW_QUEUE_OPTIONS
+ desc: in Current Playlist settings
+ user: core
+ <source>
+ *: "Show Queue Options"
+ </source>
+ <dest>
+ *: "Прикажи опције реда"
+ </dest>
+ <voice>
+ *: "Прикажи опције реда"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SHOW_SHUFFLED_ADDING_OPTIONS
+ desc: in Current Playlist settings
+ user: core
+ <source>
+ *: "Show Shuffled Adding Options"
+ </source>
+ <dest>
+ *: "Прикажи опције измешаног додавања"
+ </dest>
+ <voice>
+ *: "Прикажи опције измешаног додавања"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_IN_SUBMENU
+ desc: in Settings
+ user: core
+ <source>
+ *: "In Submenu"
+ </source>
+ <dest>
+ *: "У подменију"
+ </dest>
+ <voice>
+ *: "У подменију"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_CLEAR_LIST_AND_PLAY_SHUFFLED
+ desc: in onplay menu. Replace current playlist with selected tracks in random order.
+ user: core
+ <source>
+ *: "Clear List & Play Shuffled"
+ </source>
+ <dest>
+ *: "Очисти листу & репродукуј измешано"
+ </dest>
+ <voice>
+ *: "Очисти листу & репродукуј измешано"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY
+ desc: disable all softlock notifications
+ user: core
+ <source>
+ *: "Disable All Lock Notifications"
+ </source>
+ <dest>
+ *: "Искључи сва закључана обавештења"
+ </dest>
+ <voice>
+ *: "Искључи сва закључана обавештења"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ACTION_VOLUME
+ desc: exempt volume from softlock
+ user: core
+ <source>
+ *: "Exempt Volume"
+ </source>
+ <dest>
+ *: "Изузми јачину"
+ </dest>
+ <voice>
+ *: "Изузми јачину"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ACTION_ALWAYSAUTOLOCK
+ desc: always prime autolock
+ user: core
+ <source>
+ *: "Always Autolock"
+ </source>
+ <dest>
+ *: "Увек аутоматски закључај"
+ </dest>
+ <voice>
+ *: "Увек аутоматски закључај"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PLAYLIST_RELOAD_AFTER_SAVE
+ desc: reload playlist after saving
+ user: core
+ <source>
+ *: "Reload After Saving"
+ </source>
+ <dest>
+ *: "Поново учитај након чувања"
+ </dest>
+ <voice>
+ *: "Поново учитај након чувања"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_ALBUMARTIST
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Album Artist]"
+ </source>
+ <dest>
+ *: "[Уметник албума]"
+ </dest>
+ <voice>
+ *: "Уметник албума"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_GENRE
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Genre]"
+ </source>
+ <dest>
+ *: "[Жанр]"
+ </dest>
+ <voice>
+ *: "Жанр"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_COMMENT
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Comment]"
+ </source>
+ <dest>
+ *: "[Коментар]"
+ </dest>
+ <voice>
+ *: "Коментар"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_COMPOSER
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Composer]"
+ </source>
+ <dest>
+ *: "[Композитор]"
+ </dest>
+ <voice>
+ *: "Композитор"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_YEAR
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Year]"
+ </source>
+ <dest>
+ *: "[Година]"
+ </dest>
+ <voice>
+ *: "Година"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_TRACKNUM
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Tracknum]"
+ </source>
+ <dest>
+ *: "[Брнумере]"
+ </dest>
+ <voice>
+ *: "Број нумере"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_DISCNUM
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Discnum]"
+ </source>
+ <dest>
+ *: "[Брдиска]"
+ </dest>
+ <voice>
+ *: "Број диска"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_FREQUENCY
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Frequency]"
+ </source>
+ <dest>
+ *: "[Фреквенција]"
+ </dest>
+ <voice>
+ *: "Фреквенција"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PROPERTIES_BITRATE
+ desc: in properties plugin
+ user: core
+ <source>
+ *: "[Bitrate]"
+ </source>
+ <dest>
+ *: "[Битски_проток]"
+ </dest>
+ <voice>
+ *: "Битски проток"
+ </voice>
+</phrase>
+<phrase>
+ id: VOICE_NUMERIC_TENS_SWAP_SEPARATOR
+ desc: voice only, for speaking numbers in languages that swap the tens and ones fields. Leave blank for languages that do not need it, such as English ("231" => "two hundred thirty one") but other languages may speak it as "two hundred one [AND] thirty"
+ user: core
+ <source>
+ *: ""
+ </source>
+ <dest>
+ *: ""
+ </dest>
+ <voice>
+ *: ""
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_VOICED_DATE_FORMAT
+ 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"
+ user: core
+ <source>
+ *: "dAY"
+ </source>
+ <dest>
+ *: "dAY"
+ </dest>
+ <voice>
+ *: ""
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_LIST_WRAPAROUND
+ desc: in Settings
+ user: core
+ <source>
+ *: "List Wraparound"
+ </source>
+ <dest>
+ *: "Обмотавање листе"
+ </dest>
+ <voice>
+ *: "Обмотавање листе"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SHOW_SHUTDOWN_MESSAGE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Show Shutdown Message"
+ </source>
+ <dest>
+ *: "Прикажи поруку искључивања"
+ </dest>
+ <voice>
+ *: "Прикажи поруку искључивања"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_LIST_ORDER
+ desc: in Settings
+ user: core
+ <source>
+ *: "List Order"
+ </source>
+ <dest>
+ *: "Редослед листе"
+ </dest>
+ <voice>
+ *: "Редослед листе"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ASCENDING
+ desc: in Settings
+ user: core
+ <source>
+ *: "Ascending"
+ </source>
+ <dest>
+ *: "Растући"
+ </dest>
+ <voice>
+ *: "растући"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_DESCENDING
+ desc: in Settings
+ user: core
+ <source>
+ *: "Descending"
+ </source>
+ <dest>
+ *: "Опадајући"
+ </dest>
+ <voice>
+ *: "опадајући"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ALBUM_ART
+ desc: in Settings
+ user: core
+ <source>
+ *: "Album Art"
+ </source>
+ <dest>
+ *: "Слика омота"
+ </dest>
+ <voice>
+ *: "слика омота"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PREFER_EMBEDDED
+ desc: in Settings
+ user: core
+ <source>
+ *: "Prefer Embedded"
+ </source>
+ <dest>
+ *: "Предност има уграђена"
+ </dest>
+ <voice>
+ *: "Предност има уграђена"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_PREFER_IMAGE_FILE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Prefer Image File"
+ </source>
+ <dest>
+ *: "Предност има фајл слике"
+ </dest>
+ <voice>
+ *: "Предност има фајл слике"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_FM_SYNC_RDS_TIME
+ desc: in radio screen and Settings
+ user: core
+ <source>
+ *: none
+ rds: "Sync RDS Time"
+ </source>
+ <dest>
+ *: none
+ rds: "Синхронизуј са RDS временом"
+ </dest>
+ <voice>
+ *: none
+ rds: "Синхронизуј са RDS временом"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SORT_ALBUMS_BY
+ desc: in Settings
+ user: core
+ <source>
+ *: "Sort albums by"
+ </source>
+ <dest>
+ *: "Сортирај албуме по"
+ </dest>
+ <voice>
+ *: "Сортирај албуме по"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ARTIST_PLUS_NAME
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Name"
+ </source>
+ <dest>
+ *: "Уметник + Име"
+ </dest>
+ <voice>
+ *: "Уметник и име"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_ARTIST_PLUS_YEAR
+ desc: in Settings
+ user: core
+ <source>
+ *: "Artist + Year"
+ </source>
+ <dest>
+ *: "Уметник + Година"
+ </dest>
+ <voice>
+ *: "Ументик и година"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_YEAR_SORT_ORDER
+ desc: in Settings
+ user: core
+ <source>
+ *: "Year sort order"
+ </source>
+ <dest>
+ *: "Редослед сортирања године"
+ </dest>
+ <voice>
+ *: "Редослед сортирања године"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_SHOW_YEAR_IN_ALBUM_TITLE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Show year in album title"
+ </source>
+ <dest>
+ *: "Приказуј годину у наслову албума"
+ </dest>
+ <voice>
+ *: "Приказуј годину у наслову албума"
+ </voice>
+</phrase>
+<phrase>
+ id: LANG_WAIT_FOR_CACHE
+ desc: in Settings
+ user: core
+ <source>
+ *: "Cache needs to finish updating first!"
+ </source>
+ <dest>
+ *: "Најпре мора да се освежи кеш!"
+ </dest>
+ <voice>
+ *: "Најпре мора да се освежи кеш!"
+ </voice>
+</phrase>
diff --git a/apps/main.c b/apps/main.c
index dff9dc5778..59932d6185 100644
--- a/apps/main.c
+++ b/apps/main.c
@@ -566,27 +566,28 @@ static void init(void)
pcm_init();
dsp_init();
-#if defined(SETTINGS_RESET) || (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ CHART(">settings_load(ALL)");
+ settings_load(SETTINGS_ALL);
+ CHART("<settings_load(ALL)");
+
+#if defined(BUTTON_REC) || \
+ (CONFIG_KEYPAD == GIGABEAT_PAD) || \
+ (CONFIG_KEYPAD == IPOD_4G_PAD) || \
(CONFIG_KEYPAD == IRIVER_H10_PAD)
+ if (global_settings.clear_settings_on_hold &&
#ifdef SETTINGS_RESET
/* Reset settings if holding the reset button. (Rec on Archos,
A on Gigabeat) */
- if ((button_status() & SETTINGS_RESET) == SETTINGS_RESET)
+ ((button_status() & SETTINGS_RESET) == SETTINGS_RESET))
#else
/* Reset settings if the hold button is turned on */
- if (button_hold())
+ (button_hold()))
#endif
{
splash(HZ*2, str(LANG_RESET_DONE_CLEAR));
settings_reset();
}
- else
#endif
- {
- CHART(">settings_load(ALL)");
- settings_load(SETTINGS_ALL);
- CHART("<settings_load(ALL)");
- }
#ifdef HAVE_DIRCACHE
CHART(">init_dircache(true)");
diff --git a/apps/menus/main_menu.c b/apps/menus/main_menu.c
index 5e9b935937..321f2cdec4 100644
--- a/apps/menus/main_menu.c
+++ b/apps/menus/main_menu.c
@@ -338,7 +338,7 @@ static int info_speak_item(int selected_item, void * data)
#ifdef HAVE_RECORDING
case INFO_REC_DIR:
talk_id(LANG_REC_DIR, false);
- if (global_settings.rec_directory && global_settings.rec_directory[0])
+ if (global_settings.rec_directory[0])
{
long *pathsep = NULL;
char rec_directory[MAX_PATHNAME+1];
diff --git a/apps/menus/settings_menu.c b/apps/menus/settings_menu.c
index 2539f17860..460909318a 100644
--- a/apps/menus/settings_menu.c
+++ b/apps/menus/settings_menu.c
@@ -584,6 +584,15 @@ MENUITEM_SETTING(keypress_restarts_sleeptimer,
&global_settings.keypress_restarts_sleeptimer, NULL);
MENUITEM_SETTING(show_shutdown_message, &global_settings.show_shutdown_message, NULL);
+#if defined(BUTTON_REC) || \
+ (CONFIG_KEYPAD == GIGABEAT_PAD) || \
+ (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IRIVER_H10_PAD)
+#define SETTINGS_CLEAR_ON_HOLD
+MENUITEM_SETTING(clear_settings_on_hold,
+ &global_settings.clear_settings_on_hold, NULL);
+#endif
+
MAKE_MENU(startup_shutdown_menu, ID2P(LANG_STARTUP_SHUTDOWN),
0, Icon_System_menu,
&show_shutdown_message,
@@ -592,7 +601,11 @@ MAKE_MENU(startup_shutdown_menu, ID2P(LANG_STARTUP_SHUTDOWN),
&sleeptimer_toggle,
&sleeptimer_duration,
&sleeptimer_on_startup,
- &keypress_restarts_sleeptimer
+ &keypress_restarts_sleeptimer,
+#if defined(SETTINGS_CLEAR_ON_HOLD)
+ &clear_settings_on_hold,
+#undef SETTINGS_CLEAR_ON_HOLD
+#endif
);
/* STARTUP/SHUTDOWN MENU */
diff --git a/apps/onplay.c b/apps/onplay.c
index 4ffa6deece..e44e81ee5d 100644
--- a/apps/onplay.c
+++ b/apps/onplay.c
@@ -497,7 +497,7 @@ static struct add_to_pl_param addtopl_queue_shuf = {PLAYLIST_INSERT_SHUFFL
static struct add_to_pl_param addtopl_queue_last_shuf = {PLAYLIST_INSERT_LAST_SHUFFLED, 1, 0};
static struct add_to_pl_param addtopl_replace = {PLAYLIST_INSERT, 0, 1};
-static struct add_to_pl_param addtopl_replace_shuffled = {PLAYLIST_INSERT_SHUFFLED, 0, 1};
+static struct add_to_pl_param addtopl_replace_shuffled = {PLAYLIST_INSERT_LAST_SHUFFLED, 0, 1};
/* CONTEXT_[TREE|ID3DB|STD] playlist options */
static int add_to_playlist(void* arg)
@@ -1860,12 +1860,20 @@ static struct hotkey_assignment hotkey_items[] = {
{ HOTKEY_INSERT_SHUFFLED, LANG_INSERT_SHUFFLED,
HOTKEY_FUNC(playlist_insert_shuffled, NULL),
ONPLAY_RELOAD_DIR },
- { HOTKEY_PLUGIN, LANG_OPEN_PLUGIN,
+ { HOTKEY_PLUGIN, LANG_OPEN_PLUGIN,
HOTKEY_FUNC(hotkey_run_plugin, NULL),
ONPLAY_OK },
- { HOTKEY_BOOKMARK, LANG_BOOKMARK_MENU_CREATE,
+ { HOTKEY_BOOKMARK, LANG_BOOKMARK_MENU_CREATE,
HOTKEY_FUNC(bookmark_create_menu, NULL),
ONPLAY_OK },
+ { HOTKEY_PROPERTIES, LANG_PROPERTIES,
+ HOTKEY_FUNC(onplay_load_plugin, (void *)"properties"),
+ ONPLAY_RELOAD_DIR },
+#ifdef HAVE_TAGCACHE
+ { HOTKEY_PICTUREFLOW, LANG_ONPLAY_PICTUREFLOW,
+ HOTKEY_FUNC(onplay_load_plugin, (void *)"pictureflow"),
+ ONPLAY_RELOAD_DIR },
+#endif
};
/* Return the language ID for this action */
diff --git a/apps/onplay.h b/apps/onplay.h
index 3a259d68e6..3121c918ac 100644
--- a/apps/onplay.h
+++ b/apps/onplay.h
@@ -39,14 +39,18 @@ int get_hotkey_lang_id(int action);
enum hotkey_action {
HOTKEY_OFF = 0,
HOTKEY_VIEW_PLAYLIST,
+ HOTKEY_PROPERTIES,
+#ifdef HAVE_TAGCACHE
+ HOTKEY_PICTUREFLOW,
+#endif
HOTKEY_SHOW_TRACK_INFO,
HOTKEY_PITCHSCREEN,
HOTKEY_OPEN_WITH,
HOTKEY_DELETE,
+ HOTKEY_BOOKMARK,
+ HOTKEY_PLUGIN,
HOTKEY_INSERT,
HOTKEY_INSERT_SHUFFLED,
- HOTKEY_PLUGIN,
- HOTKEY_BOOKMARK,
};
#endif
diff --git a/apps/playlist.c b/apps/playlist.c
index b1d5d5a4be..70a1a0823e 100644
--- a/apps/playlist.c
+++ b/apps/playlist.c
@@ -2154,6 +2154,7 @@ int playlist_resume(void)
}
buffer = core_get_data(handle);
+ playlist_shutdown(); /* flush any cached control commands to disk */
empty_playlist(playlist, true);
playlist->control_fd = open(playlist->control_filename, O_RDWR);
diff --git a/apps/playlist_viewer.c b/apps/playlist_viewer.c
index a94e07643e..2f23d87c2b 100644
--- a/apps/playlist_viewer.c
+++ b/apps/playlist_viewer.c
@@ -73,6 +73,15 @@ enum direction
BACKWARD
};
+enum pv_onplay_result {
+ PV_ONPLAY_USB,
+ PV_ONPLAY_USB_CLOSED,
+ PV_ONPLAY_CLOSED,
+ PV_ONPLAY_ITEM_REMOVED,
+ PV_ONPLAY_CHANGED,
+ PV_ONPLAY_UNCHANGED,
+};
+
struct playlist_buffer
{
char *name_buffer; /* Buffer used to store track names */
@@ -108,6 +117,8 @@ static struct playlist_viewer viewer;
/* Used when viewing playlists on disk */
static struct playlist_info temp_playlist;
+static bool dirty = false;
+
static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer,
int names_buffer_size);
static void playlist_buffer_load_entries(struct playlist_buffer * pb, int index,
@@ -126,7 +137,9 @@ static void format_line(const struct playlist_entry* track, char* str,
int len);
static bool update_playlist(bool force);
-static int onplay_menu(int index);
+static enum pv_onplay_result onplay_menu(int index);
+
+static void close_playlist_viewer(void);
static void playlist_buffer_init(struct playlist_buffer *pb, char *names_buffer,
int names_buffer_size)
@@ -479,7 +492,7 @@ static bool update_playlist(bool force)
return true;
}
-static int show_track_info(struct playlist_entry *current_track)
+static enum pv_onplay_result show_track_info(const struct playlist_entry *current_track)
{
struct mp3entry id3;
bool id3_retrieval_successful = false;
@@ -494,15 +507,63 @@ static int show_track_info(struct playlist_entry *current_track)
return id3_retrieval_successful &&
browse_id3(&id3, current_track->index + 1,
- viewer.num_tracks) ? -1 : 0;
+ viewer.num_tracks) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED;
+}
+
+
+#ifdef HAVE_HOTKEY
+static enum pv_onplay_result open_with(const struct playlist_entry *current_track)
+{
+ char selected_track[MAX_PATH];
+ close_playlist_viewer();
+ snprintf(selected_track, sizeof(selected_track), "%s", current_track->name);
+
+ return (filetype_list_viewers(selected_track) ==
+ PLUGIN_USB_CONNECTED ? PV_ONPLAY_USB_CLOSED : PV_ONPLAY_CLOSED);
+}
+#endif /* HAVE_HOTKEY */
+
+#ifdef HAVE_TAGCACHE
+static enum pv_onplay_result open_pictureflow(const struct playlist_entry *current_track)
+{
+ char selected_track[MAX_PATH];
+ close_playlist_viewer();
+ snprintf(selected_track, sizeof(selected_track), "%s", current_track->name);
+
+ return (filetype_load_plugin((void *)"pictureflow", selected_track) ==
+ PLUGIN_USB_CONNECTED ? PV_ONPLAY_USB_CLOSED : PV_ONPLAY_CLOSED);
+}
+#endif
+
+static enum pv_onplay_result delete_track(int current_track_index,
+ int index, bool current_was_playing)
+{
+ playlist_delete(viewer.playlist, current_track_index);
+ if (current_was_playing)
+ {
+ if (playlist_amount_ex(viewer.playlist) <= 0)
+ audio_stop();
+ else
+ {
+ /* Start playing new track except if it's the lasttrack
+ track in the playlist and repeat mode is disabled */
+ struct playlist_entry *current_track =
+ playlist_buffer_get_track(&viewer.buffer, index);
+ if (current_track->display_index != viewer.num_tracks ||
+ global_settings.repeat_mode == REPEAT_ALL)
+ {
+ audio_play(0, 0);
+ viewer.current_playing_track = -1;
+ }
+ }
+ }
+ return PV_ONPLAY_ITEM_REMOVED;
}
-/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen.
- Returns -1 if USB attached, 0 if no playlist change, 1 if playlist
- changed, 2 if a track was removed from the playlist */
-static int onplay_menu(int index)
+/* Menu of playlist commands. Invoked via ON+PLAY on main viewer screen. */
+static enum pv_onplay_result onplay_menu(int index)
{
- int result, ret = 0;
+ int result, ret = PV_ONPLAY_UNCHANGED;
struct playlist_entry * current_track =
playlist_buffer_get_track(&viewer.buffer, index);
MENUITEM_STRINGLIST(menu_items, ID2P(LANG_PLAYLIST), NULL,
@@ -510,13 +571,18 @@ static int onplay_menu(int index)
ID2P(LANG_REMOVE), ID2P(LANG_MOVE), ID2P(LANG_MENU_SHOW_ID3_INFO),
ID2P(LANG_SHUFFLE),
ID2P(LANG_SAVE),
- ID2P(LANG_PLAYLISTVIEWER_SETTINGS));
- bool current = (current_track->index == viewer.current_playing_track);
+ ID2P(LANG_PLAYLISTVIEWER_SETTINGS)
+#ifdef HAVE_TAGCACHE
+ ,ID2P(LANG_ONPLAY_PICTUREFLOW)
+#endif
+ );
+
+ bool current_was_playing = (current_track->index == viewer.current_playing_track);
result = do_menu(&menu_items, NULL, NULL, false);
if (result == MENU_ATTACHED_USB)
{
- ret = -1;
+ ret = PV_ONPLAY_USB;
}
else if (result >= 0)
{
@@ -529,41 +595,21 @@ static int onplay_menu(int index)
case 0:
/* playlist */
onplay_show_playlist_menu(current_track->name, NULL);
- ret = 0;
+ ret = PV_ONPLAY_UNCHANGED;
break;
case 1:
/* add to catalog */
onplay_show_playlist_cat_menu(current_track->name);
- ret = 0;
+ ret = PV_ONPLAY_UNCHANGED;
break;
case 2:
- /* delete track */
- playlist_delete(viewer.playlist, current_track->index);
- if (current)
- {
- if (playlist_amount_ex(viewer.playlist) <= 0)
- audio_stop();
- else
- {
- /* Start playing new track except if it's the lasttrack
- track in the playlist and repeat mode is disabled */
- current_track =
- playlist_buffer_get_track(&viewer.buffer, index);
- if (current_track->display_index!=viewer.num_tracks ||
- global_settings.repeat_mode == REPEAT_ALL)
- {
- audio_play(0, 0);
- viewer.current_playing_track = -1;
- }
- }
- }
- ret = 2;
+ ret = delete_track(current_track->index, index, current_was_playing);
break;
case 3:
/* move track */
viewer.moving_track = index;
viewer.moving_playlist_index = current_track->index;
- ret = 0;
+ ret = PV_ONPLAY_UNCHANGED;
break;
case 4:
ret = show_track_info(current_track);
@@ -571,18 +617,23 @@ static int onplay_menu(int index)
case 5:
/* shuffle */
playlist_randomise(viewer.playlist, current_tick, false);
- ret = 1;
+ ret = PV_ONPLAY_CHANGED;
break;
case 6:
/* save playlist */
save_playlist_screen(viewer.playlist);
- ret = 0;
+ ret = PV_ONPLAY_UNCHANGED;
break;
case 7:
/* playlist viewer settings */
result = do_menu(&viewer_settings_menu, NULL, NULL, false);
- ret = (result == MENU_ATTACHED_USB) ? -1 : 0;
+ ret = (result == MENU_ATTACHED_USB) ? PV_ONPLAY_USB : PV_ONPLAY_UNCHANGED;
break;
+#ifdef HAVE_TAGCACHE
+ case 8:
+ ret = open_pictureflow(current_track);
+ break;
+#endif
}
}
return ret;
@@ -691,6 +742,71 @@ static int playlist_callback_voice(int selected_item, void *data)
return 0;
}
+static void update_lists(struct gui_synclist * playlist_lists)
+{
+ gui_synclist_set_voice_callback(playlist_lists,
+ global_settings.talk_file?
+ &playlist_callback_voice:NULL);
+ gui_synclist_set_icon_callback(playlist_lists,
+ global_settings.playlist_viewer_icons?
+ &playlist_callback_icons:NULL);
+ gui_synclist_set_title(playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
+ gui_synclist_draw(playlist_lists);
+ gui_synclist_speak_item(playlist_lists);
+}
+
+static bool update_viewer_with_changes(struct gui_synclist *playlist_lists, enum pv_onplay_result res)
+{
+ bool exit = false;
+ if (res == PV_ONPLAY_CHANGED ||
+ res == PV_ONPLAY_ITEM_REMOVED)
+ {
+ if (res == PV_ONPLAY_ITEM_REMOVED)
+ gui_synclist_del_item(playlist_lists);
+ update_playlist(true);
+ if (viewer.num_tracks <= 0)
+ exit = true;
+ if (viewer.selected_track >= viewer.num_tracks)
+ viewer.selected_track = viewer.num_tracks-1;
+ dirty = true;
+ }
+ /* the show_icons option in the playlist viewer settings
+ * menu might have changed */
+ update_lists(playlist_lists);
+ return exit;
+}
+
+static void prepare_lists(struct gui_synclist * playlist_lists)
+{
+ gui_synclist_init(playlist_lists, playlist_callback_name,
+ &viewer, false, 1, NULL);
+ gui_synclist_set_voice_callback(playlist_lists,
+ global_settings.talk_file ?
+ &playlist_callback_voice : NULL);
+ gui_synclist_set_icon_callback(playlist_lists,
+ global_settings.playlist_viewer_icons ?
+ &playlist_callback_icons : NULL);
+ gui_synclist_set_nb_items(playlist_lists, viewer.num_tracks);
+ gui_synclist_set_title(playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
+ gui_synclist_select_item(playlist_lists, viewer.selected_track);
+ gui_synclist_draw(playlist_lists);
+ gui_synclist_speak_item(playlist_lists);
+}
+
+static bool open_playlist_viewer(const char* filename,
+ struct gui_synclist *playlist_lists,
+ bool reload)
+{
+ push_current_activity(ACTIVITY_PLAYLISTVIEWER);
+
+ if (!playlist_viewer_init(&viewer, filename, reload))
+ return false;
+
+ prepare_lists(playlist_lists);
+
+ return true;
+}
+
/* Main viewer function. Filename identifies playlist to be viewed. If NULL,
view current playlist. */
enum playlist_viewer_result playlist_viewer_ex(const char* filename)
@@ -698,25 +814,11 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
enum playlist_viewer_result ret = PLAYLIST_VIEWER_OK;
bool exit = false; /* exit viewer */
int button;
- bool dirty = false;
struct gui_synclist playlist_lists;
- if (!playlist_viewer_init(&viewer, filename, false))
+
+ if (!open_playlist_viewer(filename, &playlist_lists, false))
goto exit;
- push_current_activity(ACTIVITY_PLAYLISTVIEWER);
- gui_synclist_init(&playlist_lists, playlist_callback_name,
- &viewer, false, 1, NULL);
- gui_synclist_set_voice_callback(&playlist_lists,
- global_settings.talk_file?
- &playlist_callback_voice:NULL);
- gui_synclist_set_icon_callback(&playlist_lists,
- global_settings.playlist_viewer_icons?
- &playlist_callback_icons:NULL);
- gui_synclist_set_nb_items(&playlist_lists, viewer.num_tracks);
- gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
- gui_synclist_select_item(&playlist_lists, viewer.selected_track);
- gui_synclist_draw(&playlist_lists);
- gui_synclist_speak_item(&playlist_lists);
while (!exit)
{
int track;
@@ -842,36 +944,22 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
}
case ACTION_STD_CONTEXT:
{
- /* ON+PLAY menu */
- int ret_val;
-
- ret_val = onplay_menu(viewer.selected_track);
+ int pv_onplay_result = onplay_menu(viewer.selected_track);
- if (ret_val < 0)
+ if (pv_onplay_result == PV_ONPLAY_USB)
{
ret = PLAYLIST_VIEWER_USB;
goto exit;
}
- else if (ret_val > 0)
+ else if (pv_onplay_result == PV_ONPLAY_USB_CLOSED)
+ return PLAYLIST_VIEWER_USB;
+ else if (pv_onplay_result == PV_ONPLAY_CLOSED)
{
- /* Playlist changed */
- if (ret_val == 2)
- gui_synclist_del_item(&playlist_lists);
- update_playlist(true);
- if (viewer.num_tracks <= 0)
- exit = true;
- if (viewer.selected_track >= viewer.num_tracks)
- viewer.selected_track = viewer.num_tracks-1;
- dirty = true;
+ if (!open_playlist_viewer(filename, &playlist_lists, true))
+ goto exit;
+ break;
}
- /* the show_icons option in the playlist viewer settings
- * menu might have changed */
- gui_synclist_set_icon_callback(&playlist_lists,
- global_settings.playlist_viewer_icons?
- &playlist_callback_icons:NULL);
- gui_synclist_set_title(&playlist_lists, playlist_lists.title, playlist_lists.title_icon);
- gui_synclist_draw(&playlist_lists);
- gui_synclist_speak_item(&playlist_lists);
+ exit = update_viewer_with_changes(&playlist_lists, pv_onplay_result);
break;
}
case ACTION_STD_MENU:
@@ -883,18 +971,50 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
{
quick_screen_quick(button);
update_playlist(true);
- gui_synclist_set_voice_callback(&playlist_lists,
- global_settings.talk_file?
- &playlist_callback_voice:NULL);
- gui_synclist_set_icon_callback(&playlist_lists,
- global_settings.playlist_viewer_icons?
- &playlist_callback_icons:NULL);
- gui_synclist_set_title(&playlist_lists, str(LANG_PLAYLIST), Icon_Playlist);
- gui_synclist_draw(&playlist_lists);
- gui_synclist_speak_item(&playlist_lists);
- break;
+ update_lists(&playlist_lists);
}
+ break;
+#endif
+#ifdef HAVE_HOTKEY
+ case ACTION_TREE_HOTKEY:
+ {
+ struct playlist_entry *current_track = playlist_buffer_get_track(
+ &viewer.buffer,
+ viewer.selected_track);
+ enum pv_onplay_result (*do_plugin)(const struct playlist_entry *) = NULL;
+#ifdef HAVE_TAGCACHE
+ if (global_settings.hotkey_tree == HOTKEY_PICTUREFLOW)
+ do_plugin = &open_pictureflow;
#endif
+ if (global_settings.hotkey_tree == HOTKEY_OPEN_WITH)
+ do_plugin = &open_with;
+
+ if (do_plugin != NULL)
+ {
+ if (do_plugin(current_track) == PV_ONPLAY_USB_CLOSED)
+ return PLAYLIST_VIEWER_USB;
+ else if (!open_playlist_viewer(filename, &playlist_lists, true))
+ goto exit;
+ }
+ else if (global_settings.hotkey_tree == HOTKEY_PROPERTIES)
+ {
+ if (show_track_info(current_track) == PV_ONPLAY_USB)
+ {
+ ret = PLAYLIST_VIEWER_USB;
+ goto exit;
+ }
+ update_lists(&playlist_lists);
+ }
+ else if (global_settings.hotkey_tree == HOTKEY_DELETE)
+ exit = update_viewer_with_changes(&playlist_lists,
+ delete_track(current_track->index,
+ viewer.selected_track,
+ (current_track->index == viewer.current_playing_track)));
+ else
+ onplay(current_track->name, FILE_ATTR_AUDIO, CONTEXT_STD, true);
+ break;
+ }
+#endif /* HAVE_HOTKEY */
default:
if(default_event_handler(button) == SYS_USB_CONNECTED)
{
@@ -906,6 +1026,12 @@ enum playlist_viewer_result playlist_viewer_ex(const char* filename)
}
exit:
+ close_playlist_viewer();
+ return ret;
+}
+
+static void close_playlist_viewer(void)
+{
talk_shutup();
pop_current_activity();
if (viewer.playlist)
@@ -914,7 +1040,7 @@ exit:
save_playlist_screen(viewer.playlist);
playlist_close(viewer.playlist);
}
- return ret;
+ dirty = false;
}
static const char* playlist_search_callback_name(int selected_item, void * data,
diff --git a/apps/plugins/CATEGORIES b/apps/plugins/CATEGORIES
index 332dd1bde4..f2ab4843c2 100644
--- a/apps/plugins/CATEGORIES
+++ b/apps/plugins/CATEGORIES
@@ -178,6 +178,7 @@ test_resize,apps
test_sampr,apps
test_scanrate,apps
test_touchscreen,apps
+test_usb,apps
test_viewports,apps
test_greylib_bitmap_scale,viewers
text_editor,apps
diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES
index c169b61cd1..942f9a5b20 100644
--- a/apps/plugins/SOURCES
+++ b/apps/plugins/SOURCES
@@ -226,5 +226,6 @@ test_sampr.c
#ifdef HAVE_TOUCHSCREEN
test_touchscreen.c
#endif
+test_usb.c
test_viewports.c
#endif /* HAVE_TEST_PLUGINS */
diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c
index 4983d5a417..3e7ea27441 100644
--- a/apps/plugins/brickmania.c
+++ b/apps/plugins/brickmania.c
@@ -111,8 +111,7 @@
#elif CONFIG_KEYPAD == SANSA_C200_PAD || \
CONFIG_KEYPAD == SANSA_CLIP_PAD || \
-CONFIG_KEYPAD == SANSA_M200_PAD || \
-CONFIG_KEYPAD == SANSA_CONNECT_PAD
+CONFIG_KEYPAD == SANSA_M200_PAD
#define QUIT BUTTON_POWER
#define LEFT BUTTON_LEFT
#define RIGHT BUTTON_RIGHT
@@ -122,6 +121,18 @@ CONFIG_KEYPAD == SANSA_CONNECT_PAD
#define UP BUTTON_UP
#define DOWN BUTTON_DOWN
+#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
+#define QUIT BUTTON_POWER
+#define LEFT BUTTON_LEFT
+#define RIGHT BUTTON_RIGHT
+#define SELECT BUTTON_SELECT
+#define UP BUTTON_UP
+#define DOWN BUTTON_DOWN
+
+#define SCROLL_FWD(x) ((x) & BUTTON_SCROLL_FWD)
+#define SCROLL_BACK(x) ((x) & BUTTON_SCROLL_BACK)
+
+
#elif CONFIG_KEYPAD == IRIVER_H10_PAD
#define QUIT BUTTON_POWER
#define LEFT BUTTON_LEFT
diff --git a/apps/plugins/doom/d_deh.c b/apps/plugins/doom/d_deh.c
index 1a399e3b49..0a67aa0aad 100644
--- a/apps/plugins/doom/d_deh.c
+++ b/apps/plugins/doom/d_deh.c
@@ -63,7 +63,7 @@ char* strlwr(char* str)
typedef struct {
const byte *inp; // Pointer to string
size_t size; // Bytes remaining in string
- int fd; // Current file descriptor
+ int fd; // Current file descriptor
} DEHFILE;
// killough 10/98: emulate IO whether input really comes from a file or not
@@ -2868,6 +2868,7 @@ boolean deh_GetData(char *s, char *k, uint_64_t *l, char **strval, int fpout)
if (*t == '=') break;
buffer[i] = *t; // copy it
}
+ if (i == 0) i = 1; /* Just in case */
buffer[--i] = '\0'; // terminate the key before the '='
if (!*t) // end of string with no equal sign
{
diff --git a/apps/plugins/doom/i_video.c b/apps/plugins/doom/i_video.c
index f5d07a8354..79f3212467 100644
--- a/apps/plugins/doom/i_video.c
+++ b/apps/plugins/doom/i_video.c
@@ -453,6 +453,9 @@ void I_ShutdownGraphics(void)
#define DOOMBUTTON_MAP BUTTON_BOTTOMRIGHT
#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
+#define DOOMBUTTON_SCROLLWHEEL
+#define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
+#define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
#define DOOMBUTTON_UP BUTTON_UP
#define DOOMBUTTON_DOWN BUTTON_DOWN
#define DOOMBUTTON_LEFT BUTTON_LEFT
diff --git a/apps/plugins/lastfm_scrobbler.c b/apps/plugins/lastfm_scrobbler.c
index 7bd213b6d2..3269f1820b 100644
--- a/apps/plugins/lastfm_scrobbler.c
+++ b/apps/plugins/lastfm_scrobbler.c
@@ -26,6 +26,7 @@ http://www.audioscrobbler.net/wiki/Portable_Player_Logging
*/
#include "plugin.h"
+#include "lib/configfile.h"
#ifndef UNTAGGED
#define UNTAGGED "<UNTAGGED>"
@@ -39,7 +40,7 @@ http://www.audioscrobbler.net/wiki/Portable_Player_Logging
/****************** constants ******************/
#define EV_EXIT MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0xFF)
-#define EV_OTHINSTANCE MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0xFE)
+#define EV_FLUSHCACHE MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0xFE)
#define EV_STARTUP MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0x01)
#define EV_TRACKCHANGE MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0x02)
#define EV_TRACKFINISH MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0x03)
@@ -55,6 +56,9 @@ http://www.audioscrobbler.net/wiki/Portable_Player_Logging
#define ITEM_HDR "#ARTIST #ALBUM #TITLE #TRACKNUM #LENGTH #RATING #TIMESTAMP #MUSICBRAINZ_TRACKID\n"
+#define CFG_FILE "/lastfm_scrobbler.cfg"
+#define CFG_VER 1
+
#if CONFIG_RTC
static time_t timestamp;
#define BASE_FILENAME HOME_DIR "/.scrobbler.log"
@@ -70,125 +74,7 @@ static time_t timestamp;
#define THREAD_STACK_SIZE 4*DEFAULT_STACK_SIZE
-#if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
- (CONFIG_KEYPAD == IRIVER_H300_PAD)
-#define SCROBBLE_OFF BUTTON_OFF
-#define SCROBBLE_OFF_TXT "STOP"
-#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || \
- (CONFIG_KEYPAD == IPOD_3G_PAD) || \
- (CONFIG_KEYPAD == IPOD_1G2G_PAD)
-#define SCROBBLE_OFF BUTTON_MENU
-#define SCROBBLE_OFF_TXT "MENU"
-#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD || \
- CONFIG_KEYPAD == AGPTEK_ROCKER_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif (CONFIG_KEYPAD == SANSA_E200_PAD) || \
- (CONFIG_KEYPAD == SANSA_C200_PAD) || \
- (CONFIG_KEYPAD == SANSA_CLIP_PAD) || \
- (CONFIG_KEYPAD == SANSA_M200_PAD)
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif (CONFIG_KEYPAD == SANSA_FUZE_PAD)
-#define SCROBBLE_OFF BUTTON_HOME
-#define SCROBBLE_OFF_TXT "HOME"
-#elif (CONFIG_KEYPAD == IRIVER_H10_PAD || \
- CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD || \
- CONFIG_KEYPAD == SONY_NWZ_PAD || \
- CONFIG_KEYPAD == XDUOO_X3_PAD || \
- CONFIG_KEYPAD == IHIFI_770_PAD || \
- CONFIG_KEYPAD == IHIFI_800_PAD || \
- CONFIG_KEYPAD == XDUOO_X3II_PAD || \
- CONFIG_KEYPAD == XDUOO_X20_PAD || \
- CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD || \
- CONFIG_KEYPAD == EROSQ_PAD)
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == GIGABEAT_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == GIGABEAT_S_PAD \
- || CONFIG_KEYPAD == SAMSUNG_YPR0_PAD \
- || CONFIG_KEYPAD == CREATIVE_ZEN_PAD
-#define SCROBBLE_OFF BUTTON_BACK
-#define SCROBBLE_OFF_TXT "BACK"
-#elif CONFIG_KEYPAD == MROBE500_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == MROBE100_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == IAUDIO_M3_PAD
-#define SCROBBLE_OFF BUTTON_REC
-#define BATTERY_RC_OFF BUTTON_RC_REC
-#define SCROBBLE_OFF_TXT "REC"
-#elif CONFIG_KEYPAD == COWON_D2_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == CREATIVEZVM_PAD
-#define SCROBBLE_OFF BUTTON_BACK
-#define SCROBBLE_OFF_TXT "BACK"
-#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == ONDAVX747_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == ONDAVX777_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \
- (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD)
-#define SCROBBLE_OFF BUTTON_RIGHT
-#define SCROBBLE_OFF_TXT "RIGHT"
-#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
-#define SCROBBLE_OFF BUTTON_REC
-#define SCROBBLE_OFF_TXT "REC"
-#elif CONFIG_KEYPAD == MPIO_HD200_PAD
-#define SCROBBLE_OFF BUTTON_REC
-#define SCROBBLE_OFF_TXT "REC"
-#elif CONFIG_KEYPAD == MPIO_HD300_PAD
-#define SCROBBLE_OFF BUTTON_REC
-#define SCROBBLE_OFF_TXT "REC"
-#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif (CONFIG_KEYPAD == HM60X_PAD) || (CONFIG_KEYPAD == HM801_PAD)
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "POWER"
-#elif CONFIG_KEYPAD == DX50_PAD
-#define SCROBBLE_OFF BUTTON_POWER_LONG
-#define SCROBBLE_OFF_TXT "Power Long"
-#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "Power"
-#elif CONFIG_KEYPAD == FIIO_M3K_PAD
-#define SCROBBLE_OFF BUTTON_POWER
-#define SCROBBLE_OFF_TXT "Power"
-#elif CONFIG_KEYPAD == SHANLING_Q1_PAD
-/* use touchscreen */
-#else
-#error "No keymap defined!"
-#endif
-#if defined(HAVE_TOUCHSCREEN)
-#ifndef SCROBBLE_OFF
-#define SCROBBLE_OFF BUTTON_TOPLEFT
-#endif
-#ifndef SCROBBLE_OFF_TXT
-#define SCROBBLE_OFF_TXT "TOPLEFT"
-#endif
-#endif
/****************** prototypes ******************/
-int plugin_main(const void* parameter); /* main loop */
enum plugin_status plugin_start(const void* parameter); /* entry */
/****************** globals ******************/
@@ -198,7 +84,8 @@ static struct
{
bool exiting; /* signal to the thread that we want to exit */
unsigned int id; /* worker thread id */
- struct event_queue queue; /* thread event queue */
+ struct event_queue queue; /* thread event queue */
+ struct queue_sender_list queue_send;
long stack[THREAD_STACK_SIZE / sizeof(long)];
} gThread;
@@ -211,6 +98,86 @@ static struct
bool force_flush;
} gCache;
+static struct
+{
+ int savepct;
+ bool playback;
+ bool verbose;
+} gConfig;
+
+static struct configdata config[] =
+{
+ {TYPE_INT, 0, 100, { .int_p = &gConfig.savepct }, "SavePct", NULL},
+ {TYPE_BOOL, 0, 1, { .bool_p = &gConfig.playback }, "Playback", NULL},
+ {TYPE_BOOL, 0, 1, { .bool_p = &gConfig.verbose }, "Verbose", NULL},
+};
+const int gCfg_sz = sizeof(config)/sizeof(*config);
+/****************** config functions *****************/
+static void config_set_defaults(void)
+{
+ gConfig.savepct = 50;
+ gConfig.playback = false;
+ gConfig.verbose = true;
+}
+
+static int config_settings_menu(void)
+{
+ int selection = 0;
+
+ struct viewport parentvp[NB_SCREENS];
+ FOR_NB_SCREENS(l)
+ {
+ rb->viewport_set_defaults(&parentvp[l], l);
+ rb->viewport_set_fullscreen(&parentvp[l], l);
+ }
+
+ MENUITEM_STRINGLIST(settings_menu, ID2P(LANG_SETTINGS), NULL,
+ ID2P(LANG_RESUME_PLAYBACK),
+ "Save Threshold",
+ "Verbose",
+ ID2P(VOICE_BLANK),
+ ID2P(LANG_CANCEL_0),
+ ID2P(LANG_SAVE_EXIT));
+
+ do {
+ selection=rb->do_menu(&settings_menu,&selection, parentvp, true);
+ switch(selection) {
+
+ case 0:
+ rb->set_bool(str(LANG_RESUME_PLAYBACK), &gConfig.playback);
+ break;
+ case 1:
+ rb->set_int("Save Threshold", "%", UNIT_PERCENT,
+ &gConfig.savepct, NULL, 10, 0, 100, NULL );
+ break;
+ case 2:
+ rb->set_bool("Verbose", &gConfig.verbose);
+ break;
+ case 3: /*sep*/
+ continue;
+ case 4:
+ return -1;
+ break;
+ case 5:
+ {
+ int res = configfile_save(CFG_FILE, config, gCfg_sz, CFG_VER);
+ if (res >= 0)
+ {
+ logf("Scrobbler cfg saved %s %d bytes", CFG_FILE, gCfg_sz);
+ return PLUGIN_OK;
+ }
+ logf("Scrobbler cfg FAILED (%d) %s", res, CFG_FILE);
+ return PLUGIN_ERROR;
+ }
+ case MENU_ATTACHED_USB:
+ return PLUGIN_USB_CONNECTED;
+ default:
+ return PLUGIN_OK;
+ }
+ } while ( selection >= 0 );
+ return 0;
+}
+
/****************** helper fuctions ******************/
int scrobbler_init(void)
@@ -326,6 +293,13 @@ static inline char* str_chk_valid(char *s, char *alt)
return (s != NULL ? s : alt);
}
+static unsigned long scrobbler_get_threshold(unsigned long length)
+{
+ /* length is assumed to be in miliseconds */
+ return length / 100 * gConfig.savepct;
+
+}
+
static void scrobbler_add_to_cache(const struct mp3entry *id)
{
static uint32_t last_crc = 0;
@@ -339,7 +313,7 @@ static void scrobbler_add_to_cache(const struct mp3entry *id)
logf("SCROBBLER: add_to_cache[%d]", gCache.pos);
- if (id->elapsed > id->length / 2)
+ if (id->elapsed >= scrobbler_get_threshold(id->length))
rating = 'L'; /* Listened */
char tracknum[11] = { "" };
@@ -410,9 +384,9 @@ static void scrobbler_change_event(unsigned short id, void *ev_data)
logf("%s", __func__);
struct mp3entry *id3 = ((struct track_event *)ev_data)->id3;
- /* check if track was resumed > %50 played ( likely got saved )
+ /* check if track was resumed > %threshold played ( likely got saved )
check for blank artist or track name */
- if ((id3->elapsed > id3->length / 2)
+ if ((id3->elapsed > scrobbler_get_threshold(id3->length))
|| (!id3->artist && !id3->albumartist) || !id3->title)
{
gCache.pending = false;
@@ -448,25 +422,32 @@ static void scrobbler_finish_event(unsigned short id, void *ev_data)
{
(void)id;
struct track_event *te = ((struct track_event *)ev_data);
- struct mp3entry *id3 = te->id3;
logf("%s %s %s", __func__, gCache.pending?"True":"False", track_event_info(te));
/* add entry using the currently ending track */
if (gCache.pending && (te->flags & TEF_CURRENT) && !(te->flags & TEF_REWIND))
{
gCache.pending = false;
- if (id3->elapsed*2 >= id3->length)
- scrobbler_add_to_cache(te->id3);
- else
- {
- logf("%s Discarding < 50%% played", __func__);
- }
+ scrobbler_add_to_cache(te->id3);
}
}
-/****************** main thread + helper ******************/
+/****************** main thread + helpers ******************/
+static void events_unregister(void)
+{
+ /* we don't want any more events */
+ rb->remove_event(PLAYBACK_EVENT_TRACK_CHANGE, scrobbler_change_event);
+ rb->remove_event(PLAYBACK_EVENT_TRACK_FINISH, scrobbler_finish_event);
+}
+
+static void events_register(void)
+{
+ rb->add_event(PLAYBACK_EVENT_TRACK_CHANGE, scrobbler_change_event);
+ rb->add_event(PLAYBACK_EVENT_TRACK_FINISH, scrobbler_finish_event);
+}
+
void thread(void)
{
bool in_usb = false;
@@ -487,6 +468,7 @@ void thread(void)
in_usb = false;
/*fall through*/
case EV_STARTUP:
+ events_register();
rb->beep_play(1500, 100, 1000);
break;
case SYS_POWEROFF:
@@ -500,10 +482,11 @@ void thread(void)
if (!in_usb)
scrobbler_flush_cache();
#endif
+ events_unregister();
return;
- case EV_OTHINSTANCE:
+ case EV_FLUSHCACHE:
scrobbler_flush_cache();
- rb->splashf(HZ * 2, "%s Cache Flushed", str(LANG_AUDIOSCROBBLER));
+ rb->queue_reply(&gThread.queue, 0);
break;
default:
logf("default %ld", ev.id);
@@ -520,6 +503,7 @@ void thread_create(void)
0, "Last.Fm_TSR"
IF_PRIO(, PRIORITY_BACKGROUND)
IF_COP(, CPU));
+ rb->queue_enable_queue_send(&gThread.queue, &gThread.queue_send, gThread.id);
rb->queue_post(&gThread.queue, EV_STARTUP, 0);
rb->yield();
}
@@ -527,79 +511,77 @@ void thread_create(void)
void thread_quit(void)
{
if (!gThread.exiting) {
+ gThread.exiting = true;
rb->queue_post(&gThread.queue, EV_EXIT, 0);
rb->thread_wait(gThread.id);
- /* we don't want any more events */
- rb->remove_event(PLAYBACK_EVENT_TRACK_CHANGE, scrobbler_change_event);
- rb->remove_event(PLAYBACK_EVENT_TRACK_FINISH, scrobbler_finish_event);
/* remove the thread's queue from the broadcast list */
rb->queue_delete(&gThread.queue);
- gThread.exiting = true;
}
}
/* callback to end the TSR plugin, called before a new one gets loaded */
static bool exit_tsr(bool reenter)
{
- logf("%s", __func__);
- bool is_exit = false;
- int button;
- if (reenter)
- {
- logf(" reenter other instance ");
- rb->queue_post(&gThread.queue, EV_OTHINSTANCE, 0);
- return false; /* dont let it start again */
- }
- rb->lcd_clear_display();
- rb->lcd_puts_scroll(0, 0, "Scrobbler is currently running.");
- rb->lcd_puts_scroll(0, 1, "Press " SCROBBLE_OFF_TXT " to exit");
- rb->lcd_puts_scroll(0, 2, "Anything else will resume");
-
- rb->lcd_update();
- rb->button_clear_queue();
- while (1)
+ MENUITEM_STRINGLIST(menu, ID2P(LANG_AUDIOSCROBBLER), NULL, ID2P(LANG_SETTINGS),
+ "Flush Cache", "Exit Plugin", ID2P(LANG_BACK));
+
+ const struct text_message quit_prompt = {
+ (const char*[]){ ID2P(LANG_AUDIOSCROBBLER),
+ "is currently running.",
+ "Quit scrobbler?" }, 3
+ };
+
+ while(true)
{
- button = rb->button_get(true);
- if (IS_SYSEVENT(button))
- continue;
- if (button == SCROBBLE_OFF)
+ int result = reenter ? rb->do_menu(&menu, NULL, NULL, false) : 2;
+ switch(result)
{
- rb->queue_post(&gThread.queue, EV_EXIT, 0);
- rb->thread_wait(gThread.id);
- /* remove the thread's queue from the broadcast list */
- rb->queue_delete(&gThread.queue);
- is_exit = true;
- }
- else is_exit = false;
+ case 0: /* settings */
+ config_settings_menu();
+ break;
+ case 1: /* flush cache */
+ rb->queue_send(&gThread.queue, EV_FLUSHCACHE, 0);
+ if (gConfig.verbose)
+ rb->splashf(2*HZ, "%s Cache Flushed", str(LANG_AUDIOSCROBBLER));
+ break;
- break;
- }
- FOR_NB_SCREENS(idx)
- rb->screens[idx]->scroll_stop();
+ case 2: /* exit plugin - quit */
+ if(rb->gui_syncyesno_run(&quit_prompt, NULL, NULL) == YESNO_YES)
+ {
+ thread_quit();
+ if (reenter)
+ rb->plugin_tsr(NULL); /* remove TSR cb */
+ return !reenter;
+ }
- if (is_exit)
- thread_quit();
+ if(!reenter)
+ return false;
- return is_exit;
+ break;
+
+ case 3: /* back to menu */
+ return false;
+ }
+ }
}
/****************** main ******************/
-
-int plugin_main(const void* parameter)
+static int plugin_main(const void* parameter)
{
(void)parameter;
rb->memset(&gThread, 0, sizeof(gThread));
- rb->splashf(HZ / 2, "%s Started",str(LANG_AUDIOSCROBBLER));
+ if (gConfig.verbose)
+ rb->splashf(HZ / 2, "%s Started",str(LANG_AUDIOSCROBBLER));
logf("%s: %s Started", __func__, str(LANG_AUDIOSCROBBLER));
rb->plugin_tsr(exit_tsr); /* stay resident */
- rb->add_event(PLAYBACK_EVENT_TRACK_CHANGE, scrobbler_change_event);
- rb->add_event(PLAYBACK_EVENT_TRACK_FINISH, scrobbler_finish_event);
thread_create();
- return 0;
+ if (gConfig.playback)
+ return PLUGIN_GOTO_WPS;
+ return PLUGIN_OK;
}
/***************** Plugin Entry Point *****************/
@@ -612,6 +594,16 @@ enum plugin_status plugin_start(const void* parameter)
language_strings = rb->language_strings;
if (scrobbler_init() < 0)
return PLUGIN_ERROR;
+
+ if (configfile_load(CFG_FILE, config, gCfg_sz, CFG_VER) < 0)
+ {
+ /* If the loading failed, save a new config file */
+ config_set_defaults();
+ configfile_save(CFG_FILE, config, gCfg_sz, CFG_VER);
+
+ rb->splash(HZ, ID2P(LANG_REVERT_TO_DEFAULT_SETTINGS));
+ }
+
int ret = plugin_main(parameter);
- return (ret==0) ? PLUGIN_OK : PLUGIN_ERROR;
+ return ret;
}
diff --git a/apps/plugins/pictureflow/pictureflow.c b/apps/plugins/pictureflow/pictureflow.c
index a2782b6a2b..0e5585681d 100644
--- a/apps/plugins/pictureflow/pictureflow.c
+++ b/apps/plugins/pictureflow/pictureflow.c
@@ -268,7 +268,6 @@ typedef fb_data pix_t;
/* some magic numbers for cache_version. */
#define CACHE_REBUILD 0
-#define CACHE_UPDATE 1
/* Error return values */
#define SUCCESS 0
@@ -306,6 +305,8 @@ struct pf_config_t
bool resize;
bool show_fps;
+
+ bool update_albumart;
};
struct pf_index_t {
@@ -511,6 +512,7 @@ static struct configdata config[] =
{ TYPE_ENUM, 0, 2, { .int_p = &pf_cfg.year_sort_order }, "year order",
year_sort_order_conf },
{ TYPE_BOOL, 0, 1, { .bool_p = &pf_cfg.show_year }, "show year", NULL },
+ { TYPE_BOOL, 0, 1, { .bool_p = &pf_cfg.update_albumart }, "update albumart", NULL }
};
#define CONFIG_NUM_ITEMS (sizeof(config) / sizeof(struct configdata))
@@ -667,9 +669,10 @@ static bool confirm_quit(void)
return true;
}
-static void config_save(int cache_version)
+static void config_save(int cache_version, bool update_albumart)
{
pf_cfg.cache_version = cache_version;
+ pf_cfg.update_albumart = update_albumart;
configfile_save(CONFIG_FILE, config, CONFIG_NUM_ITEMS, CONFIG_VERSION);
}
@@ -684,12 +687,13 @@ static void config_set_defaults(struct pf_config_t *cfg)
cfg->last_album = 0;
cfg->backlight_mode = 0;
cfg->resize = true;
- cfg->cache_version = 0;
+ cfg->cache_version = CACHE_REBUILD;
cfg->show_album_name = (LCD_HEIGHT > 100)
? ALBUM_NAME_TOP : ALBUM_NAME_BOTTOM;
cfg->sort_albums_by = SORT_BY_ARTIST_AND_NAME;
cfg->year_sort_order = ASCENDING;
cfg->show_year = false;
+ cfg->update_albumart = false;
}
static inline PFreal fmul(PFreal a, PFreal b)
@@ -959,6 +963,9 @@ const struct custom_format format_transposed = {
static const struct button_mapping* get_context_map(int context)
{
+#ifdef HAVE_LOCKED_ACTIONS
+ context &= ~CONTEXT_LOCKED;
+#endif
return pf_contexts[context & ~CONTEXT_PLUGIN];
}
@@ -2250,8 +2257,6 @@ static bool incremental_albumart_cache(bool verbose)
unsigned int hash_artist, hash_album;
unsigned int format = FORMAT_NATIVE;
- bool update = (pf_cfg.cache_version == CACHE_UPDATE);
-
if (pf_cfg.resize)
format |= FORMAT_RESIZE|FORMAT_KEEP_ASPECT;
@@ -2263,8 +2268,6 @@ static bool incremental_albumart_cache(bool verbose)
aa_cache.inspected++;
if (aa_cache.idx >= pf_idx.album_ct) { aa_cache.idx = 0; } /* Rollover */
- if (!get_albumart_for_index_from_db(idx, aa_cache.file, sizeof(aa_cache.file)))
- goto aa_failure; //rb->strcpy(aa_cache.file, EMPTY_SLIDE_BMP);
hash_artist = mfnv(get_album_artist(idx));
hash_album = mfnv(get_album_name(idx));
@@ -2272,13 +2275,15 @@ static bool incremental_albumart_cache(bool verbose)
rb->snprintf(aa_cache.pfraw_file, sizeof(aa_cache.pfraw_file),
CACHE_PREFIX "/%x%x.pfraw", hash_album, hash_artist);
- if(rb->file_exists(aa_cache.pfraw_file)) {
- if(update) {
- aa_cache.slides++;
- goto aa_success;
- }
+ if(pf_cfg.update_albumart && rb->file_exists(aa_cache.pfraw_file)) {
+ aa_cache.slides++;
+ goto aa_success;
}
+ if (!get_albumart_for_index_from_db(idx, aa_cache.file, sizeof(aa_cache.file)))
+ goto aa_failure; //rb->strcpy(aa_cache.file, EMPTY_SLIDE_BMP);
+
+
aa_cache.input_bmp.data = aa_cache.buf;
aa_cache.input_bmp.width = DISPLAY_WIDTH;
aa_cache.input_bmp.height = DISPLAY_HEIGHT;
@@ -3169,14 +3174,14 @@ static inline void set_current_slide(const int slide_index)
{
int old_center_index = center_index;
step = 0;
- center_index = fbound(slide_index, 0, number_of_slides - 1);
+ center_index = fbound(0, slide_index, number_of_slides - 1);
if (old_center_index != center_index)
{
rb->queue_remove_from_head(&thread_q, EV_WAKEUP);
rb->queue_post(&thread_q, EV_WAKEUP, 0);
}
target = center_index;
- slide_frame = slide_index << 16;
+ slide_frame = center_index << 16;
reset_slides();
}
@@ -3609,6 +3614,7 @@ static int settings_menu(void)
break;
/* fallthrough if changed, since cache needs to be rebuilt */
case 10:
+ pf_cfg.update_albumart = false;
pf_cfg.cache_version = CACHE_REBUILD;
rb->remove(EMPTY_SLIDE);
configfile_save(CONFIG_FILE, config,
@@ -3616,7 +3622,8 @@ static int settings_menu(void)
rb->splash(HZ, ID2P(LANG_CACHE_REBUILT_NEXT_RESTART));
break;
case 11:
- pf_cfg.cache_version = CACHE_UPDATE;
+ pf_cfg.update_albumart = true;
+ pf_cfg.cache_version = CACHE_REBUILD;
rb->remove(EMPTY_SLIDE);
configfile_save(CONFIG_FILE, config,
CONFIG_NUM_ITEMS, CONFIG_VERSION);
@@ -4210,7 +4217,7 @@ static void set_initial_slide(const char* selected_file)
pf_cfg.last_album);
else
{
- struct mp3entry id3;
+ static struct mp3entry id3;
#if defined(HAVE_TC_RAMCACHE) && defined(HAVE_DIRCACHE)
if (rb->tagcache_fill_tags(&id3, selected_file))
set_current_slide(id3_get_index(&id3));
@@ -4319,13 +4326,13 @@ static int pictureflow_main(const char* selected_file)
pf_idx.buf_sz -= aa_bufsz;
if (!create_empty_slide(pf_cfg.cache_version != CACHE_VERSION)) {
- config_save(CACHE_REBUILD);
+ config_save(CACHE_REBUILD, false);
error_wait("Could not load the empty slide");
return PLUGIN_ERROR;
}
if ((pf_cfg.cache_version != CACHE_VERSION) && !create_albumart_cache()) {
- config_save(CACHE_REBUILD);
+ config_save(CACHE_REBUILD, false);
error_wait("Could not create album art cache");
} else if(aa_cache.inspected < pf_idx.album_ct) {
rb->splash(HZ * 2, "Updating album art cache in background");
@@ -4333,7 +4340,7 @@ static int pictureflow_main(const char* selected_file)
if (pf_cfg.cache_version != CACHE_VERSION)
{
- config_save(CACHE_VERSION);
+ config_save(CACHE_VERSION, pf_cfg.update_albumart);
}
rb->buflib_init(&buf_ctx, (void *)pf_idx.buf, pf_idx.buf_sz);
@@ -4416,7 +4423,12 @@ static int pictureflow_main(const char* selected_file)
break;
case pf_idle:
render_all_slides();
- incremental_albumart_cache(false);
+ if (aa_cache.inspected < pf_idx.album_ct)
+ {
+ buf_ctx_lock();
+ incremental_albumart_cache(false);
+ buf_ctx_unlock();
+ }
break;
}
diff --git a/apps/plugins/properties.c b/apps/plugins/properties.c
index e5f00e307b..c4378a0356 100644
--- a/apps/plugins/properties.c
+++ b/apps/plugins/properties.c
@@ -313,7 +313,8 @@ enum plugin_status plugin_start(const void* parameter)
int button;
bool quit = false, usb = false;
const char *file = parameter;
- if(!parameter) return PLUGIN_ERROR;
+ if(!parameter || (file[0] != '/')) return PLUGIN_ERROR;
+
#ifdef HAVE_TOUCHSCREEN
rb->touchscreen_set_mode(rb->global_settings->touch_mode);
#endif
diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c
index a34cb77669..af6aa40ea0 100644
--- a/apps/plugins/sliding_puzzle.c
+++ b/apps/plugins/sliding_puzzle.c
@@ -468,8 +468,8 @@ static const char * initial_bmp_path=NULL;
static const char * get_albumart_bmp_path(void)
{
struct mp3entry* track = rb->audio_current_track();
-
- if (!track || !track->path || track->path[0] == '\0')
+ /* Note rb->audio_current_track->path should never be null */
+ if (!track || track->path[0] == '\0')
return NULL;
if (!rb->search_albumart_files(track, "", albumart_path, MAX_PATH ) )
diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c
index 8203fad612..1099672c4c 100644
--- a/apps/plugins/spacerocks.c
+++ b/apps/plugins/spacerocks.c
@@ -259,8 +259,8 @@
#define AST_QUIT BUTTON_POWER
#define AST_THRUST BUTTON_UP
#define AST_HYPERSPACE BUTTON_DOWN
-#define AST_LEFT BUTTON_LEFT
-#define AST_RIGHT BUTTON_RIGHT
+#define AST_LEFT BUTTON_SCROLL_BACK
+#define AST_RIGHT BUTTON_SCROLL_FWD
#define AST_FIRE BUTTON_SELECT
#elif (CONFIG_KEYPAD == SAMSUNG_YPR0_PAD)
diff --git a/apps/plugins/test_usb.c b/apps/plugins/test_usb.c
new file mode 100644
index 0000000000..6bb77c40be
--- /dev/null
+++ b/apps/plugins/test_usb.c
@@ -0,0 +1,136 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2022 Aidan MacDonald
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "plugin.h"
+#include "logf.h"
+
+#undef DEBUGF
+#define DEBUGF(...)
+//#define DEBUGF printf
+
+#define EV_EXIT MAKE_SYS_EVENT(SYS_EVENT_CLS_PRIVATE, 0xFF)
+
+unsigned char stack[DEFAULT_STACK_SIZE];
+struct event_queue queue;
+int thread_id;
+const char* state = "none";
+const char* prev_state = "none";
+
+static void main_loop(void)
+{
+ bool exiting = false;
+ struct queue_event ev;
+
+ while(true) {
+ rb->queue_wait(&queue, &ev);
+
+ /* events that are handled whether exiting or not */
+ switch(ev.id) {
+ case EV_EXIT:
+ return;
+ }
+
+ if(exiting)
+ continue;
+
+ /* events handled only when not exiting */
+ switch(ev.id) {
+ case SYS_USB_CONNECTED:
+ prev_state = state;
+ state = "connected";
+ logf("test_usb: connect ack %ld", *rb->current_tick);
+ DEBUGF("test_usb: connect ack %ld\n", *rb->current_tick);
+ rb->usb_acknowledge(SYS_USB_CONNECTED_ACK);
+ break;
+
+ case SYS_USB_DISCONNECTED:
+ prev_state = state;
+ state = "disconnected";
+ logf("test_usb: disconnect %ld", *rb->current_tick);
+ DEBUGF("test_usb: disconnect %ld\n", *rb->current_tick);
+ break;
+
+ case SYS_POWEROFF:
+ case SYS_REBOOT:
+ prev_state = state;
+ state = "exiting";
+ exiting = true;
+ break;
+ }
+ }
+}
+
+static void kill_tsr(void)
+{
+ rb->queue_post(&queue, EV_EXIT, 0);
+ rb->thread_wait(thread_id);
+ rb->queue_delete(&queue);
+}
+
+static bool exit_tsr(bool reenter)
+{
+ MENUITEM_STRINGLIST(menu, "USB test menu", NULL,
+ "Status", "Stop plugin", "Back");
+
+ while(true) {
+ int result = reenter ? rb->do_menu(&menu, NULL, NULL, false) : 1;
+ switch(result) {
+ case 0:
+ rb->splashf(HZ, "State: %s", state);
+ rb->splashf(HZ, "Prev: %s", prev_state);
+ break;
+ case 1:
+ rb->splashf(HZ, "Stopping USB test thread");
+ kill_tsr();
+ return true;
+ case 2:
+ return false;
+ }
+ }
+}
+
+static void run_tsr(void)
+{
+ rb->queue_init(&queue, true);
+ thread_id = rb->create_thread(main_loop, stack, sizeof(stack),
+ 0, "test_usb TSR"
+ IF_PRIO(, PRIORITY_BACKGROUND)
+ IF_COP(, CPU));
+ rb->plugin_tsr(exit_tsr);
+}
+
+enum plugin_status plugin_start(const void* parameter)
+{
+ (void)parameter;
+ MENUITEM_STRINGLIST(menu, "USB test menu", NULL,
+ "Start", "Quit");
+
+ switch(rb->do_menu(&menu, NULL, NULL, false)) {
+ case 0:
+ run_tsr();
+ rb->splashf(HZ, "Thread started");
+ return PLUGIN_OK;
+ case 1:
+ return PLUGIN_OK;
+ default:
+ return PLUGIN_ERROR;
+ }
+}
diff --git a/apps/plugins/xworld/engine.c b/apps/plugins/xworld/engine.c
index b09e320078..d99d9df6c6 100644
--- a/apps/plugins/xworld/engine.c
+++ b/apps/plugins/xworld/engine.c
@@ -293,7 +293,7 @@ void engine_processInput(struct Engine* e) {
e->sys->input.save = false;
}
if (e->sys->input.fastMode) {
- e->vm._fastMode = !&e->vm._fastMode;
+ e->vm._fastMode = !e->vm._fastMode;
e->sys->input.fastMode = false;
}
if (e->sys->input.stateSlot != 0) {
diff --git a/apps/settings.h b/apps/settings.h
index 9af8e27e5e..092c04a76b 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -868,6 +868,12 @@ struct user_settings
#if defined(DX50) || defined(DX90) || (defined(HAVE_USB_POWER) && !defined(USB_NONE) && !defined(SIMULATOR))
int usb_mode;
#endif
+#if defined(BUTTON_REC) || \
+ (CONFIG_KEYPAD == GIGABEAT_PAD) || \
+ (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IRIVER_H10_PAD)
+ bool clear_settings_on_hold;
+#endif
};
/** global variables **/
diff --git a/apps/settings_list.c b/apps/settings_list.c
index 0e39a58b1a..5fd7e0459b 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -2113,10 +2113,23 @@ const struct settings_list settings[] = {
HOTKEY_OPEN_WITH, HOTKEY_DELETE, HOTKEY_BOOKMARK, HOTKEY_PLUGIN),
TABLE_SETTING(F_ALLOW_ARBITRARY_VALS, hotkey_tree,
LANG_HOTKEY_FILE_BROWSER, HOTKEY_OFF, "hotkey tree",
- "off,open with,delete,insert,insert shuffled",
- UNIT_INT, hotkey_formatter, hotkey_getlang, NULL, 5, HOTKEY_OFF,
- HOTKEY_OPEN_WITH, HOTKEY_DELETE, HOTKEY_INSERT, HOTKEY_INSERT_SHUFFLED),
+#ifdef HAVE_TAGCACHE
+ "off,properties,pictureflow,open with,delete,insert,insert shuffled",
+#else
+ "off,properties,open with,delete,insert,insert shuffled",
+#endif
+ UNIT_INT, hotkey_formatter, hotkey_getlang, NULL,
+#ifdef HAVE_TAGCACHE
+ 7,
+#else
+ 6,
+#endif
+ HOTKEY_OFF,HOTKEY_PROPERTIES,
+#ifdef HAVE_TAGCACHE
+ HOTKEY_PICTUREFLOW,
#endif
+ HOTKEY_OPEN_WITH, HOTKEY_DELETE, HOTKEY_INSERT, HOTKEY_INSERT_SHUFFLED),
+#endif /* HAVE_HOTKEY */
INT_SETTING(F_TIME_SETTING, resume_rewind, LANG_RESUME_REWIND, 0,
"resume rewind", UNIT_SEC, 0, 60, 5,
@@ -2148,19 +2161,18 @@ const struct settings_list settings[] = {
LANG_USB_MODE,
USBMODE_DEFAULT,
"usb mode",
- "ask,mass storage,charge"
+ "mass storage,charge"
#if defined(DX50) || defined(DX90)
",adb"
#endif
,
#if defined(DX50) || defined(DX90)
ibasso_set_usb_mode,
- 4,
+ 3,
#else
usb_set_mode,
- 3,
+ 2,
#endif
- ID2P(LANG_ASK),
ID2P(LANG_USB_MODE_MASS_STORAGE),
ID2P(LANG_USB_MODE_CHARGE)
#if defined(DX50) || defined(DX90)
@@ -2168,6 +2180,13 @@ const struct settings_list settings[] = {
#endif
),
#endif
+#if defined(BUTTON_REC) || \
+ (CONFIG_KEYPAD == GIGABEAT_PAD) || \
+ (CONFIG_KEYPAD == IPOD_4G_PAD) || \
+ (CONFIG_KEYPAD == IRIVER_H10_PAD)
+ OFFON_SETTING(0, clear_settings_on_hold, LANG_CLEAR_SETTINGS_ON_HOLD,
+ true, "clear settings on hold", NULL),
+#endif
};
const int nb_settings = sizeof(settings)/sizeof(*settings);
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 436d85812b..8db1569379 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -170,7 +170,7 @@ static const char * const tag_type_str[] = {
#endif /* ndef LOGF_ENABLE */
/* Status information of the tagcache. */
-static struct tagcache_stat tc_stat;
+struct tagcache_stat tc_stat;
/* Queue commands. */
enum tagcache_queue {
diff --git a/apps/tagtree.c b/apps/tagtree.c
index 45d2bb991b..2694a764a0 100644
--- a/apps/tagtree.c
+++ b/apps/tagtree.c
@@ -1429,6 +1429,10 @@ static struct tagentry* get_entries(struct tree_context *tc)
return core_get_data(tc->cache.entries_handle);
}
+#ifdef HAVE_TC_RAMCACHE
+extern struct tagcache_stat tc_stat;
+#endif
+
static int retrieve_entries(struct tree_context *c, int offset, bool init)
{
struct tagcache_search tcs;
@@ -1447,6 +1451,9 @@ static int retrieve_entries(struct tree_context *c, int offset, bool init)
otherwise show it after the normal 1/2 second delay */
show_search_progress(
#ifdef HAVE_DISK_STORAGE
+#ifdef HAVE_TC_RAMCACHE
+ tc_stat.ramcache ? true :
+#endif
storage_disk_is_active()
#else
true