summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2012-05-02 20:53:07 -0400
committerMichael Sevakis <jethead71@rockbox.org>2012-05-02 20:53:07 -0400
commite189b33ff4cc530cb6e59a17b260675d7341e551 (patch)
tree948b635696cbea2eac432303fa2821cfbff13670 /apps
parentc0208f0f64c68a97c67e42efc1b39df7c75bf7da (diff)
downloadrockbox-e189b33ff4cc530cb6e59a17b260675d7341e551.tar.gz
rockbox-e189b33ff4cc530cb6e59a17b260675d7341e551.tar.bz2
rockbox-e189b33ff4cc530cb6e59a17b260675d7341e551.zip
Clean up peak calculating code.
Mixer needn't keep peak data around that will never be used. Just pass pcm_peaks structure to it instead of allocating for every channel. Plugin API becomes incompatible. vu_meter digital mode was still using global peak calculation; switch it to playback channel like the rest. Remove some accumulated soil peaks inside pcm.c and make it more generic. Change-Id: Ib4d268d80b6a9d09915eea1c91eab483c1a2c009
Diffstat (limited to 'apps')
-rw-r--r--apps/plugin.h6
-rw-r--r--apps/plugins/oscilloscope.c4
-rw-r--r--apps/plugins/starfield.c6
-rw-r--r--apps/plugins/vu_meter.c13
-rw-r--r--apps/recorder/peakmeter.c7
5 files changed, 25 insertions, 11 deletions
diff --git a/apps/plugin.h b/apps/plugin.h
index 588a01262e..4091cecc16 100644
--- a/apps/plugin.h
+++ b/apps/plugin.h
@@ -154,12 +154,12 @@ void* plugin_get_buffer(size_t *buffer_size);
#define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */
-#define PLUGIN_API_VERSION 219
+#define PLUGIN_API_VERSION 220
/* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */
-#define PLUGIN_MIN_API_VERSION 219
+#define PLUGIN_MIN_API_VERSION 220
/* plugin return codes */
/* internal returns start at 0x100 to make exit(1..255) work */
@@ -697,7 +697,7 @@ struct plugin_api {
const void * (*mixer_channel_get_buffer)(enum pcm_mixer_channel channel,
int *count);
void (*mixer_channel_calculate_peaks)(enum pcm_mixer_channel channel,
- int *left, int *right);
+ struct pcm_peaks *peaks);
void (*mixer_channel_play_data)(enum pcm_mixer_channel channel,
pcm_play_callback_type get_more,
const void *start, size_t size);
diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c
index a4be0fbd8e..0bf951f069 100644
--- a/apps/plugins/oscilloscope.c
+++ b/apps/plugins/oscilloscope.c
@@ -881,8 +881,10 @@ enum plugin_status plugin_start(const void* parameter)
left = rb->mas_codec_readreg(0xC);
right = rb->mas_codec_readreg(0xD);
#elif (CONFIG_CODEC == SWCODEC)
+ static struct pcm_peaks peaks;
rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
- &left, &right);
+ &peaks);
+ left = peaks.left; right = peaks.right;
#endif
if (osc.orientation == OSC_HORIZ)
anim_horizontal(left, right);
diff --git a/apps/plugins/starfield.c b/apps/plugins/starfield.c
index 811e9c61ae..30b01b2645 100644
--- a/apps/plugins/starfield.c
+++ b/apps/plugins/starfield.c
@@ -228,9 +228,11 @@ static int plugin_main(void)
/* Get the peaks. ( Borrowed from vu_meter ) */
#if (CONFIG_CODEC == SWCODEC)
- int left_peak, right_peak;
+ static struct pcm_peaks peaks;
rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
- &left_peak, &right_peak);
+ &peaks);
+ #define left_peak peaks.left
+ #define right_peak peaks.right
#else
int left_peak = rb->mas_codec_readreg(0xC);
int right_peak = rb->mas_codec_readreg(0xD);
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c
index 51f2d19f40..ec884442d4 100644
--- a/apps/plugins/vu_meter.c
+++ b/apps/plugins/vu_meter.c
@@ -704,9 +704,11 @@ static void analog_meter(void) {
int left_peak = rb->mas_codec_readreg(0xC);
int right_peak = rb->mas_codec_readreg(0xD);
#elif (CONFIG_CODEC == SWCODEC)
- int left_peak, right_peak;
+ static struct pcm_peaks peaks;
rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
- &left_peak, &right_peak);
+ &peaks);
+ #define left_peak peaks.left
+ #define right_peak peaks.right
#endif
if(vumeter_settings.analog_use_db_scale) {
@@ -762,8 +764,11 @@ static void digital_meter(void) {
int left_peak = rb->mas_codec_readreg(0xC);
int right_peak = rb->mas_codec_readreg(0xD);
#elif (CONFIG_CODEC == SWCODEC)
- int left_peak, right_peak;
- rb->pcm_calculate_peaks(&left_peak, &right_peak);
+ static struct pcm_peaks peaks;
+ rb->mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
+ &peaks);
+ #define left_peak peaks.left
+ #define right_peak peaks.right
#endif
if(vumeter_settings.digital_use_db_scale) {
diff --git a/apps/recorder/peakmeter.c b/apps/recorder/peakmeter.c
index 9f0db3330a..48a695b933 100644
--- a/apps/recorder/peakmeter.c
+++ b/apps/recorder/peakmeter.c
@@ -619,8 +619,13 @@ void peak_meter_peek(void)
/* read current values */
#if CONFIG_CODEC == SWCODEC
if (pm_playback)
+ {
+ static struct pcm_peaks chan_peaks; /* *MUST* be static */
mixer_channel_calculate_peaks(PCM_MIXER_CHAN_PLAYBACK,
- &pm_cur_left, &pm_cur_right);
+ &chan_peaks);
+ pm_cur_left = chan_peaks.left;
+ pm_cur_right = chan_peaks.right;
+ }
#ifdef HAVE_RECORDING
else
pcm_calculate_rec_peaks(&pm_cur_left, &pm_cur_right);