diff options
Diffstat (limited to 'apps/playback.c')
-rw-r--r-- | apps/playback.c | 45 |
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 | ||
2370 | static 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 */ |
2372 | static void audio_finalise_track_change(void) | 2397 | static 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; |