summaryrefslogtreecommitdiff
path: root/apps/playback.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/playback.c')
-rw-r--r--apps/playback.c45
1 files changed, 41 insertions, 4 deletions
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;