From d108849812280eb69b5a00bd1f79193237b2e51a Mon Sep 17 00:00:00 2001 From: Dan Everton Date: Sun, 5 Mar 2006 19:34:54 +0000 Subject: 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 --- apps/plugin.c | 8 +++- apps/plugin.h | 22 ++++++---- apps/plugins/vu_meter.c | 108 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 108 insertions(+), 30 deletions(-) (limited to 'apps') diff --git a/apps/plugin.c b/apps/plugin.c index 4f6b6e91d7..c26d06dd07 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -52,6 +52,7 @@ #include "splash.h" #if (CONFIG_CODEC == SWCODEC) #include "pcm_playback.h" +#include "dsp.h" #endif #ifdef HAVE_CHARGING @@ -310,9 +311,8 @@ static const struct plugin_api rockbox_api = { #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) mpeg_get_last_header, #endif -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + sound_set_pitch, -#endif #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) /* MAS communication */ @@ -407,6 +407,10 @@ static const struct plugin_api rockbox_api = { sim_lcd_ex_init, sim_lcd_ex_update_rect, #endif + +#if (CONFIG_CODEC == SWCODEC) + pcm_calculate_peaks, +#endif }; int plugin_load(const char* plugin, void* parameter) diff --git a/apps/plugin.h b/apps/plugin.h index aa4db39d0b..c0ae6c69d1 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -52,6 +52,7 @@ #include "misc.h" #if (HWCODEC == SWCODEC) #include "pcm_playback.h" +#include "dsp.h" #endif #include "settings.h" #include "timer.h" @@ -98,12 +99,12 @@ #define PLUGIN_MAGIC 0x526F634B /* RocK */ /* 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 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 7 +#define PLUGIN_MIN_API_VERSION 8 /* plugin return codes */ enum plugin_status { @@ -167,7 +168,7 @@ struct plugin_api { void (*lcd_bitmap_transparent_part)(const fb_data *src, int src_x, int src_y, int stride, int x, int y, int width, int height); - void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y, + void (*lcd_bitmap_transparent)(const fb_data *src, int x, int y, int width, int height); #endif void (*lcd_putsxy)(int x, int y, const unsigned char *string); @@ -364,9 +365,8 @@ struct plugin_api { #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) unsigned long (*mpeg_get_last_header)(void); #endif -#if (CONFIG_CODEC == MAS3587F) || (CONFIG_CODEC == MAS3539F) + void (*sound_set_pitch)(int pitch); -#endif /* MAS communication */ #if !defined(SIMULATOR) && (CONFIG_CODEC != SWCODEC) @@ -418,7 +418,7 @@ struct plugin_api { bool (*charger_inserted)(void); # ifdef HAVE_CHARGE_STATE bool (*charging_state)(void); -# endif +# endif #endif #ifdef HAVE_USB_POWER bool (*usb_powered)(void); @@ -465,15 +465,19 @@ struct plugin_api { #endif 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); #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_update_rect)(int x, int y, int width, int height); #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 */ diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index b486c3c94e..de0c4667bc 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -17,7 +17,7 @@ **************************************************************************/ #include "plugin.h" -#if defined(HAVE_LCD_BITMAP) && (CONFIG_CODEC != SWCODEC) +#if defined(HAVE_LCD_BITMAP) PLUGIN_HEADER @@ -28,6 +28,10 @@ PLUGIN_HEADER #define VUMETER_MENU BUTTON_F1 #define VUMETER_MENU_EXIT BUTTON_F1 #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 #define VUMETER_QUIT BUTTON_OFF @@ -37,12 +41,62 @@ PLUGIN_HEADER #define VUMETER_MENU (BUTTON_MENU | BUTTON_REPEAT) #define VUMETER_MENU_EXIT BUTTON_MENU #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 const struct plugin_api* rb; -#ifdef SIMULATOR +#if SIMULATOR && (CONFIG_CODEC != SWCODEC) #define mas_codec_readreg(x) rand()%MAX_PEAK #endif @@ -229,7 +283,7 @@ void change_settings(void) quit = true; break; - case BUTTON_LEFT: + case VUMETER_LEFT: if(selected_setting==0) settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; if(settings.meter_type==ANALOG) { @@ -250,7 +304,7 @@ void change_settings(void) } break; - case BUTTON_RIGHT: + case VUMETER_RIGHT: if(selected_setting==0) settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; if(settings.meter_type==ANALOG) { @@ -271,11 +325,11 @@ void change_settings(void) } break; - case BUTTON_DOWN: + case VUMETER_UP: selected_setting == 3 ? selected_setting=0 : selected_setting++; break; - case BUTTON_UP: + case VUMETER_DOWN: selected_setting == 0 ? selected_setting=3 : selected_setting--; } } @@ -334,14 +388,22 @@ void draw_digital_minimeters(void) { } void analog_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.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; + 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 { - left_needle_top_x = rb->mas_codec_readreg(0xC) * 56 / MAX_PEAK; - right_needle_top_x = (rb->mas_codec_readreg(0xD) * 56 / MAX_PEAK)+56; + left_needle_top_x = left_peak * 56 / MAX_PEAK; + right_needle_top_x = right_peak * 56 / MAX_PEAK + 56; } /* Makes a decay on the needle */ @@ -382,13 +444,21 @@ void analog_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) { - num_left_leds = digital_db_scale[rb->mas_codec_readreg(0xC) * 44 / MAX_PEAK]; - num_right_leds = digital_db_scale[rb->mas_codec_readreg(0xD) * 44 / MAX_PEAK]; + num_left_leds = digital_db_scale[left_peak * 44 / MAX_PEAK]; + num_right_leds = digital_db_scale[right_peak * 44 / MAX_PEAK]; } else { - num_left_leds = rb->mas_codec_readreg(0xC) * 11 / MAX_PEAK; - num_right_leds = rb->mas_codec_readreg(0xD) * 11 / MAX_PEAK; + num_left_leds = left_peak * 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); @@ -481,13 +551,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { change_settings(); break; - case BUTTON_UP: - case BUTTON_UP | BUTTON_REPEAT: + case VUMETER_UP: + case VUMETER_UP | BUTTON_REPEAT: change_volume(1); break; - case BUTTON_DOWN: - case BUTTON_DOWN | BUTTON_REPEAT: + case VUMETER_DOWN: + case VUMETER_DOWN | BUTTON_REPEAT: change_volume(-1); break; -- cgit v1.2.3