From e189b33ff4cc530cb6e59a17b260675d7341e551 Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Wed, 2 May 2012 20:53:07 -0400 Subject: 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 --- apps/plugin.h | 6 +++--- apps/plugins/oscilloscope.c | 4 +++- apps/plugins/starfield.c | 6 ++++-- apps/plugins/vu_meter.c | 13 +++++++++---- apps/recorder/peakmeter.c | 7 ++++++- 5 files changed, 25 insertions(+), 11 deletions(-) (limited to 'apps') 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); -- cgit v1.2.3