summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2017-11-24 07:55:56 -0500
committerMichael Sevakis <jethead71@rockbox.org>2017-11-24 08:55:49 -0500
commitabef23608152a2839c34dcfc283d1561b3eadd45 (patch)
treeeb03da5bfd7bc9ec7858e3fed123b93ece24df90
parent75d2e1f35c0ec40f839687ed2d1a670b0da41a36 (diff)
downloadrockbox-abef236.tar.gz
rockbox-abef236.tar.bz2
rockbox-abef236.zip
Do playback restarts the proper way
It isn't necessary to explicitly stop and restart playback to force it to update something that must cause rebuffering. Change-Id: I6ff5394fcafc7374af67ef9fbf9022bb4a79b773
-rw-r--r--apps/gui/skin_engine/skin_parser.c23
-rw-r--r--apps/menus/playback_menu.c2
-rw-r--r--apps/playback.c34
-rw-r--r--apps/playback.h11
-rw-r--r--apps/settings.c44
-rw-r--r--apps/settings.h3
6 files changed, 52 insertions, 65 deletions
diff --git a/apps/gui/skin_engine/skin_parser.c b/apps/gui/skin_engine/skin_parser.c
index 5409861cc7..dce88e9c58 100644
--- a/apps/gui/skin_engine/skin_parser.c
+++ b/apps/gui/skin_engine/skin_parser.c
@@ -2533,22 +2533,13 @@ bool skin_data_load(enum screen_type screen, struct wps_data *wps_data,
}
#endif
#if defined(HAVE_ALBUMART) && !defined(__PCTOOL__)
- int status = audio_status();
- if (status & AUDIO_STATUS_PLAY)
- {
- /* last_albumart_{width,height} is either both 0 or valid AA dimensions */
- struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
- if (aa && (aa->state != WPS_ALBUMART_NONE ||
- (((wps_data->last_albumart_height != aa->height) ||
- (wps_data->last_albumart_width != aa->width)))))
- {
- struct mp3entry *id3 = audio_current_track();
- unsigned long elapsed = id3->elapsed;
- unsigned long offset = id3->offset;
- audio_stop();
- if (!(status & AUDIO_STATUS_PAUSE))
- audio_play(elapsed, offset);
- }
+ /* last_albumart_{width,height} is either both 0 or valid AA dimensions */
+ struct skin_albumart *aa = SKINOFFSETTOPTR(skin_buffer, wps_data->albumart);
+ if (aa && (aa->state != WPS_ALBUMART_NONE ||
+ (((wps_data->last_albumart_height != aa->height) ||
+ (wps_data->last_albumart_width != aa->width)))))
+ {
+ playback_update_aa_dims();
}
#endif
#ifndef __PCTOOL__
diff --git a/apps/menus/playback_menu.c b/apps/menus/playback_menu.c
index a82c88e04a..23f1cb55bf 100644
--- a/apps/menus/playback_menu.c
+++ b/apps/menus/playback_menu.c
@@ -258,7 +258,7 @@ static int playback_callback(int action,const struct menu_item_ex *this_item)
#ifdef HAVE_PLAY_FREQ
if (this_item == &play_frequency)
{
- settings_apply_play_freq(global_settings.play_frequency, false);
+ audio_set_playback_frequency(global_settings.play_frequency);
break;
}
#endif /* HAVE_PLAY_FREQ */
diff --git a/apps/playback.c b/apps/playback.c
index 54410ad2cc..28e520319d 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -52,6 +52,10 @@
#endif
#endif
+#ifdef HAVE_PLAY_FREQ
+#include "pcm_mixer.h"
+#endif
+
/* TODO: The audio thread really is doing multitasking of acting like a
consumer and producer of tracks. It may be advantageous to better
logically separate the two functions. I won't go that far just yet. */
@@ -2523,6 +2527,7 @@ static void audio_start_playback(const struct audio_resume_info *resume_info,
resume.elapsed = id3_get(PLAYING_ID3)->elapsed;
resume.offset = id3_get(PLAYING_ID3)->offset;
track_list_clear(TRACK_LIST_CLEAR_ALL);
+ pcmbuf_update_frequency();
}
else
{
@@ -2556,9 +2561,6 @@ static void audio_start_playback(const struct audio_resume_info *resume_info,
#ifndef PLATFORM_HAS_VOLUME_CHANGE
sound_set_volume(global_settings.volume);
#endif
-#ifdef HAVE_PLAY_FREQ
- settings_apply_play_freq(global_settings.play_frequency, true);
-#endif
pcmbuf_update_frequency();
/* Be sure channel is audible */
@@ -3628,6 +3630,12 @@ void playback_release_aa_slot(int slot)
aa_slot->used--;
}
}
+
+void playback_update_aa_dims(void)
+{
+ LOGFQUEUE("audio >| audio Q_AUDIO_REMAKE_AUDIO_BUFFER");
+ audio_queue_send(Q_AUDIO_REMAKE_AUDIO_BUFFER, 0);
+}
#endif /* HAVE_ALBUMART */
/* Return file byte offset */
@@ -3702,6 +3710,26 @@ void audio_set_crossfade(int enable)
}
#endif /* HAVE_CROSSFADE */
+#ifdef HAVE_PLAY_FREQ
+void audio_set_playback_frequency(int setting)
+{
+ static const unsigned long play_sampr[] = { SAMPR_44, SAMPR_48 };
+
+ if ((unsigned)setting >= ARRAYLEN(play_sampr))
+ setting = 0;
+
+ unsigned long playback_sampr = mixer_get_frequency();
+ unsigned long sampr = play_sampr[setting];
+
+ if (sampr != playback_sampr)
+ {
+ mixer_set_frequency(sampr);
+ LOGFQUEUE("audio >| audio Q_AUDIO_REMAKE_AUDIO_BUFFER");
+ audio_queue_send(Q_AUDIO_REMAKE_AUDIO_BUFFER, 0);
+ }
+}
+#endif /* HAVE_PLAY_FREQ */
+
unsigned int playback_status(void)
{
return play_status;
diff --git a/apps/playback.h b/apps/playback.h
index 177768ded3..8a63bd7907 100644
--- a/apps/playback.h
+++ b/apps/playback.h
@@ -62,12 +62,18 @@ int playback_claim_aa_slot(struct dim *dim);
* Save to call from other threads */
void playback_release_aa_slot(int slot);
+/*
+ * Tells playback to sync buffered album art dimensions
+ *
+ * Save to call from other threads */
+void playback_update_aa_dims(void);
+
struct bufopen_bitmap_data {
struct dim *dim;
struct mp3_albumart *embedded_albumart;
};
-#endif
+#endif /* HAVE_ALBUMART */
/* Functions */
int audio_track_count(void);
@@ -79,6 +85,9 @@ void audio_set_cuesheet(bool enable);
#ifdef HAVE_CROSSFADE
void audio_set_crossfade(int enable);
#endif
+#ifdef HAVE_PLAY_FREQ
+void audio_set_playback_frequency(int setting);
+#endif
size_t audio_get_filebuflen(void);
diff --git a/apps/settings.c b/apps/settings.c
index aa51e051e9..8afec9f806 100644
--- a/apps/settings.c
+++ b/apps/settings.c
@@ -87,10 +87,6 @@ struct system_status global_status;
#include "enc_config.h"
#endif
#include "pcm_sampr.h"
-#ifdef HAVE_PLAY_FREQ
-#include "pcm_mixer.h"
-#include "dsp_core.h"
-#endif
#endif /* CONFIG_CODEC == SWCODEC */
#define NVRAM_BLOCK_SIZE 44
@@ -735,41 +731,6 @@ void settings_apply_pm_range(void)
}
#endif /* HAVE_LCD_BITMAP */
-#ifdef HAVE_PLAY_FREQ
-void settings_apply_play_freq(int value, bool playback)
-{
- static const unsigned long play_sampr[] = { SAMPR_44, SAMPR_48 };
- static int prev_setting = 0;
-
- if ((unsigned)value >= ARRAYLEN(play_sampr))
- value = 0;
-
- bool changed = value != prev_setting;
- prev_setting = value;
-
- unsigned long elapsed = 0;
- unsigned long offset = 0;
- bool playing = changed && !playback &&
- audio_status() == AUDIO_STATUS_PLAY;
-
- if (playing)
- {
- struct mp3entry *id3 = audio_current_track();
- elapsed = id3->elapsed;
- offset = id3->offset;
- }
-
- if (changed && !playback)
- audio_hard_stop();
-
- /* Other sub-areas of playback pick it up from the mixer */
- mixer_set_frequency(play_sampr[value]);
-
- if (playing)
- audio_play(elapsed, offset);
-}
-#endif /* HAVE_PLAY_FREQ */
-
void sound_settings_apply(void)
{
#ifdef AUDIOHW_HAVE_BASS
@@ -1023,10 +984,11 @@ void settings_apply(bool read_disk)
lcd_scroll_delay(global_settings.scroll_delay);
+#if CONFIG_CODEC == SWCODEC
#ifdef HAVE_PLAY_FREQ
- settings_apply_play_freq(global_settings.play_frequency, false);
+ /* before crossfade */
+ audio_set_playback_frequency(global_settings.play_frequency);
#endif
-#if CONFIG_CODEC == SWCODEC
#ifdef HAVE_CROSSFADE
audio_set_crossfade(global_settings.crossfade);
#endif
diff --git a/apps/settings.h b/apps/settings.h
index 5de65bb193..71233d904a 100644
--- a/apps/settings.h
+++ b/apps/settings.h
@@ -224,9 +224,6 @@ void settings_apply_skins(void);
void settings_apply(bool read_disk);
void settings_apply_pm_range(void);
-#ifdef HAVE_PLAY_FREQ
-void settings_apply_play_freq(int value, bool playback);
-#endif
void settings_display(void);
enum optiontype { INT, BOOL };