A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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