Get VU Meter plugin working on SWCODEC targets. Still needs to be scaled to fit better on larger displays. Also requires bumping the plugin API versions.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8915 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dan Everton 2006-03-05 19:34:54 +00:00
parent 780e8dd0ef
commit d108849812
3 changed files with 109 additions and 31 deletions

View file

@ -52,6 +52,7 @@
#include "splash.h" #include "splash.h"
#if (CONFIG_CODEC == SWCODEC) #if (CONFIG_CODEC == SWCODEC)
#include "pcm_playback.h" #include "pcm_playback.h"
#include "dsp.h"
#endif #endif
#ifdef HAVE_CHARGING #ifdef HAVE_CHARGING
@ -310,9 +311,8 @@ static const struct plugin_api rockbox_api = {
#if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
mpeg_get_last_header, mpeg_get_last_header,
#endif #endif
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
sound_set_pitch, sound_set_pitch,
#endif
#if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
/* MAS communication */ /* MAS communication */
@ -407,6 +407,10 @@ static const struct plugin_api rockbox_api = {
sim_lcd_ex_init, sim_lcd_ex_init,
sim_lcd_ex_update_rect, sim_lcd_ex_update_rect,
#endif #endif
#if (CONFIG_CODEC == SWCODEC)
pcm_calculate_peaks,
#endif
}; };
int plugin_load(const char* plugin, void* parameter) int plugin_load(const char* plugin, void* parameter)

View file

@ -52,6 +52,7 @@
#include "misc.h" #include "misc.h"
#if (HWCODEC == SWCODEC) #if (HWCODEC == SWCODEC)
#include "pcm_playback.h" #include "pcm_playback.h"
#include "dsp.h"
#endif #endif
#include "settings.h" #include "settings.h"
#include "timer.h" #include "timer.h"
@ -98,12 +99,12 @@
#define PLUGIN_MAGIC 0x526F634B /* RocK */ #define PLUGIN_MAGIC 0x526F634B /* RocK */
/* increase this every time the api struct changes */ /* increase this every time the api struct changes */
#define PLUGIN_API_VERSION 9 #define PLUGIN_API_VERSION 10
/* update this to latest version if a change to the api struct breaks /* update this to latest version if a change to the api struct breaks
backwards compatibility (and please take the opportunity to sort in any backwards compatibility (and please take the opportunity to sort in any
new function which are "waiting" at the end of the function table) */ new function which are "waiting" at the end of the function table) */
#define PLUGIN_MIN_API_VERSION 7 #define PLUGIN_MIN_API_VERSION 8
/* plugin return codes */ /* plugin return codes */
enum plugin_status { enum plugin_status {
@ -364,9 +365,8 @@ struct plugin_api {
#if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
unsigned long (*mpeg_get_last_header)(void); unsigned long (*mpeg_get_last_header)(void);
#endif #endif
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
void (*sound_set_pitch)(int pitch); void (*sound_set_pitch)(int pitch);
#endif
/* MAS communication */ /* MAS communication */
#if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC)
@ -465,15 +465,19 @@ struct plugin_api {
#endif #endif
int (*show_logo)(void); int (*show_logo)(void);
/* new stuff at the end, sort into place next time
the API gets incompatible */
struct tree_context* (*tree_get_context)(void); struct tree_context* (*tree_get_context)(void);
#if defined(SIMULATOR) && defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8 #if defined(SIMULATOR) && defined(HAVE_LCD_BITMAP) && LCD_DEPTH < 8
void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int)); void (*sim_lcd_ex_init)(int shades, unsigned long (*getpixel)(int, int));
void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height); void (*sim_lcd_ex_update_rect)(int x, int y, int width, int height);
#endif #endif
#if (CONFIG_CODEC == SWCODEC)
void (*pcm_calculate_peaks)(int *left, int *right);
#endif
/* new stuff at the end, sort into place next time
the API gets incompatible */
}; };
/* plugin header */ /* plugin header */

View file

@ -17,7 +17,7 @@
**************************************************************************/ **************************************************************************/
#include "plugin.h" #include "plugin.h"
#if defined(HAVE_LCD_BITMAP) && (CONFIG_CODEC != SWCODEC) #if defined(HAVE_LCD_BITMAP)
PLUGIN_HEADER PLUGIN_HEADER
@ -28,6 +28,10 @@ PLUGIN_HEADER
#define VUMETER_MENU BUTTON_F1 #define VUMETER_MENU BUTTON_F1
#define VUMETER_MENU_EXIT BUTTON_F1 #define VUMETER_MENU_EXIT BUTTON_F1
#define VUMETER_MENU_EXIT2 BUTTON_OFF #define VUMETER_MENU_EXIT2 BUTTON_OFF
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_UP
#define VUMETER_DOWN BUTTON_DOWN
#elif CONFIG_KEYPAD == ONDIO_PAD #elif CONFIG_KEYPAD == ONDIO_PAD
#define VUMETER_QUIT BUTTON_OFF #define VUMETER_QUIT BUTTON_OFF
@ -37,12 +41,62 @@ PLUGIN_HEADER
#define VUMETER_MENU (BUTTON_MENU | BUTTON_REPEAT) #define VUMETER_MENU (BUTTON_MENU | BUTTON_REPEAT)
#define VUMETER_MENU_EXIT BUTTON_MENU #define VUMETER_MENU_EXIT BUTTON_MENU
#define VUMETER_MENU_EXIT2 BUTTON_OFF #define VUMETER_MENU_EXIT2 BUTTON_OFF
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_UP
#define VUMETER_DOWN BUTTON_DOWN
#elif (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
(CONFIG_KEYPAD == IRIVER_H300_PAD)
#define VUMETER_QUIT BUTTON_OFF
#define VUMETER_HELP BUTTON_ON
#define VUMETER_MENU BUTTON_SELECT
#define VUMETER_MENU_EXIT BUTTON_SELECT
#define VUMETER_MENU_EXIT2 BUTTON_OFF
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_UP
#define VUMETER_DOWN BUTTON_DOWN
#elif (CONFIG_KEYPAD == IPOD_3G_PAD) || \
(CONFIG_KEYPAD == IPOD_4G_PAD)
#define VUMETER_QUIT BUTTON_MENU
#define VUMETER_HELP BUTTON_PLAY
#define VUMETER_MENU BUTTON_SELECT
#define VUMETER_MENU_EXIT BUTTON_SELECT
#define VUMETER_MENU_EXIT2 BUTTON_MENU
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_SCROLL_FWD
#define VUMETER_DOWN BUTTON_SCROLL_BACK
#elif (CONFIG_KEYPAD == GIGABEAT_PAD)
#define VUMETER_QUIT BUTTON_POWER
#define VUMETER_HELP BUTTON_A
#define VUMETER_MENU BUTTON_SELECT
#define VUMETER_MENU_EXIT BUTTON_SELECT
#define VUMETER_MENU_EXIT2 BUTTON_POWER
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_UP
#define VUMETER_DOWN BUTTON_DOWN
#elif CONFIG_KEYPAD == IAUDIO_X5_PAD
#define VUMETER_QUIT BUTTON_POWER
#define VUMETER_HELP BUTTON_PLAY
#define VUMETER_MENU BUTTON_SELECT
#define VUMETER_MENU_EXIT BUTTON_SELECT
#define VUMETER_MENU_EXIT2 BUTTON_POWER
#define VUMETER_LEFT BUTTON_LEFT
#define VUMETER_RIGHT BUTTON_RIGHT
#define VUMETER_UP BUTTON_UP
#define VUMETER_DOWN BUTTON_DOWN
#endif #endif
const struct plugin_api* rb; const struct plugin_api* rb;
#ifdef SIMULATOR #if SIMULATOR && (CONFIG_CODEC != SWCODEC)
#define mas_codec_readreg(x) rand()%MAX_PEAK #define mas_codec_readreg(x) rand()%MAX_PEAK
#endif #endif
@ -229,7 +283,7 @@ void change_settings(void)
quit = true; quit = true;
break; break;
case BUTTON_LEFT: case VUMETER_LEFT:
if(selected_setting==0) if(selected_setting==0)
settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++;
if(settings.meter_type==ANALOG) { if(settings.meter_type==ANALOG) {
@ -250,7 +304,7 @@ void change_settings(void)
} }
break; break;
case BUTTON_RIGHT: case VUMETER_RIGHT:
if(selected_setting==0) if(selected_setting==0)
settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++;
if(settings.meter_type==ANALOG) { if(settings.meter_type==ANALOG) {
@ -271,11 +325,11 @@ void change_settings(void)
} }
break; break;
case BUTTON_DOWN: case VUMETER_UP:
selected_setting == 3 ? selected_setting=0 : selected_setting++; selected_setting == 3 ? selected_setting=0 : selected_setting++;
break; break;
case BUTTON_UP: case VUMETER_DOWN:
selected_setting == 0 ? selected_setting=3 : selected_setting--; selected_setting == 0 ? selected_setting=3 : selected_setting--;
} }
} }
@ -334,14 +388,22 @@ void draw_digital_minimeters(void) {
} }
void analog_meter(void) { void analog_meter(void) {
if(settings.analog_use_db_scale) {
left_needle_top_x = analog_db_scale[rb->mas_codec_readreg(0xC)*56/MAX_PEAK];
right_needle_top_x = analog_db_scale[rb->mas_codec_readreg(0xD)*56/MAX_PEAK]+56;
}
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
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);
#endif
if(settings.analog_use_db_scale) {
left_needle_top_x = analog_db_scale[left_peak * 56 / MAX_PEAK];
right_needle_top_x = analog_db_scale[right_peak * 56 / MAX_PEAK] + 56;
}
else { else {
left_needle_top_x = rb->mas_codec_readreg(0xC) * 56 / MAX_PEAK; left_needle_top_x = left_peak * 56 / MAX_PEAK;
right_needle_top_x = (rb->mas_codec_readreg(0xD) * 56 / MAX_PEAK)+56; right_needle_top_x = right_peak * 56 / MAX_PEAK + 56;
} }
/* Makes a decay on the needle */ /* Makes a decay on the needle */
@ -382,13 +444,21 @@ void analog_meter(void) {
} }
void digital_meter(void) { void digital_meter(void) {
#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F)
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);
#endif
if(settings.digital_use_db_scale) { if(settings.digital_use_db_scale) {
num_left_leds = digital_db_scale[rb->mas_codec_readreg(0xC) * 44 / MAX_PEAK]; num_left_leds = digital_db_scale[left_peak * 44 / MAX_PEAK];
num_right_leds = digital_db_scale[rb->mas_codec_readreg(0xD) * 44 / MAX_PEAK]; num_right_leds = digital_db_scale[right_peak * 44 / MAX_PEAK];
} }
else { else {
num_left_leds = rb->mas_codec_readreg(0xC) * 11 / MAX_PEAK; num_left_leds = left_peak * 11 / MAX_PEAK;
num_right_leds = rb->mas_codec_readreg(0xD) * 11 / MAX_PEAK; num_right_leds = right_peak * 11 / MAX_PEAK;
} }
num_left_leds = (num_left_leds+last_num_left_leds*settings.digital_decay)/(settings.digital_decay+1); num_left_leds = (num_left_leds+last_num_left_leds*settings.digital_decay)/(settings.digital_decay+1);
@ -481,13 +551,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) {
change_settings(); change_settings();
break; break;
case BUTTON_UP: case VUMETER_UP:
case BUTTON_UP | BUTTON_REPEAT: case VUMETER_UP | BUTTON_REPEAT:
change_volume(1); change_volume(1);
break; break;
case BUTTON_DOWN: case VUMETER_DOWN:
case BUTTON_DOWN | BUTTON_REPEAT: case VUMETER_DOWN | BUTTON_REPEAT:
change_volume(-1); change_volume(-1);
break; break;