A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 436 lines 10 kB view raw
1/*************************************************************************** 2 * __________ __ ___. 3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___ 4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / 5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < 6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ 7 * \/ \/ \/ \/ \/ 8 * $Id$ 9 * 10 * Copyright (C) 2007 Jens Arnold 11 * 12 * This program is free software; you can redistribute it and/or 13 * modify it under the terms of the GNU General Public License 14 * as published by the Free Software Foundation; either version 2 15 * of the License, or (at your option) any later version. 16 * 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 18 * KIND, either express or implied. 19 * 20 ****************************************************************************/ 21 22.macro LEFT8_PW dW1, dW2 | needs %d0 == 24, clobbers %d2 23 lsl.l #8, \dW1 | changes dW1, keeps dW2 24 move.l \dW2, %d2 25 lsr.l %d0, %d2 26 or.l %d2, \dW1 27.endm 28 29.macro LEFT24_PW dW1, dW2 | needs %d0 == 24, clobbers %d2 30 lsl.l %d0, \dW1 | changes dW1, keeps dW2 31 move.l \dW2, %d2 32 lsr.l #8, %d2 33 or.l %d2, \dW1 34.endm 35 36/*****************************************************************************/ 37 38 .align 2 39 .global MC_put_o_8 40 .type MC_put_o_8, @function 41 42MC_put_o_8: 43 movem.l (4,%sp), %a0-%a1 | dest, source 44 move.l %a1, %d0 45 and.l #3, %d0 46 sub.l %d0, %a1 | align source 47 jmp.l (2, %pc, %d0.l*4) 48 bra.w .po8_0 49 bra.w .po8_1 50 bra.w .po8_2 51 | last table entry coincides with target 52 53.po8_3: 54 lea.l (-5*4,%sp), %sp 55 movem.l %d2-%d5/%a2, (%sp) | save some registers 56 move.l (5*4+12,%sp), %a2 | stride 57 move.l (5*4+16,%sp), %d1 | height 58 moveq.l #24, %d0 | shift amount 591: 60 movem.l (%a1), %d3-%d5 61 add.l %a2, %a1 62 LEFT24_PW %d3, %d4 63 lsl.l %d0, %d4 64 lsr.l #8, %d5 65 or.l %d5, %d4 66 movem.l %d3-%d4, (%a0) 67 add.l %a2, %a0 68 subq.l #1, %d1 69 bne.s 1b 70 movem.l (%sp), %d2-%d5/%a2 71 lea.l (5*4,%sp), %sp 72 rts 73 74.po8_2: 75 lea.l (-3*4,%sp), %sp 76 movem.l %d2-%d4, (%sp) | save some registers 77 movem.l (3*4+12,%sp), %d0-%d1 | stride, height 781: 79 movem.l (%a1), %d2-%d4 80 add.l %d0, %a1 81 swap %d2 82 swap %d3 83 move.w %d3, %d2 84 swap %d4 85 move.w %d4, %d3 86 movem.l %d2-%d3, (%a0) 87 add.l %d0, %a0 88 subq.l #1, %d1 89 bne.s 1b 90 movem.l (%sp), %d2-%d4 91 lea.l (3*4,%sp), %sp 92 rts 93 94.po8_1: 95 lea.l (-5*4,%sp), %sp 96 movem.l %d2-%d5/%a2, (%sp) | save some registers 97 move.l (5*4+12,%sp), %a2 | stride 98 move.l (5*4+16,%sp), %d1 | height 99 moveq.l #24, %d0 | shift amount 1001: 101 movem.l (%a1), %d3-%d5 102 add.l %a2, %a1 103 LEFT8_PW %d3, %d4 104 lsl.l #8, %d4 105 lsr.l %d0, %d5 106 or.l %d5, %d4 107 movem.l %d3-%d4, (%a0) 108 add.l %a2, %a0 109 subq.l #1, %d1 110 bne.s 1b 111 movem.l (%sp), %d2-%d5/%a2 112 lea.l (5*4,%sp), %sp 113 rts 114 115.po8_0: 116 movem.l (12,%sp), %d0-%d1 | stride, height 117 subq.l #4, %d0 | adjust for increment within the loop 1181: 119 move.l (%a1)+, (%a0)+ 120 move.l (%a1), (%a0) 121 add.l %d0, %a0 122 add.l %d0, %a1 123 subq.l #1, %d1 124 bne.s 1b 125 rts 126 127/*****************************************************************************/ 128 129 .align 2 130 .global MC_put_o_16 131 .type MC_put_o_16, @function 132 133MC_put_o_16: 134 lea.l (-7*4,%sp), %sp 135 movem.l %d2-%d7/%a2, (%sp) | save some registers 136 movem.l (7*4+4,%sp), %a0-%a2| dest, source, stride 137 move.l (7*4+16,%sp), %d1 | height 138 move.l %a1, %d0 139 and.l #3, %d0 140 sub.l %d0, %a1 141 jmp.l (2, %pc, %d0.l*4) 142 bra.w .po16_0 143 bra.w .po16_1 144 bra.w .po16_2 145 | last table entry coincides with target 146 147.po16_3: 148 moveq.l #24, %d0 | shift amount 1491: 150 movem.l (%a1), %d3-%d7 151 add.l %a2, %a1 152 LEFT24_PW %d3, %d4 153 LEFT24_PW %d4, %d5 154 LEFT24_PW %d5, %d6 155 lsl.l %d0, %d6 156 lsr.l #8, %d7 157 or.l %d7, %d6 158 movem.l %d3-%d6, (%a0) 159 add.l %a2, %a0 160 subq.l #1, %d1 161 bne.s 1b 162 movem.l (%sp), %d2-%d7/%a2 163 lea.l (7*4,%sp), %sp 164 rts 165 166.po16_2: 1671: 168 movem.l (%a1), %d3-%d7 169 add.l %a2, %a1 170 swap %d3 171 swap %d4 172 move.w %d4, %d3 173 swap %d5 174 move.w %d5, %d4 175 swap %d6 176 move.w %d6, %d5 177 swap %d7 178 move.w %d7, %d6 179 movem.l %d3-%d6, (%a0) 180 add.l %a2, %a0 181 subq.l #1, %d1 182 bne.s 1b 183 movem.l (%sp), %d2-%d7/%a2 184 lea.l (7*4,%sp), %sp 185 rts 186 187.po16_1: 188 moveq.l #24, %d0 | shift amount 1891: 190 movem.l (%a1), %d3-%d7 191 add.l %a2, %a1 192 LEFT8_PW %d3, %d4 193 LEFT8_PW %d4, %d5 194 LEFT8_PW %d5, %d6 195 lsl.l #8, %d6 196 lsr.l %d0, %d7 197 or.l %d7, %d6 198 movem.l %d3-%d6, (%a0) 199 add.l %a2, %a0 200 subq.l #1, %d1 201 bne.s 1b 202 movem.l (%sp), %d2-%d7/%a2 203 lea.l (7*4,%sp), %sp 204 rts 205 206.po16_0: 2071: 208 movem.l (%a1), %d3-%d6 209 add.l %a2, %a1 210 movem.l %d3-%d6, (%a0) 211 add.l %a2, %a0 212 subq.l #1, %d1 213 bne.s 1b 214 movem.l (%sp), %d2-%d7/%a2 215 lea.l (7*4,%sp), %sp 216 rts 217 218/*****************************************************************************/ 219 220.macro AVG_PW dW1, dW2 | needs %d0 == 24, clobbers %d1, %d2, 221 move.l \dW1, %d1 | changes dW1, keeps dW2 222 lsl.l #8, \dW1 223 move.l \dW2, %d2 224 lsr.l %d0, %d2 225 or.l %d2, \dW1 226 move.l %d1, %d2 227 eor.l \dW1, %d1 228 and.l %d2, \dW1 229 move.l #0xfefefefe, %d2 230 and.l %d1, %d2 231 eor.l %d2, %d1 232 lsr.l #1, %d2 233 add.l %d2, \dW1 234 add.l %d1, \dW1 235.endm 236 237/*****************************************************************************/ 238 239 .align 2 240 .global MC_put_x_8 241 .type MC_put_x_8, @function 242 243MC_put_x_8: 244 lea.l (-6*4,%sp), %sp 245 movem.l %d2-%d6/%a2, (%sp) | save some registers 246 movem.l (6*4+4,%sp), %a0-%a2| dest, source, stride 247 move.l (6*4+16,%sp), %d6 | height 248 move.l %a1, %d0 249 and.l #3, %d0 250 sub.l %d0, %a1 251 jmp.l (2, %pc, %d0.l*4) 252 bra.w .px8_0 253 bra.w .px8_1 254 bra.w .px8_2 255 | last table entry coincides with target 256 257.px8_3: 258 moveq.l #24, %d0 2591: 260 movem.l (%a1), %d3-%d5 261 add.l %a2, %a1 262 LEFT24_PW %d3, %d4 263 LEFT24_PW %d4, %d5 264 lsl.l %d0, %d5 265 AVG_PW %d3, %d4 266 AVG_PW %d4, %d5 267 movem.l %d3-%d4, (%a0) 268 add.l %a2, %a0 269 subq.l #1, %d6 270 bne.s 1b 271 movem.l (%sp), %d2-%d6/%a2 272 lea.l (6*4,%sp), %sp 273 rts 274 275.px8_2: 276 moveq.l #24, %d0 2771: 278 movem.l (%a1), %d3-%d5 279 add.l %a2, %a1 280 swap %d3 281 swap %d4 282 move.w %d4, %d3 283 swap %d5 284 move.w %d5, %d4 285 AVG_PW %d3, %d4 286 AVG_PW %d4, %d5 287 movem.l %d3-%d4, (%a0) 288 add.l %a2, %a0 289 subq.l #1, %d6 290 bne.s 1b 291 movem.l (%sp), %d2-%d6/%a2 292 lea.l (6*4,%sp), %sp 293 rts 294 295.px8_1: 296 moveq.l #24, %d0 2971: 298 movem.l (%a1), %d3-%d5 299 add.l %a2, %a1 300 LEFT8_PW %d3, %d4 301 LEFT8_PW %d4, %d5 302 lsl.l #8, %d5 303 AVG_PW %d3, %d4 304 AVG_PW %d4, %d5 305 movem.l %d3-%d4, (%a0) 306 add.l %a2, %a0 307 subq.l #1, %d6 308 bne.s 1b 309 movem.l (%sp), %d2-%d6/%a2 310 lea.l (6*4,%sp), %sp 311 rts 312 313.px8_0: 314 moveq.l #24, %d0 3151: 316 movem.l (%a1), %d3-%d5 317 add.l %a2, %a1 318 AVG_PW %d3, %d4 319 AVG_PW %d4, %d5 320 movem.l %d3-%d4, (%a0) 321 add.l %a2, %a0 322 subq.l #1, %d6 323 bne.s 1b 324 movem.l (%sp), %d2-%d6/%a2 325 lea.l (6*4,%sp), %sp 326 rts 327 328/*****************************************************************************/ 329 330 .align 2 331 .global MC_put_x_16 332 .type MC_put_x_16, @function 333 334MC_put_x_16: 335 lea.l (-8*4,%sp), %sp 336 movem.l %d2-%d7/%a2-%a3, (%sp) | save some registers 337 movem.l (8*4+4,%sp), %a0-%a3 | dest, source, stride, height 338 move.l %a1, %d0 339 and.l #3, %d0 340 sub.l %d0, %a1 341 jmp.l (2, %pc, %d0.l*4) 342 bra.w .px16_0 343 bra.w .px16_1 344 bra.w .px16_2 345 | last table entry coincides with target 346 347.px16_3: 348 moveq.l #24, %d0 3491: 350 movem.l (%a1), %d3-%d7 351 add.l %a2, %a1 352 LEFT24_PW %d3, %d4 353 LEFT24_PW %d4, %d5 354 LEFT24_PW %d5, %d6 355 LEFT24_PW %d6, %d7 356 lsl.l %d0, %d7 357 AVG_PW %d3, %d4 358 AVG_PW %d4, %d5 359 AVG_PW %d5, %d6 360 AVG_PW %d6, %d7 361 movem.l %d3-%d6, (%a0) 362 add.l %a2, %a0 363 subq.l #1, %a3 364 tst.l %a3 365 bne.w 1b 366 movem.l (%sp), %d2-%d7/%a2-%a3 367 lea.l (8*4,%sp), %sp 368 rts 369 370.px16_2: 371 moveq.l #24, %d0 3721: 373 movem.l (%a1), %d3-%d7 374 add.l %a2, %a1 375 swap %d3 376 swap %d4 377 move.w %d4, %d3 378 swap %d5 379 move.w %d5, %d4 380 swap %d6 381 move.w %d6, %d5 382 swap %d7 383 move.w %d7, %d6 384 AVG_PW %d3, %d4 385 AVG_PW %d4, %d5 386 AVG_PW %d5, %d6 387 AVG_PW %d6, %d7 388 movem.l %d3-%d6, (%a0) 389 add.l %a2, %a0 390 subq.l #1, %a3 391 tst.l %a3 392 bne.w 1b 393 movem.l (%sp), %d2-%d7/%a2-%a3 394 lea.l (8*4,%sp), %sp 395 rts 396 397.px16_1: 398 moveq.l #24, %d0 3991: 400 movem.l (%a1), %d3-%d7 401 add.l %a2, %a1 402 LEFT8_PW %d3, %d4 403 LEFT8_PW %d4, %d5 404 LEFT8_PW %d5, %d6 405 LEFT8_PW %d6, %d7 406 lsl.l #8, %d7 407 AVG_PW %d3, %d4 408 AVG_PW %d4, %d5 409 AVG_PW %d5, %d6 410 AVG_PW %d6, %d7 411 movem.l %d3-%d6, (%a0) 412 add.l %a2, %a0 413 subq.l #1, %a3 414 tst.l %a3 415 bne.w 1b 416 movem.l (%sp), %d2-%d7/%a2-%a3 417 lea.l (8*4,%sp), %sp 418 rts 419 420.px16_0: 421 moveq.l #24, %d0 4221: 423 movem.l (%a1), %d3-%d7 424 add.l %a2, %a1 425 AVG_PW %d3, %d4 426 AVG_PW %d4, %d5 427 AVG_PW %d5, %d6 428 AVG_PW %d6, %d7 429 movem.l %d3-%d6, (%a0) 430 add.l %a2, %a0 431 subq.l #1, %a3 432 tst.l %a3 433 bne.w 1b 434 movem.l (%sp), %d2-%d7/%a2-%a3 435 lea.l (8*4,%sp), %sp 436 rts