diff --git a/apps/SOURCES b/apps/SOURCES index 313e5e0..cbf0487 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -128,6 +128,7 @@ recorder/radio.c #ifdef HAVE_RECORDING recorder/recording.c #endif +playback.c #if CONFIG_CODEC == SWCODEC #if INPUT_SRC_CAPS != 0 audio_path.c @@ -135,7 +136,6 @@ audio_path.c fixedpoint.c pcmbuf.c codec_thread.c -playback.c codecs.c dsp.c tdspeed.c diff --git a/apps/appevents.h b/apps/appevents.h index 2319489..1cb879f 100644 --- a/apps/appevents.h +++ b/apps/appevents.h @@ -35,6 +35,7 @@ enum { PLAYBACK_EVENT_TRACK_FINISH, PLAYBACK_EVENT_TRACK_CHANGE, PLAYBACK_EVENT_NEXTTRACKID3_AVAILABLE, + PLAYBACK_EVENT_START_PLAYBACK, }; /** Buffering events **/ diff --git a/apps/lang/english.lang b/apps/lang/english.lang index 4d73592..109f50c 100644 --- a/apps/lang/english.lang +++ b/apps/lang/english.lang @@ -13287,3 +13287,17 @@ *: "of" + + id: LANG_PAUSE_BETWEEN_TRACKS + desc: in playback settings menu + user: core + + *: "Pause between tracks" + + + *: "Pause between tracks" + + + *: "Pause between tracks" + + diff --git a/apps/main.c b/apps/main.c index 6d2609b..a34261f 100644 --- a/apps/main.c +++ b/apps/main.c @@ -80,10 +80,8 @@ #include "iap.h" #endif -#if (CONFIG_CODEC == SWCODEC) #include "playback.h" #include "tdspeed.h" -#endif #if (CONFIG_CODEC == SWCODEC) && defined(HAVE_RECORDING) && !defined(SIMULATOR) #include "pcm_record.h" #endif @@ -366,6 +364,7 @@ static void init(void) #endif /* CONFIG_CODEC == SWCODEC */ audio_init(); + playback_init(); button_clear_queue(); /* Empty the keyboard buffer */ settings_apply(true); @@ -624,6 +623,8 @@ static void init(void) #ifdef HAVE_ACCESSORY_SUPPLY accessory_supply_set(global_settings.accessory_supply); #endif + + playback_init(); #ifdef HAVE_HOTSWAP_STORAGE_AS_MAIN check_bootfile(false); /* remember write time and filesize */ #endif diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c index 5be7a8c..f900156 100644 --- a/apps/menus/playback_menu.c +++ b/apps/menus/playback_menu.c @@ -62,6 +62,8 @@ static int playback_callback(int action,const struct menu_item_ex *this_item); MENUITEM_SETTING(shuffle_item, &global_settings.playlist_shuffle, playback_callback); MENUITEM_SETTING(repeat_mode, &global_settings.repeat_mode, playback_callback); MENUITEM_SETTING(play_selected, &global_settings.play_selected, NULL); +MENUITEM_SETTING(pause_between_tracks, &global_settings.pause_between_tracks, + NULL); MENUITEM_SETTING(ff_rewind_accel, &global_settings.ff_rewind_accel, NULL); MENUITEM_SETTING(ff_rewind_min_step, &global_settings.ff_rewind_min_step, NULL); @@ -180,7 +182,7 @@ MENUITEM_SETTING(prevent_skip, &global_settings.prevent_skip, NULL); MAKE_MENU(playback_settings,ID2P(LANG_PLAYBACK),0, Icon_Playback_menu, - &shuffle_item, &repeat_mode, &play_selected, + &shuffle_item, &repeat_mode, &pause_between_tracks, &play_selected, &ff_rewind_settings_menu, #ifdef HAVE_DISK_STORAGE &buffer_margin, diff --git a/apps/mpeg.c b/apps/mpeg.c index 514379c..81c023e 100644 --- a/apps/mpeg.c +++ b/apps/mpeg.c @@ -1289,6 +1289,7 @@ static void mpeg_thread(void) play_pending_track_change = true; update_playlist(); + send_event(PLAYBACK_EVENT_START_PLAYBACK, NULL); current_track_counter++; break; diff --git a/apps/playback.c b/apps/playback.c index ff20172..0e68ba4 100644 --- a/apps/playback.c +++ b/apps/playback.c @@ -27,7 +27,11 @@ #include "playback.h" #include "codec_thread.h" #include "kernel.h" +#if CONFIG_CODEC == SWCODEC #include "codecs.h" +#else +#include "settings.h" +#endif #include "buffering.h" #include "voice_thread.h" #include "usb.h" @@ -55,6 +59,7 @@ #define PLAYBACK_VOICE +#if CONFIG_CODEC == SWCODEC /* amount of guess-space to allow for codecs that must hunt and peck * for their correct seeek target, 32k seems a good size */ #define AUDIO_REBUFFER_GUESS_SIZE (1024*32) @@ -1714,6 +1719,8 @@ static void audio_play_start(size_t offset) last_peek_offset = -1; + send_event(PLAYBACK_EVENT_START_PLAYBACK, NULL); + /* Officially playing */ queue_reply(&audio_queue, 1); @@ -2140,3 +2147,35 @@ int *get_codec_hid() { return &tracks[track_ridx].codec_hid; } +#endif /* CONFIG_CODEC == SWCODEC */ + +static bool starting_playback = false; + +void audio_pause_between_tracks_start_callback(void *data) +{ + (void)data; + starting_playback = true; +} + +void audio_pause_between_tracks_callback(void *data) +{ + (void)data; + if(global_settings.pause_between_tracks + && !global_settings.party_mode && !starting_playback) { +#if CONFIG_CODEC == SWCODEC + queue_post(&audio_queue, Q_AUDIO_PAUSE, true); +#else + audio_pause(); +#endif + } + + starting_playback = false; +} + +void playback_init(void) +{ + add_event(PLAYBACK_EVENT_TRACK_CHANGE, false, + &audio_pause_between_tracks_callback); + add_event(PLAYBACK_EVENT_START_PLAYBACK, false, + &audio_pause_between_tracks_start_callback); +} diff --git a/apps/playback.h b/apps/playback.h index 27e27ff..4c07163 100644 --- a/apps/playback.h +++ b/apps/playback.h @@ -60,6 +60,7 @@ long audio_filebufused(void); void audio_pre_ff_rewind(void); void audio_skip(int direction); void audio_hard_stop(void); /* Stops audio from serving playback */ +void audio_pause(void); #ifdef HAVE_CROSSFADE void audio_set_crossfade(int enable); #endif @@ -113,3 +114,4 @@ enum { }; #endif +void playback_init(void); diff --git a/apps/settings.h b/apps/settings.h index ea7138c..ca2b4ba 100644 --- a/apps/settings.h +++ b/apps/settings.h @@ -506,6 +506,7 @@ struct user_settings #ifdef HAVE_TOUCHPAD_SENSITIVITY_SETTING int touchpad_sensitivity; #endif + bool pause_between_tracks; /* Pauses the playback on track changes */ #ifdef HAVE_HEADPHONE_DETECTION int unplug_mode; /* pause on headphone unplug */ diff --git a/apps/settings_list.c b/apps/settings_list.c index a60ee3f..01a7d6c 100644 --- a/apps/settings_list.c +++ b/apps/settings_list.c @@ -571,6 +571,8 @@ const struct settings_list settings[] = { ,ID2P(LANG_REPEAT_AB) #endif ), /* CHOICE_SETTING( repeat_mode ) */ + OFFON_SETTING(0, pause_between_tracks, LANG_PAUSE_BETWEEN_TRACKS, false, + "pause between tracks", NULL), /* LCD */ #ifdef HAVE_LCD_CONTRAST /* its easier to leave this one un-macro()ed for the time being */