mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
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:
parent
780e8dd0ef
commit
d108849812
3 changed files with 109 additions and 31 deletions
|
@ -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)
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue