A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 368 lines 12 kB view raw
1/*************************************************************************** 2* __________ __ ___. 3* Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7* \/ \/ \/ \/ \/ 8* $Id$ 9* 10* Greyscale demo plugin 11* 12* Copyright (C) 2004-2008 Jens Arnold 13* 14* This program is free software; you can redistribute it and/or 15* modify it under the terms of the GNU General Public License 16* as published by the Free Software Foundation; either version 2 17* of the License, or (at your option) any later version. 18* 19* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20* KIND, either express or implied. 21* 22****************************************************************************/ 23 24#include "plugin.h" 25#include "lib/helper.h" 26 27#if (LCD_DEPTH < 4) 28#include "lib/grey.h" 29 30 31 32/* variable button definitions */ 33#if CONFIG_KEYPAD == IRIVER_H100_PAD 34#define GREYSCALE_SHIFT BUTTON_ON 35#define GREYSCALE_UP BUTTON_UP 36#define GREYSCALE_DOWN BUTTON_DOWN 37#define GREYSCALE_LEFT BUTTON_LEFT 38#define GREYSCALE_RIGHT BUTTON_RIGHT 39#define GREYSCALE_OFF BUTTON_OFF 40 41#define GREYSCALE_RC_OFF BUTTON_RC_STOP 42 43#elif (CONFIG_KEYPAD == IAUDIO_X5M5_PAD) || (CONFIG_KEYPAD == MROBE100_PAD) 44#define GREYSCALE_SHIFT BUTTON_PLAY /* won't work, but define it anyway */ 45#define GREYSCALE_UP BUTTON_UP 46#define GREYSCALE_DOWN BUTTON_DOWN 47#define GREYSCALE_LEFT BUTTON_LEFT 48#define GREYSCALE_RIGHT BUTTON_RIGHT 49#define GREYSCALE_OFF BUTTON_POWER 50 51#elif (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 52 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 53#define GREYSCALE_SHIFT BUTTON_SELECT 54#define GREYSCALE_UP BUTTON_SCROLL_BACK 55#define GREYSCALE_DOWN BUTTON_SCROLL_FWD 56#define GREYSCALE_LEFT BUTTON_LEFT 57#define GREYSCALE_RIGHT BUTTON_RIGHT 58#define GREYSCALE_OFF BUTTON_MENU 59 60#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 61#define GREYSCALE_SHIFT BUTTON_RC_PLAY /* somewhat dangerous... */ 62#define GREYSCALE_UP BUTTON_RC_VOL_UP 63#define GREYSCALE_DOWN BUTTON_RC_VOL_DOWN 64#define GREYSCALE_LEFT BUTTON_RC_REW 65#define GREYSCALE_RIGHT BUTTON_RC_FF 66#define GREYSCALE_OFF BUTTON_RC_REC 67 68#define GREYSCALE_RC_OFF BUTTON_REC 69 70#elif CONFIG_KEYPAD == SANSA_CLIP_PAD 71#define GREYSCALE_SHIFT BUTTON_SELECT 72#define GREYSCALE_UP BUTTON_UP 73#define GREYSCALE_DOWN BUTTON_DOWN 74#define GREYSCALE_LEFT BUTTON_LEFT 75#define GREYSCALE_RIGHT BUTTON_RIGHT 76#define GREYSCALE_OFF BUTTON_POWER 77 78#elif (CONFIG_KEYPAD == SAMSUNG_YH820_PAD) || \ 79 (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) 80#define GREYSCALE_SHIFT BUTTON_FFWD 81#define GREYSCALE_UP BUTTON_UP 82#define GREYSCALE_DOWN BUTTON_DOWN 83#define GREYSCALE_LEFT BUTTON_LEFT 84#define GREYSCALE_RIGHT BUTTON_RIGHT 85#define GREYSCALE_OFF BUTTON_PLAY 86 87#elif CONFIG_KEYPAD == XDUOO_X3_PAD 88#define GREYSCALE_SHIFT BUTTON_PLAY 89#define GREYSCALE_UP BUTTON_HOME 90#define GREYSCALE_DOWN BUTTON_OPTION 91#define GREYSCALE_LEFT BUTTON_PREV 92#define GREYSCALE_RIGHT BUTTON_NEXT 93#define GREYSCALE_OFF BUTTON_POWER 94 95#endif 96 97#define GFX_HEIGHT (LCD_HEIGHT-8) 98#if LCD_WIDTH < 160 99#define GFX_GREYTONE_WIDTH 86 100#define GFX_GREYTONE_STEP 3 101#else 102#define GFX_GREYTONE_WIDTH 128 103#define GFX_GREYTONE_STEP 2 104#endif 105/******************************* Globals ***********************************/ 106 107GREY_INFO_STRUCT 108static unsigned char *gbuf; 109static size_t gbuf_size = 0; 110 111/**************************** main function ********************************/ 112 113void cleanup(void *parameter) 114{ 115 (void)parameter; 116 117 grey_release(); /* switch off overlay and deinitialize */ 118 /* Turn on backlight timeout (revert to settings) */ 119 backlight_use_settings(); 120} 121 122/* this is only a demo of what the framework can do */ 123int main(void) 124{ 125 int time; 126 int x, y, i; 127 int button, scroll_amount; 128 bool black_border = false; 129 130 static const unsigned char rockbox[] = { 131 /* ........................................... 132 * .####...###...###..#...#.####...###..#...#. 133 * .#...#.#...#.#...#.#..#..#...#.#...#..#.#.. 134 * .####..#...#.#.....###...####..#...#...#... 135 * .#..#..#...#.#...#.#..#..#...#.#...#..#.#.. 136 * .#...#..###...###..#...#.####...###..#...#. 137 * ........................................... 138 * 43 x 7 pixel, 1 bpp 139 */ 140 0x00, 0x3E, 0x0A, 0x0A, 0x1A, 0x24, 0x00, 0x1C, 0x22, 0x22, 141 0x22, 0x1C, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x14, 0x00, 0x3E, 142 0x08, 0x08, 0x14, 0x22, 0x00, 0x3E, 0x2A, 0x2A, 0x2A, 0x14, 143 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x22, 0x14, 0x08, 144 0x14, 0x22, 0x00 145 }; 146 147 static const unsigned char showing[] = { 148 /* ....................................... 149 * ..####.#...#..###..#...#.#.#...#..####. 150 * .#.....#...#.#...#.#...#.#.##..#.#..... 151 * ..###..#####.#...#.#.#.#.#.#.#.#.#..##. 152 * .....#.#...#.#...#.#.#.#.#.#..##.#...#. 153 * .####..#...#..###...#.#..#.#...#..####. 154 * ....................................... 155 * 39 x 7 pixel, 1 bpp 156 */ 157 0x00, 0x24, 0x2A, 0x2A, 0x2A, 0x12, 0x00, 0x3E, 0x08, 0x08, 158 0x08, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x22, 0x1C, 0x00, 0x1E, 159 0x20, 0x18, 0x20, 0x1E, 0x00, 0x3E, 0x00, 0x3E, 0x04, 0x08, 160 0x10, 0x3E, 0x00, 0x1C, 0x22, 0x22, 0x2A, 0x3A, 0x00 161 }; 162 163 static const unsigned char grayscale_grey[] = { 164 /* ....................................................... 165 * ..####.####...###..#...#..####..###...###..#.....#####. 166 * .#.....#...#.#...#.#...#.#.....#...#.#...#.#.....#..... 167 * .#..##.####..#####..#.#...###..#.....#####.#.....####.. 168 * .#...#.#..#..#...#...#.......#.#...#.#...#.#.....#..... 169 * ..####.#...#.#...#...#...####...###..#...#.#####.#####. 170 * ....................................................... 171 * 55 x 7 pixel, 8 bpp 172 */ 173 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 174 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 175 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 176 110,110,110,110,110,110,110, 177 120,120, 20, 20, 20, 20,120,222,222,222,222,120,120,120, 24, 24, 178 24,120,120,226,120,120,120,226,120,120, 28, 28, 28, 28,120,120, 179 230,230,230,120,120,120, 32, 32, 32,120,120,234,120,120,120,120, 180 120, 36, 36, 36, 36, 36,120, 181 130, 20,130,130,130,130,130,222,130,130,130,222,130, 24,130,130, 182 130, 24,130,226,130,130,130,226,130, 28,130,130,130,130,130,230, 183 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130, 184 130, 36,130,130,130,130,130, 185 140, 20,140,140, 20, 20,140,222,222,222,222,140,140, 24, 24, 24, 186 24, 24,140,140,226,140,226,140,140,140, 28, 28, 28,140,140,230, 187 140,140,140,140,140, 32, 32, 32, 32, 32,140,234,140,140,140,140, 188 140, 36, 36, 36, 36,140,140, 189 130, 20,130,130,130, 20,130,222,130,130,222,130,130, 24,130,130, 190 130, 24,130,130,130,226,130,130,130,130,130,130,130, 28,130,230, 191 130,130,130,230,130, 32,130,130,130, 32,130,234,130,130,130,130, 192 130, 36,130,130,130,130,130, 193 120,120, 20, 20, 20, 20,120,222,120,120,120,222,120, 24,120,120, 194 120, 24,120,120,120,226,120,120,120, 28, 28, 28, 28,120,120,120, 195 230,230,230,120,120, 32,120,120,120, 32,120,234,234,234,234,234, 196 120, 36, 36, 36, 36, 36,120, 197 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 198 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 199 110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110, 200 110,110,110,110,110,110,110 201 }; 202 203 /* Turn off backlight timeout */ 204 backlight_ignore_timeout(); 205 206 rb->lcd_setfont(FONT_SYSFIXED); /* select default font */ 207 208 /* get the remainder of the plugin buffer */ 209 gbuf = (unsigned char *) rb->plugin_get_buffer(&gbuf_size); 210 211 /* initialize the greyscale buffer: 212 Archos: 112 pixels wide, 7 rows (56 pixels) high. 213 H1x0: 160 pixels wide, 30 rows (120 pixels) high. */ 214 if (!grey_init(gbuf, gbuf_size, GREY_BUFFERED|GREY_ON_COP, 215 LCD_WIDTH, GFX_HEIGHT, NULL)) 216 { 217 rb->splash(HZ, "Not enough memory."); 218 return PLUGIN_ERROR; 219 } 220 221 /* place greyscale overlay 1 row down */ 222 grey_set_position(0, 8); 223 224 rb->lcd_puts(0, 0, "Shades: 129"); 225 rb->lcd_update(); 226 227#ifdef HAVE_ADJUSTABLE_CPU_FREQ 228 rb->cpu_boost(true); 229#endif 230 grey_show(true); /* switch on greyscale overlay */ 231 232 time = *rb->current_tick; /* start time measurement */ 233 234 grey_set_background(150); 235 grey_clear_display(); /* fill everything with grey 150 */ 236 237 /* draw a dark grey line star background */ 238 grey_set_foreground(80); 239 for (y = 0; y < GFX_HEIGHT; y += 8) /* horizontal part */ 240 { 241 grey_drawline(0, y, (LCD_WIDTH-1), (GFX_HEIGHT-1) - y); /*grey lines */ 242 } 243 for (x = 10; x <= LCD_WIDTH; x += 10) /* vertical part */ 244 { 245 grey_drawline(x, 0, (LCD_WIDTH-1) - x, (GFX_HEIGHT-1)); /*grey lines */ 246 } 247 248 grey_set_foreground(0); 249 grey_drawrect(0, 0, LCD_WIDTH, GFX_HEIGHT); /* black border */ 250 251 /* draw grey tones */ 252 for (i = 0; i < GFX_GREYTONE_WIDTH; i++) 253 { 254 x = ((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2) + i; 255 grey_set_foreground(GFX_GREYTONE_STEP * i); 256 /* vertical lines */ 257 grey_vline(x, (GFX_HEIGHT/8), (GFX_HEIGHT-GFX_HEIGHT/8-1)); 258 } 259 260 grey_set_drawmode(DRMODE_COMPLEMENT); 261 /* invert rectangle (lower half) */ 262 grey_fillrect((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2, (GFX_HEIGHT/2+1), 263 GFX_GREYTONE_WIDTH, (GFX_HEIGHT/2-GFX_HEIGHT/8-1)); 264 /* invert a line */ 265 grey_hline((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2, 266 (LCD_WIDTH+GFX_GREYTONE_WIDTH)/2, (GFX_HEIGHT/2-1)); 267 268 /* show bitmaps (1 bit and 8 bit) */ 269 /* opaque */ 270 grey_set_drawinfo(DRMODE_SOLID, 255, 100); 271 grey_mono_bitmap(rockbox, 272 MAX((LCD_WIDTH/2-47), ((LCD_WIDTH-GFX_GREYTONE_WIDTH)/2)), 273 (5*GFX_HEIGHT/16-4), 43, 7); 274 /* transparent */ 275 grey_set_drawinfo(DRMODE_FG, 0, 100); 276 grey_mono_bitmap(showing, (LCD_WIDTH/2+4) , (5*GFX_HEIGHT/16-4), 39, 7); 277 /* greyscale */ 278 grey_gray_bitmap(grayscale_grey, ((LCD_WIDTH-55)/2), (11*GFX_HEIGHT/16-4), 279 55, 7); 280 281 grey_update(); 282 283 time = *rb->current_tick - time; /* end time measurement */ 284 285 rb->lcd_putsf(0, 0, "Shades: 129, %d.%02ds", time / 100, time % 100); 286 grey_deferred_lcd_update(); /* schedule an lcd_update() */ 287#ifdef HAVE_ADJUSTABLE_CPU_FREQ 288 rb->cpu_boost(false); 289#endif 290 291 /* drawing is now finished, play around with scrolling 292 * until you press OFF or connect USB 293 */ 294 grey_set_background(255); 295 while (true) 296 { 297 scroll_amount = 1; 298 299 button = rb->button_get(true); 300 301 exit_on_usb(button); 302 303 if (button & GREYSCALE_SHIFT) 304 { 305 if (!black_border) 306 { 307 grey_set_background(0); 308 black_border = true; 309 } 310 } 311 else 312 { 313 if (black_border) 314 { 315 grey_set_background(255); 316 black_border = false; 317 } 318 } 319 320 if (button & BUTTON_REPEAT) 321 scroll_amount = 4; 322 323 switch (button & ~(GREYSCALE_SHIFT | BUTTON_REPEAT)) 324 { 325 case GREYSCALE_LEFT: 326 327 grey_scroll_left(scroll_amount); /* scroll left */ 328 grey_update(); 329 break; 330 331 case GREYSCALE_RIGHT: 332 333 grey_scroll_right(scroll_amount); /* scroll right */ 334 grey_update(); 335 break; 336 337 case GREYSCALE_UP: 338 339 grey_scroll_up(scroll_amount); /* scroll up */ 340 grey_update(); 341 break; 342 343 case GREYSCALE_DOWN: 344 345 grey_scroll_down(scroll_amount); /* scroll down */ 346 grey_update(); 347 break; 348#ifdef GREYSCALE_RC_OFF 349 case GREYSCALE_RC_OFF: 350#endif 351 case GREYSCALE_OFF: 352 return PLUGIN_OK; 353 } 354 } 355} 356 357/*************************** Plugin entry point ****************************/ 358 359enum plugin_status plugin_start(const void* parameter) 360{ 361 (void)parameter; 362 363 atexit(cleanup); 364 return main(); 365} 366 367#endif /* #if LCD_DEPTH < 4 */ 368