diff options
author | Jonas Häggqvist <rasher@rasher.dk> | 2006-07-12 20:07:08 +0000 |
---|---|---|
committer | Jonas Häggqvist <rasher@rasher.dk> | 2006-07-12 20:07:08 +0000 |
commit | 1d789eec71cd4b9c131acbdde18a3c8b68165a06 (patch) | |
tree | 5a71011326e024fc0a8abc8b41116ef548bb5c53 /apps/plugins | |
parent | ebd3d087b682fabc7b89acd8fb44c6169480dc56 (diff) | |
download | rockbox-1d789eec71cd4b9c131acbdde18a3c8b68165a06.tar.gz rockbox-1d789eec71cd4b9c131acbdde18a3c8b68165a06.zip |
Adjust vu_meter plugin for all screens. Patch by Robert Keevil. Slight code policing as well.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10204 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins')
-rw-r--r-- | apps/plugins/vu_meter.c | 272 |
1 files changed, 198 insertions, 74 deletions
diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index d97c834363..e3d56c9d5c 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c | |||
@@ -103,21 +103,15 @@ const struct plugin_api* rb; | |||
103 | #endif | 103 | #endif |
104 | 104 | ||
105 | /* Defines x positions on a logarithmic (dBfs) scale. */ | 105 | /* Defines x positions on a logarithmic (dBfs) scale. */ |
106 | const unsigned char analog_db_scale[] = | 106 | unsigned char analog_db_scale[LCD_WIDTH/2]; |
107 | {0,0,10,15,19,22,25,27,29,31,32,33,35,36,37,38,39,39,40,41,42,42,43,44,44,45,45,46, | 107 | |
108 | 46,47,47,48,48,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,55,56,56}; | 108 | /* Define's y positions, to make the needle arch, like a real needle would. */ |
109 | unsigned char y_values[LCD_WIDTH/2]; | ||
109 | 110 | ||
110 | const unsigned char digital_db_scale[] = | 111 | const unsigned char digital_db_scale[] = |
111 | {0,2,3,5,5,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10, | 112 | {0,2,3,5,5,6,6,6,7,7,7,7,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10, |
112 | 10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11}; | 113 | 10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11}; |
113 | 114 | ||
114 | /* Define's y positions, to make the needle arch, like a real needle would. */ | ||
115 | const unsigned char y_values[] = | ||
116 | {34,34,33,33,32,32,31,31,30,30,29,29,28,28,28,27,27,27,26,26,26,26,25,25,25,25,25,25, | ||
117 | 25,25,25,25,25,25,26,26,26,26,27,27,27,28,28,28,29,29,30,30,31,31,32,32,33,33,34,34}; | ||
118 | |||
119 | const unsigned char led[] = {0x0e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x0e}; | ||
120 | |||
121 | const unsigned char needle_cover[] = | 115 | const unsigned char needle_cover[] = |
122 | {0x18, 0x1c, 0x1c, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1c, 0x1c, 0x18}; | 116 | {0x18, 0x1c, 0x1c, 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1c, 0x1c, 0x18}; |
123 | 117 | ||
@@ -127,6 +121,23 @@ const unsigned char sound_med_level[] = {0x42,0x3C}; | |||
127 | const unsigned char sound_high_level[] = {0x81,0x7E}; | 121 | const unsigned char sound_high_level[] = {0x81,0x7E}; |
128 | const unsigned char sound_max_level[] = {0x0E,0xDF,0x0E}; | 122 | const unsigned char sound_max_level[] = {0x0E,0xDF,0x0E}; |
129 | 123 | ||
124 | const int half_width = LCD_WIDTH / 2; | ||
125 | const int quarter_width = LCD_WIDTH / 4; | ||
126 | const int half_height = LCD_HEIGHT / 2; | ||
127 | |||
128 | /* approx ratio of the previous hard coded values */ | ||
129 | const int analog_mini_1 = (LCD_WIDTH / 2)*0.1; | ||
130 | const int analog_mini_2 = (LCD_WIDTH / 2)*0.25; | ||
131 | const int analog_mini_3 = (LCD_WIDTH / 2)*0.4; | ||
132 | const int analog_mini_4 = (LCD_WIDTH / 2)*0.75; | ||
133 | |||
134 | const int digital_block_width = LCD_WIDTH / 11; | ||
135 | const int digital_block_gap = (int)(LCD_WIDTH / 11) / 10; | ||
136 | /* ammount to lead in on left so 11x blocks are centered - is often 0 */ | ||
137 | const int digital_lead = (LCD_WIDTH - (((int)(LCD_WIDTH / 11))*11) ) / 2; | ||
138 | |||
139 | const int digital_block_height = (LCD_HEIGHT - 54) / 2 ; | ||
140 | |||
130 | #define ANALOG 1 /* The two meter types */ | 141 | #define ANALOG 1 /* The two meter types */ |
131 | #define DIGITAL 2 | 142 | #define DIGITAL 2 |
132 | 143 | ||
@@ -135,7 +146,7 @@ int left_needle_top_x; | |||
135 | int last_left_needle_top_x; | 146 | int last_left_needle_top_x; |
136 | int right_needle_top_y; | 147 | int right_needle_top_y; |
137 | int right_needle_top_x; | 148 | int right_needle_top_x; |
138 | int last_right_needle_top_x = 56; | 149 | int last_right_needle_top_x = LCD_WIDTH / 2; |
139 | 150 | ||
140 | int num_left_leds; | 151 | int num_left_leds; |
141 | int num_right_leds; | 152 | int num_right_leds; |
@@ -146,6 +157,12 @@ int i; | |||
146 | 157 | ||
147 | #define MAX_PEAK 0x8000 | 158 | #define MAX_PEAK 0x8000 |
148 | 159 | ||
160 | /* gap at the top for left/right etc */ | ||
161 | #define NEEDLE_TOP 25 | ||
162 | |||
163 | /* pow(M_E, 5) * 65536 */ | ||
164 | #define E_POW_5 9726404 | ||
165 | |||
149 | struct saved_settings { | 166 | struct saved_settings { |
150 | int meter_type; | 167 | int meter_type; |
151 | bool analog_use_db_scale; | 168 | bool analog_use_db_scale; |
@@ -156,7 +173,7 @@ struct saved_settings { | |||
156 | int digital_decay; | 173 | int digital_decay; |
157 | } settings; | 174 | } settings; |
158 | 175 | ||
159 | void reset_settings(void) { | 176 | void reset_settings(void) { |
160 | settings.meter_type=ANALOG; | 177 | settings.meter_type=ANALOG; |
161 | settings.analog_use_db_scale=true; | 178 | settings.analog_use_db_scale=true; |
162 | settings.digital_use_db_scale=true; | 179 | settings.digital_use_db_scale=true; |
@@ -166,6 +183,108 @@ void reset_settings(void) { | |||
166 | settings.digital_decay=0; | 183 | settings.digital_decay=0; |
167 | } | 184 | } |
168 | 185 | ||
186 | /* taken from http://www.quinapalus.com/efunc.html */ | ||
187 | int fxlog(int x) { | ||
188 | int t,y; | ||
189 | |||
190 | y=0xa65af; | ||
191 | if(x<0x00008000) x<<=16, y-=0xb1721; | ||
192 | if(x<0x00800000) x<<= 8, y-=0x58b91; | ||
193 | if(x<0x08000000) x<<= 4, y-=0x2c5c8; | ||
194 | if(x<0x20000000) x<<= 2, y-=0x162e4; | ||
195 | if(x<0x40000000) x<<= 1, y-=0x0b172; | ||
196 | t=x+(x>>1); if((t&0x80000000)==0) x=t,y-=0x067cd; | ||
197 | t=x+(x>>2); if((t&0x80000000)==0) x=t,y-=0x03920; | ||
198 | t=x+(x>>3); if((t&0x80000000)==0) x=t,y-=0x01e27; | ||
199 | t=x+(x>>4); if((t&0x80000000)==0) x=t,y-=0x00f85; | ||
200 | t=x+(x>>5); if((t&0x80000000)==0) x=t,y-=0x007e1; | ||
201 | t=x+(x>>6); if((t&0x80000000)==0) x=t,y-=0x003f8; | ||
202 | t=x+(x>>7); if((t&0x80000000)==0) x=t,y-=0x001fe; | ||
203 | x=0x80000000-x; | ||
204 | y-=x>>15; | ||
205 | return y; | ||
206 | } | ||
207 | |||
208 | /* | ||
209 | * Integer square root routine, good for up to 32-bit values. | ||
210 | * Note that the largest square root (that of 0xffffffff) is | ||
211 | * 0xffff, so the result fits in a regular unsigned and need | ||
212 | * not be `long'. | ||
213 | * | ||
214 | * Original code from Tomas Rokicki (using a well known algorithm). | ||
215 | * This version by Chris Torek, University of Maryland. | ||
216 | * | ||
217 | * This code is in the public domain. | ||
218 | */ | ||
219 | unsigned int root(unsigned long v) | ||
220 | { | ||
221 | register unsigned long t = 1L << 30, r = 0, s; /* 30 = 15*2 */ | ||
222 | |||
223 | #define STEP(k) \ | ||
224 | s = t + r; \ | ||
225 | r >>= 1; \ | ||
226 | if (s <= v) { \ | ||
227 | v -= s; \ | ||
228 | r |= t; \ | ||
229 | } | ||
230 | STEP(15); t >>= 2; | ||
231 | STEP(14); t >>= 2; | ||
232 | STEP(13); t >>= 2; | ||
233 | STEP(12); t >>= 2; | ||
234 | STEP(11); t >>= 2; | ||
235 | STEP(10); t >>= 2; | ||
236 | STEP(9); t >>= 2; | ||
237 | STEP(8); t >>= 2; | ||
238 | STEP(7); t >>= 2; | ||
239 | STEP(6); t >>= 2; | ||
240 | STEP(5); t >>= 2; | ||
241 | STEP(4); t >>= 2; | ||
242 | STEP(3); t >>= 2; | ||
243 | STEP(2); t >>= 2; | ||
244 | STEP(1); t >>= 2; | ||
245 | STEP(0); | ||
246 | return r; | ||
247 | |||
248 | } | ||
249 | |||
250 | void calc_scales(void) | ||
251 | { | ||
252 | unsigned int fx_log_factor = E_POW_5/half_width; | ||
253 | unsigned int y,z; | ||
254 | |||
255 | for (i=1; i <= half_width; i++) | ||
256 | { | ||
257 | y = (half_width/5)*fxlog(i*fx_log_factor); | ||
258 | |||
259 | /* better way of checking for negative values? */ | ||
260 | z = y>>16; | ||
261 | if (z > LCD_WIDTH) | ||
262 | z = 0; | ||
263 | |||
264 | analog_db_scale[i-1] = z; | ||
265 | /* play nice */ | ||
266 | rb->yield(); | ||
267 | } | ||
268 | |||
269 | long j; | ||
270 | long k; | ||
271 | unsigned int l; | ||
272 | int nh = LCD_HEIGHT - NEEDLE_TOP; | ||
273 | long nh2 = nh*nh; | ||
274 | for (i=1; i<=half_width; i++) | ||
275 | { | ||
276 | j = i - (int)(half_width/2); | ||
277 | k = nh2 - ( j * j ); | ||
278 | /* +1 seems to give a closer approximation */ | ||
279 | l = root(k) + 1; | ||
280 | l = LCD_HEIGHT - l; | ||
281 | |||
282 | y_values[i-1] = l; | ||
283 | rb->yield(); | ||
284 | } | ||
285 | |||
286 | } | ||
287 | |||
169 | void load_settings(void) { | 288 | void load_settings(void) { |
170 | int fp = rb->open("/.rockbox/rocks/.vu_meter", O_RDONLY); | 289 | int fp = rb->open("/.rockbox/rocks/.vu_meter", O_RDONLY); |
171 | if(fp>=0) { | 290 | if(fp>=0) { |
@@ -234,7 +353,7 @@ void change_settings(void) | |||
234 | rb->lcd_putsxy(0, 24, "Minimeters:"); | 353 | rb->lcd_putsxy(0, 24, "Minimeters:"); |
235 | if(settings.analog_minimeters) | 354 | if(settings.analog_minimeters) |
236 | rb->lcd_putsxy(65, 24, "On"); | 355 | rb->lcd_putsxy(65, 24, "On"); |
237 | else | 356 | else |
238 | rb->lcd_putsxy(65, 24, "Off"); | 357 | rb->lcd_putsxy(65, 24, "Off"); |
239 | 358 | ||
240 | rb->lcd_putsxy(0, 32, "Decay Speed:"); | 359 | rb->lcd_putsxy(0, 32, "Decay Speed:"); |
@@ -258,7 +377,7 @@ void change_settings(void) | |||
258 | rb->lcd_putsxy(0, 24, "Minimeters:"); | 377 | rb->lcd_putsxy(0, 24, "Minimeters:"); |
259 | if(settings.digital_minimeters) | 378 | if(settings.digital_minimeters) |
260 | rb->lcd_putsxy(65, 24, "On"); | 379 | rb->lcd_putsxy(65, 24, "On"); |
261 | else | 380 | else |
262 | rb->lcd_putsxy(65, 24, "Off"); | 381 | rb->lcd_putsxy(65, 24, "Off"); |
263 | 382 | ||
264 | rb->lcd_putsxy(0, 32, "Decay Speed:"); | 383 | rb->lcd_putsxy(0, 32, "Decay Speed:"); |
@@ -290,8 +409,8 @@ void change_settings(void) | |||
290 | settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; | 409 | settings.meter_type == DIGITAL ? settings.meter_type = ANALOG : settings.meter_type++; |
291 | if(settings.meter_type==ANALOG) { | 410 | if(settings.meter_type==ANALOG) { |
292 | if(selected_setting==1) | 411 | if(selected_setting==1) |
293 | settings.analog_use_db_scale = !settings.analog_use_db_scale; | 412 | settings.analog_use_db_scale = !settings.analog_use_db_scale; |
294 | if(selected_setting==2) | 413 | if(selected_setting==2) |
295 | settings.analog_minimeters = !settings.analog_minimeters; | 414 | settings.analog_minimeters = !settings.analog_minimeters; |
296 | if(selected_setting==3) | 415 | if(selected_setting==3) |
297 | settings.analog_decay == 0 ? settings.analog_decay = 6 : settings.analog_decay--; | 416 | settings.analog_decay == 0 ? settings.analog_decay = 6 : settings.analog_decay--; |
@@ -299,7 +418,7 @@ void change_settings(void) | |||
299 | else { | 418 | else { |
300 | if(selected_setting==1) | 419 | if(selected_setting==1) |
301 | settings.digital_use_db_scale = !settings.digital_use_db_scale; | 420 | settings.digital_use_db_scale = !settings.digital_use_db_scale; |
302 | if(selected_setting==2) | 421 | if(selected_setting==2) |
303 | settings.digital_minimeters = !settings.digital_minimeters; | 422 | settings.digital_minimeters = !settings.digital_minimeters; |
304 | if(selected_setting==3) | 423 | if(selected_setting==3) |
305 | settings.digital_decay == 0 ? settings.digital_decay = 6 : settings.digital_decay--; | 424 | settings.digital_decay == 0 ? settings.digital_decay = 6 : settings.digital_decay--; |
@@ -338,54 +457,54 @@ void change_settings(void) | |||
338 | } | 457 | } |
339 | 458 | ||
340 | void draw_analog_minimeters(void) { | 459 | void draw_analog_minimeters(void) { |
341 | rb->lcd_mono_bitmap(sound_speaker, 0, 12, 4, 8); | 460 | rb->lcd_mono_bitmap(sound_speaker, quarter_width-28, 12, 4, 8); |
342 | rb->lcd_set_drawmode(DRMODE_FG); | 461 | rb->lcd_set_drawmode(DRMODE_FG); |
343 | if(5<left_needle_top_x) | 462 | if(analog_mini_1<left_needle_top_x) |
344 | rb->lcd_mono_bitmap(sound_low_level, 5, 12, 2, 8); | 463 | rb->lcd_mono_bitmap(sound_low_level, quarter_width-23, 12, 2, 8); |
345 | if(12<left_needle_top_x) | 464 | if(analog_mini_2<left_needle_top_x) |
346 | rb->lcd_mono_bitmap(sound_med_level, 7, 12, 2, 8); | 465 | rb->lcd_mono_bitmap(sound_med_level, quarter_width-21, 12, 2, 8); |
347 | if(24<left_needle_top_x) | 466 | if(analog_mini_3<left_needle_top_x) |
348 | rb->lcd_mono_bitmap(sound_high_level, 9, 12, 2, 8); | 467 | rb->lcd_mono_bitmap(sound_high_level, quarter_width-19, 12, 2, 8); |
349 | if(40<left_needle_top_x) | 468 | if(analog_mini_4<left_needle_top_x) |
350 | rb->lcd_mono_bitmap(sound_max_level, 12, 12, 3, 8); | 469 | rb->lcd_mono_bitmap(sound_max_level, quarter_width-16, 12, 3, 8); |
351 | 470 | ||
352 | rb->lcd_set_drawmode(DRMODE_SOLID); | 471 | rb->lcd_set_drawmode(DRMODE_SOLID); |
353 | rb->lcd_mono_bitmap(sound_speaker, 54, 12, 4, 8); | 472 | rb->lcd_mono_bitmap(sound_speaker, quarter_width+half_width-30, 12, 4, 8); |
354 | rb->lcd_set_drawmode(DRMODE_FG); | 473 | rb->lcd_set_drawmode(DRMODE_FG); |
355 | if(5<(right_needle_top_x-56)) | 474 | if(analog_mini_1<(right_needle_top_x-half_width)) |
356 | rb->lcd_mono_bitmap(sound_low_level, 59, 12, 2, 8); | 475 | rb->lcd_mono_bitmap(sound_low_level, quarter_width+half_width-25, 12, 2, 8); |
357 | if(12<(right_needle_top_x-56)) | 476 | if(analog_mini_2<(right_needle_top_x-half_width)) |
358 | rb->lcd_mono_bitmap(sound_med_level, 61, 12, 2, 8); | 477 | rb->lcd_mono_bitmap(sound_med_level, quarter_width+half_width-23, 12, 2, 8); |
359 | if(24<(right_needle_top_x-56)) | 478 | if(analog_mini_3<(right_needle_top_x-half_width)) |
360 | rb->lcd_mono_bitmap(sound_high_level, 63, 12, 2, 8); | 479 | rb->lcd_mono_bitmap(sound_high_level, quarter_width+half_width-21, 12, 2, 8); |
361 | if(40<(right_needle_top_x-56)) | 480 | if(analog_mini_4<(right_needle_top_x-half_width)) |
362 | rb->lcd_mono_bitmap(sound_max_level, 66, 12, 3, 8); | 481 | rb->lcd_mono_bitmap(sound_max_level, quarter_width+half_width-18, 12, 3, 8); |
363 | rb->lcd_set_drawmode(DRMODE_SOLID); | 482 | rb->lcd_set_drawmode(DRMODE_SOLID); |
364 | } | 483 | } |
365 | 484 | ||
366 | void draw_digital_minimeters(void) { | 485 | void draw_digital_minimeters(void) { |
367 | rb->lcd_mono_bitmap(sound_speaker, 34, 24, 4, 8); | 486 | rb->lcd_mono_bitmap(sound_speaker, 34, half_height-8, 4, 8); |
368 | rb->lcd_set_drawmode(DRMODE_FG); | 487 | rb->lcd_set_drawmode(DRMODE_FG); |
369 | if(1<num_left_leds) | 488 | if(1<num_left_leds) |
370 | rb->lcd_mono_bitmap(sound_low_level, 39, 24, 2, 8); | 489 | rb->lcd_mono_bitmap(sound_low_level, 39, half_height-8, 2, 8); |
371 | if(2<num_left_leds) | 490 | if(2<num_left_leds) |
372 | rb->lcd_mono_bitmap(sound_med_level, 41, 24, 2, 8); | 491 | rb->lcd_mono_bitmap(sound_med_level, 41, half_height-8, 2, 8); |
373 | if(5<num_left_leds) | 492 | if(5<num_left_leds) |
374 | rb->lcd_mono_bitmap(sound_high_level, 43, 24, 2, 8); | 493 | rb->lcd_mono_bitmap(sound_high_level, 43, half_height-8, 2, 8); |
375 | if(8<num_left_leds) | 494 | if(8<num_left_leds) |
376 | rb->lcd_mono_bitmap(sound_max_level, 46, 24, 3, 8); | 495 | rb->lcd_mono_bitmap(sound_max_level, 46, half_height-8, 3, 8); |
377 | 496 | ||
378 | rb->lcd_set_drawmode(DRMODE_SOLID); | 497 | rb->lcd_set_drawmode(DRMODE_SOLID); |
379 | rb->lcd_mono_bitmap(sound_speaker, 34, 40, 4, 8); | 498 | rb->lcd_mono_bitmap(sound_speaker, 34, half_height+8, 4, 8); |
380 | rb->lcd_set_drawmode(DRMODE_FG); | 499 | rb->lcd_set_drawmode(DRMODE_FG); |
381 | if(1<(num_right_leds)) | 500 | if(1<(num_right_leds)) |
382 | rb->lcd_mono_bitmap(sound_low_level, 39, 40, 2, 8); | 501 | rb->lcd_mono_bitmap(sound_low_level, 39, half_height+8, 2, 8); |
383 | if(2<(num_right_leds)) | 502 | if(2<(num_right_leds)) |
384 | rb->lcd_mono_bitmap(sound_med_level, 41, 40, 2, 8); | 503 | rb->lcd_mono_bitmap(sound_med_level, 41, half_height+8, 2, 8); |
385 | if(5<(num_right_leds)) | 504 | if(5<(num_right_leds)) |
386 | rb->lcd_mono_bitmap(sound_high_level, 43, 40, 2, 8); | 505 | rb->lcd_mono_bitmap(sound_high_level, 43, half_height+8, 2, 8); |
387 | if(8<(num_right_leds)) | 506 | if(8<(num_right_leds)) |
388 | rb->lcd_mono_bitmap(sound_max_level, 46, 40, 3, 8); | 507 | rb->lcd_mono_bitmap(sound_max_level, 46, half_height+8, 3, 8); |
389 | rb->lcd_set_drawmode(DRMODE_SOLID); | 508 | rb->lcd_set_drawmode(DRMODE_SOLID); |
390 | } | 509 | } |
391 | 510 | ||
@@ -400,12 +519,12 @@ void analog_meter(void) { | |||
400 | #endif | 519 | #endif |
401 | 520 | ||
402 | if(settings.analog_use_db_scale) { | 521 | if(settings.analog_use_db_scale) { |
403 | left_needle_top_x = analog_db_scale[left_peak * 56 / MAX_PEAK]; | 522 | left_needle_top_x = analog_db_scale[left_peak * half_width / MAX_PEAK]; |
404 | right_needle_top_x = analog_db_scale[right_peak * 56 / MAX_PEAK] + 56; | 523 | right_needle_top_x = analog_db_scale[right_peak * half_width / MAX_PEAK] + half_width; |
405 | } | 524 | } |
406 | else { | 525 | else { |
407 | left_needle_top_x = left_peak * 56 / MAX_PEAK; | 526 | left_needle_top_x = left_peak * half_width / MAX_PEAK; |
408 | right_needle_top_x = right_peak * 56 / MAX_PEAK + 56; | 527 | right_needle_top_x = right_peak * half_width / MAX_PEAK + half_width; |
409 | } | 528 | } |
410 | 529 | ||
411 | /* Makes a decay on the needle */ | 530 | /* Makes a decay on the needle */ |
@@ -416,32 +535,32 @@ void analog_meter(void) { | |||
416 | last_right_needle_top_x = right_needle_top_x; | 535 | last_right_needle_top_x = right_needle_top_x; |
417 | 536 | ||
418 | left_needle_top_y = y_values[left_needle_top_x]; | 537 | left_needle_top_y = y_values[left_needle_top_x]; |
419 | right_needle_top_y = y_values[right_needle_top_x-56]; | 538 | right_needle_top_y = y_values[right_needle_top_x-half_width]; |
420 | 539 | ||
421 | /* Needles */ | 540 | /* Needles */ |
422 | rb->lcd_drawline(28, 63, left_needle_top_x, left_needle_top_y); | 541 | rb->lcd_drawline(quarter_width, LCD_HEIGHT-1, left_needle_top_x, left_needle_top_y); |
423 | rb->lcd_drawline(84, 63, right_needle_top_x, right_needle_top_y); | 542 | rb->lcd_drawline((quarter_width+half_width), LCD_HEIGHT-1, right_needle_top_x, right_needle_top_y); |
424 | 543 | ||
425 | if(settings.analog_minimeters) | 544 | if(settings.analog_minimeters) |
426 | draw_analog_minimeters(); | 545 | draw_analog_minimeters(); |
427 | 546 | ||
428 | /* Needle covers */ | 547 | /* Needle covers */ |
429 | rb->lcd_set_drawmode(DRMODE_FG); | 548 | rb->lcd_set_drawmode(DRMODE_FG); |
430 | rb->lcd_mono_bitmap(needle_cover, 22, 59, 13, 5); | 549 | rb->lcd_mono_bitmap(needle_cover, quarter_width-6, LCD_HEIGHT-5, 13, 5); |
431 | rb->lcd_mono_bitmap(needle_cover, 78, 59, 13, 5); | 550 | rb->lcd_mono_bitmap(needle_cover, half_width+quarter_width-6, LCD_HEIGHT-5, 13, 5); |
432 | rb->lcd_set_drawmode(DRMODE_SOLID); | 551 | rb->lcd_set_drawmode(DRMODE_SOLID); |
433 | 552 | ||
434 | /* Show Left/Right */ | 553 | /* Show Left/Right */ |
435 | rb->lcd_putsxy(16, 12, "Left"); | 554 | rb->lcd_putsxy(quarter_width-12, 12, "Left"); |
436 | rb->lcd_putsxy(70, 12, "Right"); | 555 | rb->lcd_putsxy(half_width+quarter_width-12, 12, "Right"); |
437 | 556 | ||
438 | /* Line above/below the Left/Right text */ | 557 | /* Line above/below the Left/Right text */ |
439 | rb->lcd_drawline(0,9,111,9); | 558 | rb->lcd_drawline(0,9,LCD_WIDTH-1,9); |
440 | rb->lcd_drawline(0,21,111,21); | 559 | rb->lcd_drawline(0,21,LCD_WIDTH-1,21); |
441 | 560 | ||
442 | for(i=0; i<56; i++) { | 561 | for(i=0; i<half_width; i++) { |
443 | rb->lcd_drawpixel(i, (y_values[i])-2); | 562 | rb->lcd_drawpixel(i, (y_values[i])-2); |
444 | rb->lcd_drawpixel(i+56, (y_values[i])-2); | 563 | rb->lcd_drawpixel(i+half_width, (y_values[i])-2); |
445 | } | 564 | } |
446 | } | 565 | } |
447 | 566 | ||
@@ -465,17 +584,20 @@ void digital_meter(void) { | |||
465 | 584 | ||
466 | num_left_leds = (num_left_leds+last_num_left_leds*settings.digital_decay)/(settings.digital_decay+1); | 585 | num_left_leds = (num_left_leds+last_num_left_leds*settings.digital_decay)/(settings.digital_decay+1); |
467 | num_right_leds = (num_right_leds+last_num_right_leds*settings.digital_decay)/(settings.digital_decay+1); | 586 | num_right_leds = (num_right_leds+last_num_right_leds*settings.digital_decay)/(settings.digital_decay+1); |
468 | 587 | ||
469 | last_num_left_leds = num_left_leds; | 588 | last_num_left_leds = num_left_leds; |
470 | last_num_right_leds = num_right_leds; | 589 | last_num_right_leds = num_right_leds; |
471 | 590 | ||
472 | rb->lcd_set_drawmode(DRMODE_FG); | 591 | rb->lcd_set_drawmode(DRMODE_FG); |
473 | /* LEDS */ | 592 | /* LEDS */ |
474 | for(i=0; i<num_left_leds; i++) | 593 | for(i=0; i<num_left_leds; i++) |
475 | rb->lcd_mono_bitmap(led, i*9+2+i, 14, 9, 5); | 594 | rb->lcd_fillrect((digital_lead + (i*digital_block_width)), |
595 | 14, digital_block_width - digital_block_gap, digital_block_height); | ||
476 | 596 | ||
477 | for(i=0; i<num_right_leds; i++) | 597 | for(i=0; i<num_right_leds; i++) |
478 | rb->lcd_mono_bitmap(led, i*9+2+i, 52, 9, 5); | 598 | rb->lcd_fillrect((digital_lead + (i*digital_block_width)), |
599 | (half_height + 20), digital_block_width - digital_block_gap, | ||
600 | digital_block_height); | ||
479 | 601 | ||
480 | rb->lcd_set_drawmode(DRMODE_SOLID); | 602 | rb->lcd_set_drawmode(DRMODE_SOLID); |
481 | 603 | ||
@@ -483,27 +605,29 @@ void digital_meter(void) { | |||
483 | draw_digital_minimeters(); | 605 | draw_digital_minimeters(); |
484 | 606 | ||
485 | /* Lines above/below where the LEDS are */ | 607 | /* Lines above/below where the LEDS are */ |
486 | rb->lcd_drawline(0,12,111,12); | 608 | rb->lcd_drawline(0,12,LCD_WIDTH-1,12); |
487 | rb->lcd_drawline(0,20,111,20); | 609 | rb->lcd_drawline(0,half_height-12,LCD_WIDTH-1,half_height-12); |
488 | 610 | ||
489 | rb->lcd_drawline(0,50,111,50); | 611 | rb->lcd_drawline(0,half_height+18,LCD_WIDTH-1,half_height+18); |
490 | rb->lcd_drawline(0,58,111,58); | 612 | rb->lcd_drawline(0,LCD_HEIGHT-6,LCD_WIDTH-1,LCD_HEIGHT-6); |
491 | 613 | ||
492 | /* Show Left/Right */ | 614 | /* Show Left/Right */ |
493 | rb->lcd_putsxy(2, 24, "Left"); | 615 | rb->lcd_putsxy(2, half_height-8, "Left"); |
494 | rb->lcd_putsxy(2, 40, "Right"); | 616 | rb->lcd_putsxy(2, half_height+8, "Right"); |
495 | 617 | ||
496 | /* Line in the middle */ | 618 | /* Line in the middle */ |
497 | rb->lcd_drawline(0,35,111,35); | 619 | rb->lcd_drawline(0,half_height+3,LCD_WIDTH-1,half_height+3); |
498 | } | 620 | } |
499 | 621 | ||
500 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { | 622 | enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { |
501 | int button; | 623 | int button; |
502 | int lastbutton = BUTTON_NONE; | 624 | int lastbutton = BUTTON_NONE; |
503 | 625 | ||
504 | (void) parameter; | 626 | (void) parameter; |
505 | rb = api; | 627 | rb = api; |
506 | 628 | ||
629 | calc_scales(); | ||
630 | |||
507 | load_settings(); | 631 | load_settings(); |
508 | rb->lcd_setfont(FONT_SYSFIXED); | 632 | rb->lcd_setfont(FONT_SYSFIXED); |
509 | 633 | ||
@@ -511,13 +635,13 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { | |||
511 | { | 635 | { |
512 | rb->lcd_clear_display(); | 636 | rb->lcd_clear_display(); |
513 | 637 | ||
514 | rb->lcd_putsxy(33, 0, "VU Meter"); | 638 | rb->lcd_putsxy(half_width-23, 0, "VU Meter"); |
515 | 639 | ||
516 | if(settings.meter_type==ANALOG) | 640 | if(settings.meter_type==ANALOG) |
517 | analog_meter(); | 641 | analog_meter(); |
518 | else | 642 | else |
519 | digital_meter(); | 643 | digital_meter(); |
520 | 644 | ||
521 | rb->lcd_update(); | 645 | rb->lcd_update(); |
522 | 646 | ||
523 | button = rb->button_get_w_tmo(1); | 647 | button = rb->button_get_w_tmo(1); |
@@ -575,4 +699,4 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { | |||
575 | lastbutton = button; | 699 | lastbutton = button; |
576 | } | 700 | } |
577 | } | 701 | } |
578 | #endif /* #ifdef HAVE_LCD_BITMAP and HWCODEC */ | 702 | #endif /* #ifdef HAVE_LCD_BITMAP */ |