summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/pcmbuf.c2
-rw-r--r--apps/playback.c45
-rw-r--r--apps/settings.h15
-rw-r--r--apps/settings_list.c13
4 files changed, 68 insertions, 7 deletions
diff --git a/apps/pcmbuf.c b/apps/pcmbuf.c
index c4164c3b4b..8718d730fb 100644
--- a/apps/pcmbuf.c
+++ b/apps/pcmbuf.c
@@ -741,7 +741,7 @@ void pcmbuf_start_track_change(enum pcm_track_change_type type)
741 } 741 }
742 } 742 }
743 743
744 if (auto_skip && global_settings.single_mode && !global_settings.party_mode) 744 if (auto_skip && global_settings.single_mode != SINGLE_MODE_OFF && !global_settings.party_mode)
745 crossfade = false; 745 crossfade = false;
746 746
747 if (crossfade) 747 if (crossfade)
diff --git a/apps/playback.c b/apps/playback.c
index 5d980b5634..4162d9b647 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -2367,6 +2367,31 @@ static void audio_on_handle_finished(int hid)
2367 } 2367 }
2368} 2368}
2369 2369
2370static inline char* single_mode_get_id3_tag(struct mp3entry *id3)
2371{
2372 struct mp3entry *valid_id3 = valid_mp3entry(id3);
2373 if (valid_id3 == NULL)
2374 return NULL;
2375
2376 switch (global_settings.single_mode)
2377 {
2378 case SINGLE_MODE_ALBUM:
2379 return valid_id3->album;
2380 case SINGLE_MODE_ALBUM_ARTIST:
2381 return valid_id3->albumartist;
2382 case SINGLE_MODE_ARTIST:
2383 return valid_id3->artist;
2384 case SINGLE_MODE_COMPOSER:
2385 return valid_id3->composer;
2386 case SINGLE_MODE_GROUPING:
2387 return valid_id3->grouping;
2388 case SINGLE_MODE_GENRE:
2389 return valid_id3->genre_string;
2390 }
2391
2392 return NULL;
2393}
2394
2370/* Called to make an outstanding track skip the current track and to send the 2395/* Called to make an outstanding track skip the current track and to send the
2371 transition events */ 2396 transition events */
2372static void audio_finalise_track_change(void) 2397static void audio_finalise_track_change(void)
@@ -2422,15 +2447,27 @@ static void audio_finalise_track_change(void)
2422 track_id3 = bufgetid3(info.id3_hid); 2447 track_id3 = bufgetid3(info.id3_hid);
2423 } 2448 }
2424 2449
2425 id3_write(PLAYING_ID3, track_id3); 2450 if (SINGLE_MODE_OFF != global_settings.single_mode && global_settings.party_mode == 0 &&
2451 ((skip_pending == TRACK_SKIP_AUTO) || (skip_pending == TRACK_SKIP_AUTO_NEW_PLAYLIST)))
2452 {
2453 bool single_mode_do_pause = true;
2454 if (SINGLE_MODE_TRACK != global_settings.single_mode)
2455 {
2456 char *previous_tag = single_mode_get_id3_tag(id3_get(PLAYING_ID3));
2457 char *new_tag = single_mode_get_id3_tag(track_id3);
2458 single_mode_do_pause = previous_tag == NULL ||
2459 new_tag == NULL ||
2460 strcmp(previous_tag, new_tag) != 0;
2461 }
2426 2462
2427 if (global_settings.single_mode) 2463 if (single_mode_do_pause)
2428 if ( ((skip_pending == TRACK_SKIP_AUTO) || (skip_pending == TRACK_SKIP_AUTO_NEW_PLAYLIST))
2429 && (global_settings.party_mode == 0) )
2430 { 2464 {
2431 play_status = PLAY_PAUSED; 2465 play_status = PLAY_PAUSED;
2432 pcmbuf_pause(true); 2466 pcmbuf_pause(true);
2433 } 2467 }
2468 }
2469
2470 id3_write(PLAYING_ID3, track_id3);
2434 2471
2435 /* The skip is technically over */ 2472 /* The skip is technically over */
2436 skip_pending = TRACK_SKIP_NONE; 2473 skip_pending = TRACK_SKIP_NONE;
diff --git a/apps/settings.h b/apps/settings.h
index 79b47f6a0f..b3c31476e3 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -108,6 +108,18 @@ enum
108 NUM_REPEAT_MODES 108 NUM_REPEAT_MODES
109}; 109};
110 110
111/* single mode options */
112enum {
113 SINGLE_MODE_OFF = 0,
114 SINGLE_MODE_TRACK,
115 SINGLE_MODE_ALBUM,
116 SINGLE_MODE_ALBUM_ARTIST,
117 SINGLE_MODE_ARTIST,
118 SINGLE_MODE_COMPOSER,
119 SINGLE_MODE_GROUPING,
120 SINGLE_MODE_GENRE
121};
122
111enum 123enum
112{ 124{
113 QUEUE_HIDE = 0, 125 QUEUE_HIDE = 0,
@@ -476,7 +488,8 @@ struct user_settings
476 int default_codepage; /* set default codepage for tag conversion */ 488 int default_codepage; /* set default codepage for tag conversion */
477 bool hold_lr_for_scroll_in_list; /* hold L/R scrolls the list left/right */ 489 bool hold_lr_for_scroll_in_list; /* hold L/R scrolls the list left/right */
478 bool play_selected; /* Plays selected file even in shuffle mode */ 490 bool play_selected; /* Plays selected file even in shuffle mode */
479 bool single_mode; /* single mode - stop after every track */ 491 int single_mode; /* single mode - stop after every track, album, album artist,
492 artist, composer, work, or genre */
480 bool party_mode; /* party mode - unstoppable music */ 493 bool party_mode; /* party mode - unstoppable music */
481 bool audioscrobbler; /* Audioscrobbler logging */ 494 bool audioscrobbler; /* Audioscrobbler logging */
482 bool cuesheet; 495 bool cuesheet;
diff --git a/apps/settings_list.c b/apps/settings_list.c
index f93b3c272a..982b483874 100644
--- a/apps/settings_list.c
+++ b/apps/settings_list.c
@@ -1243,7 +1243,18 @@ const struct settings_list settings[] = {
1243#endif 1243#endif
1244 /* more playback */ 1244 /* more playback */
1245 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL), 1245 OFFON_SETTING(0,play_selected,LANG_PLAY_SELECTED,true,"play selected",NULL),
1246 OFFON_SETTING(0,single_mode,LANG_SINGLE_MODE,false,"single mode",NULL), 1246 CHOICE_SETTING(0, single_mode, LANG_SINGLE_MODE, 0,
1247 "single mode",
1248 "off,track,album,album artist,artist,composer,work,genre",
1249 NULL, 8,
1250 ID2P(LANG_OFF),
1251 ID2P(LANG_TRACK),
1252 ID2P(LANG_ID3_ALBUM),
1253 ID2P(LANG_ID3_ALBUMARTIST),
1254 ID2P(LANG_ID3_ARTIST),
1255 ID2P(LANG_ID3_COMPOSER),
1256 ID2P(LANG_ID3_GROUPING),
1257 ID2P(LANG_ID3_GENRE)),
1247 OFFON_SETTING(0,party_mode,LANG_PARTY_MODE,false,"party mode",NULL), 1258 OFFON_SETTING(0,party_mode,LANG_PARTY_MODE,false,"party mode",NULL),
1248 OFFON_SETTING(0,fade_on_stop,LANG_FADE_ON_STOP,true,"volume fade",NULL), 1259 OFFON_SETTING(0,fade_on_stop,LANG_FADE_ON_STOP,true,"volume fade",NULL),
1249 INT_SETTING(F_TIME_SETTING, ff_rewind_min_step, LANG_FFRW_STEP, 1, 1260 INT_SETTING(F_TIME_SETTING, ff_rewind_min_step, LANG_FFRW_STEP, 1,