From 9c708e3876b4d2ad76893144f3cb8348e3fbbb0f Mon Sep 17 00:00:00 2001 From: mojyack Date: Fri, 13 Feb 2026 16:53:25 +0900 Subject: [PATCH 01/24] plugins: midi: remove HW_SAMPR_CAPS usage Change-Id: Ie4962cf6d4f2f9078fa348f8f6f638cfbc0047a5 --- apps/plugins/midi/midiplay.c | 58 +++++++++++++++++++++++++++++-- apps/plugins/midi/midiutil.c | 2 +- apps/plugins/midi/midiutil.h | 65 ++--------------------------------- apps/plugins/midi/sequencer.c | 26 +++++++------- apps/plugins/midi/synth.c | 6 ++-- 5 files changed, 75 insertions(+), 82 deletions(-) diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index 2689e96ba1..012169a02e 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -381,6 +381,8 @@ struct MIDIfile * mf IBSS_ATTR; +int sample_rate IBSS_ATTR; +int max_voices IBSS_ATTR; int number_of_samples IBSS_ATTR; /* the number of samples in the current tick */ int playing_time IBSS_ATTR; /* How many seconds into the file have we been playing? */ int samples_this_second IBSS_ATTR; /* How many samples produced during this second so far? */ @@ -490,11 +492,61 @@ static void get_more(const void** start, size_t* size) *size = samples_in_buf*sizeof(int32_t); } +static const struct mixer_play_cbs mixer_cbs = { + .get_more = get_more, + /* TODO: update sample_rate and max_voices on sampr_changed() */ +}; + +UNUSED_ATTR static int find_min_sampr_ge_22(void) +{ + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); + int ret = caps->samprs[0]; + for (size_t i = 1; i < caps->num_samprs; i += 1) + { + /* caps->samprs is in descending order */ + if (caps->samprs[i] >= SAMPR_22) + ret = caps->samprs[i]; + else + break; + } + return ret; +} + static int midimain(const void * filename) { int a, notes_used, vol; bool is_playing = true; /* false = paused */ + /* decide sample_rate and max_voices */ +#if defined(SIMULATOR) /* Simulator requires 44100Hz, and we can afford to use more voices */ || \ + (CONFIG_PLATFORM & PLATFORM_HOSTED) /* All hosted targets have CPU to spare */ || \ + defined(CPU_MIPS) /* All MIPS targets are pretty fast */ + sample_rate = SAMPR_44; + max_voices = 48; +#elif defined(CPU_PP) + /* Some of the pp based targets can't handle too many voices + mainly because they have to use 44100Hz sample rate, this could be + improved to increase max_voices for targets that can do 22kHz */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#elif defined(CPU_ARM) + /* ARMv4 targets are slow, but treat everything else as fast */ +#if (ARM_ARCH >= 6) + sample_rate = SAMPR_44; + max_voices = 32; +#elif (ARM_ARCH >= 5) + sample_rate = find_min_sampr_ge_22(); + max_voices = 32; +#else /* ie v4 */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif +#else /* !CPU_ARM */ + /* Treat everything else as slow */ + sample_rate = find_min_sampr_ge_22(); + max_voices = sample_rate == SAMPR_22 ? 24 : 16; +#endif + #if defined(HAVE_ADJUSTABLE_CPU_FREQ) rb->cpu_boost(true); #endif @@ -537,7 +589,7 @@ static int midimain(const void * filename) rb->dsp_set_timestretch(PITCH_SPEED_100); #endif rb->dsp_configure(dsp, DSP_SET_SAMPLE_DEPTH, 22); - rb->dsp_configure(dsp, DSP_SET_FREQUENCY, SAMPLE_RATE); /* 44100 22050 11025 */ + rb->dsp_configure(dsp, DSP_SET_FREQUENCY, sample_rate); /* 44100 22050 11025 */ rb->dsp_configure(dsp, DSP_SET_STEREO_MODE, STEREO_INTERLEAVED); /* @@ -553,14 +605,14 @@ static int midimain(const void * filename) midi_debug("Okay, starting sequencing"); bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Skip over any junk in the beginning of the file, so start playing */ /* after the first note event */ do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c index b9e57a405b..7438455ca3 100644 --- a/apps/plugins/midi/midiutil.c +++ b/apps/plugins/midi/midiutil.c @@ -35,7 +35,7 @@ struct GPatch * gusload(char *); struct GPatch * patchSet[128]; struct GPatch * drumSet[128]; -struct SynthObject voices[MAX_VOICES] IBSS_ATTR; +struct SynthObject voices[48] IBSS_ATTR; static void *alloc(int size) { diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h index ee9769b108..71da7461e3 100644 --- a/apps/plugins/midi/midiutil.h +++ b/apps/plugins/midi/midiutil.h @@ -27,67 +27,6 @@ #define NBUF 2 #define MAX_SAMPLES 512 -#ifdef SIMULATOR - -/* Simulator requires 44100Hz, and we can afford to use more voices */ -#define SAMPLE_RATE SAMPR_44 -#define MAX_VOICES 48 - -#elif (CONFIG_PLATFORM & PLATFORM_HOSTED) - -/* All hosted targets have CPU to spare */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_PP) - -/* Some of the pp based targets can't handle too many voices - mainly because they have to use 44100Hz sample rate, this could be - improved to increase MAX_VOICES for targets that can do 22kHz */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#elif defined(CPU_MIPS) - -/* All MIPS targets are pretty fast */ -#define MAX_VOICES 48 -#define SAMPLE_RATE SAMPR_44 - -#elif defined(CPU_ARM) - -/* ARMv4 targets are slow, but treat everything else as fast */ - -#if (ARM_ARCH >= 6) -#define MAX_VOICES 32 -#define SAMPLE_RATE SAMPR_44 -#elif (ARM_ARCH >= 5) -#define MAX_VOICES 32 -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#else /* ie v4 */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif -#endif /* ARM_ARCH < 5*/ - -#else /* !CPU_ARM */ - -/* Treat everything else as slow */ -#define SAMPLE_RATE HW_SAMPR_MIN_GE_22 -#if HW_SAMPR_CAPS & SAMPR_CAP_22 -#define MAX_VOICES 24 /* General MIDI minimum */ -#else -#define MAX_VOICES 16 -#endif - -#endif /* Wrap it up. */ - #define BYTE unsigned char /* Data chunk ID types, returned by readID() */ @@ -189,7 +128,7 @@ void * readData(int file, int len); #define malloc(n) my_malloc(n) void * my_malloc(int size); -extern struct SynthObject voices[MAX_VOICES]; +extern struct SynthObject voices[48]; /* 48: maximum possible max_voices */ extern int chVol[16]; /* Channel volume */ extern int chPan[16]; /* Channel panning */ @@ -207,6 +146,8 @@ extern struct GPatch * drumSet[128]; extern struct MIDIfile * mf; +extern int sample_rate; +extern int max_voices; extern int number_of_samples; extern int playing_time IBSS_ATTR; extern int samples_this_second IBSS_ATTR; diff --git a/apps/plugins/midi/sequencer.c b/apps/plugins/midi/sequencer.c index d35a057c32..ce4aa6628a 100644 --- a/apps/plugins/midi/sequencer.c +++ b/apps/plugins/midi/sequencer.c @@ -65,7 +65,7 @@ static inline void setVol(int ch, int vol) /* If channel volume changes, we need to recalculate the volume scale */ /* factor for all voices active on this channel */ - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].ch == ch) setVolScale(a); } @@ -156,7 +156,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) delta = (((freqtable[note+chPBNoteOffset[ch]]))); /* anywhere from 8000 to 8000000 */ delta = delta * wf->sampRate; /* approx 20000 - 44000 but can vary with tuning */ delta = (delta * chPBFractBend[ch]); /* approx 60000 - 70000 */ - delta = delta / (SAMPLE_RATE); /* 44100 or 22050 */ + delta = delta / (sample_rate); /* 44100 or 22050 */ delta = delta / (wf->rootFreq); /* anywhere from 8000 to 8000000 */ /* Pitch bend is encoded as a fractional of 16 bits, hence the 16 */ @@ -167,7 +167,7 @@ static void findDelta(struct SynthObject * so, int ch, int note) static inline void computeDeltas(int ch) { int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].isUsed && voices[a].ch == ch) { @@ -210,7 +210,7 @@ static inline void pressNote(int ch, int note, int vol) if(ch == 15) return; */ int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) break; @@ -218,7 +218,7 @@ static inline void pressNote(int ch, int note, int vol) if (!voices[a].isUsed) break; } - if (a == MAX_VOICES) + if (a == max_voices) { // midi_debug("\nVoice kill"); // midi_debug("\nToo many voices playing at once. No more left"); @@ -226,7 +226,7 @@ static inline void pressNote(int ch, int note, int vol) // for(a=0; a<48; a++) // midi_debug("\n#%d Ch=%d Note=%d curRate=%d curOffset=%d curPoint=%d targetOffset=%d", a, voices[a].ch, voices[a].note, voices[a].curRate, voices[a].curOffset, voices[a].curPoint, voices[a].targetOffset); lastKill++; - if (lastKill == MAX_VOICES) + if (lastKill == max_voices) lastKill = 0; a = lastKill; // return; /* None available */ @@ -263,7 +263,7 @@ static inline void pressNote(int ch, int note, int vol) struct GWaveform * wf = drumSet[note]->waveforms[0]; voices[a].wf = wf; - voices[a].delta = (((freqtable[note]<rootFreq) * wf->sampRate / SAMPLE_RATE); + voices[a].delta = (((freqtable[note]<rootFreq) * wf->sampRate / sample_rate); if (wf->mode & 28) // midi_debug("\nWoah, a drum patch has a loop. Stripping the loop..."); wf->mode = wf->mode & (255-28); @@ -285,7 +285,7 @@ static void releaseNote(int ch, int note) return; int a; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) { if (voices[a].ch == ch && voices[a].note == note) { @@ -432,7 +432,7 @@ int tick(void) tempo = (((short)e->evData[0])<<16)|(((short)e->evData[1])<<8)|(e->evData[2]); /* midi_debug("\nMeta-Event: Tempo Set = %d", tempo); */ bpm=mf->div*1000000/tempo; - number_of_samples=SAMPLE_RATE/bpm; + number_of_samples=sample_rate/bpm; } } @@ -446,9 +446,9 @@ int tick(void) samples_this_second += number_of_samples; - while (samples_this_second >= SAMPLE_RATE) + while (samples_this_second >= sample_rate) { - samples_this_second -= SAMPLE_RATE; + samples_this_second -= sample_rate; playing_time++; } @@ -471,7 +471,7 @@ void seekBackward(int nsec) /* Set the tempo to defalt */ bpm = mf->div*1000000/tempo; - number_of_samples = SAMPLE_RATE/bpm; + number_of_samples = sample_rate/bpm; /* Reset the tracks to start */ rewindFile(); @@ -484,7 +484,7 @@ void seekBackward(int nsec) do { notes_used = 0; - for (a = 0; a < MAX_VOICES; a++) + for (a = 0; a < max_voices; a++) if (voices[a].isUsed) notes_used++; tick(); diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index f199d544e5..3143e61a4f 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c @@ -46,7 +46,7 @@ static void readTextBlock(int file, char * buf) void resetControllers() { int a=0; - for(a=0; amemset(buf_ptr, 0, nsamples * 2 * sizeof(int32_t)); - for(i=0; i < MAX_VOICES; i++) + for(i=0; i < max_voices; i++) { voicept=&voices[i]; if(voicept->isUsed) From 2578411f00470c4f605e1f60f8aceb408af28927 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 25 Mar 2026 07:30:27 -0400 Subject: [PATCH 02/24] Fix red in 9c708e3876 Test build didn't catch this due to a dependency failure. (WTF?) Change-Id: I0487a02e9fad8b6bec9b93066619aef04c838d3b --- apps/plugins/midi/midiplay.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/plugins/midi/midiplay.c b/apps/plugins/midi/midiplay.c index 012169a02e..d19ff7888b 100644 --- a/apps/plugins/midi/midiplay.c +++ b/apps/plugins/midi/midiplay.c @@ -492,11 +492,6 @@ static void get_more(const void** start, size_t* size) *size = samples_in_buf*sizeof(int32_t); } -static const struct mixer_play_cbs mixer_cbs = { - .get_more = get_more, - /* TODO: update sample_rate and max_voices on sampr_changed() */ -}; - UNUSED_ATTR static int find_min_sampr_ge_22(void) { const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); From da53cc0f1425c6f62a607a66d563359879eb5d3a Mon Sep 17 00:00:00 2001 From: Aidan MacDonald Date: Tue, 24 Mar 2026 00:04:16 +0000 Subject: [PATCH 03/24] echoplayer: pcm: increase SAI FIFO buffer depth Change the SAI FIFO threshold so that it is always kept topped up at maximum; DMA needs to do single transfers to the peripheral now. Ignore FEIF errors since they seem to occur constantly with this setup (though it's not exactly clear why this happens). FEIF only indicates that the SAI made a DMA request while the DMA FIFO is empty, which isn't a fatal error. The DMA channel will simply service the request when it is ready. Keeping the SAI FIFO constantly full increases the overall timing margin before underrun so losing the FEIF info isn't a big deal in practice. Change-Id: I16eb1cbb17039db76938bd86c4921b8060c83556 --- firmware/target/arm/stm32/debug-stm32h7.c | 4 --- .../arm/stm32/echoplayer/pcm-echoplayer.c | 31 +++++-------------- 2 files changed, 7 insertions(+), 28 deletions(-) diff --git a/firmware/target/arm/stm32/debug-stm32h7.c b/firmware/target/arm/stm32/debug-stm32h7.c index f8cd7200c3..4002876e28 100644 --- a/firmware/target/arm/stm32/debug-stm32h7.c +++ b/firmware/target/arm/stm32/debug-stm32h7.c @@ -89,8 +89,6 @@ static bool swd_menu(void) #if defined(ECHO_R1) extern volatile int pcm_sai_xrun_count; extern volatile int pcm_dma_teif_count; -extern volatile int pcm_dma_dmeif_count; -extern volatile int pcm_dma_feif_count; struct pcmdebug_counter { @@ -102,8 +100,6 @@ static const struct pcmdebug_counter pcmdebug_counters[] = { {"SAI xrun count", &pcm_sai_xrun_count}, {"DMA TEIF count", &pcm_dma_teif_count}, - {"DMA DMEIF count", &pcm_dma_dmeif_count}, - {"DMA FEIF count", &pcm_dma_feif_count}, }; static int pcmdebug_menu_action_cb(int action, struct gui_synclist *lists) diff --git a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c index c1d457ef8d..1867b21de0 100644 --- a/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c +++ b/firmware/target/arm/stm32/echoplayer/pcm-echoplayer.c @@ -36,19 +36,16 @@ # define PCM_NATIVE_SAMPLE_SIZE 4 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_32BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_32BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_QUARTER # define SAI_FRL_VAL 64 #elif PCM_NATIVE_BITDEPTH == 24 # define PCM_NATIVE_SAMPLE_SIZE 4 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_32BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_24BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_QUARTER # define SAI_FRL_VAL 64 #elif PCM_NATIVE_BITDEPTH == 16 # define PCM_NATIVE_SAMPLE_SIZE 2 # define DMA_PSIZE_VAL BV_DMA_CHN_CR_PSIZE_16BIT # define SAI_DSIZE_VAL BV_SAI_SUBBLOCK_CR1_DS_16BIT -# define SAI_FIFO_THRESH BV_SAI_SUBBLOCK_CR2_FTH_HALF # define SAI_FRL_VAL 32 #else # error "Unsupported PCM bit depth" @@ -67,8 +64,6 @@ static int pcm_last_freq = -1; volatile int pcm_sai_xrun_count; volatile int pcm_dma_teif_count; -volatile int pcm_dma_dmeif_count; -volatile int pcm_dma_feif_count; static void play_dma_start(const void *addr, size_t size) { @@ -105,7 +100,7 @@ static void sai_init(void) /* Configure DMA1 channel 0 */ reg_writelf(dma1_ch0, DMA_CHN_CR, MBURST_V(INCR4), /* 32-bit x 4 burst = 16 bytes */ - PBURST_V(INCR4), /* (16|32)-bit x 4 burst = 8-16 bytes */ + PBURST_V(SINGLE), /* (16|32)-bit x 4 burst = 8-16 bytes */ TRBUFF(0), /* bufferable mode not used for SAI */ DBM(0), /* double buffer mode off */ PL_V(VERYHIGH), /* highest priority */ @@ -117,10 +112,8 @@ static void sai_init(void) DIR_V(MEM_TO_PERIPH), /* read from memory, write to SAI */ PFCTRL_V(DMA), /* DMA is flow controller */ TCIE(1), /* transfer complete interrupt */ - TEIE(1), /* transfer error interrupt */ - DMEIE(1)); /* direct mode error interrupt */ + TEIE(1)); /* transfer error interrupt */ reg_writelf(dma1_ch0, DMA_CHN_FCR, - FEIE(1), /* fifo error interrupt */ DMDIS(1), /* enable fifo mode */ FTH_V(FULL)); /* fifo threshold = 4 words */ @@ -146,7 +139,7 @@ static void sai_init(void) MUTEVAL_V(ZERO_SAMPLE), /* send zero sample on mute */ MUTE(1), /* mute output initially */ TRIS(0), /* don't tri-state outputs */ - FTH(SAI_FIFO_THRESH)); /* fifo threshold (2 or 4 samples) */ + FTH_V(FULL)); /* fifo threshold (2 or 4 samples) */ reg_writelf(sai1a, SAI_SUBBLOCK_FRCR, FSOFF(1), FSPOL(0), FSDEF(1), /* I2S format */ FSALL(SAI_FRL_VAL/2 - 1), /* FS active for half the frame */ @@ -336,22 +329,12 @@ void dma1_ch0_irq_handler(void) size_t size; if (reg_vreadf(lisr, DMA_LISR, TEIF0)) - pcm_dma_teif_count++; - - if (reg_vreadf(lisr, DMA_LISR, DMEIF0)) - pcm_dma_dmeif_count++; - - if (reg_vreadf(lisr, DMA_LISR, FEIF0)) - pcm_dma_feif_count++; - - if (reg_vreadf(lisr, DMA_LISR, TEIF0) || - reg_vreadf(lisr, DMA_LISR, DMEIF0) || - reg_vreadf(lisr, DMA_LISR, FEIF0)) { - reg_assignlf(dma1, DMA_LIFCR, TEIF0(1), DMEIF0(1), FEIF0(1)); - reg_writelf(dma1_ch0, DMA_CHN_CR, EN(0)); + pcm_dma_teif_count++; + reg_assignlf(dma1, DMA_LIFCR, TEIF0(1)); - pcm_play_dma_status_callback(PCM_DMAST_ERR_DMA); + /* TODO: this case may need additional handling */ + pcm_play_dma_complete_callback(PCM_DMAST_ERR_DMA, NULL, NULL); } else if (reg_vreadf(lisr, DMA_LISR, TCIF0)) { From 9b207bfb91b26603d19ccb70a15ee8c29ddadd7c Mon Sep 17 00:00:00 2001 From: mojyack Date: Mon, 16 Feb 2026 11:29:55 +0900 Subject: [PATCH 04/24] plugins: pacbox: remove hw_freq_sampr usage Change-Id: I365b4f901dd2fbcc22bf1a8009a9d9b58a1da556 --- apps/plugins/pacbox/pacbox.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/plugins/pacbox/pacbox.c b/apps/plugins/pacbox/pacbox.c index a8208f1e51..34f103039d 100644 --- a/apps/plugins/pacbox/pacbox.c +++ b/apps/plugins/pacbox/pacbox.c @@ -395,19 +395,19 @@ static void start_sound(void) #endif /* Get the closest rate >= to what is preferred */ + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); sr_index = rb->round_value_to_list32(PREFERRED_SAMPLING_RATE, - rb->hw_freq_sampr, HW_NUM_FREQ, false); + caps->samprs, caps->num_samprs, false); - if (rb->hw_freq_sampr[sr_index] < PREFERRED_SAMPLING_RATE - && sr_index > 0) + if (caps->samprs[sr_index] < PREFERRED_SAMPLING_RATE && sr_index > 0) { /* Round up */ sr_index--; } - wsg3_set_sampling_rate(rb->hw_freq_sampr[sr_index]); + wsg3_set_sampling_rate(caps->samprs[sr_index]); - rb->mixer_set_frequency(rb->hw_freq_sampr[sr_index]); + rb->mixer_set_frequency(caps->samprs[sr_index]); rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); sound_playing = true; From ae724ba5f3a0f48206a5f92cb6eb6bcbfbfe15a9 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 25 Mar 2026 08:44:00 -0400 Subject: [PATCH 05/24] as3525: PCM driver init references the sink directly Change-Id: I42e8f04214790676d6f177669cdeda58fa8e8c28 --- firmware/target/arm/as3525/pcm-as3525.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/target/arm/as3525/pcm-as3525.c b/firmware/target/arm/as3525/pcm-as3525.c index a5a9ee0cee..b72070b312 100644 --- a/firmware/target/arm/as3525/pcm-as3525.c +++ b/firmware/target/arm/as3525/pcm-as3525.c @@ -189,7 +189,7 @@ static void sink_dma_init(void) I2SOUT_CONTROL = (1<<6) | (1<<3); /* enable dma, stereo */ audiohw_preinit(); - sink_set_freq(HW_SAMPR_DEFAULT); + sink_set_freq(builtin_pcm_sink.caps.default_freq); } #ifdef HAVE_PCM_DMA_ADDRESS From 759ef2767ab4dd1a48ddf6d833508a9fe88bd887 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 25 Mar 2026 08:48:55 -0400 Subject: [PATCH 06/24] pcm: Make pcm_is_ready a per-sink property instead of a global. All that matters is that the _current_ sink is ready, not all possible sinks. When switching sinks we will need to ensure tehy are initialized before switching over. Change-Id: I341f7e9dcb4e2add4d0b292b68b69eb08dec0194 --- firmware/export/pcm_sink.h | 1 + firmware/pcm.c | 21 ++++++++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/firmware/export/pcm_sink.h b/firmware/export/pcm_sink.h index 27c0c31db1..77c64428f6 100644 --- a/firmware/export/pcm_sink.h +++ b/firmware/export/pcm_sink.h @@ -47,6 +47,7 @@ struct pcm_sink { /* runtime states */ unsigned long pending_freq; unsigned long configured_freq; + unsigned long pcm_is_ready; }; enum pcm_sink_ids { diff --git a/firmware/pcm.c b/firmware/pcm.c index 08383ace2d..766ec0491d 100644 --- a/firmware/pcm.c +++ b/firmware/pcm.c @@ -76,9 +76,6 @@ * */ -/* 'true' when all stages of pcm initialization have completed */ -static bool pcm_is_ready = false; - static struct pcm_sink* sinks[1] = { [PCM_SINK_BUILTIN] = &builtin_pcm_sink, }; @@ -142,7 +139,7 @@ void pcm_play_stop_int(void) static void pcm_wait_for_init(void) { - while (!pcm_is_ready) + while (!sinks[cur_sink]->pcm_is_ready) sleep(0); } @@ -251,9 +248,11 @@ void pcm_init(void) logf("pcm_init"); for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { - sinks[i]->pending_freq = sinks[i]->caps.default_freq; - sinks[i]->configured_freq = -1UL; - sinks[i]->ops.init(); + struct pcm_sink* sink = sinks[i]; + sink->pending_freq = sink->caps.default_freq; + sink->configured_freq = -1UL; + sink->pcm_is_ready = false; + sink->ops.init(); } } @@ -263,15 +262,15 @@ void pcm_postinit(void) logf("pcm_postinit"); for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { - sinks[i]->ops.postinit(); + struct pcm_sink* sink = sinks[i]; + sink->ops.postinit(); + sink->pcm_is_ready = true; } - - pcm_is_ready = true; } bool pcm_is_initialized(void) { - return pcm_is_ready; + return sinks[cur_sink]->pcm_is_ready; } enum pcm_sink_ids pcm_current_sink(void) From daef425c5946651408b0ac496955bc07e2bdf632 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 08:14:52 -0400 Subject: [PATCH 07/24] pcm_mixer: Get default sample rate from pcm layer. Change-Id: I6eccb37556e70f23112bbb0e26f4a45ac0930245 --- firmware/pcm_mixer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/firmware/pcm_mixer.c b/firmware/pcm_mixer.c index d36560f149..92da971fb1 100644 --- a/firmware/pcm_mixer.c +++ b/firmware/pcm_mixer.c @@ -33,7 +33,7 @@ before the last samples are sent to the codec and so things are done in parallel (as much as possible) with sending-out data. */ -static unsigned int mixer_sampr = HW_SAMPR_DEFAULT; +static unsigned int mixer_sampr = -1UL; static unsigned int mix_frame_size = MIX_FRAME_SAMPLES*4; /* Define this to nonzero to add a marker pulse at each frame start */ @@ -266,7 +266,10 @@ static void mixer_start_pcm(void) #endif /* Requires a shared global sample rate for all channels */ - pcm_set_frequency(mixer_sampr); + if (mixer_sampr == -1UL) + mixer_sampr = pcm_get_frequency(); + else + pcm_set_frequency(mixer_sampr); /* Prepare initial frames and set up the double buffer */ mixer_buffer_callback(PCM_DMAST_STARTED); From a84a38dd87ae300565087ec3af05607ed26e9b01 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 08:51:37 -0400 Subject: [PATCH 08/24] pcm: Fix up some compile warnings that show up under some sim builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit firmware/pcm_mixer.c:36:35: warning: conversion from ‘long unsigned int’ to ‘unsigned int’ changes value from ‘18446744073709551615’ to ‘4294967295’ [-Woverflow] 36 | static unsigned int mixer_sampr = -1UL; | firmware/pcm_mixer.c:269:21: warning: comparison is always false due to limited range of data type [-Wtype-limits] 269 | if (mixer_sampr == -1UL) | ^~ So drop the 'L' and everything is peachy. Change-Id: I9440d3300931be229c6c4b01bdc1d09b55c34d88 --- firmware/pcm.c | 4 ++-- firmware/pcm_mixer.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/pcm.c b/firmware/pcm.c index 766ec0491d..19c76a8a10 100644 --- a/firmware/pcm.c +++ b/firmware/pcm.c @@ -202,7 +202,7 @@ void pcm_do_peak_calculation(struct pcm_peaks *peaks, bool active, if (active) { struct pcm_sink* sink = sinks[cur_sink]; - if (sink->configured_freq == -1UL) + if (sink->configured_freq == -1U) { logf("not configured yet"); return; @@ -250,7 +250,7 @@ void pcm_init(void) for(size_t i = 0; i < ARRAYLEN(sinks); i += 1) { struct pcm_sink* sink = sinks[i]; sink->pending_freq = sink->caps.default_freq; - sink->configured_freq = -1UL; + sink->configured_freq = -1U; sink->pcm_is_ready = false; sink->ops.init(); } diff --git a/firmware/pcm_mixer.c b/firmware/pcm_mixer.c index 92da971fb1..a0d26fc86d 100644 --- a/firmware/pcm_mixer.c +++ b/firmware/pcm_mixer.c @@ -33,7 +33,7 @@ before the last samples are sent to the codec and so things are done in parallel (as much as possible) with sending-out data. */ -static unsigned int mixer_sampr = -1UL; +static unsigned int mixer_sampr = -1U; static unsigned int mix_frame_size = MIX_FRAME_SAMPLES*4; /* Define this to nonzero to add a marker pulse at each frame start */ @@ -266,7 +266,7 @@ static void mixer_start_pcm(void) #endif /* Requires a shared global sample rate for all channels */ - if (mixer_sampr == -1UL) + if (mixer_sampr == -1U) mixer_sampr = pcm_get_frequency(); else pcm_set_frequency(mixer_sampr); From 5ce96b84d87e6e270b62f0bf3a8897b4307477ee Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 08:43:40 -0400 Subject: [PATCH 09/24] pcm_mixer: Explicitly initialize the mixer frequency in the pcm init path Change-Id: I5b79dbb0608ef182fd5592797c6211ce5299999c --- firmware/pcm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/firmware/pcm.c b/firmware/pcm.c index 19c76a8a10..eebcf70e1c 100644 --- a/firmware/pcm.c +++ b/firmware/pcm.c @@ -266,6 +266,9 @@ void pcm_postinit(void) sink->ops.postinit(); sink->pcm_is_ready = true; } + + /* Ensure mixer is in a sane state */ + mixer_set_frequency(pcm_get_frequency()); } bool pcm_is_initialized(void) From 36f34089d6cc9b425162c490868a06904a103dca Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 08:41:35 -0400 Subject: [PATCH 10/24] volume: Apply limits inside sound_set_volume() This way all paths to setting the volume respect the limits, instead of only callers of setvol(), which only applies to (some?) interactive paths. Change-Id: Ia8ece22aafcb04df33021071cb933eaeb1146502 --- apps/misc.c | 14 ++------------ firmware/sound.c | 10 ++++++++++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/misc.c b/apps/misc.c index 40a55d032f..a44f106fb9 100644 --- a/apps/misc.c +++ b/apps/misc.c @@ -866,20 +866,10 @@ void check_bootfile(bool do_rolo) #endif #endif -/* check range, set volume and save settings */ +/* set volume and save settings */ void setvol(void) { - const int min_vol = sound_min(SOUND_VOLUME); - const int max_vol = sound_max(SOUND_VOLUME); - int volume = global_status.volume; - if (volume < min_vol) - volume = min_vol; - if (volume > max_vol) - volume = max_vol; - if (volume > global_settings.volume_limit) - volume = global_settings.volume_limit; - - sound_set_volume(volume); + sound_set_volume(global_status.volume); global_status.last_volume_change = current_tick; status_save(false); } diff --git a/firmware/sound.c b/firmware/sound.c index 0e43f38f5a..07a91878d8 100644 --- a/firmware/sound.c +++ b/firmware/sound.c @@ -312,6 +312,16 @@ void sound_set_volume(int value) if (!audio_is_initialized) return; + /* Apply limits */ + const int min_vol = sound_min(SOUND_VOLUME); + const int max_vol = sound_max(SOUND_VOLUME); + if (value < min_vol) + value = min_vol; + if (value > max_vol) + value = max_vol; + if (value > global_settings.volume_limit) + value = global_settings.volume_limit; + #ifndef BOOTLOADER global_status.volume = value; #endif From 42ad3c75d2ca35c95f609cea8984b95b5ebd9a60 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 12:41:43 -0400 Subject: [PATCH 11/24] Fix red in 36f34089d6 Can't reference settings in bootloader builds Change-Id: I471c3ca61ec4c93d38317278b79b973192aa28bb --- firmware/sound.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/sound.c b/firmware/sound.c index 07a91878d8..06f6906b55 100644 --- a/firmware/sound.c +++ b/firmware/sound.c @@ -312,6 +312,7 @@ void sound_set_volume(int value) if (!audio_is_initialized) return; +#ifndef BOOTLOADER /* Apply limits */ const int min_vol = sound_min(SOUND_VOLUME); const int max_vol = sound_max(SOUND_VOLUME); @@ -322,7 +323,6 @@ void sound_set_volume(int value) if (value > global_settings.volume_limit) value = global_settings.volume_limit; -#ifndef BOOTLOADER global_status.volume = value; #endif From 3f4d5a527b7a739eb46fa5bc2a91d37eec38eb48 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sat, 28 Mar 2026 12:43:59 -0400 Subject: [PATCH 12/24] bootloader: Don't compile sound.c in bootloader builds (a) Nothing uses it, and (b) stuff it needs isn't built either Change-Id: Ib8b46e00d4306f7d05b47883bfaa98497a075db5 --- firmware/SOURCES | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/firmware/SOURCES b/firmware/SOURCES index 14365f965e..888d296fd0 100644 --- a/firmware/SOURCES +++ b/firmware/SOURCES @@ -527,12 +527,11 @@ drivers/rds.c #endif /* HAVE_RDS_CAP */ #endif /* PLATFORM_NATIVE */ #endif /* CONFIG_TUNER */ -#endif /* BOOTLOADER */ +#endif /* !BOOTLOADER */ /* Sound */ -sound.c - #ifndef BOOTLOADER +sound.c pcm_sampr.c pcm.c pcm_mixer.c @@ -544,7 +543,7 @@ enc_base.c #endif /* HAVE_RECORDING */ drivers/audio/audiohw-swcodec.c -#endif /* BOOTLOADER */ +#endif /* !BOOTLOADER */ /* Audio codec */ #if !defined(BOOTLOADER) From d2b76a99f340ff59639cc49ca6e50dc2a087769d Mon Sep 17 00:00:00 2001 From: mojyack Date: Fri, 19 Dec 2025 16:59:43 +0900 Subject: [PATCH 13/24] usb: introduce batched request api in order to implement iap digital audio interface, we have to send a pcm packet every usb frame i.e. 1000 packets per second. this rate can't be achieved with current standard request-response design, even with fast_completion_handler. this is why this new api is needed. Change-Id: Id3d7dd037660871e2bdb69656f63ff13280c3804 --- firmware/export/usb_drv.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/firmware/export/usb_drv.h b/firmware/export/usb_drv.h index ea048a3cd1..76cba9d82b 100644 --- a/firmware/export/usb_drv.h +++ b/firmware/export/usb_drv.h @@ -109,6 +109,27 @@ int usb_drv_deinit_endpoint(int endpoint); int usb_drv_get_frame_number(void); #endif +#if USB_BATCH_SLOTS > 0 + +/* batched request api is for workloads that perform very high-frequency, + * performance-sensitive isochronous transactions continuously. + * this api allows multiple transaction requests to be buffered in udc driver. + * so that it can maximize the controller's performance. */ + +/* called when usb system requires more buffer */ +typedef void(*usb_drv_batch_get_more)(const void** ptr, size_t* len); + +/* prepare request queue */ +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more); +/* destroy request queue */ +int usb_drv_batch_deinit(void); +/* start processing */ +int usb_drv_batch_start(void); +/* stop processing */ +int usb_drv_batch_stop(void); + +#endif + /* USB_STRING_INITIALIZER(u"Example String") */ #define USB_STRING_INITIALIZER(S) { \ sizeof(struct usb_string_descriptor) + sizeof(S) - sizeof(*S), \ From f84003fa4013fdb33b19f59e9aaa71d3d5dcba7e Mon Sep 17 00:00:00 2001 From: mojyack Date: Tue, 6 Jan 2026 11:19:54 +0900 Subject: [PATCH 14/24] usb: add fallback implementation of emulated batch api some targets can process requests fast enough without dedicated batch api implementation. provide generic implementationn for such targets. Change-Id: I152681441e70e0e98396274d9305d371d2bbfbe3 --- firmware/export/config.h | 3 ++ firmware/export/usb_drv.h | 4 -- firmware/usbstack/usb_core.c | 71 +++++++++++++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/firmware/export/config.h b/firmware/export/config.h index 587da6c496..5fb260f336 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -1362,6 +1362,9 @@ Lyre prototype 1 */ //#define USB_HAS_INTERRUPT -- seems to be broken #endif /* CONFIG_USBOTG */ +#define USB_BATCH_NON_NATIVE +#define USB_BATCH_SLOTS 1 + /* define the class drivers to enable */ #ifdef BOOTLOADER diff --git a/firmware/export/usb_drv.h b/firmware/export/usb_drv.h index 76cba9d82b..6c8949200d 100644 --- a/firmware/export/usb_drv.h +++ b/firmware/export/usb_drv.h @@ -109,8 +109,6 @@ int usb_drv_deinit_endpoint(int endpoint); int usb_drv_get_frame_number(void); #endif -#if USB_BATCH_SLOTS > 0 - /* batched request api is for workloads that perform very high-frequency, * performance-sensitive isochronous transactions continuously. * this api allows multiple transaction requests to be buffered in udc driver. @@ -128,8 +126,6 @@ int usb_drv_batch_start(void); /* stop processing */ int usb_drv_batch_stop(void); -#endif - /* USB_STRING_INITIALIZER(u"Example String") */ #define USB_STRING_INITIALIZER(S) { \ sizeof(struct usb_string_descriptor) + sizeof(S) - sizeof(*S), \ diff --git a/firmware/usbstack/usb_core.c b/firmware/usbstack/usb_core.c index 9d5fa04d13..9b90fbd5ad 100644 --- a/firmware/usbstack/usb_core.c +++ b/firmware/usbstack/usb_core.c @@ -554,6 +554,64 @@ void usb_core_hotswap_event(int volume, bool inserted) } #endif + +#ifdef USB_BATCH_NON_NATIVE +static uint8_t batch_ep = 0; +static bool batch_stopped; +static usb_drv_batch_get_more batch_get_more; + +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more) +{ + if(batch_ep != 0) { + logf("usb_core: batch api in use user=0x%02X", batch_ep); + return -1; + } + batch_ep = ep; + batch_get_more = get_more; + batch_stopped = false; + return 0; +} + +int usb_drv_batch_deinit(void) +{ + logf("usb_core: batch deinit"); + usb_drv_batch_stop(); + batch_ep = 0; + return 0; +} + +static int batch_get_and_send(void) +{ + const void* ptr; + size_t len; + batch_get_more(&ptr, &len); + if(len == 0 || batch_stopped) { + return 0; + } + return usb_drv_send_nonblocking(EP_NUM(batch_ep), (void*)ptr, len); +} + +int usb_drv_batch_start(void) +{ + logf("usb_core: batch start"); + batch_stopped = false; + return batch_get_and_send(); +} + +int usb_drv_batch_stop(void) +{ + batch_stopped = true; + return 0; +} + +static void batch_xfer_complete(void) { + if(batch_stopped) { + return; + } + batch_get_and_send(); +} +#endif + static void usb_core_set_serial_function_id(void) { int i, id = 0; @@ -1130,8 +1188,14 @@ void usb_core_bus_reset(void) /* called by usb_drv_transfer_completed() */ void usb_core_transfer_complete(int endpoint, int dir, int status, int length) { - struct usb_transfer_completion_event_data* completion_event = - &ep_data[endpoint].completion_event[EP_DIR(dir)]; +#ifdef USB_BATCH_NON_NATIVE + /* batch api */ + if(batch_ep != 0 && (endpoint | dir) == batch_ep) { + batch_xfer_complete(); + return; + } +#endif + /* Fast notification */ fast_completion_handler_t handler = ep_data[endpoint].fast_completion_handler[EP_DIR(dir)]; if(handler != NULL && handler(endpoint, dir, status, length)) @@ -1154,6 +1218,9 @@ void usb_core_transfer_complete(int endpoint, int dir, int status, int length) } #endif + struct usb_transfer_completion_event_data* completion_event = + &ep_data[endpoint].completion_event[EP_DIR(dir)]; + completion_event->endpoint = endpoint; completion_event->dir = dir; completion_event->data[0] = data0; From 03060090c9aa9d1c14341dd47ce59b5ea0c7af23 Mon Sep 17 00:00:00 2001 From: mojyack Date: Fri, 19 Dec 2025 17:13:57 +0900 Subject: [PATCH 15/24] usb: arc: implement batched request api Change-Id: I9d677286589a336d7258cf2c9d3c7d2847243dfa --- firmware/export/config.h | 4 + firmware/target/arm/usb-drv-arc.c | 198 +++++++++++++++++++++++++++++- 2 files changed, 197 insertions(+), 5 deletions(-) diff --git a/firmware/export/config.h b/firmware/export/config.h index 5fb260f336..4cd178e405 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -1362,8 +1362,12 @@ Lyre prototype 1 */ //#define USB_HAS_INTERRUPT -- seems to be broken #endif /* CONFIG_USBOTG */ +#if CONFIG_USBOTG == USBOTG_ARC +#define USB_BATCH_SLOTS 16 +#else #define USB_BATCH_NON_NATIVE #define USB_BATCH_SLOTS 1 +#endif /* define the class drivers to enable */ #ifdef BOOTLOADER diff --git a/firmware/target/arm/usb-drv-arc.c b/firmware/target/arm/usb-drv-arc.c index 1eeee010b3..09c1ade438 100644 --- a/firmware/target/arm/usb-drv-arc.c +++ b/firmware/target/arm/usb-drv-arc.c @@ -362,6 +362,7 @@ static const unsigned int pipe2mask[USB_NUM_ENDPOINTS*2] = { /*-------------------------------------------------------------------------*/ static void transfer_completed(void); static void control_received(void); +static void sof_received(void); static int prime_transfer(int ep_num, void* ptr, int len, bool send, bool wait); static void prepare_td(struct transfer_descriptor* td, struct transfer_descriptor* previous_td, void *ptr, int len,int pipe); @@ -415,6 +416,14 @@ static void usb_drv_reset(void) #endif } +static void td_set_buf_ptr(struct transfer_descriptor* td, const void* ptr){ + td->buff_ptr0 = (unsigned int)ptr; + td->buff_ptr1 = ((unsigned int)ptr & 0xfffff000) + 0x1000; + td->buff_ptr2 = ((unsigned int)ptr & 0xfffff000) + 0x2000; + td->buff_ptr3 = ((unsigned int)ptr & 0xfffff000) + 0x3000; + td->buff_ptr4 = ((unsigned int)ptr & 0xfffff000) + 0x4000; +} + /* One-time driver startup init */ void usb_drv_startup(void) { @@ -544,6 +553,12 @@ void usb_drv_int(void) if (status & USBSTS_PORT_CHANGE) { REG_USBSTS = USBSTS_PORT_CHANGE; } + + /* sof */ + if (status & USBSTS_SOF) { + REG_USBSTS = USBSTS_SOF; + sof_received(); + } } bool usb_drv_stalled(int endpoint,bool in) @@ -664,6 +679,183 @@ void usb_drv_set_test_mode(int mode) REG_USBCMD |= USBCMD_RUN; } +/* batched request api */ +static struct transfer_descriptor batch_td_array[USB_BATCH_SLOTS] USB_DEVBSS_ATTR __attribute__((aligned(32))); + +static uint8_t batch_ep = 0; +static uint8_t batch_write_cursor; +static bool batch_stopped; +static usb_drv_batch_get_more batch_get_more; + +static int ep_to_pipe_index(uint8_t ep) { + const int ep_num = EP_NUM(ep); + const int ep_dir = EP_DIR(ep); + const int pipe = ep_num * 2 + (ep_dir == DIR_IN ? 1 : 0); + return pipe; +} + +int usb_drv_batch_init(int ep, usb_drv_batch_get_more get_more) { + logf("batch init"); + if(batch_ep != 0) { + logf("batch function not available"); + return -1; + } + batch_ep = ep; + batch_get_more = get_more; + return 0; +} + +int usb_drv_batch_deinit() { + logf("batch deinit"); + usb_drv_batch_stop(); + batch_ep = 0; + return 0; +} + +/* returns whether priming is needed */ +static bool batch_fill_tds(void) { + while(!(batch_td_array[batch_write_cursor].size_ioc_sts & DTD_STATUS_ACTIVE)) { + /* batch_get_more may call batch_stop() through: + * - batch_get_more() + * - pcm_play_dma_complete_callback() + * - sink_stop() + * - usb_drv_batch_stop() */ + const void* ptr; + size_t len; + batch_get_more(&ptr, &len); + if(len == 0 || batch_stopped) { + return false; + } + + struct transfer_descriptor* td = &batch_td_array[batch_write_cursor]; + td_set_buf_ptr(td, ptr); + td->size_ioc_sts = (len << DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE; + batch_write_cursor = (batch_write_cursor + 1) % USB_BATCH_SLOTS; + } + return true; +} + +int usb_drv_batch_start(void) { + logf("batch start"); + + /* reset variables */ + batch_write_cursor = 0; + batch_stopped = false; + + /* chain tds */ + memset(batch_td_array, 0, sizeof(struct transfer_descriptor) * USB_BATCH_SLOTS); + for(int i = 0; i < USB_BATCH_SLOTS; i += 1) { + struct transfer_descriptor* td = &batch_td_array[i]; + td->next_td_ptr = (unsigned int)&batch_td_array[(i + 1) % USB_BATCH_SLOTS]; + } + + /* configure queue head */ + const int pipe = ep_to_pipe_index(batch_ep); + struct queue_head* const qh = &qh_array[pipe]; + + qh->curr_dtd_ptr = (unsigned int)&batch_td_array[0]; /* or error check in sof_received may read random location */ + qh->dtd.next_td_ptr = (unsigned int)&batch_td_array[0]; + qh->dtd.size_ioc_sts = 0; + + /* pull initial buffers */ + batch_fill_tds(); + + /* monitor sof */ + REG_USBINTR |= USBINTR_SOF_EN; + return 0; +} + +int usb_drv_batch_stop(void) { + batch_stopped = true; + + /* disable sof interrupt */ + REG_USBINTR &= ~USBINTR_SOF_EN; + + /* break the chain */ + /* terminating qh->dtd.next_td_ptr is not reliable */ + for(int i = 0; i < USB_BATCH_SLOTS; i += 1) { + struct transfer_descriptor* td = &batch_td_array[i]; + td->next_td_ptr = DTD_NEXT_TERMINATE; + } + + /* flush endpoint */ + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + + REG_ENDPTFLUSH = mask; + while (REG_ENDPTFLUSH & mask); + + return 0; +} + +#if defined(LOGF_ENABLE) && defined(ROCKBOX_HAS_LOGF) +void usb_drv_dump_regs(void) { + logf("==== register dump %ld ====", current_tick); + logf("USBSTS 0x%08X", REG_USBSTS); + logf("ENDPTSETUPSTAT 0x%08X", REG_ENDPTSETUPSTAT); + logf("ENDPTPRIME 0x%08X", REG_ENDPTPRIME); + logf("ENDPTFLUSH 0x%08X", REG_ENDPTFLUSH); + logf("ENDPTSTATUS 0x%08X", REG_ENDPTSTATUS); + logf("ENDPTCOMPLETE 0x%08X", REG_ENDPTCOMPLETE); + logf("ENDPTCTRL0 0x%08X", REG_ENDPTCTRL0); + logf("ENDPTCTRL1 0x%08X", REG_ENDPTCTRL1); + logf("ENDPTCTRL2 0x%08X", REG_ENDPTCTRL2); +} + +static void dump_td_array(struct queue_head* qh, struct transfer_descriptor* tds, size_t size) { + void* current = (void*)qh->curr_dtd_ptr; + void* next = (void*)qh->dtd.next_td_ptr; + + logf("==== td dump %ld n=%p c=%p ====", current_tick, next, current); + for(int i = 0; i < size; i += 1) { + int len = (tds[i].size_ioc_sts & DTD_PACKET_SIZE) >> DTD_LENGTH_BIT_POS; + char sts[] = { + &tds[i] == current ? 'c' : ' ', + &tds[i] == next ? 'n' : ' ', + i == batch_write_cursor ? 'w' : ' ', + '\0', + }; + logf("%s td[%02d] status=0x%08X len=%d", sts, i, tds[i].size_ioc_sts, len); + } +} + +void usb_drv_dump_tds(int ep) { + const int pipe = ep_to_pipe_index(ep); + struct queue_head* const qh = &qh_array[pipe]; + dump_td_array(qh, &td_array[pipe * NUM_TDS_PER_EP], NUM_TDS_PER_EP); +} + +void usb_drv_batch_dump_tds(void) { + const int pipe = ep_to_pipe_index(batch_ep); + struct queue_head* const qh = &qh_array[pipe]; + dump_td_array(qh, batch_td_array, USB_BATCH_SLOTS); +} +#endif + +static void sof_received(void) { + if(batch_ep == 0) { + /* should not happen */ + return; + } + + /* error recovery */ + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + struct queue_head* const qh = &qh_array[pipe]; + struct transfer_descriptor* const td = (void*)qh->curr_dtd_ptr; + if(td->size_ioc_sts & DTD_ERROR_MASK) { + logf("td error status=0x%08X", td->size_ioc_sts); + REG_ENDPTPRIME |= mask; + } + + /* do refill */ + if(batch_fill_tds()) { + const int pipe = ep_to_pipe_index(batch_ep); + const unsigned int mask = pipe2mask[pipe]; + REG_ENDPTPRIME |= mask; + } +} + /*-------------------------------------------------------------------------*/ /* manual: 32.14.5.2 */ @@ -854,11 +1046,7 @@ static void prepare_td(struct transfer_descriptor* td, td->next_td_ptr = DTD_NEXT_TERMINATE; td->size_ioc_sts = (len<< DTD_LENGTH_BIT_POS) | DTD_STATUS_ACTIVE | DTD_IOC; - td->buff_ptr0 = (unsigned int)ptr; - td->buff_ptr1 = ((unsigned int)ptr & 0xfffff000) + 0x1000; - td->buff_ptr2 = ((unsigned int)ptr & 0xfffff000) + 0x2000; - td->buff_ptr3 = ((unsigned int)ptr & 0xfffff000) + 0x3000; - td->buff_ptr4 = ((unsigned int)ptr & 0xfffff000) + 0x4000; + td_set_buf_ptr(td, ptr); td->reserved |= DTD_RESERVED_LENGTH_MASK & len; td->reserved |= DTD_RESERVED_IN_USE; td->reserved |= (pipe << DTD_RESERVED_PIPE_OFFSET); From f235443ba194d7d492be4a808704a0810935e14b Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sun, 29 Mar 2026 09:23:01 -0400 Subject: [PATCH 16/24] FS13829 - Add Android-specific entries to disktidy plugin Notably, the 'Android' and 'LOST.DIR' top-level directories. Change-Id: Idee411e518a8b73e4f0a4283e368e35c8a2f0938 --- apps/plugins/disktidy.config | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/plugins/disktidy.config b/apps/plugins/disktidy.config index a5f31df5e7..d37fa9f66d 100644 --- a/apps/plugins/disktidy.config +++ b/apps/plugins/disktidy.config @@ -24,4 +24,7 @@ .Trash-*/: no .dolphinview: no .d3lphinview: no +< Android >: no + Android/: no + LOST.DIR/: no < Other >: no From e677895e29ba5bbe517f92980941c570fb92a932 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Sun, 29 Mar 2026 18:02:09 -0400 Subject: [PATCH 17/24] xrick: Fix a race condition that could result in audio stopping get_more() can disable audio when there's nothing more to genreate but that can get called (and "fail") _before_ we set the flag that audio is turned on. If this occurs, we will incorrecly set the "audio on" flag after the failure which will prevent the mixer from being re-started. (We're at the mercy of thread scheduling) Change-Id: I4f6c50a71c7ad685ff45f775e7e4b1c61b8b7777 --- apps/plugins/xrick/system/syssnd_rockbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/plugins/xrick/system/syssnd_rockbox.c b/apps/plugins/xrick/system/syssnd_rockbox.c index afd0766863..74edd98140 100644 --- a/apps/plugins/xrick/system/syssnd_rockbox.c +++ b/apps/plugins/xrick/system/syssnd_rockbox.c @@ -222,8 +222,8 @@ void syssnd_update(void) if (!isAudioPlaying && fillCount > 0) { - rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); isAudioPlaying = true; + rb->mixer_channel_play_data(PCM_MIXER_CHAN_PLAYBACK, get_more, NULL, 0); } } } From 96b5642c93d16116eb0078dd2de754ce9cec3996 Mon Sep 17 00:00:00 2001 From: Erin of Yukis Date: Tue, 10 Feb 2026 14:15:54 +0100 Subject: [PATCH 18/24] sdlapp: Enable compilation of most apps/games MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes `#ifdef`s in many places to just have `HAVE_TOUCHSCREEN` be the input fall back, as is already tentatively the case in the code. Solitaire was the only app excluded since there aren’t enough buttons for it mapped in the SDL layer. Change-Id: I62450b7110b86c8037a121e96cd2e46754be79a3 --- apps/plugins/SOURCES | 3 +++ apps/plugins/SOURCES.app_build | 2 +- apps/plugins/blackjack.c | 6 +++++- apps/plugins/boomshine.lua | 8 ++++++-- apps/plugins/brickmania.c | 5 ++++- apps/plugins/calculator.c | 5 ++++- apps/plugins/calendar.c | 5 +---- apps/plugins/chessclock.c | 5 ++++- apps/plugins/chip8.c | 5 +---- apps/plugins/cube.c | 5 +---- apps/plugins/fft/fft.c | 3 ++- apps/plugins/flipit.c | 5 +---- apps/plugins/invadrox.c | 5 +---- apps/plugins/jewels.c | 5 +---- apps/plugins/metronome.c | 2 ++ apps/plugins/minesweeper.c | 5 +---- apps/plugins/mp3_encoder.c | 5 +---- apps/plugins/oscilloscope.c | 5 +---- apps/plugins/pegbox.c | 5 +---- apps/plugins/pong.c | 5 +---- apps/plugins/rockblox.c | 5 +---- apps/plugins/sliding_puzzle.c | 5 +---- apps/plugins/snake.c | 5 +---- apps/plugins/snake2.c | 5 +---- apps/plugins/sokoban.c | 5 +---- apps/plugins/spacerocks.c | 5 +---- apps/plugins/star.c | 10 +++++----- apps/plugins/vu_meter.c | 5 +---- apps/plugins/wormlet.c | 5 +---- apps/plugins/xobox.c | 5 +---- 30 files changed, 56 insertions(+), 93 deletions(-) diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index 3a57e3f9e5..d06e0181f2 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -157,7 +157,10 @@ pong.c sliding_puzzle.c snake.c snake2.c +#ifndef SDLAPP +/* Too many buttons for SDL */ solitaire.c +#endif sokoban.c star.c starfield.c diff --git a/apps/plugins/SOURCES.app_build b/apps/plugins/SOURCES.app_build index cdd764dc27..746af3c0a9 100644 --- a/apps/plugins/SOURCES.app_build +++ b/apps/plugins/SOURCES.app_build @@ -1,4 +1,4 @@ -#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) +#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(SDLAPP) /* In devices running RockBox as an application, but having a keypad */ #include "SOURCES" #else diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c index 10272f90e4..146fe2da41 100644 --- a/apps/plugins/blackjack.c +++ b/apps/plugins/blackjack.c @@ -628,7 +628,7 @@ enum { #define BJACK_RIGHT BUTTON_RIGHT #define BJACK_LEFT BUTTON_LEFT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif @@ -641,6 +641,10 @@ enum { #define BJACK_SELECT BUTTON_CENTER #define BJACK_SELECT_NAME "BUTTON_CENTER" #endif +#ifndef BJACK_QUIT +#define BJACK_QUIT BUTTON_BOTTOMRIGHT +#define BJACK_QUIT_NAME "BUTTON_BOTTOMRIGHT" +#endif #ifndef BJACK_MAX #define BJACK_MAX BUTTON_TOPRIGHT #endif diff --git a/apps/plugins/boomshine.lua b/apps/plugins/boomshine.lua index fcdf7c9a1c..089a4e6b0e 100644 --- a/apps/plugins/boomshine.lua +++ b/apps/plugins/boomshine.lua @@ -707,7 +707,9 @@ if HAS_TOUCHSCREEN then rb.touchscreen_mode(rb.TOUCHSCREEN_POINT) end -rb.backlight_force_on() +if rb.backlight_force_on then + rb.backlight_force_on() +end local eva = rockev.register("action", action_event, rb.HZ / 10) @@ -761,7 +763,9 @@ else end -- Restore user backlight settings -rb.backlight_use_settings() +if rb.backlight_use_settings then + rb.backlight_use_settings() +end if rb.cpu_boost then rb.cpu_boost(false) end os.exit() diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index bb34219895..b45b7597e3 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -382,7 +382,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define UP BUTTON_UP #define DOWN BUTTON_DOWN -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif @@ -408,6 +408,9 @@ CONFIG_KEYPAD == SANSA_M200_PAD #ifndef DOWN #define DOWN BUTTON_BOTTOMMIDDLE #endif +#ifndef QUIT +#define QUIT BUTTON_BOTTOMRIGHT +#endif #endif /* MI: fallback for the suicide combination */ diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index 5e69e1f12a..97e998c43d 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -557,7 +557,7 @@ F3: equal to "=" #define CALCULATOR_CALC BUTTON_MENU #define CALCULATOR_CLEAR BUTTON_USER -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif @@ -583,6 +583,9 @@ F3: equal to "=" #ifndef CALCULATOR_CLEAR #define CALCULATOR_CLEAR BUTTON_TOPRIGHT #endif +#ifndef CALCULATOR_QUIT +#define CALCULATOR_QUIT BUTTON_TOPLEFT +#endif #include "lib/pluginlib_touchscreen.h" static struct ts_raster calc_raster = { X_0_POS, Y_1_POS, diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index d1213367ae..42cd88c1aa 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -409,9 +409,6 @@ #define CALENDAR_NEXT_MONTH BUTTON_VOL_UP #define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define CALENDAR_QUIT (BUTTON_BACK|BUTTON_MENU) #define CALENDAR_SELECT BUTTON_PLAY @@ -443,7 +440,7 @@ #define CALENDAR_NEXT_MONTH BUTTON_POWER #define CALENDAR_PREV_MONTH BUTTON_USER -#else +#elif !defined(HAVE_TOUCHSCREEN) #error "No keypad setting." #endif diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 521ae034b7..6df7756151 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -418,7 +418,7 @@ #define CHC_SETTINGS_OK BUTTON_SELECT #define CHC_SETTINGS_CANCEL BUTTON_BACK -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif @@ -444,6 +444,9 @@ #ifndef CHC_MENU #define CHC_MENU BUTTON_TOPRIGHT #endif +#ifndef CHC_QUIT +#define CHC_QUIT BUTTON_BOTTOMRIGHT +#endif #endif diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c index fa6acea82a..cecda4503a 100644 --- a/apps/plugins/chip8.c +++ b/apps/plugins/chip8.c @@ -1314,10 +1314,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define CHIP8_KEY8 BUTTON_POWER #define CHIP8_KEY9 BUTTON_USER -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index d3c95be10f..692bad893e 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -392,9 +392,6 @@ #define CUBE_PAUSE BUTTON_PLAY #define CUBE_HIGHSPEED BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define CUBE_QUIT BUTTON_BACK #define CUBE_NEXT BUTTON_RIGHT @@ -425,7 +422,7 @@ #define CUBE_PAUSE BUTTON_USER #define CUBE_HIGHSPEED BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c index fb719ab9aa..8933984669 100644 --- a/apps/plugins/fft/fft.c +++ b/apps/plugins/fft/fft.c @@ -56,7 +56,8 @@ static const struct button_mapping *plugin_contexts[] = { pla_main_ctx }; #if (CONFIG_KEYPAD == IPOD_1G2G_PAD) \ || (CONFIG_KEYPAD == IPOD_3G_PAD) \ - || (CONFIG_KEYPAD == IPOD_4G_PAD) + || (CONFIG_KEYPAD == IPOD_4G_PAD) \ + || defined(SDLAPP) #define FFT_QUIT PLA_UP #else #define FFT_QUIT PLA_EXIT diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index 3080f2f239..89ac3655c8 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -482,9 +482,6 @@ #define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP #define FLIPIT_TOGGLE BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define FLIPIT_LEFT BUTTON_LEFT @@ -523,7 +520,7 @@ #define FLIPIT_STEP_BY_STEP BUTTON_POWER #define FLIPIT_TOGGLE BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c index d8b792aedc..c01ef71e7c 100644 --- a/apps/plugins/invadrox.c +++ b/apps/plugins/invadrox.c @@ -281,9 +281,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define RIGHT BUTTON_RIGHT #define FIRE BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define QUIT BUTTON_BACK @@ -305,7 +302,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define RIGHT BUTTON_RIGHT #define FIRE BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error INVADROX: Unsupported keypad #endif diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index e681c578ad..1413214a43 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -367,9 +367,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "SELECT" #define HK_CANCEL "BACK" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define JEWELS_UP BUTTON_UP #define JEWELS_DOWN BUTTON_DOWN @@ -400,7 +397,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "A" #define HK_CANCEL "B" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c index f7baccf84f..0c43c25063 100644 --- a/apps/plugins/metronome.c +++ b/apps/plugins/metronome.c @@ -86,6 +86,8 @@ enum metronome_errors || (CONFIG_KEYPAD == IPOD_3G_PAD) \ || (CONFIG_KEYPAD == IPOD_4G_PAD) #define METRONOME_QUIT PLA_UP +#elif defined(SDLAPP) +#define METRONOME_QUIT PLA_CANCEL #else #define METRONOME_QUIT PLA_EXIT #endif diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index e4a99e8f22..c69b356487 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -442,9 +442,6 @@ CONFIG_KEYPAD == MROBE500_PAD # define MINESWP_DISCOVER (BUTTON_MENU|BUTTON_REPEAT) # define MINESWP_INFO BUTTON_MENU -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == RG_NANO_PAD # define MINESWP_LEFT BUTTON_LEFT # define MINESWP_RIGHT BUTTON_RIGHT @@ -465,7 +462,7 @@ CONFIG_KEYPAD == MROBE500_PAD # define MINESWP_DISCOVER BUTTON_SELECT # define MINESWP_INFO BUTTON_MENU -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index 7e96ab81d9..c8a1d979b4 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -2577,9 +2577,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_POWER #define MP3ENC_SELECT BUTTON_SELECT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define MP3ENC_PREV BUTTON_LEFT #define MP3ENC_NEXT BUTTON_RIGHT @@ -2598,7 +2595,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_POWER #define MP3ENC_SELECT BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c index 49c0aeda4e..7719db65c1 100644 --- a/apps/plugins/oscilloscope.c +++ b/apps/plugins/oscilloscope.c @@ -550,9 +550,6 @@ #define OSCILLOSCOPE_VOL_UP BUTTON_UP #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == RG_NANO_PAD #define OSCILLOSCOPE_QUIT BUTTON_START #define OSCILLOSCOPE_DRAWMODE BUTTON_X @@ -576,7 +573,7 @@ #define OSCILLOSCOPE_VOL_UP BUTTON_UP #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c index 832ebc49f7..f9fa412a23 100644 --- a/apps/plugins/pegbox.c +++ b/apps/plugins/pegbox.c @@ -711,9 +711,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define LVL_UP_TEXT "UP+MENU" #define LVL_DOWN_TEXT "DOWN+MENU" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == RG_NANO_PAD #define PEGBOX_SELECT BUTTON_A #define PEGBOX_QUIT BUTTON_START @@ -748,7 +745,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define LVL_DOWN_TEXT "Start" #define SELECT_TEXT "A" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error "Unsupported keymap!" #endif diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index c9addff347..329b1ec813 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -318,9 +318,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_BACK #define PONG_RIGHT_DOWN BUTTON_RIGHT -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define PONG_QUIT BUTTON_BACK #define PONG_PAUSE BUTTON_PLAY @@ -345,7 +342,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_MENU #define PONG_RIGHT_DOWN BUTTON_POWER -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index a657dde2d7..ce0745530f 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -458,9 +458,6 @@ #define ROCKBLOX_RESTART BUTTON_BACK #define ROCKBLOX_SCROLL_ENABLED 1 -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define ROCKBLOX_OFF (BUTTON_BACK|BUTTON_REPEAT) #define ROCKBLOX_ROTATE_CCW BUTTON_UP @@ -495,7 +492,7 @@ #define ROCKBLOX_DROP BUTTON_SELECT #define ROCKBLOX_RESTART BUTTON_USER -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index 63121edba1..934fbfc1a7 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -348,9 +348,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_BACK #define PUZZLE_PICTURE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define PUZZLE_QUIT BUTTON_BACK #define PUZZLE_LEFT BUTTON_LEFT @@ -378,7 +375,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_SELECT #define PUZZLE_PICTURE BUTTON_MENU -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index 4055087159..2cf10a2811 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -305,9 +305,6 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #define SNAKE_DOWN BUTTON_DOWN #define SNAKE_PLAYPAUSE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define SNAKE_QUIT BUTTON_BACK #define SNAKE_LEFT BUTTON_LEFT @@ -332,7 +329,7 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #define SNAKE_DOWN BUTTON_DOWN #define SNAKE_PLAYPAUSE BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index d8a97f159f..8e38df047e 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -449,9 +449,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_PLAY #define SNAKE2_PLAYPAUSE_TEXT "PLAY" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define SNAKE2_LEFT BUTTON_LEFT #define SNAKE2_RIGHT BUTTON_RIGHT @@ -479,7 +476,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_SELECT #define SNAKE2_PLAYPAUSE_TEXT "A" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 7b6e79f70b..03edeb67c4 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -681,9 +681,6 @@ #define BUTTON_SAVE BUTTON_BACK #define BUTTON_SAVE_NAME "BACK" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define SOKOBAN_LEFT BUTTON_LEFT #define SOKOBAN_RIGHT BUTTON_RIGHT @@ -734,7 +731,7 @@ #define SOKOBAN_LEVEL_REPEAT_NAME "[TOPRIGHT]" #define BUTTON_SAVE_NAME "A [CENTER]" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c index 38ee7504ac..db3e8d7f40 100644 --- a/apps/plugins/spacerocks.c +++ b/apps/plugins/spacerocks.c @@ -363,9 +363,6 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define AST_PAUSE BUTTON_MENU #define AST_QUIT BUTTON_BACK @@ -393,7 +390,7 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/star.c b/apps/plugins/star.c index 856a2af51a..097c67f94c 100644 --- a/apps/plugins/star.c +++ b/apps/plugins/star.c @@ -705,15 +705,15 @@ #define STAR_LEVEL_DOWN_NAME "Start" #define STAR_LEVEL_REPEAT_NAME "Y" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif #ifdef HAVE_TOUCHSCREEN -//#ifndef STAR_QUIT -//#define STAR_QUIT BUTTON_TOPLEFT -//#define STAR_QUIT_NAME "TOPLEFT" -//#endif +#ifndef STAR_QUIT +#define STAR_QUIT BUTTON_TOPRIGHT +#define STAR_QUIT_NAME "TOPRIGHT" +#endif #ifndef STAR_LEFT #define STAR_LEFT BUTTON_MIDLEFT #endif diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index d18b6a658c..17569a623d 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -443,9 +443,6 @@ #define LABEL_MENU "MENU" #define LABEL_VOLUME "VOL+/VOL-" -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define VUMETER_QUIT BUTTON_BACK #define VUMETER_HELP BUTTON_LEFT @@ -479,7 +476,7 @@ #define LABEL_MENU "X" #define LABEL_VOLUME "Up/Down" -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c index c02234d500..d347c88035 100644 --- a/apps/plugins/wormlet.c +++ b/apps/plugins/wormlet.c @@ -397,9 +397,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define BTN_QUIT BUTTON_POWER #define BTN_STOPRESET BUTTON_BACK -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == MA_PAD #define BTN_DIR_UP BUTTON_UP #define BTN_DIR_DOWN BUTTON_DOWN @@ -429,7 +426,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define BTN_QUIT BUTTON_BACK #define BTN_STOPRESET BUTTON_MENU -#else +#elif !defined(HAVE_TOUCHSCREEN) #error No keymap defined! #endif diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c index f82cde1c32..eca53a2bda 100644 --- a/apps/plugins/xobox.c +++ b/apps/plugins/xobox.c @@ -351,9 +351,6 @@ CONFIG_KEYPAD == MROBE500_PAD #define DOWN BUTTON_DOWN #define PAUSE BUTTON_PLAY -#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD -/* use touchscreen */ - #elif CONFIG_KEYPAD == RG_NANO_PAD #define QUIT BUTTON_START @@ -372,7 +369,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define DOWN BUTTON_DOWN #define PAUSE BUTTON_SELECT -#else +#elif !defined(HAVE_TOUCHSCREEN) #error "No keymap defined!" #endif From 78ba3211be5af4b23e42fe45d67910476e1c9267 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Mon, 30 Mar 2026 16:28:26 -0400 Subject: [PATCH 19/24] FS13846: Russian translation update (Sergey Puskov) Change-Id: Ifa9dff84380f20637e39900409bacbb690d40634 --- apps/lang/russian.lang | 111 +++++++++++++++++++---------------------- 1 file changed, 50 insertions(+), 61 deletions(-) diff --git a/apps/lang/russian.lang b/apps/lang/russian.lang index 01df4bb766..3866b360b3 100644 --- a/apps/lang/russian.lang +++ b/apps/lang/russian.lang @@ -13142,20 +13142,6 @@ *: "в сторону ферзя" - - id: LANG_PLAYTIME_ERROR - desc: playing time screen - user: core - - *: "Error while gathering info" - - - *: "Сбой при сборе информации" - - - *: "Сбой при сборе информации" - - id: LANG_CLEAR_ALL_RESUMES desc: in the mpegplayer settings menu @@ -14389,7 +14375,7 @@ user: core *: "Press LEFT to cancel." - android,hifietma*,zenvision: "Press BACK to cancel." + android,hifietma*: "Press BACK to cancel." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." ihifi760,ihifi960: "Double tap RETURN to cancel." ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." @@ -14404,7 +14390,7 @@ *: "Нажмите ВЛЕВО для отмены." - android,hifietma*,zenvision: "Нажмите НАЗАД для отмены." + android,hifietma*: "Нажмите НАЗАД для отмены." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите ВКЛ. для отмены." ihifi760,ihifi960: "Дважды нажмите ВОЗВРАТ для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите ДОМОЙ для отмены." @@ -14419,7 +14405,7 @@ *: "Нажмите кнопку Влево для отмены." - android,hifietma*,zenvision: "Нажмите кнопку Назад для отмены." + android,hifietma*: "Нажмите кнопку Назад для отмены." cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Нажмите кнопку включения для отмены." ihifi760,ihifi960: "Дважды нажмите кнопку Назад для отмены." ihifi770,ihifi770c,ihifi800: "Нажмите кнопку Домой для отмены." @@ -15790,13 +15776,13 @@ 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" + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one user: core *: "dAY" - *: "~dAY" + *: "dAy" *: "" @@ -15872,20 +15858,6 @@ *: "Браузер по умолчанию" - - id: LANG_AMAZE_MENU - desc: Amaze game - user: core - - *: "Amaze Main Menu" - - - *: "Главное меню Amaze" - - - *: "Главное меню Amaze" - - id: LANG_SET_MAZE_SIZE desc: Maze size in Amaze game @@ -16138,34 +16110,6 @@ *: "Настройки Mik mod" - - id: LANG_MIKMOD_MENU - desc: mikmod plugin - user: core - - *: "Mikmod Menu" - - - *: "Меню Mikmod" - - - *: "Меню Mik mod" - - - - id: LANG_CHESSBOX_MENU - desc: chessbox plugin - user: core - - *: "Chessbox Menu" - - - *: "Меню Chessbox" - - - *: "Меню Chessbox" - - id: VOICE_INVALID_VOICE_FILE desc: played if the voice file fails to load @@ -16999,3 +16943,48 @@ *: "Все трэки сортируются по альбому" + + id: LANG_ANNOUNCE_STATUS + desc: announnnce_status plugin + user: core + + *: "Announce Status" + + + *: "Объявлять статус" + + + *: "Объявлять статус" + + + + id: LANG_USE_LED_INDICATORS + desc: LED indicators setting + user: core + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Использовать LED индикаторы" + + + *: none + general_purpose_led: "Использовать LED индикаторы" + + + + id: LANG_KEEP_DIRECTORY + desc: file browser setting + user: core + + *: "Always remember last folder" + + + *: "Всегда запоминать последнюю папку" + + + *: "Всегда запоминать последнюю папку" + + From 65f210544586524118edf504c8e7e832a026281a Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Mon, 30 Mar 2026 20:52:36 -0400 Subject: [PATCH 20/24] Revert "sdlapp: Enable compilation of most apps/games" This reverts commit 96b5642c93d16116eb0078dd2de754ce9cec3996. Reason for revert: Accidentlly merged this before it was ready. Change-Id: I9344988f6556b774479dd4fd209f30e450ad0858 --- apps/plugins/SOURCES | 3 --- apps/plugins/SOURCES.app_build | 2 +- apps/plugins/blackjack.c | 6 +----- apps/plugins/boomshine.lua | 8 ++------ apps/plugins/brickmania.c | 5 +---- apps/plugins/calculator.c | 5 +---- apps/plugins/calendar.c | 5 ++++- apps/plugins/chessclock.c | 5 +---- apps/plugins/chip8.c | 5 ++++- apps/plugins/cube.c | 5 ++++- apps/plugins/fft/fft.c | 3 +-- apps/plugins/flipit.c | 5 ++++- apps/plugins/invadrox.c | 5 ++++- apps/plugins/jewels.c | 5 ++++- apps/plugins/metronome.c | 2 -- apps/plugins/minesweeper.c | 5 ++++- apps/plugins/mp3_encoder.c | 5 ++++- apps/plugins/oscilloscope.c | 5 ++++- apps/plugins/pegbox.c | 5 ++++- apps/plugins/pong.c | 5 ++++- apps/plugins/rockblox.c | 5 ++++- apps/plugins/sliding_puzzle.c | 5 ++++- apps/plugins/snake.c | 5 ++++- apps/plugins/snake2.c | 5 ++++- apps/plugins/sokoban.c | 5 ++++- apps/plugins/spacerocks.c | 5 ++++- apps/plugins/star.c | 10 +++++----- apps/plugins/vu_meter.c | 5 ++++- apps/plugins/wormlet.c | 5 ++++- apps/plugins/xobox.c | 5 ++++- 30 files changed, 93 insertions(+), 56 deletions(-) diff --git a/apps/plugins/SOURCES b/apps/plugins/SOURCES index d06e0181f2..3a57e3f9e5 100644 --- a/apps/plugins/SOURCES +++ b/apps/plugins/SOURCES @@ -157,10 +157,7 @@ pong.c sliding_puzzle.c snake.c snake2.c -#ifndef SDLAPP -/* Too many buttons for SDL */ solitaire.c -#endif sokoban.c star.c starfield.c diff --git a/apps/plugins/SOURCES.app_build b/apps/plugins/SOURCES.app_build index 746af3c0a9..cdd764dc27 100644 --- a/apps/plugins/SOURCES.app_build +++ b/apps/plugins/SOURCES.app_build @@ -1,4 +1,4 @@ -#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) || defined(SDLAPP) +#if !defined(HAVE_TOUCHSCREEN) || defined(DX50) || defined(DX90) || defined(HIBY_R3PROII) || defined(HIBY_R1) /* In devices running RockBox as an application, but having a keypad */ #include "SOURCES" #else diff --git a/apps/plugins/blackjack.c b/apps/plugins/blackjack.c index 146fe2da41..10272f90e4 100644 --- a/apps/plugins/blackjack.c +++ b/apps/plugins/blackjack.c @@ -628,7 +628,7 @@ enum { #define BJACK_RIGHT BUTTON_RIGHT #define BJACK_LEFT BUTTON_LEFT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif @@ -641,10 +641,6 @@ enum { #define BJACK_SELECT BUTTON_CENTER #define BJACK_SELECT_NAME "BUTTON_CENTER" #endif -#ifndef BJACK_QUIT -#define BJACK_QUIT BUTTON_BOTTOMRIGHT -#define BJACK_QUIT_NAME "BUTTON_BOTTOMRIGHT" -#endif #ifndef BJACK_MAX #define BJACK_MAX BUTTON_TOPRIGHT #endif diff --git a/apps/plugins/boomshine.lua b/apps/plugins/boomshine.lua index 089a4e6b0e..fcdf7c9a1c 100644 --- a/apps/plugins/boomshine.lua +++ b/apps/plugins/boomshine.lua @@ -707,9 +707,7 @@ if HAS_TOUCHSCREEN then rb.touchscreen_mode(rb.TOUCHSCREEN_POINT) end -if rb.backlight_force_on then - rb.backlight_force_on() -end +rb.backlight_force_on() local eva = rockev.register("action", action_event, rb.HZ / 10) @@ -763,9 +761,7 @@ else end -- Restore user backlight settings -if rb.backlight_use_settings then - rb.backlight_use_settings() -end +rb.backlight_use_settings() if rb.cpu_boost then rb.cpu_boost(false) end os.exit() diff --git a/apps/plugins/brickmania.c b/apps/plugins/brickmania.c index b45b7597e3..bb34219895 100644 --- a/apps/plugins/brickmania.c +++ b/apps/plugins/brickmania.c @@ -382,7 +382,7 @@ CONFIG_KEYPAD == SANSA_M200_PAD #define UP BUTTON_UP #define DOWN BUTTON_DOWN -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif @@ -408,9 +408,6 @@ CONFIG_KEYPAD == SANSA_M200_PAD #ifndef DOWN #define DOWN BUTTON_BOTTOMMIDDLE #endif -#ifndef QUIT -#define QUIT BUTTON_BOTTOMRIGHT -#endif #endif /* MI: fallback for the suicide combination */ diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index 97e998c43d..5e69e1f12a 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -557,7 +557,7 @@ F3: equal to "=" #define CALCULATOR_CALC BUTTON_MENU #define CALCULATOR_CLEAR BUTTON_USER -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif @@ -583,9 +583,6 @@ F3: equal to "=" #ifndef CALCULATOR_CLEAR #define CALCULATOR_CLEAR BUTTON_TOPRIGHT #endif -#ifndef CALCULATOR_QUIT -#define CALCULATOR_QUIT BUTTON_TOPLEFT -#endif #include "lib/pluginlib_touchscreen.h" static struct ts_raster calc_raster = { X_0_POS, Y_1_POS, diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index 42cd88c1aa..d1213367ae 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -409,6 +409,9 @@ #define CALENDAR_NEXT_MONTH BUTTON_VOL_UP #define CALENDAR_PREV_MONTH BUTTON_VOL_DOWN +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define CALENDAR_QUIT (BUTTON_BACK|BUTTON_MENU) #define CALENDAR_SELECT BUTTON_PLAY @@ -440,7 +443,7 @@ #define CALENDAR_NEXT_MONTH BUTTON_POWER #define CALENDAR_PREV_MONTH BUTTON_USER -#elif !defined(HAVE_TOUCHSCREEN) +#else #error "No keypad setting." #endif diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 6df7756151..521ae034b7 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -418,7 +418,7 @@ #define CHC_SETTINGS_OK BUTTON_SELECT #define CHC_SETTINGS_CANCEL BUTTON_BACK -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif @@ -444,9 +444,6 @@ #ifndef CHC_MENU #define CHC_MENU BUTTON_TOPRIGHT #endif -#ifndef CHC_QUIT -#define CHC_QUIT BUTTON_BOTTOMRIGHT -#endif #endif diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c index cecda4503a..fa6acea82a 100644 --- a/apps/plugins/chip8.c +++ b/apps/plugins/chip8.c @@ -1314,7 +1314,10 @@ CONFIG_KEYPAD == MROBE500_PAD #define CHIP8_KEY8 BUTTON_POWER #define CHIP8_KEY9 BUTTON_USER -#elif !defined(HAVE_TOUCHSCREEN) +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + +#else #error No keymap defined! #endif diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index 692bad893e..d3c95be10f 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -392,6 +392,9 @@ #define CUBE_PAUSE BUTTON_PLAY #define CUBE_HIGHSPEED BUTTON_BACK +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define CUBE_QUIT BUTTON_BACK #define CUBE_NEXT BUTTON_RIGHT @@ -422,7 +425,7 @@ #define CUBE_PAUSE BUTTON_USER #define CUBE_HIGHSPEED BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/fft/fft.c b/apps/plugins/fft/fft.c index 8933984669..fb719ab9aa 100644 --- a/apps/plugins/fft/fft.c +++ b/apps/plugins/fft/fft.c @@ -56,8 +56,7 @@ static const struct button_mapping *plugin_contexts[] = { pla_main_ctx }; #if (CONFIG_KEYPAD == IPOD_1G2G_PAD) \ || (CONFIG_KEYPAD == IPOD_3G_PAD) \ - || (CONFIG_KEYPAD == IPOD_4G_PAD) \ - || defined(SDLAPP) + || (CONFIG_KEYPAD == IPOD_4G_PAD) #define FFT_QUIT PLA_UP #else #define FFT_QUIT PLA_EXIT diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index 89ac3655c8..3080f2f239 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -482,6 +482,9 @@ #define FLIPIT_STEP_BY_STEP BUTTON_VOL_UP #define FLIPIT_TOGGLE BUTTON_SELECT +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define FLIPIT_LEFT BUTTON_LEFT @@ -520,7 +523,7 @@ #define FLIPIT_STEP_BY_STEP BUTTON_POWER #define FLIPIT_TOGGLE BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/invadrox.c b/apps/plugins/invadrox.c index c01ef71e7c..d8b792aedc 100644 --- a/apps/plugins/invadrox.c +++ b/apps/plugins/invadrox.c @@ -281,6 +281,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define RIGHT BUTTON_RIGHT #define FIRE BUTTON_SELECT +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define QUIT BUTTON_BACK @@ -302,7 +305,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define RIGHT BUTTON_RIGHT #define FIRE BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error INVADROX: Unsupported keypad #endif diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index 1413214a43..e681c578ad 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -367,6 +367,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "SELECT" #define HK_CANCEL "BACK" +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define JEWELS_UP BUTTON_UP #define JEWELS_DOWN BUTTON_DOWN @@ -397,7 +400,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define HK_SELECT "A" #define HK_CANCEL "B" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c index 0c43c25063..f7baccf84f 100644 --- a/apps/plugins/metronome.c +++ b/apps/plugins/metronome.c @@ -86,8 +86,6 @@ enum metronome_errors || (CONFIG_KEYPAD == IPOD_3G_PAD) \ || (CONFIG_KEYPAD == IPOD_4G_PAD) #define METRONOME_QUIT PLA_UP -#elif defined(SDLAPP) -#define METRONOME_QUIT PLA_CANCEL #else #define METRONOME_QUIT PLA_EXIT #endif diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index c69b356487..e4a99e8f22 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -442,6 +442,9 @@ CONFIG_KEYPAD == MROBE500_PAD # define MINESWP_DISCOVER (BUTTON_MENU|BUTTON_REPEAT) # define MINESWP_INFO BUTTON_MENU +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == RG_NANO_PAD # define MINESWP_LEFT BUTTON_LEFT # define MINESWP_RIGHT BUTTON_RIGHT @@ -462,7 +465,7 @@ CONFIG_KEYPAD == MROBE500_PAD # define MINESWP_DISCOVER BUTTON_SELECT # define MINESWP_INFO BUTTON_MENU -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index c8a1d979b4..7e96ab81d9 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -2577,6 +2577,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_POWER #define MP3ENC_SELECT BUTTON_SELECT +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define MP3ENC_PREV BUTTON_LEFT #define MP3ENC_NEXT BUTTON_RIGHT @@ -2595,7 +2598,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define MP3ENC_DONE BUTTON_POWER #define MP3ENC_SELECT BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c index 7719db65c1..49c0aeda4e 100644 --- a/apps/plugins/oscilloscope.c +++ b/apps/plugins/oscilloscope.c @@ -550,6 +550,9 @@ #define OSCILLOSCOPE_VOL_UP BUTTON_UP #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == RG_NANO_PAD #define OSCILLOSCOPE_QUIT BUTTON_START #define OSCILLOSCOPE_DRAWMODE BUTTON_X @@ -573,7 +576,7 @@ #define OSCILLOSCOPE_VOL_UP BUTTON_UP #define OSCILLOSCOPE_VOL_DOWN BUTTON_DOWN -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/pegbox.c b/apps/plugins/pegbox.c index f9fa412a23..832ebc49f7 100644 --- a/apps/plugins/pegbox.c +++ b/apps/plugins/pegbox.c @@ -711,6 +711,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define LVL_UP_TEXT "UP+MENU" #define LVL_DOWN_TEXT "DOWN+MENU" +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == RG_NANO_PAD #define PEGBOX_SELECT BUTTON_A #define PEGBOX_QUIT BUTTON_START @@ -745,7 +748,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define LVL_DOWN_TEXT "Start" #define SELECT_TEXT "A" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error "Unsupported keymap!" #endif diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index 329b1ec813..c9addff347 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -318,6 +318,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_BACK #define PONG_RIGHT_DOWN BUTTON_RIGHT +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define PONG_QUIT BUTTON_BACK #define PONG_PAUSE BUTTON_PLAY @@ -342,7 +345,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PONG_RIGHT_UP BUTTON_MENU #define PONG_RIGHT_DOWN BUTTON_POWER -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index ce0745530f..a657dde2d7 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -458,6 +458,9 @@ #define ROCKBLOX_RESTART BUTTON_BACK #define ROCKBLOX_SCROLL_ENABLED 1 +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define ROCKBLOX_OFF (BUTTON_BACK|BUTTON_REPEAT) #define ROCKBLOX_ROTATE_CCW BUTTON_UP @@ -492,7 +495,7 @@ #define ROCKBLOX_DROP BUTTON_SELECT #define ROCKBLOX_RESTART BUTTON_USER -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index 934fbfc1a7..63121edba1 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -348,6 +348,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_BACK #define PUZZLE_PICTURE BUTTON_PLAY +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define PUZZLE_QUIT BUTTON_BACK #define PUZZLE_LEFT BUTTON_LEFT @@ -375,7 +378,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define PUZZLE_SHUFFLE BUTTON_SELECT #define PUZZLE_PICTURE BUTTON_MENU -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index 2cf10a2811..4055087159 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -305,6 +305,9 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #define SNAKE_DOWN BUTTON_DOWN #define SNAKE_PLAYPAUSE BUTTON_PLAY +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define SNAKE_QUIT BUTTON_BACK #define SNAKE_LEFT BUTTON_LEFT @@ -329,7 +332,7 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #define SNAKE_DOWN BUTTON_DOWN #define SNAKE_PLAYPAUSE BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index 8e38df047e..d8a97f159f 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -449,6 +449,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_PLAY #define SNAKE2_PLAYPAUSE_TEXT "PLAY" +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define SNAKE2_LEFT BUTTON_LEFT #define SNAKE2_RIGHT BUTTON_RIGHT @@ -476,7 +479,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define SNAKE2_PLAYPAUSE BUTTON_SELECT #define SNAKE2_PLAYPAUSE_TEXT "A" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 03edeb67c4..7b6e79f70b 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -681,6 +681,9 @@ #define BUTTON_SAVE BUTTON_BACK #define BUTTON_SAVE_NAME "BACK" +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define SOKOBAN_LEFT BUTTON_LEFT #define SOKOBAN_RIGHT BUTTON_RIGHT @@ -731,7 +734,7 @@ #define SOKOBAN_LEVEL_REPEAT_NAME "[TOPRIGHT]" #define BUTTON_SAVE_NAME "A [CENTER]" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/spacerocks.c b/apps/plugins/spacerocks.c index db3e8d7f40..38ee7504ac 100644 --- a/apps/plugins/spacerocks.c +++ b/apps/plugins/spacerocks.c @@ -363,6 +363,9 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_PLAY +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define AST_PAUSE BUTTON_MENU #define AST_QUIT BUTTON_BACK @@ -390,7 +393,7 @@ #define AST_RIGHT BUTTON_RIGHT #define AST_FIRE BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/star.c b/apps/plugins/star.c index 097c67f94c..856a2af51a 100644 --- a/apps/plugins/star.c +++ b/apps/plugins/star.c @@ -705,15 +705,15 @@ #define STAR_LEVEL_DOWN_NAME "Start" #define STAR_LEVEL_REPEAT_NAME "Y" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif #ifdef HAVE_TOUCHSCREEN -#ifndef STAR_QUIT -#define STAR_QUIT BUTTON_TOPRIGHT -#define STAR_QUIT_NAME "TOPRIGHT" -#endif +//#ifndef STAR_QUIT +//#define STAR_QUIT BUTTON_TOPLEFT +//#define STAR_QUIT_NAME "TOPLEFT" +//#endif #ifndef STAR_LEFT #define STAR_LEFT BUTTON_MIDLEFT #endif diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index 17569a623d..d18b6a658c 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -443,6 +443,9 @@ #define LABEL_MENU "MENU" #define LABEL_VOLUME "VOL+/VOL-" +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define VUMETER_QUIT BUTTON_BACK #define VUMETER_HELP BUTTON_LEFT @@ -476,7 +479,7 @@ #define LABEL_MENU "X" #define LABEL_VOLUME "Up/Down" -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c index d347c88035..c02234d500 100644 --- a/apps/plugins/wormlet.c +++ b/apps/plugins/wormlet.c @@ -397,6 +397,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define BTN_QUIT BUTTON_POWER #define BTN_STOPRESET BUTTON_BACK +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == MA_PAD #define BTN_DIR_UP BUTTON_UP #define BTN_DIR_DOWN BUTTON_DOWN @@ -426,7 +429,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define BTN_QUIT BUTTON_BACK #define BTN_STOPRESET BUTTON_MENU -#elif !defined(HAVE_TOUCHSCREEN) +#else #error No keymap defined! #endif diff --git a/apps/plugins/xobox.c b/apps/plugins/xobox.c index eca53a2bda..f82cde1c32 100644 --- a/apps/plugins/xobox.c +++ b/apps/plugins/xobox.c @@ -351,6 +351,9 @@ CONFIG_KEYPAD == MROBE500_PAD #define DOWN BUTTON_DOWN #define PAUSE BUTTON_PLAY +#elif CONFIG_KEYPAD == SHANLING_Q1_PAD || CONFIG_KEYPAD == HIBY_R3PROII_PAD +/* use touchscreen */ + #elif CONFIG_KEYPAD == RG_NANO_PAD #define QUIT BUTTON_START @@ -369,7 +372,7 @@ CONFIG_KEYPAD == MROBE500_PAD #define DOWN BUTTON_DOWN #define PAUSE BUTTON_SELECT -#elif !defined(HAVE_TOUCHSCREEN) +#else #error "No keymap defined!" #endif From c5b171da41415f4edc2e36353372088b340bafac Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 1 Apr 2026 08:25:23 -0400 Subject: [PATCH 21/24] =?UTF-8?q?FS#13847=20-=20Updated=20Norwegian=20Nyno?= =?UTF-8?q?rsk=20translation=20(Eivind=20=C3=98deg=C3=A5rd)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iccb88dcb80b4c316ad1701fada1d0aac54958e51 --- apps/lang/norsk-nynorsk.lang | 8857 +++++++++++++++++++++++++++++----- docs/CREDITS | 2 + 2 files changed, 7650 insertions(+), 1209 deletions(-) diff --git a/apps/lang/norsk-nynorsk.lang b/apps/lang/norsk-nynorsk.lang index 928805ace2..0048e214ad 100644 --- a/apps/lang/norsk-nynorsk.lang +++ b/apps/lang/norsk-nynorsk.lang @@ -17,6 +17,7 @@ # Norwegian Nynorsk language file, translated by: # - Karl Ove Hufthammer # - Tore Johnny Bråtveit +# - Eivind Ødegård id: LANG_SET_BOOL_YES desc: bool true representation @@ -98,23 +99,7 @@ *: "Lastar …" - *: "" - - - - id: LANG_CONFIRM_SHUTDOWN - desc: in shutdown screen - user: core - - *: none - soft_shutdown: "Press OFF to shut down" - - - *: none - soft_shutdown: "Trykk AV for å slå av" - - - *: none + *: "Lastar" @@ -128,23 +113,7 @@ *: "Slår av …" - *: "" - - - - id: LANG_REMOVE_MMC - desc: before acknowledging usb in case an MMC is inserted (Ondio) - user: core - - *: none - archosondio*: "Please remove inserted MMC" - - - *: none - archosondio*: "Fjern minnekortet" - - - *: none + *: "Slår av" @@ -279,23 +248,6 @@ *: "Program" - - id: LANG_SHUTDOWN - desc: in main menu - user: core - - *: none - soft_shutdown: "Shut down" - - - *: none - soft_shutdown: "Slå av" - - - *: none - soft_shutdown: "Slå av" - - id: LANG_VOLUME desc: in sound_settings @@ -318,10 +270,10 @@ *: "Bass" - *: "Bass" + *: "~Bass" - *: "Bass" + *: "~Bass" @@ -354,30 +306,30 @@ id: LANG_CHANNEL_STEREO - desc: in sound_settings + desc: in sound_settings and radio screen user: core *: "Stereo" - *: "Stereo" + *: "~Stereo" - *: "Stereo" + *: "~Stereo" id: LANG_CHANNEL_MONO - desc: in sound_settings + desc: in sound_settings and radio screen user: core *: "Mono" - *: "Mono" + *: "~Mono" - *: "Mono" + *: "~Mono" @@ -430,10 +382,10 @@ *: "Karaoke" - *: "Karaoke" + *: "~Karaoke" - *: "Karaoke" + *: "~Karaoke" @@ -450,158 +402,6 @@ *: "Stereo-breidd" - - id: LANG_LOUDNESS - desc: in sound_settings - user: core - - *: none - masf: "Loudness" - - - *: none - masf: "Lydstyrke" - - - *: none - masf: "Lydstyrke" - - - - id: LANG_AUTOVOL - desc: in sound_settings - user: core - - *: none - masf: "Auto Volume" - - - *: none - masf: "Automatisk lydnivå" - - - *: none - masf: "Automatisk lydnivå" - - - - id: LANG_DECAY - desc: in sound_settings - user: core - - *: none - masf: "AV Decay Time" - - - *: none - masf: "Falltid for automatisk lydnivå" - - - *: none - - - - id: LANG_SUPERBASS - desc: in sound settings - user: core - - *: none - masf: "Super Bass" - - - *: none - masf: "Superbass" - - - *: none - masf: "Superbass" - - - - id: LANG_MDB_ENABLE - desc: in sound settings - user: core - - *: none - masf: "MDB Enable" - - - *: none - masf: "Bruk MDB" - - - *: none - masf: "Bruk MDB" - - - - id: LANG_MDB_STRENGTH - desc: in sound settings - user: core - - *: none - masf: "MDB Strength" - - - *: none - masf: "MDB-styrke" - - - *: none - masf: "MDB-styrke" - - - - id: LANG_MDB_HARMONICS - desc: in sound settings - user: core - - *: none - masf: "MDB Harmonics" - - - *: none - masf: "MDB-overtonar" - - - *: none - masf: "MDB-overtonar" - - - - id: LANG_MDB_CENTER - desc: in sound settings - user: core - - *: none - masf: "MDB Centre Frequency" - - - *: none - masf: "MDB-midtfrekvens" - - - *: none - masf: "MDB-midtfrekvens" - - - - id: LANG_MDB_SHAPE - desc: in sound settings - user: core - - *: none - masf: "MDB Shape" - - - *: none - masf: "MDB-form" - - - *: none - masf: "MDB-form" - - id: LANG_CROSSFEED desc: in sound settings @@ -680,10 +480,10 @@ *: "System" - *: "System" + *: "~System" - *: "System" + *: "~System" @@ -767,7 +567,7 @@ *: "Tømt" - *: "" + *: "Tømt" @@ -812,7 +612,7 @@ *: "Bruk tonekontroll" - *: none + *: "Bruk tonekontroll" @@ -826,7 +626,7 @@ *: "Grafisk tonekontroll" - *: none + *: "Grafisk tonekontroll" @@ -840,7 +640,7 @@ *: "Førehandskutting" - *: none + *: "Førehandskutting" @@ -851,10 +651,10 @@ *: "Simple EQ Settings" - *: "Enkelt oppsett" + *: "Enkelt EQ-oppsett" - *: none + *: "Enkelt EQ-oppsett" @@ -865,10 +665,10 @@ *: "Advanced EQ Settings" - *: "Avansert oppsett" + *: "Avansert EQ-oppsett" - *: none + *: "Avansert EQ-oppsett" @@ -882,7 +682,7 @@ *: "Lagra som ferdigoppsett" - *: none + *: "Lagra som ferdigoppsett" @@ -896,21 +696,7 @@ *: "Sjå gjennom ferdigoppsett" - *: none - - - - id: LANG_EQUALIZER_EDIT_MODE - desc: in the equalizer settings menu - user: core - - *: "Edit mode: %s" - - - *: "Redigeringsmodus: %s" - - - *: none + *: "Sjå gjennom ferdigoppsett" @@ -924,7 +710,7 @@ *: "%d Hz-bandforsterking" - *: none + *: "Hertz bandforsterking" @@ -935,10 +721,10 @@ *: "Low Shelf Filter" - *: "Lågskrankefilter" + *: "Bassfilter" - *: none + *: "Bassfilter" @@ -952,7 +738,7 @@ *: "Lydtoppfilter %d" - *: none + *: "Lydtoppfilter" @@ -963,10 +749,10 @@ *: "High Shelf Filter" - *: "Høgskrankefilter" + *: "Diskantfilter" - *: none + *: "Diskantfilter" @@ -994,7 +780,7 @@ *: "Midtfrekvens" - *: none + *: "Midtfrekvens" @@ -1263,10 +1049,10 @@ *: "Replaygain" - *: "Replaygain" + *: "Avspelingsvolum" - *: "Replaygain" + *: "Avspelingsvolum" @@ -1364,10 +1150,10 @@ *: "Database" - *: "Database" + *: "~Database" - *: "Database" + *: "~Database" @@ -1667,6 +1453,7 @@ *: none + remote: "Fjern-LCD-oppsett" @@ -1694,7 +1481,7 @@ *: "Status- og rullelinje" - *: none + *: "Status og rullelinje" @@ -1703,15 +1490,12 @@ user: core *: "Peak Meter" - masd: none *: "Lydtoppmålar" - masd: none *: "Lydtoppmålar" - masd: none @@ -1739,7 +1523,7 @@ *: "Latin-1 (ISO-8859-1)" - *: "Latin 1" + *: "Latin-1" @@ -1767,7 +1551,7 @@ *: "Hebraisk (ISO-8859-8)" - *: none + *: "Hebraisk" @@ -1792,10 +1576,10 @@ *: "Thai (ISO-8859-11)" - *: "Thai (ISO-8859-11)" + *: "~Thai (ISO-8859-11)" - *: none + *: "~Thai" @@ -1809,7 +1593,7 @@ *: "Arabisk (CP1256)" - *: none + *: "Arabisk" @@ -1851,7 +1635,7 @@ *: "Japansk (SJIS)" - *: none + *: "Japansk" @@ -1865,7 +1649,7 @@ *: "Kinesisk – forenkla (GB2312)" - *: none + *: "Forenkla kinesisk" @@ -1879,7 +1663,7 @@ *: "Koreansk (KSX1001)" - *: none + *: "Koreansk" @@ -1893,7 +1677,7 @@ *: "Kinesisk – tradisjonell (BIG5)" - *: none + *: "Tradisjonell kinesisk" @@ -1904,10 +1688,10 @@ *: "Unicode (UTF-8)" - *: "Unicode (UTF-8)" + *: "~Unicode (UTF-8)" - *: "Unicode" + *: "~Unicode" @@ -1932,10 +1716,10 @@ *: "Disk" - *: "Disk" + *: "~Disk" - *: "Disk" + *: "~Disk" @@ -1952,6 +1736,7 @@ *: none + rtc: "Dato og klokkeslett" @@ -2117,20 +1902,6 @@ *: "Vil du ha ei oversikt over nye bokmerke?" - - id: LANG_BOOKMARK_SETTINGS_UNIQUE_ONLY - desc: Save only on bookmark for each playlist in recent bookmarks - user: core - - *: "Unique only" - - - *: "Berre unike" - - - *: "Berre unike" - - id: LANG_VOICE_MENU desc: item of voice menu, enable/disable the voice UI @@ -2215,23 +1986,6 @@ *: ".talk-klipp" - - id: LANG_RECORDING_QUALITY - desc: in the recording settings - user: core - - *: none - recording_hwcodec: "Quality" - - - *: none - recording_hwcodec: "Kvalitet" - - - *: none - recording_hwcodec: "Kvalitet" - - id: LANG_FREQUENCY desc: in recording and playback settings @@ -2296,28 +2050,11 @@ *: none - recording: "Digital" + recording: "~Digital" *: none - recording: "Digital" - - - - id: LANG_RECORDING_EDITABLE - desc: Editable recordings setting - user: core - - *: none - recording_hwcodec: "Independent Frames" - - - *: none - recording_hwcodec: "Uavhengige rammer" - - - *: none - recording_hwcodec: "Uavhengige rammer" + recording: "~Digital" @@ -2351,23 +2088,7 @@ *: none - - - - id: LANG_RECORD_DIRECTORY - desc: in recording settings_menu - user: core - - *: none - recording: "Directory" - - - *: none - recording: "Mappe" - - - *: none - recording: "Mappe" + recording: "Forinnspelingstid" @@ -2418,6 +2139,7 @@ *: none + remote: "Berre hovudeining" @@ -2434,6 +2156,7 @@ *: none + remote: "Berre fjerneining" @@ -2450,6 +2173,7 @@ *: none + remote: "Hovud og fjerneining" @@ -2911,7 +2635,7 @@ *: "Felt (invers)" - *: none + *: "Felt invers" @@ -3153,23 +2877,6 @@ *: "Statuslinje" - - id: LANG_BUTTON_BAR - desc: in settings menu - user: core - - *: none - recorder_pad: "Button Bar" - - - *: none - recorder_pad: "Knapprad" - - - *: none - recorder_pad: "Knapprad" - - id: LANG_VOLUME_DISPLAY desc: Volume type title @@ -3232,15 +2939,12 @@ user: core *: "Peak Release" - masd: none *: "Lydtoppfråfall" - masd: none *: "Lydtoppfråfall" - masd: none @@ -3249,15 +2953,12 @@ user: core *: "Peak Hold Time" - masd: none *: "Lydtopphaldetid" - masd: none *: "Lydtopphaldetid" - masd: none @@ -3266,15 +2967,12 @@ user: core *: "Clip Hold Time" - masd: none *: "Klipphaldetid" - masd: none *: "Klipphaldetid" - masd: none @@ -3283,15 +2981,12 @@ user: core *: "Eternal" - masd: none *: "Uendeleg" - masd: none *: "Uendeleg" - masd: none @@ -3300,15 +2995,12 @@ user: core *: "Scale" - masd: none *: "Skala" - masd: none *: "Skala" - masd: none @@ -3317,11 +3009,9 @@ user: core *: "Logarithmic (dB)" - masd: none *: "Logarithmisk (dB)" - masd: none *: "Logarithmisk desibel" @@ -3333,11 +3023,9 @@ user: core *: "Linear (%)" - masd: none *: "Lineær (%)" - masd: none *: "Lineær prosent" @@ -3349,15 +3037,12 @@ user: core *: "Minimum of Range" - masd: none *: "Minste verdi" - masd: none *: "Minste verdi" - masd: none @@ -3366,15 +3051,12 @@ user: core *: "Maximum of Range" - masd: none *: "Største verdi" - masd: none *: "Største verdi" - masd: none @@ -3391,55 +3073,6 @@ *: "Batterikapasitet" - - id: LANG_BATTERY_TYPE - desc: in battery settings - user: core - - *: none - battery_types: "Battery Type" - - - *: none - battery_types: "Batteritype" - - - *: none - - - - id: LANG_BATTERY_TYPE_1 - desc: in battery settings - user: core - - *: none - battery_types: "Alkaline" - - - *: none - battery_types: "Alkaline" - - - *: none - battery_types: "Alkaline" - - - - id: LANG_BATTERY_TYPE_2 - desc: in battery settings - user: core - - *: none - battery_types: "NiMH" - - - *: none - battery_types: "NiMH" - - - *: none - - id: LANG_SPINDOWN desc: in settings_menu @@ -3681,7 +3314,7 @@ *: "Fila/mappa finst alt. Vil du skriva over ho?" - *: "" + *: "Fila eller mappa finst alt. Vil du skriva over ho?" @@ -3740,7 +3373,7 @@ *: "Er du sikker på at du vil sletta?" - *: "" + *: "Er du sikker på at du vil sletta?" @@ -3830,62 +3463,6 @@ *: "Stokk om" - - id: LANG_INSERT - desc: in onplay menu. insert a track/playlist into dynamic playlist. - user: core - - *: "Insert" - - - *: "Set inn" - - - *: "Set inn" - - - - id: LANG_INSERT_FIRST - desc: in onplay menu. insert a track/playlist into dynamic playlist. - user: core - - *: "Insert Next" - - - *: "Set inn som neste" - - - *: "Set inn som neste" - - - - id: LANG_INSERT_LAST - desc: in onplay menu. append a track/playlist into dynamic playlist. - user: core - - *: "Insert Last" - - - *: "Set inn til slutt" - - - *: "Set inn til slutt" - - - - id: LANG_INSERT_SHUFFLED - desc: in onplay menu. insert a track/playlist randomly into dynamic playlist - user: core - - *: "Insert Shuffled" - - - *: "Set inn tilfeldig" - - - *: "Set inn tilfeldig" - - id: LANG_QUEUE desc: The verb/action Queue @@ -3967,7 +3544,7 @@ *: "Søkjer … fann %d (%s)" - *: "" + *: "Søkjer fann" @@ -4026,39 +3603,7 @@ *: none - charging: "Batteri: Ladar" - - - - id: LANG_BATTERY_TOPOFF_CHARGE - desc: in info display, shows that top off charge is running Only for V1 archosrecorder - user: core - - *: none - archosrecorder: "Battery: Top-Off Chg" - - - *: none - archosrecorder: "Batteri: Top-off-lading" - - - *: none - - - - id: LANG_BATTERY_TRICKLE_CHARGE - desc: in info display, shows that trickle charge is running - user: core - - *: none - charging: "Battery: Trickle Chg" - - - *: none - charging: "Battery: Trickle-lading" - - - *: none + charging: "Batteri ladar" @@ -4068,11 +3613,10 @@ *: "Battery: %d%% %dh %dm" ipodmini1g,ipodmini2g,iriverh10: "Batt: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" *: "Batteri: %d%% %dh %dm" - iriverifp7xx: "%d%% %dh %dm" + ipodmini1g,ipodmini2g,iriverh10: "~Batt: %d%% %dh %dm" *: "Batterinivå" @@ -4086,10 +3630,10 @@ *: "Disk:" - *: "Disk:" + *: "~Disk:" - *: "" + *: "Disk" @@ -4103,7 +3647,7 @@ *: "Ledig:" - *: "Ledig diskplass:" + *: "Ledig diskplass" @@ -4112,38 +3656,41 @@ user: core *: "Int:" + hibylinux: "mSD:" xduoox3: "mSD1:" - *: "Int:" - xduoox3: "mSD1:" + *: "Intern:" + hibylinux: "~mSD:" + xduoox3: "~mSD1:" *: "Intern" - xduoox3: "Micro S D 1" + hibylinux: "mikro S D" + xduoox3: "mikro S D 1" id: LANG_DISK_NAME_MMC - desc: in info menu; name for external disk with multivolume (Ondio; keep short!) + desc: in info menu; name for external disk with multivolume (keep short!) user: core *: none - archosondio*: "MMC:" - multivolume: "HD1" + hibylinux: "USB:" + multivolume: "HD1:" sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" xduoox3: "mSD2:" *: none - archosondio*: "MMC" - multivolume: "HD1" - sansac200*,sansaclipplus,sansae200*,sansafuze*: "mSD:" - xduoox3: "mSD2:" + hibylinux: "~USB:" + multivolume: "~HD1:" + sansac200*,sansaclipplus,sansae200*,sansafuze*: "~mSD:" + xduoox3: "~mSD2:" *: none - archosondio*: "M M C" + hibylinux: "U S B" multivolume: "H D 1" sansac200*,sansaclipplus,sansae200*,sansafuze*: "Micro S D" xduoox3: "Micro S D 2" @@ -4159,11 +3706,11 @@ *: none - rtc: "" + rtc: "Klokkeslett" *: none - rtc: "" + rtc: "Klokkeslett" @@ -4180,6 +3727,7 @@ *: none + pitchscreen: "" @@ -4196,6 +3744,7 @@ *: none + pitchscreen: "" @@ -4206,10 +3755,10 @@ *: "Pause" - *: "Pause" + *: "~Pause" - *: "Pause" + *: "~Pause" @@ -4275,8 +3824,8 @@ *: none rtc: "OFF = Revert" + aigoerosq,erosqnative,gigabeats,sansafuzeplus,xduoox3*: "BACK = Revert" gigabeatfx,mrobe500: "POWER = Revert" - gigabeats,sansafuzeplus: "BACK = Revert" gogearsa9200: "LEFT = Revert" iaudiom5,iaudiox5: "RECORD = Revert" ipod*,mpiohd300,sansac200*: "MENU = Revert" @@ -4289,8 +3838,9 @@ *: none rtc: "OFF = tilbakestill" - gigabeatfx,mrobe500: "POWER = Tilbakestill" + aigoerosq,erosqnative,xduoox3*: "BACK = Tilbakestill" gigabeats,sansafuzeplus: "BACK = Tilbakestill" + gigabeatfx,mrobe500: "POWER = Tilbakestill" gogearsa9200: "LEFT = Tilbakestill" iaudiom5,iaudiox5: "RECORD = Tilbakestill" ipod*,mpiohd300,sansac200*: "MENU = Tilbakestill" @@ -4318,6 +3868,7 @@ *: none + recording: "" @@ -4334,6 +3885,7 @@ *: none + recording: "" @@ -4358,6 +3910,7 @@ *: none + iaudiom5,iaudiox5,iriverh100,iriverh120,iriverh300,recording,samsungyh*,sansac200*,sansae200*,vibe500: "" @@ -4428,22 +3981,6 @@ recording: "Førdelingsrom" - - id: LANG_DB_INF - desc: -inf db for values below measurement - user: core - - *: none - recording: "-inf" - - - *: none - recording: "–uendeleg" - - - *: none - - id: LANG_ALARM_MOD_TIME desc: The current alarm time shown in the alarm menu for the RTC alarm mod. @@ -4458,6 +3995,7 @@ *: none + alarm: "" @@ -4474,22 +4012,7 @@ *: none - - - - id: LANG_ALARM_MOD_SHUTDOWN - desc: The text that tells the user that the alarm time is ok and the device shuts off (for the RTC alarm mod). - user: core - - *: none - alarm: "Alarm Set" - - - *: none - alarm: "Alarm stilt inn" - - - *: none + alarm: "Vaknar opp om" @@ -4509,33 +4032,6 @@ alarm: "Vekking om for kort tid" - - id: LANG_ALARM_MOD_KEYS - desc: Shown key functions in alarm menu (for the RTC alarm mod). - user: core - - *: 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" - - - *: none - alarm: "SPEL = vel – AV = avbryt" - gigabeats: "VEL = vel – PÅ/AV = avbryt" - ipod*: "VEL = vel – MENY = avbryt" - iriverh10,iriverh10_5gb: "VEL = vel – TILBAKE = avbryt" - mpiohd300: "ENTER = vel – MENU = avbryt" - vibe500: "OK = vel – C = avbryt" - - - *: none - - id: LANG_ALARM_MOD_DISABLE desc: Announce that the RTC alarm has been turned off @@ -4567,6 +4063,7 @@ *: none + lcd_color: "" @@ -4583,6 +4080,7 @@ *: none + lcd_color: "" @@ -4599,6 +4097,7 @@ *: none + lcd_color: "" @@ -4623,10 +4122,10 @@ *: "Artist" - *: "Artist" + *: "~Artist" - *: "Artist" + *: "~Artist" @@ -4637,10 +4136,10 @@ *: "Album" - *: "Album" + *: "~Album" - *: "Album" + *: "~Album" @@ -4721,10 +4220,10 @@ *: "Bitrate" - *: "Bitrate" + *: "~Bitrate" - *: "Bitrate" + *: "~Bitrate" @@ -4769,20 +4268,6 @@ *: "Sporforsterking" - - id: LANG_ID3_ALBUM_GAIN - desc: in tag viewer - user: core - - *: "Album Gain" - - - *: "Albumforsterking" - - - *: "Albumforsterking" - - id: LANG_ID3_PATH desc: in tag viewer @@ -4825,6 +4310,7 @@ *: none + rtc: "" @@ -4841,6 +4327,7 @@ *: none + rtc: "" @@ -4857,6 +4344,7 @@ *: none + rtc: "" @@ -4873,6 +4361,7 @@ *: none + rtc: "" @@ -4889,6 +4378,7 @@ *: none + rtc: "" @@ -4905,6 +4395,7 @@ *: none + rtc: "" @@ -4921,6 +4412,7 @@ *: none + rtc: "" @@ -4931,10 +4423,10 @@ *: "Jan" - *: "Jan" + *: "~Jan" - *: none + *: "Januar" @@ -4945,10 +4437,10 @@ *: "Feb" - *: "Feb" + *: "~Feb" - *: none + *: "Februar" @@ -4959,10 +4451,10 @@ *: "Mar" - *: "Mar" + *: "~Mar" - *: none + *: "Mars" @@ -4973,10 +4465,10 @@ *: "Apr" - *: "Apr" + *: "~Apr" - *: none + *: "April" @@ -5001,10 +4493,10 @@ *: "Jun" - *: "Jun" + *: "~Jun" - *: none + *: "Juni" @@ -5015,10 +4507,10 @@ *: "Jul" - *: "Jul" + *: "~Jul" - *: none + *: "Juli" @@ -5029,10 +4521,10 @@ *: "Aug" - *: "Aug" + *: "~Aug" - *: none + *: "August" @@ -5043,10 +4535,10 @@ *: "Sep" - *: "Sep" + *: "~Sep" - *: none + *: "September" @@ -5057,10 +4549,10 @@ *: "Oct" - *: "Okt" + *: "~Okt" - *: none + *: "Oktober" @@ -5071,10 +4563,10 @@ *: "Nov" - *: "Nov" + *: "~Nov" - *: none + *: "November" @@ -5085,10 +4577,10 @@ *: "Dec" - *: "Des" + *: "~Des" - *: none + *: "Desember" @@ -5777,48 +5269,6 @@ *: "" - - id: LANG_KILOBYTE - desc: a unit postfix, also voiced - user: core - - *: "KB" - - - *: "KB" - - - *: "kilobyte" - - - - id: LANG_MEGABYTE - desc: a unit postfix, also voiced - user: core - - *: "MB" - - - *: "MB" - - - *: "megabyte" - - - - id: LANG_GIGABYTE - desc: a unit postfix, also voiced - user: core - - *: "GB" - - - *: "GB" - - - *: "gigabyte" - - id: LANG_POINT desc: decimal separator for composing numbers @@ -6365,6 +5815,7 @@ *: none + remote: "speleskjerm på fjern eining" @@ -6417,10 +5868,10 @@ *: "Inserted %d tracks (%s)" - *: "Sett inn %d spor (%s)" + *: "Set inn %d spor (%s)" - *: "" + *: "Set inn spor" @@ -6434,7 +5885,7 @@ *: "Lagt %d spor i kø (%s)" - *: "" + *: "Lagt spor i kø" @@ -6448,7 +5899,7 @@ *: "Lagra %d spor (%s)" - *: "" + *: "Lagra spor" @@ -6493,20 +5944,6 @@ *: "Ingenting å halda fram med" - - id: LANG_PLAYLIST_CONTROL_UPDATE_ERROR - desc: Playlist error - user: core - - *: "Error updating playlist control file" - - - *: "Feil ved oppdatering av spelelistekontrollfil" - - - *: "Feil ved oppdatering av spelelistekontrollfil" - - id: LANG_PLAYLIST_ACCESS_ERROR desc: Playlist error @@ -6665,86 +6102,6 @@ radio: "Ferdigoppsettlista er full" - - id: LANG_BUTTONBAR_MENU - desc: in button bar - user: core - - *: none - radio_screen_button_bar: "Menu" - - - *: none - radio_screen_button_bar: "Meny" - - - *: none - - - - id: LANG_FM_BUTTONBAR_EXIT - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Exit" - - - *: none - radio_screen_button_bar: "Avslutt" - - - *: none - - - - id: LANG_FM_BUTTONBAR_ACTION - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Action" - - - *: none - radio_screen_button_bar: "Handling" - - - *: none - - - - id: LANG_FM_BUTTONBAR_ADD - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Add" - - - *: none - radio_screen_button_bar: "Legg til" - - - *: none - - - - id: LANG_FM_BUTTONBAR_RECORD - desc: in radio screen - user: core - - *: none - radio_screen_button_bar: "Record" - - - *: none - radio_screen_button_bar: "Ta opp" - - - *: none - - id: LANG_FM_MONO_MODE desc: in radio screen @@ -6776,6 +6133,7 @@ *: none + radio: "" @@ -6788,10 +6146,11 @@ *: none - radio: "Søk automatisk" + radio: "Søk automatisk i ferdigoppsett" *: none + radio: "Søk automatisk i ferdigoppsett" @@ -6825,6 +6184,7 @@ *: none + radio: "Søkjer" @@ -6841,6 +6201,7 @@ *: none + radio: "" @@ -6871,7 +6232,7 @@ *: "Mappebufferen er full" - *: "" + *: "Mappebufferen er full" @@ -6946,7 +6307,7 @@ id: LANG_OFF_ABORT - desc: Used on archosrecorder models + desc: Used on many models user: core *: "OFF to abort" @@ -6958,13 +6319,13 @@ iriverh100,iriverh120,iriverh300: "STOP to abort" - *: "OFF for å avbryte" - gigabeatfx: "POWER for å avbryte" - gigabeats,sansafuzeplus: "BACK for å avbryte" - iaudiom5,iaudiox5: "PLAY (langt trykk) for å avbryte" - ipod*: "PLAY/PAUSE for å avbryte" - iriverh10,iriverh10_5gb,sansac200*,sansae200*,vibe500: "PREV for å avbryte" - iriverh100,iriverh120,iriverh300: "STOP for å avbryte" + *: "OFF for å avbryta" + gigabeatfx: "POWER for å avbryta" + gigabeats,sansafuzeplus: "BACK for å avbryta" + iaudiom5,iaudiox5: "PLAY (langt trykk) for å avbryta" + ipod*: "PLAY/PAUSE for å avbryta" + iriverh10,iriverh10_5gb,sansac200*,sansae200*,vibe500: "PREV for å avbryta" + iriverh100,iriverh120,iriverh300: "STOP for å avbryta" *: "" @@ -7093,7 +6454,7 @@ *: "Klarte ikkje opna «%s»" - *: "" + *: "Klarte ikkje opna" @@ -7107,12 +6468,12 @@ *: "Klarte ikkje lesa «%s»" - *: "" + *: "Klarte ikkje lesa" id: LANG_PLUGIN_WRONG_MODEL - desc: The plugin is not compatible with the archos model trying to run it + desc: The plugin is not compatible with the player model trying to run it user: core *: "Incompatible model" @@ -7121,7 +6482,7 @@ *: "Inkompatibel modell" - *: "" + *: "Inkompatibel modell" @@ -7135,7 +6496,7 @@ *: "Inkompatibel versjon" - *: "" + *: "Inkompatibel versjon" @@ -7149,7 +6510,7 @@ *: "Programmet gav ei feilmelding" - *: "" + *: "Programmet gav ei feilmelding" @@ -7262,7 +6623,7 @@ *: "Direkteforsterking" - *: none + *: "Direkteforsterking" @@ -7276,7 +6637,7 @@ *: "Kryssforsterking" - *: none + *: "Kryssforsterking" @@ -7290,7 +6651,7 @@ *: "Høgfrekvensdemping" - *: none + *: "Høgfrekvensdemping" @@ -7304,7 +6665,7 @@ *: "Høgfrekvensgrense" - *: none + *: "Høgfrekvensgrense" @@ -7456,20 +6817,6 @@ recording: "Oppdelingsstorleik" - - id: LANG_CATALOG - desc: in onplay menu - user: core - - *: "Playlist Catalogue" - - - *: "Spelelistekatalog" - - - *: "Spelelistekatalog" - - id: LANG_SPLIT_MEASURE desc: in record timesplit options @@ -7518,20 +6865,6 @@ recording: "Oppdelingstid" - - id: LANG_CATALOG_ADD_TO - desc: in onplay playlist catalogue submenu - user: core - - *: "Add to Playlist" - - - *: "Legg til speleliste" - - - *: "Legg til speleliste" - - id: LANG_START_NEW_FILE desc: in record timesplit options @@ -7566,20 +6899,6 @@ recording: "Gjer dette ved oppdeling" - - id: LANG_CATALOG_VIEW - desc: in onplay playlist catalogue submenu - user: core - - *: "View Catalogue" - - - *: "Vis katalog" - - - *: "Vis katalog" - - id: LANG_CATALOG_NO_DIRECTORY desc: error message when playlist catalogue directory doesn't exist @@ -7591,7 +6910,7 @@ *: "«%s» finst ikkje" - *: "" + *: "finst ikkje" @@ -7608,40 +6927,6 @@ *: "Ingen spelelister" - - id: LANG_SYSFONT_CHANNEL_STEREO - desc: in sound_settings - user: core - - *: none - recording: "Stereo" - - - *: none - recording: "Stereo" - - - *: none - recording: "Stereo" - - - - id: LANG_SYSFONT_CHANNEL_MONO - desc: in sound_settings - user: core - - *: none - recording: "Mono" - - - *: none - recording: "Mono" - - - *: none - recording: "Mono" - - id: LANG_SYSFONT_EQUALIZER_EDIT_MODE desc: in the equalizer settings menu @@ -7650,7 +6935,7 @@ *: "Edit mode: %s %s" - *: "Redigeringsmodus: %s" + *: "Redigeringsmodus: %s %s" *: "" @@ -7670,170 +6955,18 @@ *: "Frekvensgrense" - - id: LANG_SYSFONT_RECORDING_QUALITY - desc: in the recording settings - user: core - - *: none - recording_hwcodec: "Quality" - - - *: none - recording_hwcodec: "Kvalitet" - - - *: none - recording_hwcodec: "Kvalitet" - - - - id: LANG_SYSFONT_RECORDING_FREQUENCY - desc: in the recording settings - user: core - - *: none - recording: "Frequency" - - - *: none - recording: "Frekvens" - - - *: none - recording: "Frekvens" - - - - id: LANG_SYSFONT_RECORDING_SOURCE - desc: in the recording settings - user: core - - *: none - recording: "Source" - - - *: none - recording: "Kjelde" - - - *: none - recording: "Kjelde" - - - - id: LANG_SYSFONT_RECORDING_SRC_MIC - desc: in the recording settings - user: core - - *: none - recording: "Int. Mic" - - - *: none - recording: "Intern mikrofon" - - - *: none - - - - id: LANG_SYSFONT_RECORDING_SRC_DIGITAL - desc: in the recording settings - user: core - - *: none - recording: "Digital" - - - *: none - recording: "Digital" - - - *: none - recording: "Digital" - - - - id: LANG_SYSFONT_RECORD_TRIGGER - desc: in recording settings_menu - user: core - - *: none - recording: "Trigger" - - - *: none - recording: "Utløysar" - - - *: none - recording: "Utløysar" - - - - id: LANG_SYSFONT_DIRBROWSE_F1 - desc: in dir browser, F1 button bar text - user: core - - *: none - recorder_pad: "Menu" - - - *: none - recorder_pad: "Meny" - - - *: none - - - - id: LANG_SYSFONT_DIRBROWSE_F2 - desc: in dir browser, F2 button bar text - user: core - - *: none - recorder_pad: "Option" - - - *: none - recorder_pad: "Val" - - - *: none - - - - id: LANG_SYSFONT_DIRBROWSE_F3 - desc: in dir browser, F3 button bar text - user: core - - *: none - recorder_pad: "LCD" - - - *: none - recorder_pad: "LCD" - - - *: none - - id: LANG_NEVER desc: in lcd settings user: core - *: none - lcd_sleep: "Never" + *: "Never" - *: none - lcd_sleep: "Aldri" + *: "Aldri" - *: none - lcd_sleep: "Aldri" + *: "Aldri" @@ -7846,10 +6979,11 @@ *: none - agc: "DJ-Set (slow)" + agc: "DJ-sett (sein)" *: none + agc: "D J sett sein" @@ -7862,10 +6996,11 @@ *: none - lcd_sleep: "Sov (etter at lyset er av)" + lcd_sleep: "Dvale (etter at lyset er av)" *: none + lcd_sleep: "Dvale etter at lyset er av" @@ -7929,11 +7064,11 @@ *: none - remote: "(Vol- : Re-enable)" + remote: "(Vol- : Skru på att)" *: none - remote: "(Vol- : Re-enable)" + remote: "Volum skru på att" @@ -7978,10 +7113,10 @@ *: "Loading... %d%% done (%s)" - *: "Lastar … %d% % fullført (%s)" + *: "Loading... %d%% done (%s)" - *: "" + *: "Lastar vent ferdig" @@ -8017,15 +7152,16 @@ desc: in lcd settings user: core - *: none + *: "Backlight on Lock" hold_button: "Backlight on Hold" - *: none + *: "Skjermlys med låseknappen" hold_button: "Lys (med «Hold»-knappen)" - *: none + *: "Skjermlys med låseknappen" + hold_button: "Skjermlys med hold-knappen" @@ -8069,11 +7205,11 @@ *: none - radio: "Korea" + radio: "~Korea" *: none - radio: "Korea" + radio: "~Korea" @@ -8090,6 +7226,7 @@ *: none + radio: "U S A og Kanada" @@ -8119,11 +7256,11 @@ *: none - radio: "Japan" + radio: "~Japan" *: none - radio: "Japan" + radio: "~Japan" @@ -8184,10 +7321,11 @@ *: none - usb_charging_enable: "Lad batteri ved USB-samband" + usb_charging_enable: "Lad batteriet ved USB-samband" *: none + usb_charging_enable: "Lad batteriet ved U S B samband" @@ -8204,6 +7342,7 @@ *: none + recording: "same som kjelda" @@ -8245,10 +7384,10 @@ *: "Format" - *: "Format" + *: "~Format" - *: "Format" + *: "~Format" @@ -8278,11 +7417,11 @@ *: none - recording: "Bitrate" + recording: "~Bitrate" *: none - recording: "Bitrate" + recording: "~Bitrate" @@ -8375,20 +7514,7 @@ *: none - - - - id: LANG_REPLACE - desc: in onplay menu. Replace the current playlist with a new one. - user: core - - *: "Play Next" - - - *: "Spel neste" - - - *: "Spel neste" + recording: "Ingen innstillingar" @@ -8466,16 +7592,16 @@ id: LANG_DITHERING - desc: in the sound settings menu + desc: in the sound settings and some other menus user: core *: "Dithering" - *: "Dithering" + *: "Utjamning" - *: "Dithering" + *: "Utjamning" @@ -8539,16 +7665,16 @@ id: LANG_AUDIOSCROBBLER - desc: "Last.fm Log" in the playback menu + desc: "Last.fm Logger" in Plugin/apps/scrobbler user: core - *: "Last.fm Log" + *: "Last.fm Logger" *: "Last.fm-logg" - *: "Last.fm-logg" + *: "Last F M logg" @@ -8565,6 +7691,7 @@ *: none + recording: "Starttype" @@ -8784,23 +7911,6 @@ *: "einingar per tikk" - - id: LANG_SYSFONT_LINE_IN - desc: in the recording settings - user: core - - *: none - recording: "Line In" - - - *: none - recording: "Linje inn" - - - *: none - recording: "Linje inn" - - id: LANG_SCANNING_DISK desc: when booting up and rebuilding the cache and calculating free space @@ -8973,14 +8083,12 @@ user: core *: "Buffer:" - archosplayer: "Buf:" - *: "Buffer:" - archosplayer: "Buf:" + *: "~Buffer:" - *: "" + *: "Buffer" @@ -9037,17 +8145,16 @@ user: core *: "PLAY = Yes" - archosplayer: "(PLAY/STOP)" cowond2*: "MENU, or top-right = 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" *: "PLAY = ja" - archosplayer: "(PLAY/STOP)" cowond2*: "MENU eller topp høgre = ja" + creativezen*: "SELECT = ja" gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = ja" iriverh100,iriverh120,iriverh300: "NAVI = ja" mrobe500: "PLAY, POWER eller topp høgre = ja" @@ -9064,8 +8171,8 @@ *: none rtc: "ON = Set" + aigoerosq,erosqnative,gogearsa9200,samsungyh*,xduoox3*: "PLAY = Set" gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = Set" - gogearsa9200,samsungyh*: "PLAY = Set" iriverh100,iriverh120,iriverh300: "NAVI = Set" mpiohd300: "ENTER = Set" mrobe500: "HEART = Set" @@ -9073,13 +8180,14 @@ *: none - rtc: "PÅ = velg" - gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = velg" - gogearsa9200,samsungyh*: "PLAY = velg" - iriverh100,iriverh120,iriverh300: "NAVI = velg" - mpiohd300: "ENTER = velg" - mrobe500: "HEART = velg" - vibe500: "OK = velg" + rtc: "PÅ = vel" + aigoerosq,erosqnative,xduoox3*: "PLAY = vel" + gogearsa9200,samsungyh*: "PLAY = vel" + gigabeat*,iaudiom5,iaudiox5,ipod*,iriverh10,iriverh10_5gb,mrobe100,sansac200*,sansaclip*,sansaconnect,sansae200*,sansafuze*: "SELECT = vel" + iriverh100,iriverh120,iriverh300: "NAVI = vel" + mpiohd300: "ENTER = vel" + mrobe500: "HEART = vel" + vibe500: "OK = vel" *: none @@ -9091,15 +8199,12 @@ user: core *: "Any Other = No" - archosplayer: none *: "Andre = nei" - archosplayer: none *: "" - archosplayer: none @@ -9223,29 +8328,12 @@ user: core *: "End of Song List" - archosplayer: "End of List" *: "Slutt på songliste" - archosplayer: "Slutt på liste" *: "Slutt på songliste" - archosplayer: "Slutt på liste" - - - - id: LANG_SYSFONT_GAIN - desc: in the equalizer settings menu - user: core - - *: "Gain" - - - *: "Forsterking" - - - *: "Forsterking" @@ -9293,20 +8381,6 @@ *: "P M" - - id: LANG_SYSFONT_MODE - desc: in wps F2 pressed - user: core - - *: "Mode:" - - - *: "Modus:" - - - *: "" - - id: LANG_MIN_DURATION desc: in recording settings_menu @@ -9363,7 +8437,7 @@ *: "Modus:" - *: "Modus:" + *: "Modus" @@ -9414,23 +8488,6 @@ *: "Arbeid" - - id: LANG_HEADPHONE_UNPLUG_RW - desc: in pause_phones_menu. - user: core - - *: none - headphone_detection: "Duration to Rewind" - - - *: none - headphone_detection: "Kor lenge å spola tilbake" - - - *: none - headphone_detection: "Kor lenge å spola tilbake" - - id: LANG_PITCH_UP_SEMITONE desc: in wps @@ -9521,20 +8578,6 @@ *: "Ikkje hald fram" - - id: LANG_BOOKMARK_CONTEXT_DELETE - desc: bookmark context menu, delete this bookmark - user: core - - *: "Delete" - - - *: "Slett" - - - *: "Slett" - - id: VOICE_OCLOCK desc: spoken only, for wall clock announce @@ -9546,7 +8589,7 @@ *: "" - *: "" + *: "o'clock" @@ -9633,7 +8676,7 @@ *: "" - *: "cuesheet" + *: "cue ark" @@ -9664,26 +8707,9 @@ *: "Ugyldig bokmerke" - - id: LANG_SYSFONT_CHANNELS - desc: in the recording settings - user: core - - *: none - recording: "Channels" - - - *: none - recording: "Kanalar" - - - *: none - recording: "Kanalar" - - id: LANG_PLAYLISTS - desc: in the main menu and file view setting + desc: in the main menu and Playlist settings menu user: core *: "Playlists" @@ -9807,23 +8833,6 @@ *: "Kopierer" - - id: LANG_SET_AS_REC_DIR - desc: used in the onplay menu to set a recording dir - user: core - - *: none - recording: "Set as Recording Directory" - - - *: none - recording: "Bruk som opptaksmappe" - - - *: none - recording: "Bruk som opptaksmappe" - - id: LANG_REMOTE_WHILE_PLAYING desc: in settings_menu() @@ -9834,10 +8843,11 @@ *: none - remote: "Browse .rwps files" + remote: "Speleskjerm på fjern eining" *: none + remote: "Speleskjerm på fjern eining" @@ -10428,7 +9438,7 @@ *: none - agc: "AGC" + agc: "Automatisk lydforsterking" *: none @@ -10539,3 +9549,7432 @@ *: "Filstorleik" + + id: LANG_CHANNEL_LEFTRIGHT + desc: in sound_settings + user: core + + *: none + recording: "Mono Left + Right" + + + *: none + recording: "Mono venstre + høgre" + + + *: none + recording: "Mono venstre pluss høgre" + + + + id: LANG_RESET_EQUALIZER + desc: in the equalizer settings menu + user: core + + *: "Reset EQ" + + + *: "Nullstill EQ" + + + *: "Nullstill E Q" + + + + id: LANG_SINGLE_MODE + desc: single mode + user: core + + *: "Single Mode" + + + *: "Singelmodus" + + + *: "Singelmodus" + + + + id: LANG_DISPLAY_TITLEALBUM_FROMTAGS + desc: track display options + user: core + + *: "Title & Album from ID3 tags" + + + *: "Tittel og album frå ID3-merkelappar" + + + *: "Tittel og album frå I D 3" + + + + id: LANG_DISPLAY_TITLE_FROMTAGS + desc: track display options + user: core + + *: "Title from ID3 tags" + + + *: "Tittel frå ID3-merkelappar" + + + *: "Tittel frå I D 3" + + + + id: LANG_RANDOM_SHUFFLE_RANDOM_SELECTIVE_SONGS_SUMMARY + desc: a summary splash screen that appear on the database browser when you try to create a playlist from the database browser that exceeds your system limit + user: core + + *: "Selection too big, %d random tracks will be selected" + + + *: "For stort utval, det blir valt %d tilfeldige spor" + + + *: "For stort utval, færre tilfeldige spor blir valde" + + + + id: LANG_DISPLAY_SPECIAL_CHARACTER + desc: Special character (japanese, accents, etc) + user: core + + *: "Special character" + + + *: "Spesialteikn" + + + *: "Spesialteikn" + + + + id: LANG_ID3_ALBUMARTISTS + desc: in tag viewer + user: core + + *: "Album Artists" + + + *: "Albumartistar" + + + *: "Albumartistar" + + + + id: LANG_ADD_CURRENT_TO_FAVES + desc: + user: core + + *: "Add Current to Shortcuts" + + + *: "Legg til denne i snarvegar" + + + *: "Legg til denne i snarvegar" + + + + id: LANG_TALK_MIXER_LEVEL + desc: Relative volume of voice prompts + user: core + + *: "Voice Prompt Volume" + + + *: "Stemmevolum" + + + *: "Stemmevolum" + + + + id: LANG_DEADZONE + desc: touchpad deadzone setting + user: core + + *: none + sansafuzeplus: "Touchpad Dead Zone" + + + *: none + sansafuzeplus: "Daudsone for styrefelt" + + + *: none + sansafuzeplus: "Daudsone for styrefelt" + + + + id: LANG_SERIAL_BITRATE + desc: in system settings menu + user: core + + *: none + serial_port: "Serial Bitrate" + + + *: none + serial_port: "Seriell bitrate" + + + *: none + serial_port: "Seriell bitrate" + + + + id: LANG_SERIAL_BITRATE_AUTO + desc: in system settings menu + user: core + + *: none + serial_port: "Auto" + + + *: none + serial_port: "~Auto" + + + *: none + serial_port: "~Auto" + + + + id: LANG_SERIAL_BITRATE_9600 + desc: in system settings menu + user: core + + *: none + serial_port: "9600" + + + *: none + serial_port: "~9600" + + + *: none + serial_port: "~9600" + + + + id: LANG_SERIAL_BITRATE_19200 + desc: in system settings menu + user: core + + *: none + serial_port: "19200" + + + *: none + serial_port: "~19200" + + + *: none + serial_port: "~19200" + + + + id: LANG_SERIAL_BITRATE_38400 + desc: in system settings menu + user: core + + *: none + serial_port: "38400" + + + *: none + serial_port: "~38400" + + + *: none + serial_port: "~38400" + + + + id: LANG_SERIAL_BITRATE_57600 + desc: in system settings menu + user: core + + *: none + serial_port: "57600" + + + *: none + serial_port: "~57600" + + + *: none + serial_port: "~57600" + + + + id: LANG_RECORDING_MONO_MODE + desc: in the recording settings + user: core + + *: none + recording: "Mono mode" + + + *: none + recording: "Monomodus" + + + *: none + recording: "Monomodus" + + + + id: LANG_SEARCH_RESULTS + desc: title for the list of results displayed after searching in a playlist + user: core + + *: "Search Results" + + + *: "Søkjeresultat" + + + *: "Søkjeresultat" + + + + id: LANG_LEFT + desc: Generic use of 'left' + user: core + + *: "Left" + + + *: "Venstre" + + + *: "Venstre" + + + + id: LANG_RIGHT + desc: Generic use of 'right' + user: core + + *: "Right" + + + *: "Høgre" + + + *: "Høgre" + + + + id: LANG_RESET_SETTING + desc: used in the settings context menu + user: core + + *: "Reset Setting" + + + *: "Nullstill" + + + *: "Nullstill" + + + + id: LANG_LEFT_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Left Quickscreen Item" + + + *: none + quickscreen: "Bruk som venstre snøggskjermelement" + + + *: none + quickscreen: "Bruk som venstre snøggskjermelement" + + + + id: LANG_RIGHT_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Right Quickscreen Item" + + + *: none + quickscreen: "Bruk som høgre snøggskjermelement" + + + *: none + quickscreen: "Bruk som høgre snøggskjermelement" + + + + id: LANG_BOTTOM_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Bottom Quickscreen Item" + + + *: none + quickscreen: "Bruk som nedre snøggskjermelement" + + + *: none + quickscreen: "Bruk som nedre snøggskjermelement" + + + + id: LANG_CREDITS + desc: in the Main Menu -> System screen + user: core + + *: "Credits" + + + *: "Bidragsytarar" + + + *: "Bidragsytarar" + + + + id: LANG_SORT_INTERPRET_NUMBERS + desc: in Settings -> File view + user: core + + *: "Interpret numbers when sorting" + + + *: "Ved sortering, tolk tal som" + + + *: "Ved sortering tolk tal som" + + + + id: LANG_SORT_INTERPRET_AS_DIGIT + desc: in Settings -> File view + user: core + + *: "As digits" + + + *: "Siffer" + + + *: "Siffer" + + + + id: LANG_SORT_INTERPRET_AS_NUMBERS + desc: in Settings -> File view + user: core + + *: "As whole numbers" + + + *: "Heiltal" + + + *: "Heiltal" + + + + id: LANG_ENABLE_SPEAKER + desc: in Settings -> Sound Settings + user: core + + *: none + speaker: "Enable Speaker" + + + *: none + speaker: "Skru på høgtalar" + + + *: none + speaker: "Skru på høgtalar" + + + + id: LANG_TOUCHSCREEN_MODE + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Touchscreen Mode" + + + *: none + touchscreen: "Peikeskjermmodus" + + + *: none + touchscreen: "Peikeskjermmodus" + + + + id: LANG_TOUCHSCREEN_GRID + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "3x3 Grid" + + + *: none + touchscreen: "3x3-gitter" + + + *: none + touchscreen: "3 gonger 3 gitter" + + + + id: LANG_TOUCHSCREEN_POINT + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Absolute Point" + + + *: none + touchscreen: "Absolutt punkt" + + + *: none + touchscreen: "Absolutt punkt" + + + + id: LANG_PREVENT_SKIPPING + desc: in Settings -> Playback Settings + user: core + + *: "Prevent Track Skipping" + + + *: "Hindra sporhopping" + + + *: "Hindra sporhopping" + + + + id: LANG_TIMESTRETCH + desc: timestretch enable + user: core + + *: "Timestretch" + + + *: "Strekk tid" + + + *: "Strekk tid" + + + + id: LANG_SPEED + desc: timestretch speed + user: core + + *: "Speed" + + + *: "Fart" + + + *: "Fart" + + + + id: LANG_TOUCHSCREEN_SETTINGS + desc: in Settings -> General -> Display menu + user: core + + *: none + touchscreen: "Touchscreen Settings" + + + *: none + touchscreen: "Peikeskjerminnstillingar" + + + *: none + touchscreen: "Peikeskjerminnstillingar" + + + + id: LANG_TOUCHSCREEN_CALIBRATE + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Calibrate" + + + *: none + touchscreen: "Kalibrer" + + + *: none + touchscreen: "Kalibrer" + + + + id: LANG_TOUCHSCREEN_RESET_CALIBRATION + desc: in Settings -> General -> Display -> Touchscreen Settings + user: core + + *: none + touchscreen: "Reset Calibration" + + + *: none + touchscreen: "Nullstill kailbrering" + + + *: none + touchscreen: "Nullstill kalibrering" + + + + id: LANG_STATUSBAR_TOP + desc: in Settings -> General -> Display -> statusbar + user: core + + *: "Top" + + + *: "Toppen" + + + *: "Toppen" + + + + id: LANG_STATUSBAR_BOTTOM + desc: in Settings -> General -> Display -> statusbar + user: core + + *: "Bottom" + + + *: "Botnen" + + + *: "Botnen" + + + + id: LANG_REMOTE_STATUSBAR + desc: in Settings -> General -> Display -> statusbar + user: core + + *: none + remote: "Remote Statusbar" + + + *: none + remote: "Fjernstatusfelt" + + + *: none + remote: "Fjernstatusfelt" + + + + id: LANG_SEMITONE + desc: + user: core + + *: none + pitchscreen: "Semitone" + + + *: none + pitchscreen: "Halvtone" + + + *: none + pitchscreen: "Halvtone" + + + + id: LANG_STRETCH_LIMIT + desc: "limit" in pitch screen + user: core + + *: none + pitchscreen: "Limit" + + + *: none + pitchscreen: "Grense" + + + *: none + pitchscreen: "Grense" + + + + id: LANG_PLAYBACK_RATE + desc: "rate" in pitch screen + user: core + + *: none + pitchscreen: "Rate" + + + *: none + pitchscreen: "~Rate" + + + *: none + pitchscreen: "~Rate" + + + + id: LANG_USB_KEYPAD_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "USB Keypad Mode" + + + *: none + usb_hid: "USB-tastaturmodus" + + + *: none + usb_hid: "U S B tastaturmodus" + + + + id: LANG_MULTIMEDIA_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Multimedia" + + + *: none + usb_hid: "~Multimedia" + + + *: none + usb_hid: "~Multimedia" + + + + id: LANG_PRESENTATION_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Presentation" + + + *: none + usb_hid: "Presentasjon" + + + *: none + usb_hid: "Presentasjon" + + + + id: LANG_BROWSER_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Browser" + + + *: none + usb_hid: "Lesar" + + + *: none + usb_hid: "Lesar" + + + + id: LANG_MOUSE_MODE + desc: in settings_menu + user: core + + *: none + usb_hid: "Mouse" + + + *: none + usb_hid: "Mus" + + + *: none + usb_hid: "Mus" + + + + id: LANG_USB_DAC + desc: in settings_menu + user: core + + *: none + usbdac: "USB-DAC" + + + *: none + usbdac: "~USB-DAC" + + + *: none + usbdac: "U S B digital lydomformar" + + + + id: LANG_WHILE_USB_CHARGE_ONLY + desc: in settings_menu + user: core + + *: none + usbdac: "While In USB Charge-Only Mode" + + + *: none + usbdac: "While In USB Charge-Only Mode" + + + *: none + usbdac: "While In USB Charge-Only Mode" + + + + id: LANG_WHILE_MASS_STORAGE_USB_ONLY + desc: in settings_menu + user: core + + *: none + usbdac: "While In USB Mass-Storage Mode" + + + *: none + usbdac: "Når USB-masselagringsmodus er i bruk" + + + *: none + usbdac: "Når U S B masselagringsmodus er i bruk" + + + + id: LANG_USB_DAC_ACTIVE + desc: for splash + user: core + + *: none + usbdac: "USB-DAC Active" + + + *: none + usbdac: "USB-DAC aktiv" + + + *: none + usbdac: "U S B digital lydomformar aktiv" + + + + id: LANG_SCROLLBAR_WIDTH + desc: in Settings -> General -> Display -> Status-/Scrollbar + user: core + + *: "Scroll Bar Width" + + + *: "Breidd på rullefeltet" + + + *: "Breidd på rullefeltet" + + + + id: LANG_COMPRESSOR + desc: in sound settings + user: core + + *: "Compressor" + + + *: "Kompressor" + + + *: "Kompressor" + + + + id: LANG_TOP_QS_ITEM + desc: used for the submenu name for the quickscreen items + user: core + + *: none + quickscreen: "Set as Top Quickscreen Item" + + + *: none + quickscreen: "Bruk som øvre snøggskjermelement" + + + *: none + quickscreen: "Bruk som øvre snøggskjermelement" + + + + id: LANG_FM_ITALY + desc: fm region Italy + user: core + + *: none + radio: "Italy" + + + *: none + radio: "Italia" + + + *: none + radio: "Italia" + + + + id: LANG_FM_OTHER + desc: Catch-all FM region. Select if none of the others work + user: core + + *: none + radio: "Other" + + + *: none + radio: "Andre" + + + *: none + radio: "Andre" + + + + id: LANG_COMPRESSOR_THRESHOLD + desc: in sound settings + user: core + + *: "Threshold" + + + *: "Terskel" + + + *: "Terskel" + + + + id: LANG_COMPRESSOR_RATIO + desc: in sound settings + user: core + + *: "Ratio" + + + *: "Rate" + + + *: "Rate" + + + + id: LANG_COMPRESSOR_RATIO_2 + desc: in sound settings + user: core + + *: "2:1" + + + *: "~2:1" + + + *: "2 til 1" + + + + id: LANG_COMPRESSOR_RATIO_4 + desc: in sound settings + user: core + + *: "4:1" + + + *: "~4:1" + + + *: "4 til 1" + + + + id: LANG_COMPRESSOR_RATIO_6 + desc: in sound settings + user: core + + *: "6:1" + + + *: "~6:1" + + + *: "6 til 1" + + + + id: LANG_COMPRESSOR_RATIO_10 + desc: in sound settings + user: core + + *: "10:1" + + + *: "~10:1" + + + *: "10 til 1" + + + + id: LANG_COMPRESSOR_RATIO_LIMIT + desc: in sound settings + user: core + + *: "Limit" + + + *: "Avgrens" + + + *: "Avgrens" + + + + id: LANG_COMPRESSOR_GAIN + desc: in sound settings + user: core + + *: "Makeup Gain" + + + *: "Kompensasjonsvolum" + + + *: "Kompensasjonsvolum" + + + + id: LANG_AUTO + desc: in sound settings + user: core + + *: "Auto" + + + *: "~Auto" + + + *: "~Auto" + + + + id: LANG_COMPRESSOR_KNEE + desc: in sound settings + user: core + + *: "Knee" + + + *: "Kne" + + + *: "Kne" + + + + id: LANG_COMPRESSOR_HARD_KNEE + desc: in sound settings + user: core + + *: "Hard Knee" + + + *: "Hardt kne" + + + *: "Hardt kne" + + + + id: LANG_COMPRESSOR_SOFT_KNEE + desc: in sound settings + user: core + + *: "Soft Knee" + + + *: "Mjukt kne" + + + *: "Mjukt kne" + + + + id: LANG_COMPRESSOR_ATTACK + desc: in sound settings + user: core + + *: "Attack Time" + + + *: "Starttid" + + + *: "Starttid" + + + + id: LANG_COMPRESSOR_RELEASE + desc: in sound settings + user: core + + *: "Release Time" + + + *: "Slepptid" + + + *: "Slepptid" + + + + id: LANG_SKIP_OUTRO + desc: skipping to the 5 seconds before the end of a track + user: core + + *: "Skip to Outro" + + + *: "Hopp til avslutninga" + + + *: "Hopp til avslutninga" + + + + id: VOICE_EXT_SBS + desc: spoken only, for file extension + user: core + + *: "" + + + *: "" + + + *: "statusfelt-drakt" + + + + id: VOICE_EXT_RSBS + desc: spoken only, for file extension + user: core + + *: none + remote: "" + + + *: none + remote: "" + + + *: none + remote: "fjern statusfelt-drakt" + + + + id: LANG_USB_HID + desc: in settings_menu + user: core + + *: none + usb_hid: "USB HID" + + + *: none + usb_hid: "~USB HID" + + + *: none + usb_hid: "USB grensesnitteining" + + + + id: LANG_QUEUE_LAST_SHUFFLED + desc: in onplay menu. queue a playlist randomly at end of dynamic playlist + user: core + + *: "Queue Last Shuffled" + + + *: "Set siste tilfeldige i kø" + + + *: "Set siste tilfeldige i kø" + + + + id: LANG_MORSE_INPUT + desc: in Settings -> System + user: core + + *: none + morse_input: "Use Morse Code Input" + + + *: none + morse_input: "Bruk morse-innputt" + + + *: none + morse_input: "Bruk morse-innputt" + + + + id: LANG_AUTOTRACKSKIP + desc: in crossfade settings + user: core + + *: none + crossfade: "Automatic Track Change Only" + + + *: none + crossfade: "Berre automatisk sporbyte" + + + *: none + crossfade: "Berre automatisk sporbyte" + + + + id: LANG_NEXT_TRACK + desc: Shown in WPS + user: core + + *: "Next Track:" + + + *: "Neste spor:" + + + *: "Neste spor" + + + + id: LANG_NEXT + desc: Shown in WPS (short form of Next Track) + user: core + + *: "Next:" + + + *: "Neste:" + + + *: "Neste" + + + + id: LANG_OF + desc: Shown in WPS: X of Y (tracks) + user: core + + *: "of" + + + *: "av" + + + *: "av" + + + + id: LANG_DISC + desc: Shown in WPS (for multidisc albums) + user: core + + *: "Disc" + + + *: "Disk" + + + *: "Disk" + + + + id: LANG_BASE_SKIN + desc: browse for the base skin in theme settings + user: core + + *: "Base Skin" + + + *: "Grunndrakt" + + + *: "Grunndrakt" + + + + id: LANG_REMOTE_BASE_SKIN + desc: browse for the base skin in theme settings + user: core + + *: "Remote Base Skin" + + + *: "Fjern grunndrakt" + + + *: "Fjern grunndrakt" + + + + id: LANG_MAIN_SCREEN + desc: in the main menu + user: core + + *: none + remote: "Main Screen" + + + *: none + remote: "Hovudskjerm" + + + *: none + remote: "Hovudskjerm" + + + + id: LANG_REMOTE_SCREEN + desc: in the main menu + user: core + + *: none + remote: "Remote Screen" + + + *: none + remote: "Fjernskjerm" + + + *: none + remote: "Fjernskjerm" + + + + id: LANG_HISTOGRAM_INTERVAL + desc: in record settings menu + user: core + + *: none + histogram: "Histogram interval" + + + *: none + histogram: "Histogramintervall" + + + *: none + histogram: "Histogramintervall" + + + + id: LANG_HOTKEY + desc: hotkey menu + user: core + + *: none + hotkey: "Hotkey" + + + *: none + hotkey: "Snøggtast" + + + *: none + hotkey: "Snøggtast" + + + + id: LANG_HOTKEY_WPS + desc: hotkey menu + user: core + + *: none + hotkey: "WPS Hotkey" + + + *: none + hotkey: "Speleskjerm-snøggtast" + + + *: none + hotkey: "Speleskjermsnøggtast" + + + + id: LANG_HOTKEY_FILE_BROWSER + desc: hotkey menu + user: core + + *: none + hotkey: "File Browser Hotkey" + + + *: none + hotkey: "Filhandterar-snøggtast" + + + *: none + hotkey: "Filhandterarsnøggtast" + + + + id: LANG_RESUME_REWIND + desc: in playback settings menu + user: core + + *: "Rewind Before Resume" + + + *: "Spol tilbake før vidarespeling" + + + *: "Spol tilbake før vidarespeling" + + + + id: LANG_REMOTE_RADIOSCREEN + desc: in the theme menu + user: core + + *: none + radio_remote: "Remote Radio Screen" + + + *: none + radio_remote: "Fjernradioskjerm" + + + *: none + radio_remote: "Fjernradioskjerm" + + + + id: VOICE_EXT_FMS + desc: spoken only, for file extension + user: core + + *: none + radio: "" + + + *: none + radio: "" + + + *: none + radio: "radioskjermdrakt" + + + + id: VOICE_EXT_RFMS + desc: spoken only, for file extension + user: core + + *: none + radio_remote: "" + + + *: none + radio_remote: "" + + + *: none + radio_remote: "drakt for fjernradioskjerm" + + + + id: LANG_FM_STATION_HEADER + desc: in radio screen + user: core + + *: none + radio: "Station:" + + + *: none + radio: "Stasjon:" + + + *: none + radio: "" + + + + id: LANG_HW_EQ_TONE_CONTROLS + desc: in sound_menu, hardware equalizer tone controls + user: core + + *: none + gigabeats,samsungypr1: "Tone Controls" + + + *: none + gigabeats,samsungypr1: "Tonekontrollar" + + + *: none + gigabeats,samsungypr1: "Tonekontrollar" + + + + id: LANG_HW_EQ_TONE_CONTROLS_ADVANCED + desc: in sound_menu, advanced settings for hardware equalizer tone controls + user: core + + *: none + gigabeats,samsungypr1: "Advanced Tone Control Settings" + + + *: none + gigabeats,samsungypr1: "Avanserte tonekontrollar" + + + *: none + gigabeats,samsungypr1: "Avanserte tonekontrollar" + + + + id: LANG_HW_EQ_GAIN + desc: in sound_menu, hardware equalizer tone controls filter gain + user: core + + *: none + gigabeats,samsungypr1: "Band %d Gain" + + + *: none + gigabeats,samsungypr1: "Band %d volum" + + + *: none + gigabeats,samsungypr1: "Bandvolum" + + + + id: LANG_HW_EQ_FREQUENCY + desc: in sound_menu, hardware equalizer tone controls shelf filter cutoff frequency + user: core + + *: none + gigabeats,samsungypr1: "Band %d Frequency" + + + *: none + gigabeats,samsungypr1: "Band %d frekvens" + + + *: none + gigabeats,samsungypr1: "Bandfrekvens" + + + + id: LANG_HW_EQ_WIDTH + desc: in sound_menu, hardware equalizer tone controls peak bandwith setting + user: core + + *: none + gigabeats,samsungypr1: "Band %d Width" + + + *: none + gigabeats,samsungypr1: "Band %d breidd" + + + *: none + gigabeats,samsungypr1: "Bandbreidd" + + + + id: LANG_HW_EQ_WIDTH_NARROW + desc: in sound_menu, hardware equalizer tone controls narrow bandwith setting + user: core + + *: none + gigabeats,samsungypr1: "Narrow" + + + *: none + gigabeats,samsungypr1: "Smal" + + + *: none + gigabeats,samsungypr1: "Smal" + + + + id: LANG_HW_EQ_WIDTH_WIDE + desc: in sound_menu, hardware equalizer tone controls wide bandwidth setting + user: core + + *: none + gigabeats,samsungypr1: "Wide" + + + *: none + gigabeats,samsungypr1: "Brei" + + + *: none + gigabeats,samsungypr1: "Brei" + + + + id: LANG_DEPTH_3D + desc: in sound_menu, amount of 3D enhancement effect + user: core + + *: none + depth_3d: "3-D Enhancement" + + + *: none + depth_3d: "3D-utviding" + + + *: none + depth_3d: "3 D utviding" + + + + id: LANG_TAGNAVI_UNTAGGED + desc: "[untagged]" entry in tag browser + user: core + + *: "[Untagged]" + + + *: "[Umerka]" + + + *: "Umerka" + + + + id: LANG_RADIOSCREEN + desc: in the theme menu + user: core + + *: none + radio: "Radio Screen" + + + *: none + radio: "Radioskjerm" + + + *: none + radio: "Radioskjerm" + + + + id: LANG_ID3_COMPOSER + desc: in tag viewer + user: core + + *: "Composer" + + + *: "Komponist" + + + *: "Komponist" + + + + id: LANG_FORCE + desc: alternative to yes/no for tristate settings + user: core + + *: "Force" + + + *: "Tving" + + + *: "Tving" + + + + id: LANG_ONPLAY_PICTUREFLOW + desc: Onplay pictureflow + user: core + + *: "PictureFlow" + + + *: "Biletflyt" + + + *: "Opna biletflyt" + + + + id: LANG_KBD_OK + desc: in keyboard + user: core + + *: none + touchscreen: "OK" + + + *: none + touchscreen: "~OK" + + + *: none + touchscreen: "~OK" + + + + id: LANG_KBD_DELETE + desc: in keyboard + user: core + + *: none + touchscreen: "Del" + + + *: none + touchscreen: "~Del" + + + *: none + touchscreen: "~Del" + + + + id: LANG_KBD_CANCEL + desc: in keyboard + user: core + + *: none + touchscreen: "Cancel" + + + *: none + touchscreen: "Avbryt" + + + *: none + touchscreen: "Avbryt" + + + + id: LANG_BOOKMARK_SETTINGS_AUTOUPDATE + desc: prompt for user to decide whether to update bookmarks + user: core + + *: "Update on Stop" + + + *: "Oppdater ved stopp" + + + *: "Oppdater ved stopp" + + + + id: LANG_RESET_START_DIR + desc: reset the browser start directory + user: core + + *: "Start File Browser at /" + + + *: "Start fillesaren på /" + + + *: "Start fillesaren i rotmappa" + + + + id: LANG_FM_RSSI + desc: Signal strength of a received FM station + user: core + + *: none + radio: "Signal strength:" + + + *: none + radio: "Signalstyrke:" + + + *: none + radio: "Signalstyrke" + + + + id: LANG_AUTORESUME + desc: resume settings menu + user: core + + *: "Automatic Resume" + + + *: "Automatisk framhald" + + + *: "Automatisk framhald" + + + + id: LANG_AUTORESUME_AUTOMATIC + desc: resume on automatic track change + user: core + + *: "Resume on automatic track change" + + + *: "Hald fram automatisk ved sporbyte" + + + *: "Hald fram automatisk ved sporbyte" + + + + id: LANG_AUTORESUME_CUSTOM + desc: enable customization of resume on automatic track change + user: core + + *: "In custom directories only" + + + *: "Berre i eigne mapper" + + + *: "Berre i eigne mapper" + + + + id: LANG_PAUSE_REWIND + desc: Seconds to rewind when rewind on pause is enabled. + user: core + + *: "Rewind on Pause" + + + *: "Spol tilbake ved pause" + + + *: "Spol tilbake ved pause" + + + + id: LANG_RESET_PLAYLISTCAT_DIR + desc: + user: core + + *: "Reset Playlist Catalogue Directory" + + + *: "Nullstill spelelistekatalogmappa" + + + *: "Nullstill spelelistekatalogmappa" + + + + id: LANG_CURRENT_PLAYLIST + desc: Used when you need to say playlist, also voiced + user: core + + *: "Current Playlist" + + + *: "Noverande spelelister" + + + *: "Noverande spelelister" + + + + id: LANG_SAVE_CHANGES + desc: When you try to exit screens to confirm save + user: core + + *: "Save Changes?" + + + *: "Lagre endringar?" + + + *: "Lagre endringar?" + + + + id: LANG_USB_SKIP_FIRST_DRIVE + desc: in settings_menu + user: core + + *: none + multidrive_usb: "USB Hide Internal Drive" + + + *: none + multidrive_usb: "USB gøym intern disk" + + + *: none + multidrive_usb: "U S B gøym intern disk" + + + + id: LANG_LIST_LINE_PADDING + desc: list padding, in display settings + user: core + + *: none + touchscreen: "Line Padding in Lists" + + + *: none + touchscreen: "Mellomrom i lister" + + + *: none + touchscreen: "Mellomrom i lister" + + + + id: LANG_SLEEP_TIMER_DURATION + desc: default sleep timer duration in minutes + user: core + + *: "Default Sleep Timer Duration" + + + *: "Standardnedteljing for dvalefunksjon" + + + *: "Standardnedteljing for dvalefunksjon" + + + + id: LANG_SLEEP_TIMER_ON_POWER_UP + desc: whether sleep timer starts on power up + user: core + + *: "Start Sleep Timer on Boot" + + + *: "Start dvalenedteljing ved oppstart" + + + *: "Start dvalenedteljing ved oppstart" + + + + id: LANG_SLEEP_TIMER_CANCEL_CURRENT + desc: shown instead of sleep timer when it's running + user: core + + *: "Cancel Sleep Timer" + + + *: "Avbryt dvalenedteljinga" + + + *: "Avbryt dvalenedteljinga" + + + + id: LANG_LIST_SEPARATOR + desc: line between lines in lists + user: core + + *: "Line Separator" + + + *: "Linedeling" + + + *: "Linedeling" + + + + id: LANG_LIST_SEPARATOR_COLOR + desc: line between lines in lists + user: core + + *: "Line Separator Colour" + + + *: "Farge på linedeling" + + + *: "Farge på linedeling" + + + + id: LANG_SHORTCUTS + desc: Title in the shortcuts menu + user: core + + *: "Shortcuts" + + + *: "Snarvegar" + + + *: "Snarvegar" + + + + id: LANG_KEYCLICK_SOFTWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Headphone Keyclick" + + + *: none + hardware_click: "Klikkelyd i øyretelefonar" + + + *: none + hardware_click: "Klikkelyd i øyretelefonar" + + + + id: LANG_KEYCLICK_HARDWARE + desc: in keyclick settings menu + user: core + + *: none + hardware_click: "Speaker Keyclick" + + + *: none + hardware_click: "Klikkelyd i høgtalar" + + + *: none + hardware_click: "Klikkelydi høgtalar" + + + + id: LANG_GLYPHS + desc: in settings_menu + user: core + + *: "Glyphs To Cache" + + + *: "Teikn å mellomlagra" + + + *: "Teikn å mellomlagra" + + + + id: LANG_STARTUP_SHUTDOWN + desc: in the general settings menu + user: core + + *: "Startup/Shutdown" + + + *: "Oppstart/avslutning" + + + *: "Oppstart og avslutning" + + + + id: LANG_KEYPRESS_RESTARTS_SLEEP_TIMER + desc: whether to restart running sleep timer on keypress + user: core + + *: "Restart Sleep Timer on Keypress" + + + *: "Nullstill dvalenedteljinga når du trykkjer ein knapp" + + + *: "Nullstill dvalenedteljinga når du trykkjer ein knapp" + + + + id: LANG_CONSTRAIN_NEXT_FOLDER + desc: in settings_menu. Whether LANG_NEXT_FOLDER should be constrained to directories within LANG_SET_AS_START_DIR + user: core + + *: "Constrain Auto-Change" + + + *: "Avgrens autoendring" + + + *: "Avgrens autoendring" + + + + id: LANG_USE_SHORTCUTS_INSTEAD_OF_QS + desc: in settings_menu. + user: core + + *: none + quickscreen: "Use Shortcuts Menu Instead of Quick Screen" + + + *: none + quickscreen: "Bruk snøggtastmenyen i staden for snøggskjerm" + + + *: none + quickscreen: "Bruk snøggtastmenyen i staden for snøggskjerm" + + + + id: LANG_SLEEP_TIMER_START_CURRENT + desc: shown when a sleep timer isn't running + user: core + + *: "Start Sleep Timer" + + + *: "Start dvalenedteljinga" + + + *: "Start dvalenedteljinga" + + + + id: LANG_CODEPAGE_WESTERN_EUROPEAN + desc: in codepage setting menu + user: core + + *: "Western European (CP1252)" + + + *: "Vesteuropeisk (CP1252)" + + + *: "Vesteuropeisk" + + + + id: LANG_CROSSFEED_MEIER + desc: in sound settings + user: core + + *: "Simple (Meier)" + + + *: "Enkel (Meier)" + + + *: "Enkel" + + + + id: LANG_CROSSFEED_CUSTOM + desc: in sound settings + user: core + + *: "Custom" + + + *: "Eiga" + + + *: "Eiga" + + + + id: LANG_SELECT_FOLDER + desc: in settings_menu + user: core + + *: "Select one or more directories" + + + *: "Vel ei eller fleire mapper" + + + *: "Vel ei eller fleire mapper" + + + + id: LANG_SELECT_DATABASE_DIRS + desc: in settings_menu + user: core + + *: "Select directories to scan" + + + *: "Vel mapper å søkja gjennom" + + + *: "Vel mapper å søkja gjennom" + + + + id: LANG_FILTER_ROLL_OFF + desc: in sound settings + user: core + + *: none + filter_roll_off: "DAC filter roll-off" + + + *: none + filter_roll_off: "Avtoning for DAC-filter" + + + *: none + filter_roll_off: "Avtoning for D A C filter" + + + + id: LANG_FILTER_SHARP + desc: in sound settings + user: core + + *: none + filter_roll_off: "Sharp" + + + *: none + filter_roll_off: "Krapp" + + + *: none + filter_roll_off: "Krapp" + + + + id: LANG_FILTER_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Slow" + + + *: none + filter_roll_off: "Sein" + + + *: none + filter_roll_off: "Sein" + + + + id: LANG_FILTER_SHORT_SHARP + desc: in sound settings + user: core + + *: none + filter_roll_off: "Short Sharp" + + + *: none + filter_roll_off: "Kort krapp" + + + *: none + filter_roll_off: "Kort krapp" + + + + id: LANG_FILTER_SHORT_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Short Slow" + + + *: none + filter_roll_off: "Kort sein" + + + *: none + filter_roll_off: "Kort sein" + + + + id: LANG_FILTER_SUPER_SLOW + desc: in sound settings + user: core + + *: none + filter_roll_off: "Super Slow" + + + *: none + filter_roll_off: "Veldig sein" + + + *: none + filter_roll_off: "Veldig sein" + + + + id: LANG_FILTER_SHORT + desc: in sound settings + user: core + + *: none + es9018: "Short" + + + *: none + es9018: "Kort" + + + *: none + es9018: "Kort" + + + + id: LANG_FILTER_BYPASS + desc: in sound settings + user: core + + *: none + es9018: "Bypass" + + + *: none + es9018: "Forbikopla" + + + *: none + es9018: "Forbikopla" + + + + id: LANG_FILTER_LINEAR_FAST + desc: in sound settings + user: core + + *: none + es9218: "Linear Fast" + + + *: none + es9218: "Lineær rask" + + + *: none + es9218: "Lineær rask" + + + + id: LANG_FILTER_LINEAR_SLOW + desc: in sound settings + user: core + + *: none + es9218: "Linear Slow" + + + *: none + es9218: "Lineær sein" + + + *: none + es9218: "Lineær sein" + + + + id: LANG_FILTER_MINIMUM_FAST + desc: in sound settings + user: core + + *: none + es9218: "Minimum Fast" + + + *: none + es9218: "Minimum rask" + + + *: none + es9218: "Minimum rask" + + + + id: LANG_FILTER_MINIMUM_SLOW + desc: in sound settings + user: core + + *: none + es9218: "Minimum Slow" + + + *: none + es9218: "Minimum sein" + + + *: none + es9218: "Minimum sein" + + + + id: LANG_FILTER_APODIZING_1 + desc: in sound settings + user: core + + *: none + es9218: "Apodizing type 1" + + + *: none + es9218: "Apodisering type 1" + + + *: none + es9218: "Apodisering type 1" + + + + id: LANG_FILTER_APODIZING_2 + desc: in sound settings + user: core + + *: none + es9218: "Apodizing type 2" + + + *: none + es9218: "Apodisering type 2" + + + *: none + es9218: "Apodisering type 2" + + + + id: LANG_FILTER_HYBRID_FAST + desc: in sound settings + user: core + + *: none + es9218: "Hybrid Fast" + + + *: none + es9218: "Hybrid rask" + + + *: none + es9218: "Hybrid rask" + + + + id: LANG_FILTER_BRICK_WALL + desc: in sound settings + user: core + + *: none + es9218: "Brick Wall" + + + *: none + es9218: "Murvegg" + + + *: none + es9218: "Murvegg" + + + + id: LANG_DAC_POWER_MODE + desc: in sound settings + user: core + + *: none + dac_power_mode: "DAC power mode" + es9218: "DAC output level" + + + *: none + dac_power_mode: "DAC-straummodus" + es9218: "DAC-utgangsnivå" + + + *: none + dac_power_mode: "D A C straummodus" + es9218: "D A C utgangsnivå" + + + + id: LANG_DAC_POWER_HIGH + desc: in sound settings + user: core + + *: none + dac_power_mode: "High performance" + es9218: "High Gain (2 Vrms)" + + + *: none + dac_power_mode: "Høg yting" + es9218: "Høgt volum (2V rms)" + + + *: none + dac_power_mode: "Høg yting" + es9218: "Høgt volum 2 volt R M S" + + + + id: LANG_DAC_POWER_LOW + desc: in sound settings + user: core + + *: none + dac_power_mode: "Save battery" + es9218: "Low Gain (1 Vrms)" + + + *: none + dac_power_mode: "Spar batteriet" + es9218: "Lågt volum (1V rms)" + + + *: none + dac_power_mode: "Spar batteriet" + es9218: "Lågt volum 1 volt R M S" + + + + id: LANG_VOLUME_LIMIT + desc: in sound_settings + user: core + + *: "Maximum Volume Limit" + + + *: "Øvste volumgrense" + + + *: "Øvste volumgrense" + + + + id: LANG_PBE + desc: in sound settings + user: core + + *: "Perceptual Bass Enhancement" + + + *: "Oppfatta bassforsterking" + + + *: "Oppfatta bassforsterking" + + + + id: LANG_AFR + desc: in sound settings + user: core + + *: "Auditory Fatigue Reduction" + + + *: "Redusert høyrselsslitasje" + + + *: "Redusert høyrselsslitasje" + + + + id: LANG_SURROUND + desc: in the sound settings menu + user: core + + *: "Haas Surround" + + + *: "Haas-kringlyd" + + + *: "Haas kringlyd" + + + + id: LANG_SURROUND_FX1 + desc: in sound settings + user: core + + *: "f(x1)" + + + *: "f(x1)" + + + *: "F X 1" + + + + id: LANG_SURROUND_FX2 + desc: in sound settings + user: core + + *: "f(x2)" + + + *: "f(x2)" + + + *: "F X 2" + + + + id: LANG_SURROUND_METHOD2 + desc: in sound settings + user: core + + *: "SIDE ONLY" + + + *: "Berre sida" + + + *: "Berre sida" + + + + id: LANG_SURROUND_MIX + desc: in sound settings + user: core + + *: "Dry / Wet Mix" + + + *: "Tørr / våt-miks" + + + *: "Tørr våt miks" + + + + id: LANG_IBASSO_FREQ_SCALING_GOVERNOR + desc: in Settings -> General -> System -> Freq Scaling Governor + user: core + + *: none + ibassodx50,ibassodx90: "Freq Scaling Governor" + + + *: none + ibassodx50,ibassodx90: "Prosessorfrekvensstyring" + + + *: none + ibassodx50,ibassodx90: "Prosessorfrekvensstyring" + + + + id: LANG_USB_MODE + desc: in Settings -> General -> System -> USB Mode + user: core + + *: "USB Mode" + + + *: "USB-modus" + + + *: "U S B modus" + + + + id: LANG_USB_MODE_MASS_STORAGE + desc: in Settings -> General -> System -> USB Mode: Mass Storage + user: core + + *: "Mass Storage" + + + *: "Masselagring" + + + *: "Masselagring" + + + + id: LANG_USB_MODE_CHARGE + desc: in Settings -> General -> System -> USB Mode: Charge Only + user: core + + *: "Charge Only" + + + *: "Berre lading" + + + *: "Berre lading" + + + + id: LANG_USB_MODE_ADB + desc: in Settings -> General -> System -> USB Mode: Android Debug Bridge + user: core + + *: "Android Debug Bridge" + + + *: "Android Debug Bridge" + + + *: "Android Debug Bridge" + + + + id: LANG_ACTION_ENABLED + desc: Selective Actions + user: core + + *: "Enabled" + + + *: "På" + + + *: "På" + + + + id: LANG_ACTION_PLAY + desc: Selective Actions + user: core + + *: "Exempt Play" + + + *: "Unnteke speling" + + + *: "Unnteke speling" + + + + id: LANG_ACTION_SEEK + desc: Selective Actions + user: core + + *: "Exempt Seek" + + + *: "Unnteke spoling" + + + *: "Unnteke spoling" + + + + id: LANG_ACTION_SKIP + desc: Selective Actions + user: core + + *: "Exempt Skip" + + + *: "Unnteke hopping" + + + *: "Unnteke hopping" + + + + id: LANG_BACKLIGHT_SELECTIVE + desc: Backlight behaviour setting + user: core + + *: "Backlight Exemptions" + + + *: "Unntak for skjermlys" + + + *: "Unntak for skjermlys" + + + + id: LANG_ACTION_DISABLE_EXT_POWER + desc: Backlight behaviour setting + user: core + + *: "Disable on External Power" + + + *: "Skru av ved ekstern srtaum" + + + *: "Skru av ved ekstern straum" + + + + id: LANG_ACTION_DISABLE_UNMAPPED + desc: Backlight behaviour setting + user: core + + *: "Disable Unmapped Keys" + + + *: "Skru av ubrukte knappar" + + + *: "Skru av ubrukte knappar" + + + + id: LANG_SOFTLOCK_SELECTIVE + desc: Softlock behaviour setting + user: core + + *: "Advanced Key Lock" + + + *: "Avansert tastelås" + + + *: "Avansert tastelås" + + + + id: LANG_ACTION_AUTOLOCK_ON + desc: Softlock behaviour setting + user: core + + *: "Autolock On" + + + *: "Autolås på" + + + *: "Autolås på" + + + + id: LANG_ACTION_AUTOLOCK_OFF + desc: Softlock behaviour setting + user: core + + *: "Autolock Off" + + + *: "Autolås av" + + + *: "Autolås av" + + + + id: LANG_ACTION_DISABLE_NOTIFY + desc: Softlock behaviour setting + user: core + + *: "Disable Locked Reminders" + + + *: "Skru av påminningar om lås" + + + *: "Skru av påminningar om lås" + + + + id: LANG_ACTION_DISABLE_TOUCH + desc: Softlock behaviour setting + user: core + + *: "Disable Touch" + + + *: "Skru av peikeskjerm" + + + *: "Skru av peikeskjerm" + + + + id: LANG_KIBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "KiB" + + + *: "KiB" + + + *: "kibibyte" + + + + id: LANG_MEBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "MiB" + + + *: "MiB" + + + *: "mebibyte" + + + + id: LANG_GIBIBYTE + desc: a unit postfix, also voiced + user: core + + *: "GiB" + + + *: "GiB" + + + *: "gibibyte" + + + + id: LANG_BOOKMARK_SETTINGS_ONE_PER_PLAYLIST + desc: Save only one bookmark for a playlist in recent bookmarks + user: core + + *: "One per playlist" + + + *: "Eitt per speleliste" + + + *: "Eitt per speleliste" + + + + id: LANG_BOOKMARK_SETTINGS_ONE_PER_TRACK + desc: Save only one bookmark for a combination (playlist,track) in recent bookmarks + user: core + + *: "One per track" + + + *: "Eitt per spor" + + + *: "Eitt per spor" + + + + id: VOICE_TRACK_TO_MOVE + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Spor å flytta" + + + + id: VOICE_QUEUED + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "I kø" + + + + id: VOICE_BAD_TRACK + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Dårleg spor" + + + + id: VOICE_MOVING_TRACK + desc: playlist viewer + user: core + + *: "" + + + *: "" + + + *: "Flyttar spor" + + + + id: LANG_PLAYTIME_ELAPSED + desc: playing time screen + user: core + + *: "Playlist elapsed:" + + + *: "Spelt av spelelista:" + + + *: "Spelt av spelelista" + + + + id: LANG_PLAYTIME_TRK_ELAPSED + desc: playing time screen + user: core + + *: "Track elapsed:" + + + *: "Spelt av sporet:" + + + *: "Spelt av sporet" + + + + id: LANG_PLAYTIME_TRK_REMAINING + desc: playing time screen + user: core + + *: "Track remaining:" + + + *: "Att av sporet:" + + + *: "Att av sporet" + + + + id: LANG_PLAYTIME_TRACK + desc: playing time screen + user: core + + *: "Track:" + + + *: "Spor:" + + + *: "Spor" + + + + id: LANG_PLAYTIME_STORAGE + desc: playing time screen + user: core + + *: "Storage (Done / Remaining):" + + + *: "Lagring (utført/attståande)" + + + *: "Lagring" + + + + id: VOICE_PLAYTIME_DONE + desc: playing time screen + user: core + + *: "" + + + *: "" + + + *: "Ferdig" + + + + id: LANG_PLAYTIME_AVG_TRACK_SIZE + desc: playing time screen + user: core + + *: "Average track size:" + + + *: "Gjennomsnittsstorleik på spor" + + + *: "Gjennomsnittsstorleik på spor" + + + + id: LANG_PLAYTIME_AVG_BITRATE + desc: playing time screen + user: core + + *: "Average bitrate:" + + + *: "Gjennomsnittsbitrate" + + + *: "Gjennomsnittsbitrate" + + + + id: LANG_PLAYING_TIME + desc: onplay menu + user: core + + *: "Playing time" + + + *: "Speletid" + + + *: "Speletid" + + + + id: LANG_CAR_ADAPTER_MODE_DELAY + desc: Displayed for setting car adapter mode delay + user: core + + *: none + charging: "Delay Before Resume" + + + *: none + charging: "Forseinking før vidarespeling" + + + *: none + charging: "Forseinking før vidarespeling" + + + + id: VOICE_PITCH_ABSOLUTE_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Absolutt modus" + + + + id: VOICE_PITCH_SEMITONE_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Halvtonemodus" + + + + id: VOICE_PITCH_TIMESTRETCH_MODE + desc: spoken only + user: core + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "" + + + *: none + pitchscreen: "Tidsstrekking" + + + + id: LANG_REMOTE_CONTROL + desc: Item for menus + user: core + + *: "Remote Control" + + + *: "Fjernkontroll" + + + *: "Fjernkontroll" + + + + id: LANG_NO_REM_CONTROL + desc: Item for menus + user: core + + *: "No Rem. Control" + + + *: "Ingen fjernkontroll" + + + *: "Ingen fjernkontroll" + + + + id: LANG_OUT_OF_CONTROL + desc: Item for menus + user: core + + *: "Out of Control" + + + *: "Ute av kontroll" + + + *: "Ute av kontroll" + + + + id: LANG_2_KEY_CONTROL + desc: Item for menus + user: core + + *: "2 Key Control" + + + *: "2-tast-kontroll" + + + *: "2-tast-kontroll" + + + + id: LANG_4_KEY_CONTROL + desc: Item for menus + user: core + + *: "4 Key Control" + + + *: "4-tast-kontroll" + + + *: "4-tast-kontroll" + + + + id: LANG_PLAY_WORMLET + desc: For wormlet menu + user: core + + *: "Play Wormlet!" + + + *: "Spel Wormlet" + + + *: "Spel Wormlet!" + + + + id: LANG_NUMBER_OF_WORMS + desc: For wormlet menu + user: core + + *: "Number of Worms" + + + *: "Tal på ormar" + + + *: "Tal på ormar" + + + + id: LANG_WORM_GROWTH_PER_FOOD + desc: For wormlet menu + user: core + + *: "Worm Growth Per Food" + + + *: "Vekst per mat" + + + *: "Vekst per mat" + + + + id: LANG_WORM_SPEED + desc: For wormlet menu + user: core + + *: "Worm Speed" + + + *: "Fart på ormen" + + + *: "Fart på ormen" + + + + id: LANG_ARGHS_PER_FOOD + desc: For wormlet menu + user: core + + *: "Arghs Per Food" + + + *: "Argh per mat" + + + *: "Argh per mat" + + + + id: LANG_ARGH_SIZE + desc: For wormlet menu + user: core + + *: "Argh Size" + + + *: "Storleik på argh" + + + *: "Storleik på argh" + + + + id: LANG_FOOD_SIZE + desc: For wormlet menu + user: core + + *: "Food Size" + + + *: "Storleik på mat" + + + *: "Storleik på mat" + + + + id: LANG_NUMBER_OF_PLAYERS + desc: For game menus + user: core + + *: "Number of Players" + + + *: "Kor mange spelarar" + + + *: "Kor mange spelarar" + + + + id: LANG_CONTROL_STYLE + desc: In various menus + user: core + + *: "Control Style" + + + *: "Kontrollstil" + + + *: "Kontrollstil" + + + + id: LANG_REVERT_TO_DEFAULT_SETTINGS + desc: In various menus + user: core + + *: "Revert to Default Settings" + + + *: "Nullstill til standard" + + + *: "Nullstill til standard" + + + + id: LANG_MENU_QUIT + desc: in various menus + user: core + + *: "Quit" + + + *: "Avslutt" + + + *: "Avslutt" + + + + id: LANG_MENU_DISPLAY_OPTIONS + desc: in various menus + user: core + + *: "Display Options" + + + *: "Visingsval" + + + *: "Visingsval" + + + + id: LANG_PREVTRACK + desc: in playback control menu + user: core + + *: "Previous Track" + + + *: "Førre spor" + + + *: "Førre spor" + + + + id: LANG_PLAYPAUSE + desc: in playback control menu + user: core + + *: "Pause / Play" + + + *: "Pause / spel" + + + *: "Pause / spel" + + + + id: LANG_STOP_PLAYBACK + desc: in playback control menu + user: core + + *: "Stop Playback" + + + *: "Stopp avspeling" + + + *: "Stopp avspeling" + + + + id: LANG_NEXTTRACK + desc: in playback control menu + user: core + + *: "Next Track" + + + *: "Neste spor" + + + *: "Neste spor" + + + + id: LANG_CHANGE_VOLUME + desc: in playback control menu + user: core + + *: "Change Volume" + + + *: "Endra volum" + + + *: "Endra volum" + + + + id: LANG_CHANGE_SHUFFLE_MODE + desc: in playback control menu + user: core + + *: "Shuffle Mode" + + + *: "Tilfeldig modus" + + + *: "Tilfeldig modus" + + + + id: LANG_CHANGE_REPEAT_MODE + desc: in playback control menu + user: core + + *: "Change Repeat Mode" + + + *: "Endre repetisjonsmodus" + + + *: "Endre repetisjonsmodus" + + + + id: LANG_PLAYBACK_CONTROL + desc: in playback control menu + user: core + + *: "Playback Control" + + + *: "Avspelingskontroll" + + + *: "Avspelingskontroll" + + + + id: LANG_CHESSBOX_CHECKMATE + desc: in chessbox + user: core + + *: "Checkmate!" + + + *: "Sjakk matt!" + + + *: "Sjakk matt!" + + + + id: LANG_CHESSBOX_ILLEGAL_MOVE + desc: in chessbox + user: core + + *: "Illegal move!" + + + *: "Ulovleg trekk!" + + + *: "Ulovleg trekk!" + + + + id: LANG_CHESSBOX_MENU_NEW_GAME + desc: in the chessbox menu + user: core + + *: "New Game" + + + *: "Nytt spel" + + + *: "Nytt spel" + + + + id: LANG_CHESSBOX_MENU_RESUME_GAME + desc: in the chessbox menu + user: core + + *: "Resume Game" + + + *: "Hald fram spel" + + + *: "Hald fram spel" + + + + id: LANG_CHESSBOX_MENU_SAVE_GAME + desc: in the chessbox menu + user: core + + *: "Save Game" + + + *: "Lagra spelet" + + + *: "Lagra spelet" + + + + id: LANG_CHESSBOX_MENU_RESTORE_GAME + desc: in the chessbox menu + user: core + + *: "Restore Game" + + + *: "Hent fram spel" + + + *: "Hent fram spel" + + + + id: LANG_CHESSBOX_MENU_RESTART_GAME + desc: in the chessbox menu + user: core + + *: "Restart Game" + + + *: "Start spelet på nytt" + + + *: "Start spelet på nytt" + + + + id: LANG_CHESSBOX_MENU_SELECT_OTHER_GAME + desc: in the chessbox menu + user: core + + *: "Select Other Game" + + + *: "Vel eit anna spel" + + + *: "Vel eit anna spel" + + + + id: LANG_CHESSBOX_LEVEL_1 + desc: in the chessbox game level selection + user: core + + *: "Level 1: 60 moves / 5 min" + + + *: "Nivå 1: 60 trekk / 5 min" + + + *: "Nivå 1, 60 trekk på 5 minutt" + + + + id: LANG_CHESSBOX_LEVEL_2 + desc: in the chessbox game level selection + user: core + + *: "Level 2: 60 moves / 15 min" + + + *: "Nivå 2: 60 trekk / 15 min" + + + *: "Nivå 2, 60 trekk på 15 minutt" + + + + id: LANG_CHESSBOX_LEVEL_3 + desc: in the chessbox game level selection + user: core + + *: "Level 3: 60 moves / 30 min" + + + *: "Nivå 3: 60 trekk / 30 min" + + + *: "Nivå 3, 60 trekk på 30 minutt" + + + + id: LANG_CHESSBOX_LEVEL_4 + desc: in the chessbox game level selection + user: core + + *: "Level 4: 40 moves / 30 min" + + + *: "Level 4: 40 moves / 30 min" + + + *: "Level 4, 40 moves per 30 minutes" + + + + id: LANG_CHESSBOX_LEVEL_5 + desc: in the chessbox game level selection + user: core + + *: "Level 5: 40 moves / 60 min" + + + *: "Nivå 5: 40 trekk / 60 min" + + + *: "Nivå 5, 40 trekk på 60 minutt" + + + + id: LANG_CHESSBOX_LEVEL_6 + desc: in the chessbox game level selection + user: core + + *: "Level 6: 40 moves / 120 min" + + + *: "Nivå 6: 40 trekk / 120 min" + + + *: "Nivå 6, 40 trekk på 120 minutt" + + + + id: LANG_CHESSBOX_LEVEL_7 + desc: in the chessbox game level selection + user: core + + *: "Level 7: 40 moves / 240 min" + + + *: "Nivå 7: 40 trekk / 240 min" + + + *: "Nivå 7, 40 trekk på 240 minutt" + + + + id: LANG_CHESSBOX_PGN_PARSE_ERROR + desc: in the chessbox game viewer + user: core + + *: "Error parsing game !" + + + *: "Greidde ikkje lesa spelet!" + + + *: "Greidde ikkje lesa spelet!" + + + + id: LANG_CHESSBOX_NO_GAMES + desc: in the chessbox game viewer + user: core + + *: "No games found !" + + + *: "Fann ingen spel!" + + + *: "Fann ingen spel!" + + + + id: LANG_CHESSBOX_GAME_BEGINNING + desc: in the chessbox game viewer + user: core + + *: "At the beginning of the game" + + + *: "På starten av spelet" + + + *: "På starten av spelet" + + + + id: LANG_CHESSBOX_GAME_END + desc: in the chessbox game viewer + user: core + + *: "At the end of the game" + + + *: "På slutten av spelet" + + + *: "På slutten av spelet" + + + + id: VOICE_PLAYER + desc: spoken only, for announcing player's id + user: core + + *: "" + + + *: "" + + + *: "Spelar" + + + + id: VOICE_GNUCHESS + desc: spoken only, for announcing player's id + user: core + + *: "" + + + *: "" + + + *: "GNU sjakk" + + + + id: VOICE_MARKED + desc: spoken only, for announcing chess piece marking + user: core + + *: "" + + + *: "" + + + *: "Markert" + + + + id: VOICE_UNMARKED + desc: spoken only, for announcing chess piece unmarking + user: core + + *: "" + + + *: "" + + + *: "Umarkert" + + + + id: VOICE_WHITE + desc: spoken only, for announcing chess piece color + user: core + + *: "" + + + *: "" + + + *: "Kvit" + + + + id: VOICE_BLACK + desc: spoken only, for announcing chess piece color + user: core + + *: "" + + + *: "" + + + *: "Svart" + + + + id: VOICE_CHESSBOX_CHECK + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "Sjakk!" + + + + id: VOICE_CHESSBOX_CAPTURES + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "fanga" + + + + id: VOICE_CHESSBOX_CASTLE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "slott" + + + + id: VOICE_CHESSBOX_KINGSIDE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "kongesida" + + + + id: VOICE_CHESSBOX_QUEENSIDE + desc: spoken only, for announcing chess moves + user: core + + *: "" + + + *: "" + + + *: "dronningsida" + + + + id: VOICE_PAWN + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Bonde" + + + + id: VOICE_KNIGHT + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Hest" + + + + id: VOICE_BISHOP + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Løpar" + + + + id: VOICE_ROOK + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Tårn" + + + + id: VOICE_QUEEN + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Dronning" + + + + id: VOICE_KING + desc: spoken only, for announcing chess piece names + user: core + + *: "" + + + *: "" + + + *: "Konge" + + + + id: LANG_CHESSBOX_GAMES + desc: in chessbox + user: core + + *: "Games" + + + *: "Spel" + + + *: "" + + + + id: LANG_CHESSBOX_SAVING_POSITION + desc: in chessbox + user: core + + *: "Saving position" + + + *: "Lagrar posisjon" + + + *: "Lagrar posisjon" + + + + id: LANG_CHESSBOX_LOADING_POSITION + desc: in chessbox + user: core + + *: "Loading position" + + + *: "Lastar posisjon" + + + *: "Lastar posisjon" + + + + id: LANG_CHESSBOX_THINKING + desc: in chessbox + user: core + + *: "Thinking..." + + + *: "Tenkjer..." + + + *: "Tenkjer" + + + + id: VOICE_BATTERY_BENCH_IS_ALREADY_RUNNING + desc: Spoken if battery bench is already running + user: core + + *: "" + + + *: "" + + + *: "Batterimålinga køyrer allereie" + + + + id: VOICE_BAT_BENCH_KEYS + desc: Battery bench start up message + user: core + + *: "" + + + *: "" + + + *: "Press spel for å køyra batterimåling eller stopp for å avbryta" + + + + id: LANG_CANNOT_RESTART_PLAYBACK + desc: cannot restart playback splash in imageviewer + user: core + + *: "Cannot restart playback" + + + *: "Kan ikkje starta speling på nytt" + + + *: "Kan ikkje starta speling på nytt" + + + + id: LANG_ORDERED + desc: in the imageviewer settings menu + user: core + + *: "Ordered" + + + *: "Ordna" + + + *: "Ordna" + + + + id: LANG_DIFFUSION + desc: in the imageviewer settings menu + user: core + + *: "Diffusion" + + + *: "Uklårleik" + + + *: "Uklårleik" + + + + id: LANG_GRAYSCALE + desc: in the imageviewer settings menu + user: core + + *: "Grayscale" + + + *: "Gråtonar" + + + *: "Gråtonar" + + + + id: LANG_SLIDESHOW_MODE + desc: in the imageviewer settings menu + user: core + + *: "Toggle Slideshow Mode" + + + *: "Skru på lysbiletemodus" + + + *: "Skru på lysbiletemodus" + + + + id: LANG_SLIDESHOW_TIME + desc: in the imageviewer settings menu + user: core + + *: "Slideshow Time" + + + *: "Framsyningstid" + + + *: "Framsyningstid" + + + + id: LANG_RETURN + desc: in various plugin menus + user: core + + *: "Return" + + + *: "Tilbake" + + + *: "Tilbake" + + + + id: LANG_REC_DIR + desc: used in the info screen to show a recording dir + user: core + + *: none + recording: "Recording Directory" + + + *: none + recording: "Opptaksmappe" + + + *: none + recording: "Opptaksmappe" + + + + id: LANG_CHESSBOX_MENU_VIEW_GAMES + desc: in the chessbox menu + user: core + + *: "View Played Games" + + + *: "Sjå spela du har spelt" + + + *: "Sjå spela du har spelt" + + + + id: LANG_MENU_AUDIO_OPTIONS + desc: in mpegplayer menus + user: core + + *: "Audio Options" + lowmem: none + + + *: "Lydinnstillingar" + lowmem: none + + + *: "Lydinnstillingar" + lowmem: none + + + + id: LANG_MENU_RESUME_OPTIONS + desc: in mpegplayer menus + user: core + + *: "Resume Options" + lowmem: none + + + *: "Innstillingar for vidarespeling" + lowmem: none + + + *: "Innstillingar for vidarespeling" + lowmem: none + + + + id: LANG_MENU_PLAY_MODE + desc: in mpegplayer menus + user: core + + *: "Play Mode" + lowmem: none + + + *: "Spelemodus" + lowmem: none + + + *: "Spelemodus" + lowmem: none + + + + id: LANG_SINGLE + desc: in mpegplayer menus + user: core + + *: "Single" + lowmem: none + + + *: "Berre ein" + lowmem: none + + + *: "Berre ein" + lowmem: none + + + + id: LANG_USE_SOUND_SETTING + desc: in mpegplayer menus + user: core + + *: "Use sound setting" + lowmem: none + + + *: "Bruk lydinnstilling" + lowmem: none + + + *: "Bruk lydinnstilling" + lowmem: none + + + + id: LANG_RESTART_PLAYBACK + desc: in the mpegplayer settings menu + user: core + + *: "Play from beginning" + lowmem: none + + + *: "Spel frå starten" + lowmem: none + + + *: "Spel frå starten" + lowmem: none + + + + id: LANG_SET_RESUME_TIME + desc: in the mpegplayer settings menu + user: core + + *: "Set resume time (min)" + lowmem: none + + + *: "Set vidarespelingstid (min)" + lowmem: none + + + *: "Set vidarespelingstid" + lowmem: none + + + + id: LANG_DISPLAY_FPS + desc: in the mpegplayer and pictureflow settings menus + user: core + + *: "Display FPS" + + + *: "Vis rammer per sekund" + + + *: "Vis rammer per sekund" + + + + id: LANG_LIMIT_FPS + desc: in the mpegplayer settings menu + user: core + + *: "Limit FPS" + lowmem: none + + + *: "Avgrens rammer per sekund" + lowmem: none + + + *: "Avgrens rammer per sekund" + lowmem: none + + + + id: LANG_SKIP_FRAMES + desc: in the mpegplayer settings menu + user: core + + *: "Skip frames" + lowmem: none + + + *: "Hopp over rammer" + lowmem: none + + + *: "Hopp over rammer" + lowmem: none + + + + id: LANG_BACKLIGHT_BRIGHTNESS + desc: in the mpegplayer settings menu + user: core + + *: "Backlight brightness" + lowmem: none + + + *: "Skjermlysstyrke" + lowmem: none + + + *: "Skjermlysstyrke" + lowmem: none + + + + id: LANG_USE_COMMON_SETTING + desc: in the mpegplayer settings menu + user: core + + *: "Use common setting" + lowmem: none + + + *: "Bruk vanleg innstilling" + lowmem: none + + + *: "Bruk vanleg innstilling" + lowmem: none + + + + id: LANG_TONE_CONTROLS + desc: in the mpegplayer settings menu + user: core + + *: "Tone controls" + lowmem: none + + + *: "Tonekontrollar" + lowmem: none + + + *: "Tonekontrollar" + lowmem: none + + + + id: LANG_FORCE_START_MENU + desc: in mpegplayer menus + user: core + + *: "Start menu" + lowmem: none + + + *: "Startmeny" + lowmem: none + + + *: "Startmeny" + lowmem: none + + + + id: LANG_CONDITIONAL_START_MENU + desc: in mpegplayer menus + user: core + + *: "Start menu if not completed" + lowmem: none + + + *: "Startmeny viss ikkje fullført" + lowmem: none + + + *: "Startmeny viss ikkje fullført" + lowmem: none + + + + id: LANG_AUTO_RESUME + desc: in mpegplayer menus + user: core + + *: "Resume automatically" + lowmem: none + + + *: "Spel vidare automatisk" + lowmem: none + + + *: "Spel vidare automatisk" + lowmem: none + + + + id: LANG_CLEAR_ALL_RESUMES + desc: in the mpegplayer settings menu + user: core + + *: "Clear all resumes" + lowmem: none + + + *: "Tøm alle vidarespelingar" + lowmem: none + + + *: "Tøm alle vidarespelingar" + lowmem: none + + + + id: LANG_UNAVAILABLE + desc: in mpegplayer settings + user: core + + *: "Unavailable" + lowmem: none + + + *: "Utilgjengeleg" + lowmem: none + + + *: "Utilgjengeleg" + lowmem: none + + + + id: LANG_TOGGLE_ITEM + desc: deprecated + user: core + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_MOVE_ITEM_UP + desc: in main_menu_config + user: core + + *: "Move Item Up" + + + *: "Flytt opp" + + + *: "Flytt opp" + + + + id: LANG_MOVE_ITEM_DOWN + desc: in main_menu_config + user: core + + *: "Move Item Down" + + + *: "Flytt ned" + + + *: "Flytt ned" + + + + id: LANG_LOAD_DEFAULT_CONFIGURATION + desc: in main_menu_config + user: core + + *: "Load Default Configuration" + + + *: "Last standardval" + + + *: "Last standardval" + + + + id: LANG_SAVE_EXIT + desc: in main_menu_config + user: core + + *: "Save and Exit" + + + *: "Lagre og avslutt" + + + *: "Lagre og avslutt" + + + + id: LANG_MAIN_MENU_ORDER + desc: deprecated + user: core + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_PROPERTIES_PATH + desc: in properties plugin + user: core + + *: "[Path]" + + + *: "[Sti]" + + + *: "Sti" + + + + id: LANG_PROPERTIES_FILENAME + desc: in properties plugin + user: core + + *: "[Filename]" + + + *: "[Filnamn]" + + + *: "Filnamn" + + + + id: LANG_PROPERTIES_SIZE + desc: in properties plugin + user: core + + *: "[Size]" + + + *: "[Storleik]" + + + *: "Storleik" + + + + id: LANG_PROPERTIES_DATE + desc: in properties plugin + user: core + + *: "[Date]" + + + *: "[Dato]" + + + *: "Dato" + + + + id: LANG_PROPERTIES_TIME + desc: in properties plugin + user: core + + *: "[Time]" + + + *: "[Tid]" + + + *: "Tid" + + + + id: LANG_PROPERTIES_SUBDIRS + desc: in properties plugin + user: core + + *: "[Subdirs]" + + + *: "[Undermapper]" + + + *: "Undermapper" + + + + id: LANG_PROPERTIES_FILES + desc: in properties plugin + user: core + + *: "[Files]" + + + *: "[Filer]" + + + *: "Filer" + + + + id: LANG_PROPERTIES_DIRECTORY_PROPERTIES + desc: in properties plugin + user: core + + *: "Directory properties" + + + *: "Mappeeigenskapar" + + + *: "" + + + + id: LANG_PROPERTIES_FILE_PROPERTIES + desc: in properties plugin + user: core + + *: "File properties" + + + *: "Fileigenskapar" + + + *: "" + + + + id: LANG_PROPERTIES_FAIL + desc: in properties plugin + user: core + + *: "Failed to gather information" + + + *: "Greidde ikkje samla informasjon" + + + *: "Greidde ikkje samla informasjon" + + + + id: LANG_SWAP_CHANNELS + desc: in sound_settings + user: core + + *: "Swap Channels" + + + *: "Byt kanalar" + + + *: "Byt kanalar" + + + + id: LANG_PANNING_SEPARATION + desc: in mikmod settings menu + user: core + + *: "Panning Separation" + lowmem: none + + + *: "Panoreringsskilnad" + lowmem: none + + + *: "Panoreringsskilnad" + lowmem: none + + + + id: LANG_REVERBERATION + desc: in mikmod settings menu + user: core + + *: "Reverberation" + lowmem: none + + + *: "Klang" + lowmem: none + + + *: "Klang" + lowmem: none + + + + id: LANG_INTERPOLATION + desc: in mikmod settings menu + user: core + + *: "Interpolation" + lowmem: none + + + *: "Interpolering" + lowmem: none + + + *: "Interpolering" + lowmem: none + + + + id: LANG_MIKMOD_SURROUND + desc: in mikmod settings menu + user: core + + *: "Surround" + lowmem: none + + + *: "Kringlyd" + lowmem: none + + + *: "Kringlyd" + lowmem: none + + + + id: LANG_MIKMOD_HQMIXER + desc: in mikmod settings menu + user: core + + *: "HQ Mixer" + lowmem: none + + + *: "HQ-miksar" + lowmem: none + + + *: "Høgkvalitetsmiksar" + lowmem: none + + + + id: LANG_MIKMOD_SAMPLERATE + desc: in mikmod settings menu + user: core + + *: "Sample Rate" + lowmem: none + + + *: "Punktrate" + lowmem: none + + + *: "Punktrate" + lowmem: none + + + + id: LANG_CPU_BOOST + desc: in mikmod settings menu + user: core + + *: "CPU Boost" + lowmem: none + + + *: "Prosessorboost" + lowmem: none + + + *: "Prosessorboost" + lowmem: none + + + + id: LANG_SPACING + desc: in the pictureflow settings menu + user: core + + *: "Spacing" + + + *: "Mellomrom" + + + *: "Mellomrom" + + + + id: LANG_CENTRE_MARGIN + desc: in the pictureflow settings menu + user: core + + *: "Centre margin" + + + *: "Midtmarg" + + + *: "Midtmarg" + + + + id: LANG_NUMBER_OF_SLIDES + desc: in the pictureflow settings menu + user: core + + *: "Number of slides" + + + *: "Tal på lysbilete" + + + *: "Tal på lysbilete" + + + + id: LANG_ZOOM + desc: in the pictureflow settings menu + user: core + + *: "Zoom" + + + *: "Zoom" + + + *: "Zoom" + + + + id: LANG_SHOW_ALBUM_TITLE + desc: in the pictureflow settings menu + user: core + + *: "Show album title" + + + *: "Vis albumtittel" + + + *: "Vis albumtittel" + + + + id: LANG_RESIZE_COVERS + desc: in the pictureflow settings menu + user: core + + *: "Resize Covers" + + + *: "Skaler omslag" + + + *: "Skaler omslag" + + + + id: LANG_REBUILD_CACHE + desc: in the pictureflow settings menu + user: core + + *: "Rebuild cache" + + + *: "Lag nytt mellomlager" + + + *: "Lag nytt mellomlager" + + + + id: LANG_WPS_INTEGRATION + desc: in the pictureflow settings menu + user: core + + *: "WPS Integration" + + + *: "Speleskjermintegrering" + + + *: "Speleskjermintegrering" + + + + id: LANG_GOTO_WPS + desc: in the pictureflow main menu + user: core + + *: "Go to WPS" + + + *: "Gå til speleskjermen" + + + *: "Gå til speleskjermen" + + + + id: LANG_HIDE_ALBUM_TITLE + desc: in the pictureflow settings + user: core + + *: "Hide album title" + + + *: "Gøym albumtittel" + + + *: "Gøym albumtittel" + + + + id: LANG_SHOW_AT_THE_BOTTOM + desc: in the pictureflow settings + user: core + + *: "Show at the bottom" + + + *: "Vis på botnen" + + + *: "Vis på botnen" + + + + id: LANG_SHOW_AT_THE_TOP + desc: in the pictureflow settings + user: core + + *: "Show at the top" + + + *: "Vis på toppen" + + + *: "Vis på toppen" + + + + id: LANG_DIRECT + desc: in the pictureflow settings, also a volume adjustment mode + user: core + + *: "Direct" + + + *: "Direkte" + + + *: "Direkte" + + + + id: LANG_VIA_TRACK_LIST + desc: in the pictureflow settings + user: core + + *: "Via Track list" + + + *: "Via sporliste" + + + *: "Via sporliste" + + + + id: LANG_ALWAYS_ON + desc: in the pictureflow settings menu + user: core + + *: "Always On" + + + *: "Alltid på" + + + *: "Alltid på" + + + + id: LANG_NO_ALBUMART_FOUND + desc: in the pictureflow splash messages + user: core + + *: "No album art found" + + + *: "Fann ingen omslag" + + + *: "Fann ingen omslag" + + + + id: LANG_ERROR_WRITING_CONFIG + desc: in the pictureflow splash messages + user: core + + *: "Error writing config" + + + *: "Greidde ikkje skriva oppsett" + + + *: "Greidde ikkje skriva oppsett" + + + + id: LANG_NOT_A_VBR_FILE + desc: in vbrfix plugin + user: core + + *: "Not a VBR file" + + + *: "Ikkje ei VBR-fil" + + + *: "Ikkje ei V B R fil" + + + + id: LANG_FILE_ERROR + desc: in vbrfix plugin + user: core + + *: "File error: %d" + + + *: "Filfeil: %d" + + + *: "Filfeil" + + + + id: LANG_UPDATE_CACHE + desc: in pictureflow + user: core + + *: "Update cache" + + + *: "Oppdater mellomlager" + + + *: "Oppdater mellomlager" + + + + id: LANG_HIDE_ALBUM_TITLE_NEW + desc: in the pictureflow settings + user: core + + *: "Hide information" + + + *: "Gøym informasjon" + + + *: "Gøym informasjon" + + + + id: LANG_SHOW_AT_THE_BOTTOM_NEW + desc: in the pictureflow settings + user: core + + *: "Show album at the bottom" + + + *: "Vis albumet på botnen" + + + *: "Vis albumet på botnen" + + + + id: LANG_SHOW_AT_THE_TOP_NEW + desc: in the pictureflow settings + user: core + + *: "Show album at the top" + + + *: "Vis albumet på toppen" + + + *: "Vis albumet på toppen" + + + + id: LANG_SHOW_ALL_AT_THE_TOP + desc: in the pictureflow settings + user: core + + *: "Show album and artist at the top" + + + *: "Vis albumet og artisten på toppen" + + + *: "Vis albumet og artisten på toppen" + + + + id: LANG_SHOW_ALL_AT_THE_BOTTOM + desc: in the pictureflow settings + user: core + + *: "Show album and artist at the bottom" + + + *: "Vis albumet og artisten på botnen" + + + *: "Vis albumet og artisten på botnen" + + + + id: LANG_ACTION_STD_CANCEL + desc: standard press x to cancel string + user: core + + *: "Press LEFT to cancel." + android,hifietma*: "Press BACK to cancel." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Press POWER to cancel." + ihifi760,ihifi960: "Double tap RETURN to cancel." + ihifi770,ihifi770c,ihifi800: "Press HOME to cancel." + iriverh10,samsungyh*: "Double tap LEFT to cancel." + mpiohd200: "Double tap REC to cancel." + mpiohd300: "Double tap MENU to cancel." + rx27generic: "Press VOLUME to cancel." + sonynwza860: "Keymaps incomplete." + touchscreen: "Press Middle Left to cancel." + vibe500: "Press PREV to cancel." + xduoox20,xduoox3,xduoox3ii: "Double tap HOME to cancel." + + + *: "Trykk VENSTRE for å avbryta." + android,hifietma*: "Trykk TILBAKE for å avbryta." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Trykk PÅ for å avbryta." + ihifi760,ihifi960: "Dobbeltrykk TILBAKE for å avbryta." + ihifi770,ihifi770c,ihifi800: "Trykk HEIM for å avbryta." + iriverh10,samsungyh*: "Dobbeltrykk VENSTRE for å avbryta." + mpiohd200: "Dobbeltrykk REC for å avbryta." + mpiohd300: "Dobbeltrykk MENY for å avbryta." + rx27generic: "Trykk VOLUM for å avbryta." + sonynwza860: "Ufullstendige teiknkart." + touchscreen: "Trykk midt venstre for å avbryta." + vibe500: "Trykk FØRRE for å avbryta." + xduoox20,xduoox3,xduoox3ii: "Dobbeltrykk HEIM for å avbryta." + + + *: "Trykk VENSTRE for å avbryta." + android,hifietma*: "Trykk TILBAKE for å avbryta." + cowond2,creativezenxfi2,ibassodx50,ibassodx90,mrobe500,ondavx747: "Trykk PÅ for å avbryta." + ihifi760,ihifi960: "Dobbeltrykk TILBAKE for å avbryta." + ihifi770,ihifi770c,ihifi800: "Trykk HEIM for å avbryta." + iriverh10,samsungyh*: "Dobbeltrykk VENSTRE for å avbryta." + mpiohd200: "Dobbeltrykk REC for å avbryta." + mpiohd300: "Dobbeltrykk MENY for å avbryta." + rx27generic: "Trykk VOLUM for å avbryta." + touchscreen: "Trykk midt venstre for å avbryta." + vibe500: "Trykk FØRRE for å avbryta." + xduoox20,xduoox3,xduoox3ii: "Dobbeltrykk HEIM for å avbryta." + + + + id: LANG_DATE + desc: for constructing time and date announcements + user: core + + *: "Date" + + + *: "Dato" + + + *: "Dato" + + + + id: LANG_CLEAR_ALL + desc: + user: core + + *: "Clear all" + + + *: "Tøm alle" + + + *: "Tøm alle" + + + + id: LANG_CANCEL_0 + desc: CANCEL. + user: core + + *: "Cancel" + + + *: "Avbryt" + + + *: "Avbryt" + + + + id: LANG_SAVE + desc: + user: core + + *: "Save" + + + *: "Lagra" + + + *: "Lagra" + + + + id: LANG_TIMEOUT + desc: + user: core + + *: "Timeout" + + + *: "Tidsavbrot" + + + *: "Tidsavbrot" + + + + id: LANG_TRACK + desc: used in track x of y constructs + user: core + + *: "Track" + + + *: "Spor" + + + *: "Spor" + + + + id: LANG_ELAPSED + desc: prefix for elapsed playtime announcement + user: core + + *: "Elapsed" + + + *: "Gått" + + + *: "Gått" + + + + id: LANG_ANNOUNCEMENT_FMT + desc: format for wps hotkey announcement + user: core + + *: none + hotkey: "Announcement format" + + + *: none + hotkey: "Meldingsformat" + + + *: none + hotkey: "Meldingsformat" + + + + id: LANG_ANNOUNCE_STATUS + desc: announnnce_status plugin + user: core + + *: "Announce Status" + + + *: "Meldingsstatus" + + + *: "Meldingsstatus" + + + + id: LANG_REMAIN + desc: for constructs such as number of tracks remaining etc + user: core + + *: none + hotkey: "Remain" + + + *: none + hotkey: "Står att" + + + *: none + hotkey: "Står att" + + + + id: LANG_GROUPING + desc: + user: core + + *: none + hotkey: "Grouping" + + + *: none + hotkey: "Gruppering" + + + *: none + hotkey: "Gruppering" + + + + id: LANG_ANNOUNCE_ON + desc: + user: core + + *: none + hotkey: "Announce on" + + + *: none + hotkey: "Meld frå ved" + + + *: none + hotkey: "Meld frå ved" + + + + id: LANG_TRACK_CHANGE + desc: + user: core + + *: none + hotkey: "Track change" + + + *: none + hotkey: "Nytt spor" + + + *: none + hotkey: "Nytt spor" + + + + id: LANG_HOLD_FOR_SETTINGS + desc: + user: core + + *: none + hotkey: "Hold for settings" + + + *: none + hotkey: "Hald for innstillingar" + + + *: none + hotkey: "Hald for innstillingar" + + + + id: LANG_OPEN_PLUGIN + desc: onplay open plugin + user: core + + *: "Open Plugin" + + + *: "Opna tillegg" + + + *: "Opna tillegg" + + + + id: LANG_OPEN_PLUGIN_NOT_A_PLUGIN + desc: open plugin module + user: core + + *: "Not a plugin: %s" + + + *: "Ikkje eit tillegg: %s" + + + *: "Ikkje eit tillegg" + + + + id: LANG_OPEN_PLUGIN_SET_WPS_CONTEXT_PLUGIN + desc: open plugin module + user: core + + *: "Set WPS Context Plugin" + + + *: "Vel konteksttillegg for speleskjerm" + + + *: "Vel konteksttillegg for speleskjerm" + + + + id: LANG_PARAMETER + desc: + user: core + + *: "Parameter" + + + *: "~Parameter" + + + *: "~Parameter" + + + + id: LANG_NAME + desc: + user: core + + *: "Name" + + + *: "Namn" + + + *: "Namn" + + + + id: LANG_ADD + desc: + user: core + + *: "Add" + + + *: "Legg til" + + + *: "Legg til" + + + + id: LANG_BACK + desc: + user: core + + *: "Back" + + + *: "Tilbake" + + + *: "Tilbake" + + + + id: LANG_EDIT + desc: + user: core + + *: "Edit" + + + *: "Rediger" + + + *: "Rediger" + + + + id: LANG_RUN + desc: + user: core + + *: "Run" + + + *: "Spring" + + + *: "Spring" + + + + id: LANG_EXPORT + desc: + user: core + + *: "Export" + + + *: "Eksporter" + + + *: "Eksporter" + + + + id: LANG_BROWSE + desc: + user: core + + *: "Browse" + + + *: "Sjå gjennom" + + + *: "Sjå gjennom" + + + + id: LANG_ENTER_USB_STORAGE_MODE_QUERY + desc: upon plugging in USB + user: core + + *: "Enter USB mass storage mode?" + + + *: "Start USB-masselagringsmodus?" + + + *: "Start U S B masselagringsmodus?" + + + + id: LANG_QUEUE_MENU + desc: in onplay menu + user: core + + *: "Queue..." + + + *: "Kø..." + + + *: "Kø" + + + + id: LANG_SHOW_QUEUE_OPTIONS + desc: in Current Playlist settings + user: core + + *: "Show Queue Options" + + + *: "Vis val for køar" + + + *: "Vis val for køar" + + + + id: LANG_SHOW_SHUFFLED_ADDING_OPTIONS + desc: in Current Playlist settings + user: core + + *: "Show Shuffled Adding Options" + + + *: "Vis val for å leggja til tilfeldig" + + + *: "Vis val for å leggja til tilfeldig" + + + + id: LANG_IN_SUBMENU + desc: in Settings + user: core + + *: "In Submenu" + + + *: "I undermeny" + + + *: "I undermeny" + + + + id: LANG_SOFTLOCK_DISABLE_ALL_NOTIFY + desc: disable all softlock notifications + user: core + + *: "Disable All Lock Notifications" + + + *: "Skru av alle låsevarslingar" + + + *: "Skru av alle låsevarslingar" + + + + id: LANG_ACTION_VOLUME + desc: exempt volume from softlock + user: core + + *: "Exempt Volume" + + + *: "Unnateke volum" + + + *: "Unnateke volum" + + + + id: LANG_ACTION_ALWAYSAUTOLOCK + desc: always prime autolock + user: core + + *: "Always Autolock" + + + *: "Alltid autolås" + + + *: "Alltid autolås" + + + + 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 + + *: "" + + + *: "" + + + *: "" + + + + id: LANG_VOICED_DATE_FORMAT + desc: format string for how dates will be read back. Y == 4-digit year (grouped), y == 4-digit year (numeric), A == month name, m == numeric month, d == numeric day. For example, for 2021-01-05, "AdY" will be voiced as "January 5 twenty twenty-one" and "dmy" will be voiced as "5 1 two thousand twenty one + user: core + + *: "dAY" + + + *: "dAY" + + + *: "" + + + + id: LANG_LIST_WRAPAROUND + desc: in Settings + user: core + + *: "List Wraparound" + + + *: "Lista tilbake frå toppen" + + + *: "Lista tilbake frå toppen" + + + + id: LANG_SHOW_SHUTDOWN_MESSAGE + desc: in Settings + user: core + + *: "Show Shutdown Message" + + + *: "Vis avsluttingsmelding" + + + *: "Vis avsluttingsmelding" + + + + id: LANG_LIST_ORDER + desc: in Settings + user: core + + *: "List Order" + + + *: "Sortering" + + + *: "Sortering" + + + + id: LANG_ASCENDING + desc: in Settings + user: core + + *: "Ascending" + + + *: "Stigande" + + + *: "Stigande" + + + + id: LANG_DESCENDING + desc: in Settings + user: core + + *: "Descending" + + + *: "Søkkande" + + + *: "Søkkande" + + + + id: LANG_ALBUM_ART + desc: in Settings + user: core + + *: "Album Art" + + + *: "Omslag" + + + *: "Omslag" + + + + id: LANG_PREFER_EMBEDDED + desc: in Settings + user: core + + *: "Prefer Embedded" + + + *: "Bruk innebygde" + + + *: "Bruk innebygde" + + + + id: LANG_PREFER_IMAGE_FILE + desc: in Settings + user: core + + *: "Prefer Image File" + + + *: "Bruk biletfil" + + + *: "Bruk biletfil" + + + + id: LANG_FM_SYNC_RDS_TIME + desc: in radio screen and Settings + user: core + + *: none + rds: "Sync RDS Time" + + + *: none + rds: "Synkroniser RDS-tid" + + + *: none + rds: "Synkroniser RDS-tid" + + + + id: LANG_SORT_ALBUMS_BY + desc: in Settings + user: core + + *: "Sort albums by" + + + *: "Sorter album etter" + + + *: "Sorter album etter" + + + + id: LANG_ARTIST_PLUS_NAME + desc: in Settings + user: core + + *: "Artist + Name" + + + *: "Artist + Namn" + + + *: "Artist og namn" + + + + id: LANG_ARTIST_PLUS_YEAR + desc: in Settings + user: core + + *: "Artist + Year" + + + *: "Artist + år" + + + *: "Artist og år" + + + + id: LANG_YEAR_SORT_ORDER + desc: in Settings + user: core + + *: "Year sort order" + + + *: "Sortering for år" + + + *: "Sortering for år" + + + + id: LANG_SHOW_YEAR_IN_ALBUM_TITLE + desc: in Settings + user: core + + *: "Show year in album title" + + + *: "Vis år i albumtittelen" + + + *: "Vis år i albumtittelen" + + + + id: LANG_WAIT_FOR_CACHE + desc: in Settings + user: core + + *: "Cache needs to finish updating first!" + + + *: "Mellomlageret må oppdaterast fyrst!" + + + *: "Mellomlageret må oppdaterast fyrst!" + + + + id: LANG_TRACK_INFO + desc: Track Info Title + user: core + + *: "Track Info" + + + *: "Sporinfo" + + + *: "Sporinfo" + + + + id: LANG_PLAY + desc: play selected file/directory, in playlist context menu + user: core + + *: "Play" + + + *: "Spel" + + + *: "Spel" + + + + id: LANG_PLAY_SHUFFLED + desc: play selected files in shuffled order, in playlist context menu + user: core + + *: "Play Shuffled" + + + *: "Spel tilfeldig" + + + *: "Spel tilfeldig" + + + + id: LANG_KEEP_CURRENT_TRACK_ON_REPLACE + desc: used in the playlist settings menu + user: core + + *: "Keep Current Track When Replacing Playlist" + + + *: "Hald på dette sporet når du byter ut spelelista" + + + *: "Hald på dette sporet når du byter ut spelelista" + + + + id: LANG_CLEAR_SETTINGS_ON_HOLD + desc: in the system sub menu + user: core + + *: none + clear_settings_on_hold,iriverh10: "Clear settings when reset button is held during startup" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Clear settings when hold switch is on during startup" + + + *: none + clear_settings_on_hold,iriverh10: "Tøm innstillingar når du held inne nullstill-knappen ved oppstart" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Tøm innstillingar når du held inne hald-knappen ved oppstart" + + + *: none + clear_settings_on_hold,iriverh10: "Tøm innstillingar når du held inne nullstill-knappen ved oppstart" + ipod4g,ipodcolor,ipodmini1g,ipodmini2g,ipodnano1g,ipodvideo: "Tøm innstillingar når du held inne hald-knappen ved oppstart" + + + + id: LANG_REWIND_ACROSS_TRACKS + desc: in playback settings menu + user: core + + *: "Rewind Across Tracks" + + + *: "Spol tilbake fleire spor" + + + *: "Spol tilbake fleire spor" + + + + id: LANG_SET_AS + desc: used in the onplay menu + user: core + + *: "Set As..." + + + *: "Bruk som..." + + + *: "Bruk som" + + + + id: LANG_PLAYLIST_DIR + desc: used in the onplay menu + user: core + + *: "Playlist Directory" + + + *: "Spelelistemappe" + + + *: "Spelelistemappe" + + + + id: LANG_START_DIR + desc: used in the onplay menu + user: core + + *: "Start Directory" + + + *: "Startmappe" + + + *: "Startmappe" + + + + id: LANG_RECORDING_DIR + desc: used in the onplay menu + user: core + + *: none + recording: "Recording Directory" + + + *: none + recording: "Opptaksmappe" + + + *: none + recording: "Opptaksmappe" + + + + id: LANG_ADD_TO_PL + desc: used in the onplay menu + user: core + + *: "Add to Playlist..." + + + *: "Legg til speleliste..." + + + *: "Legg til speleliste" + + + + id: LANG_ADD_TO_EXISTING_PL + desc: used in the onplay menu + user: core + + *: "Add to Existing Playlist" + + + *: "Legg til denne spelelista" + + + *: "Legg til denne spelelista" + + + + id: LANG_PLAYING_NEXT + desc: used in the onplay menu + user: core + + *: "Playing Next..." + + + *: "Spelar neste..." + + + *: "Spelar neste" + + + + id: LANG_PLAY_NEXT + desc: used in the onplay menu + user: core + + *: "Play Next" + + + *: "Spel neste" + + + *: "Spel neste" + + + + id: LANG_ADD_SHUFFLED + desc: used in the onplay menu + user: core + + *: "Add Shuffled" + + + *: "Legg til tilfeldig" + + + *: "Legg til tilfeldig" + + + + id: LANG_PLAY_LAST + desc: used in the onplay menu + user: core + + *: "Play Last" + + + *: "Spel siste" + + + *: "Spel siste" + + + + id: LANG_PLAY_LAST_SHUFFLED + desc: used in the onplay menu + user: core + + *: "Play Last Shuffled" + + + *: "Spel siste tilfeldige" + + + *: "Spel siste tilfeldige" + + + + id: LANG_VOLUME_ADJUST_MODE + desc: in system settings + user: core + + *: none + perceptual_volume: "Volume Adjustment Mode" + + + *: none + perceptual_volume: "Volumusteringsmodus" + + + *: none + perceptual_volume: "Volumjusteringsmodus" + + + + id: LANG_VOLUME_ADJUST_NORM_STEPS + desc: in system settings + user: core + + *: none + perceptual_volume: "Number of Volume Steps" + + + *: none + perceptual_volume: "Kor mange volumsteg" + + + *: none + perceptual_volume: "Kor mange volumsteg" + + + + id: LANG_PERCEPTUAL + desc: in system settings -> volume adjustment mode + user: core + + *: none + perceptual_volume: "Perceptual" + + + *: none + perceptual_volume: "Oppfatta" + + + *: none + perceptual_volume: "Oppfatta" + + + + id: LANG_SHOW_TRACKS_WHILE_BROWSING + desc: in PictureFlow Main Menu + user: core + + *: "Show Tracks While Browsing" + + + *: "Vis spor når du ser gjennom" + + + *: "Vis spor når du ser gjennom" + + + + id: LANG_GOTO_LAST_ALBUM + desc: in PictureFlow Main Menu + user: core + + *: "Go to Last Album" + + + *: "Gå til siste album" + + + *: "Gå til siste album" + + + + id: LANG_DATABASE_DIR + desc: in database settings menu + user: core + + *: "Database Directory" + + + *: "Databasemappe" + + + *: "Databasemappe" + + + + id: LANG_REMOVE_QUEUED_TRACKS + desc: Confirmation dialog + user: core + + *: "Remove Queued Tracks?" + + + *: "Fjern spor i kø?" + + + *: "Fjern spor i kø?" + + + + id: LANG_QUICK_IGNORE_DIRACHE + desc: in Settings + user: core + + *: "Quick (Ignore Directory Cache)" + + + *: "Raskt (oversjå mappemellomlager)" + + + *: "Raskt (oversjå mappemellomlager)" + + + + id: LANG_WPS + desc: in Settings + user: core + + *: "What's Playing Screen" + + + *: "Speleskjerm" + + + *: "Speleskjerm" + + + + id: LANG_DEFAULT_BROWSER + desc: in Settings + user: core + + *: "Default Browser" + + + *: "Standardlesar" + + + *: "Standardlesar" + + + + id: LANG_SET_MAZE_SIZE + desc: Maze size in Amaze game + user: core + + *: "Set Maze Size" + + + *: "Labyrintstorleik" + + + *: "Labyrintstorleik" + + + + id: LANG_VIEW_MAP + desc: Map in Amaze game + user: core + + *: "View Map" + + + *: "Sjå kartet" + + + *: "Sjå kartet" + + + + id: LANG_SHOW_COMPASS + desc: Compass in Amaze game + user: core + + *: "Show Compass" + + + *: "Vis kompasset" + + + *: "Vis kompasset" + + + + id: LANG_SHOW_MAP + desc: Map in Amaze game + user: core + + *: "Show Map" + + + *: "Vis kartet" + + + *: "Vis kartet" + + + + id: LANG_REMEMBER_PATH + desc: Map in Amaze game + user: core + + *: "Remember Path" + + + *: "Hugs stien" + + + *: "Hugs stien" + + + + id: LANG_USE_LARGE_TILES + desc: Map in Amaze game + user: core + + *: "Use Large Tiles" + + + *: "Bruk store fliser" + + + *: "Bruk store fliser" + + + + id: LANG_SHOW_SOLUTION + desc: Map in Amaze game + user: core + + *: "Show Solution" + + + *: "Vis løysing" + + + *: "Vis løysing" + + + + id: LANG_QUIT_WITHOUT_SAVING + desc: + user: core + + *: "Quit without saving" + + + *: "Avslutt utan å lagra" + + + *: "Avslutt utan å lagra" + + + + id: LANG_GENERATING_MAZE + desc: Amaze game + user: core + + *: "Generating maze..." + + + *: "Lagar labyrint..." + + + *: "Lagar labyrint" + + + + id: LANG_YOU_WIN + desc: Success in game + user: core + + *: "You win!" + + + *: "Du vann!" + + + *: "Du vann!" + + + + id: LANG_YOU_CHEATED + desc: Cheated in game + user: core + + *: "You cheated!" + + + *: "Du juksa!" + + + *: "Du juksa!" + + + + id: LANG_DIFFICULTY_EASY + desc: Game difficulty + user: core + + *: "Easy" + + + *: "Lett" + + + *: "Lett" + + + + id: LANG_DIFFICULTY_MEDIUM + desc: Game difficulty + user: core + + *: "Medium" + + + *: "Middels" + + + *: "Middels" + + + + id: LANG_DIFFICULTY_HARD + desc: Game difficulty + user: core + + *: "Hard" + + + *: "Vanskeleg" + + + *: "Vanskeleg" + + + + id: LANG_DIFFICULTY_EXPERT + desc: Game difficulty + user: core + + *: "Expert" + + + *: "Ekspert" + + + *: "Ekspert" + + + + id: LANG_LEGAL_NOTICES + desc: in system menu + user: core + + *: "Legal Notices" + + + *: "Juridiske merknader" + + + *: "Juridiske merknader" + + + + id: LANG_ERROR_FORMATSTR + desc: for general use + user: core + + *: "Error: %s" + + + *: "Feil: %s" + + + *: "Feil" + + + + id: LANG_MIKMOD_SETTINGS + desc: mikmod plugin + user: core + + *: "Mikmod Settings" + + + *: "Mikmod-innstillingar" + + + *: "Mikmod-innstillingar" + + + + id: VOICE_INVALID_VOICE_FILE + desc: played if the voice file fails to load + user: core + + *: "" + + + *: "" + + + *: "Ugyldig stemmefil" + + + + id: VOICE_LANG_NAME + desc: Spoken name of the language + user: core + + *: "" + + + *: "" + + + *: "Nynorsk" + + + + id: LANG_PERCENT_FORMAT + desc: percent formatting ( `10%` is default , for `10 %` use '%ld %%' , for `%10` use '%%%ld' and so on) + user: core + + *: "%ld%%" + + + *: "%ld%%" + + + *: none + + + + id: LANG_CHOOSE_FILE + desc: file_picker plugin ask user to select a file + user: core + + *: "Choose File" + + + *: "Vel fil" + + + *: "Vel fil" + + + + id: LANG_DISABLE_MAINMENU_SCROLLING + desc: Disable main menu scrolling + user: core + + *: "Disable main menu scrolling" + + + *: "Skru av hovudmenyrulling" + + + *: "Skru av hovudmenyrulling" + + + + id: LANG_REMAINING + desc: Playing Time + user: core + + *: "Remaining" + + + *: "Står att" + + + *: "Står att" + + + + id: LANG_SHOW_FIRST_LETTER + desc: Database menu + user: core + + *: "First Letter" + + + *: "Førebokstav" + + + *: "Førebokstav" + + + + id: LANG_SHOW_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "By First Letter..." + + + *: "Etter førebokstav" + + + *: "Etter førebokstav" + + + + id: LANG_SHOW_ARTISTS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Artists by First Letter" + + + *: "Artistar etter førebokstav" + + + *: "Artistar etter førebokstav" + + + + id: LANG_SHOW_ALBUM_ARTISTS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Album Artists by First Letter" + + + *: "Albumartistar etter førebokstav" + + + *: "Albumartistar etter førebokstav" + + + + id: LANG_SHOW_ALBUMS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Albums by First Letter" + + + *: "Album etter førebokstav" + + + *: "Album etter førebokstav" + + + + id: LANG_SHOW_TRACKS_BY_FIRST_LETTER + desc: Database menu + user: core + + *: "Tracks by First Letter" + + + *: "Spor etter førebokstav" + + + *: "Spor etter førebokstav" + + + + id: LANG_ARTISTS + desc: Database menu + user: core + + *: "Artists" + + + *: "Artistar" + + + *: "Artistar" + + + + id: LANG_ALBUMS + desc: Database menu + user: core + + *: "Albums" + + + *: "Album" + + + *: "Album" + + + + id: LANG_TRACKS + desc: Database menu + user: core + + *: "Tracks" + + + *: "Spor" + + + *: "Spor" + + + + id: LANG_SHUFFLE_SONGS + desc: Database menu + user: core + + *: "Shuffle Songs" + + + *: "Spel songar tilfeldig" + + + *: "Spel songar tilfeldig" + + + + id: LANG_FILENAME + desc: Database and recording menus + user: core + + *: "Filename" + + + *: "Filnamn" + + + *: "Filnamn" + + + + id: LANG_TITLE_WITH_DURATION + desc: Database menu + user: core + + *: "Title (with track duration)" + + + *: "Tittel (med tid)" + + + *: "Tittel med tid" + + + + id: LANG_USER_RATING + desc: Database menu + user: core + + *: "User Rating" + + + *: "Brukarrangering" + + + *: "Brukarrangering" + + + + id: LANG_SEARCH + desc: Database menu + user: core + + *: "Search" + + + *: "Søk" + + + *: "Søk" + + + + id: LANG_SEARCH_BY + desc: Database menu + user: core + + *: "Search by..." + + + *: "Søk etter..." + + + *: "Søk etter" + + + + id: LANG_RECENTLY_ADDED + desc: Database menu + user: core + + *: "Recently Added" + + + *: "Nyst lagt til" + + + *: "Nyst lagt til" + + + + id: LANG_PLAYBACK_HISTORY + desc: Database menu + user: core + + *: "Playback History" + + + *: "Sist spelt" + + + *: "Sist spelt" + + + + id: LANG_CUSTOM_MENU + desc: Database menu + user: core + + *: "Custom menu" + + + *: "Eigen meny" + + + *: "Eigen meny" + + + + id: LANG_SAME_AS_CURRENT + desc: Database menu + user: core + + *: "Same as currently played track" + + + *: "Same som noverande spor" + + + *: "Same som noverande spor" + + + + id: LANG_DIRECTORY + desc: Database menu + user: core + + *: "Directory" + + + *: "Mappe" + + + *: "Mappe" + + + + id: LANG_ALBUMS_BY_YEAR + desc: Database menu + user: core + + *: "Albums by Year" + + + *: "Album etter år" + + + *: "Album etter år" + + + + id: LANG_ALBUMS_BETWEEN_YEARS + desc: Database menu + user: core + + *: "Albums between Years" + + + *: "Album mellom åra" + + + *: "Album mellom åra" + + + + id: LANG_ARTISTS_BETWEEN_YEARS + desc: Database menu + user: core + + *: "Artists between Years" + + + *: "Artistar mellom åra" + + + *: "Artistar mellom åra" + + + + id: LANG_HISTORY_MOST_PLAYED + desc: Database menu + user: core + + *: "Most played (Plays|Score)" + + + *: "Mest spelte (Avspelingar|Vurdering)" + + + *: "Mest spelte etter avspelingar og så vurdering" + + + + id: LANG_HISTORY_RECENTLY_PLAYED_TRACKS + desc: Database menu + user: core + + *: "Recently played tracks" + + + *: "Sist spelte spor" + + + *: "Sist spelte spor" + + + + id: LANG_HISTORY_NEVER_PLAYED_TRACKS + desc: Database menu + user: core + + *: "Never played tracks" + + + *: "Aldri spelte spor" + + + *: "Aldri spelte spor" + + + + id: LANG_HISTORY_FAVOURITE_ARTISTS + desc: Database menu + user: core + + *: "Favourite artists" + + + *: "Favorittartist" + + + *: "Favorittartist" + + + + id: LANG_HISTORY_FAVOURITE_ALBUMS + desc: Database menu + user: core + + *: "Favourite albums" + + + *: "Favorittalbum" + + + *: "Favorittalbum" + + + + id: LANG_HISTORY_RECENT_FAVOURITES + desc: Database menu + user: core + + *: "Recent favourites" + + + *: "Siste favorittar" + + + *: "Siste favorittar" + + + + id: LANG_HISTORY_NEW_FAVOURITES + desc: Database menu + user: core + + *: "New favourites" + + + *: "Nye favorittar" + + + *: "Nye favorittar" + + + + id: LANG_HISTORY_FORGOTTEN_FAVOURITES + desc: Database menu + user: core + + *: "Forgotten favourites" + + + *: "Gløymde favorittar" + + + *: "Gløymde favorittar" + + + + id: LANG_TRACKS_BY + desc: Database menu + user: core + + *: "Tracks by" + + + *: "Spor etter" + + + *: "Spor etter" + + + + id: LANG_VIEW_ALBUMART + desc: WPS context menu + user: core + + *: "View Album Art" + + + *: "Vis omslag" + + + *: "Vis omslag" + + + + id: LANG_TAGNAVI_ALL_TRACKS_SORTED_BY_ALBUM + desc: "[By album]" entry in tag browser + user: core + + *: "[By album]" + + + *: "[Etter album]" + + + *: "Alle spor sorterte etter album" + + + + id: LANG_HP_LO_SELECT + desc: Output Select + user: core + + *: none + erosqnative: "Output Select" + + + *: none + erosqnative: "Vel utgang" + + + *: none + erosqnative: "Vel utgang" + + + + id: LANG_HEADPHONE + desc: in settings_menu + user: core + + *: none + erosqnative: "Headphone" + + + *: none + erosqnative: "Øyreklokker" + + + *: none + erosqnative: "Øyreklokker" + + + + id: LANG_LINEOUT + desc: in settings_menu + user: core + + *: none + erosqnative,lineout_poweroff: "Line Out" + + + *: none + erosqnative,lineout_poweroff: "Lineutgang" + + + *: none + erosqnative,lineout_poweroff: "Lineutgang" + + + + id: LANG_FONT_LOAD_ERROR + desc: Displayed when font loading fails + user: core + + *: "Unable to load font: (%s)" + + + *: "Greidde ikkje lasta skrift: (%s)" + + + *: "Greidde ikkje lasta skrift" + + + + id: LANG_LOGGING + desc: playback logging + user: core + + *: "Logging" + + + *: "~Logging" + + + *: "~logging" + + + + id: LANG_VIEWLOG + desc: view Log + user: core + + *: "View log" + + + *: "Sjå loggen" + + + *: "sjå loggen" + + + + id: LANG_REPLAY_FINISHED_PLAYLIST + desc: Resume playback of finished playlist + user: core + + *: "Playlist finished. Play again?" + + + *: "Spelelista er ferdig. Spel på nytt?" + + + *: "Spelelista er ferdig. Spel på nytt?" + + + + id: LANG_SORT_PLAYLISTS + desc: playlists sorting setting + user: core + + *: "Sort Playlists" + + + *: "Sorter spelelister" + + + *: "sorter spelelister" + + + + id: LANG_USE_LED_INDICATORS + desc: LED indicators setting + user: core + + *: none + general_purpose_led: "Use LED indicators" + + + *: none + general_purpose_led: "Bruk LED-indikatorar" + + + *: none + general_purpose_led: "Bruk LED-indikatorar" + + + + id: LANG_KEEP_DIRECTORY + desc: file browser setting + user: core + + *: "Always remember last folder" + + + *: "Alltid hugs siste mappe" + + + *: "Alltid hugs siste mappe" + + diff --git a/docs/CREDITS b/docs/CREDITS index fa6e3c3b44..06045db966 100644 --- a/docs/CREDITS +++ b/docs/CREDITS @@ -758,6 +758,8 @@ Ingmar Steen Lourenço Soares Yegor Chernyshov Javier Gutiérrez Gertrúdix +Sergey Puskov +Eivind Ødegård The libmad team The wavpack team From 6be230275e1868f7c1e4ab53b69a4b6d16e64e7c Mon Sep 17 00:00:00 2001 From: mojyack Date: Fri, 13 Feb 2026 22:37:47 +0900 Subject: [PATCH 22/24] plugins: pdbox: remove HW_SAMPR_CAPS usage Change-Id: I4e37213a38ac5d1260bc2fa208828abd55fc2647 --- apps/plugins/pdbox/pdbox.c | 22 +++++++++++++++++++++- apps/plugins/pdbox/pdbox.h | 14 +++----------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/apps/plugins/pdbox/pdbox.c b/apps/plugins/pdbox/pdbox.c index 08236bfeba..78d6037fa6 100644 --- a/apps/plugins/pdbox/pdbox.c +++ b/apps/plugins/pdbox/pdbox.c @@ -188,6 +188,26 @@ enum plugin_status plugin_start(const void* parameter) /* Set audio API. */ sys_set_audio_api(API_ROCKBOX); + /* Determine sample rate. */ +#if defined(SIMULATOR) +#define PREFERRED_SAMPR SAMPR_44 +#else +#define PREFERRED_SAMPR SAMPR_22 +#endif + int samplerate; + { + int i; + const struct pcm_sink_caps* caps = rb->pcm_current_sink_caps(); + for (i = 0; i < caps->num_samprs; i++) { + if (caps->samprs[i] == PREFERRED_SAMPR) + break; + } + if (i == caps->num_samprs) + samplerate = SAMPR_44; + else + samplerate = caps->samprs[i]; + } + /* Initialize audio subsystem. */ sys_open_audio(0, /* No sound input yet */ sys_soundindevlist, @@ -197,7 +217,7 @@ enum plugin_status plugin_start(const void* parameter) sys_soundoutdevlist, -1, /* Use the default amount (2) of channels */ sys_choutlist, - PD_SAMPLERATE, /* Sample rate */ + samplerate, /* Sample rate */ DEFAULTADVANCE, /* Scheduler advance */ 1 /* Enable */); diff --git a/apps/plugins/pdbox/pdbox.h b/apps/plugins/pdbox/pdbox.h index 8dcb152479..36fb6c4fa8 100644 --- a/apps/plugins/pdbox/pdbox.h +++ b/apps/plugins/pdbox/pdbox.h @@ -40,17 +40,9 @@ #define calloc(elements, elem_size) tlsf_calloc(elements, elem_size) /* Audio declarations. */ -#ifdef SIMULATOR - #define PD_SAMPLERATE 44100 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_22) - #define PD_SAMPLERATE 22050 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_32) - #define PD_SAMPLERATE 32000 -#elif (HW_SAMPR_CAPS & SAMPR_CAP_44) - #define PD_SAMPLERATE 44100 -#else - #error No sufficient sample rate available! -#endif +/* Maximum sample rate; used for buffer sizing. + * Actual rate is determined at runtime from pcm sink capabilities. */ +#define PD_SAMPLERATE 44100 #define PD_SAMPLES_PER_HZ ((PD_SAMPLERATE / HZ) + \ (PD_SAMPLERATE % HZ > 0 ? 1 : 0)) #define PD_OUT_CHANNELS 2 From a2f652cf1f7d1b9718683fa97415065f9df22c48 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 1 Apr 2026 10:32:40 -0400 Subject: [PATCH 23/24] disktidy: Add '__MACOSX' directories to the list Change-Id: If25ccbeaf1ada8ae4bcc9a1853302c297f7a3e08 --- apps/plugins/disktidy.config | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/plugins/disktidy.config b/apps/plugins/disktidy.config index d37fa9f66d..98bb77e6e6 100644 --- a/apps/plugins/disktidy.config +++ b/apps/plugins/disktidy.config @@ -19,6 +19,7 @@ .Trashes/: no .Spotlight-V100/: no .DS_Store: no + __MACOSX/: no ._*: no < Linux/BSD >: no .Trash-*/: no From 0e7718ed4ecf3eaa0f1c788c78f2c2d672f65e34 Mon Sep 17 00:00:00 2001 From: Solomon Peachy Date: Wed, 1 Apr 2026 08:47:34 -0400 Subject: [PATCH 24/24] voice: Add Norwegian Nynorsk voicefile synthesis (Enabled, as it now has >98% coverage) Change-Id: Ie14c28cf279cf8bb2215deb8f1ec597cb980b3ab --- tools/builds.pm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/builds.pm b/tools/builds.pm index 1a283dd9b1..0aafee756f 100644 --- a/tools/builds.pm +++ b/tools/builds.pm @@ -782,7 +782,7 @@ sub simbuilds { 'norsk' => { 'lang' => 'norsk', 'name' => 'Norsk (Norwegian)', - 'short' => 'no', + 'short' => 'nb', 'defengine' => 'piper', 'engines' => { 'espeak' => '-vno', @@ -791,6 +791,18 @@ sub simbuilds { }, 'enabled' => 0, }, + 'norsk-nynorsk' => { + 'lang' => 'norsk-nynorsk', + 'name' => 'Nynorsk (Norwegian Nynorsk)', + 'short' => 'nn', + 'defengine' => 'piper', + 'engines' => { + 'espeak' => '-vno', + 'gtts' => '-l no', + 'piper' => 'no_NO-talesyntese-medium.onnx', + }, + 'enabled' => 1, + }, 'moldoveneste' => { 'lang' => 'moldoveneste', 'name' => 'Moldovenească (Moldavian)',