Mercurial > hg > pa-neon
comparison remap_neon.c @ 5:07763f536182 default tip
ALIGNment support
author | Peter Meerwald <p.meerwald@bct-electronic.com> |
---|---|
date | Sun, 08 Jul 2012 21:48:08 +0200 |
parents | e889fd0e7769 |
children |
comparison
equal
deleted
inserted
replaced
4:1f6289166006 | 5:07763f536182 |
---|---|
237 | 237 |
238 #include "arm_neon.h" | 238 #include "arm_neon.h" |
239 | 239 |
240 static void mono_to_stereo_float_neon_a8(float *dst, const float *src, unsigned n) { | 240 static void mono_to_stereo_float_neon_a8(float *dst, const float *src, unsigned n) { |
241 int i = n & 3; | 241 int i = n & 3; |
242 | 242 |
243 asm volatile ( | 243 asm volatile ( |
244 "mov %[n], %[n], lsr #2\n\t" | 244 "mov %[n], %[n], lsr #2\n\t" |
245 "1:\n\t" | 245 "1:\n\t" |
246 "vld1.32 {q0}, [%[src]]!\n\t" | 246 "vld1.32 {q0}, [%[src]]!\n\t" |
247 "vmov q1, q0\n\t" | 247 "vmov q1, q0\n\t" |
286 } | 286 } |
287 } | 287 } |
288 | 288 |
289 static void mono_to_stereo_int16_neon(int16_t *dst, const int16_t *src, unsigned n) { | 289 static void mono_to_stereo_int16_neon(int16_t *dst, const int16_t *src, unsigned n) { |
290 int i = n & 7; | 290 int i = n & 7; |
291 | 291 |
292 asm volatile ( | 292 asm volatile ( |
293 "mov %[n], %[n], lsr #3\n\t" | 293 "mov %[n], %[n], lsr #3\n\t" |
294 "1:\n\t" | 294 "1:\n\t" |
295 "vld1.16 {q0}, [%[src]]!\n\t" | 295 "vld1.16 {q0}, [%[src]]!\n\t" |
296 "vmov q1, q0\n\t" | 296 "vmov q1, q0\n\t" |
297 "subs %[n], %[n], #1\n\t" | 297 "subs %[n], %[n], #1\n\t" |
298 "vst2.16 {q0,q1}, [%[dst]]!\n\t" | 298 "vst2.16 {q0,q1}, [%[dst]]!\n\t" |
299 "bgt 1b\n\t" | 299 "bgt 1b\n\t" |
300 // output operands (or input operands that get modified) | 300 // output operands (or input operands that get modified) |
301 : [dst] "+r" (dst), [src] "+r" (src), [n] "+r" (n) | 301 : [dst] "+r" (dst), [src] "+r" (src), [n] "+r" (n) |
302 : // input operands | 302 : // input operands |
303 : "memory", "cc" // clobber list | 303 : "memory", "cc" // clobber list |
304 ); | 304 ); |
305 | 305 |
306 while (i--) { | 306 while (i--) { |
397 } | 397 } |
398 } | 398 } |
399 | 399 |
400 #define SAMPLES 1019 | 400 #define SAMPLES 1019 |
401 #define TIMES 500000 | 401 #define TIMES 500000 |
402 #define ALIGN 1 | |
402 | 403 |
403 static void run_test_mono_to_stereo_float(void) { | 404 static void run_test_mono_to_stereo_float(void) { |
404 float stereo_a9[2*SAMPLES]; | 405 float stereo_a9[2*SAMPLES+ALIGN]; |
405 float stereo_a8[2*SAMPLES]; | 406 float stereo_a8[2*SAMPLES+ALIGN]; |
406 float stereo_ref[2*SAMPLES]; | 407 float stereo_ref[2*SAMPLES+ALIGN]; |
407 float stereo_gen[2*SAMPLES]; | 408 float stereo_gen[2*SAMPLES+ALIGN]; |
408 float mono[SAMPLES]; | 409 float mono[SAMPLES+ALIGN]; |
409 int i; | 410 int i; |
410 pa_usec_t start, stop; | 411 pa_usec_t start, stop; |
411 pa_sample_format_t sf; | 412 pa_sample_format_t sf; |
412 pa_sample_spec iss, oss; | 413 pa_sample_spec iss, oss; |
413 pa_remap_t remap; | 414 pa_remap_t remap; |
417 memset(stereo_ref, 0, sizeof(stereo_ref)); | 418 memset(stereo_ref, 0, sizeof(stereo_ref)); |
418 memset(stereo_gen, 0, sizeof(stereo_gen)); | 419 memset(stereo_gen, 0, sizeof(stereo_gen)); |
419 memset(stereo_a9, 0, sizeof(stereo_a9)); | 420 memset(stereo_a9, 0, sizeof(stereo_a9)); |
420 memset(stereo_a8, 0, sizeof(stereo_a8)); | 421 memset(stereo_a8, 0, sizeof(stereo_a8)); |
421 | 422 |
422 for (i = 0; i < SAMPLES; i++) { | 423 for (i = 0; i < SAMPLES+ALIGN; i++) { |
423 mono[i] = rand()/(float) RAND_MAX - 0.5f; | 424 mono[i] = rand()/(float) RAND_MAX - 0.5f; |
424 } | 425 } |
425 | 426 |
426 sf = PA_SAMPLE_FLOAT32NE; | 427 sf = PA_SAMPLE_FLOAT32NE; |
427 remap.format = &sf; | 428 remap.format = &sf; |
432 remap.i_ss = &iss; | 433 remap.i_ss = &iss; |
433 remap.o_ss = &oss; | 434 remap.o_ss = &oss; |
434 remap.map_table_f[0][0] = 1.0; | 435 remap.map_table_f[0][0] = 1.0; |
435 remap.map_table_f[1][0] = 1.0; | 436 remap.map_table_f[1][0] = 1.0; |
436 | 437 |
437 remap_mono_to_stereo_neon_a9(&remap, stereo_a9, mono, SAMPLES); | 438 remap_mono_to_stereo_neon_a9(&remap, stereo_a9+ALIGN, mono+ALIGN, SAMPLES); |
438 remap_mono_to_stereo_neon_a8(&remap, stereo_a8, mono, SAMPLES); | 439 remap_mono_to_stereo_neon_a8(&remap, stereo_a8+ALIGN, mono+ALIGN, SAMPLES); |
439 remap_mono_to_stereo_c(&remap, stereo_ref, mono, SAMPLES); | 440 remap_mono_to_stereo_c(&remap, stereo_ref+ALIGN, mono+ALIGN, SAMPLES); |
440 remap_channels_matrix_c(&remap, stereo_gen, mono, SAMPLES); | 441 remap_channels_matrix_c(&remap, stereo_gen+ALIGN, mono+ALIGN, SAMPLES); |
441 | 442 |
442 for (i = 0; i < 2*SAMPLES; i++) { | 443 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
443 if (fabsf(stereo_a9[i] - stereo_ref[i]) > 0.00001) { | 444 if (fabsf(stereo_a9[i] - stereo_ref[i]) > 0.00001) { |
444 pa_log_debug("NEON/A9 %d: %.3f != %.3f (%.3f)", i, stereo_a9[i], stereo_ref[i], | 445 pa_log_debug("NEON/A9 %d: %.3f != %.3f (%.3f)", i, stereo_a9[i], stereo_ref[i], |
445 mono[i/2]); | 446 mono[i/2]); |
446 } | 447 } |
447 } | 448 } |
448 for (i = 0; i < 2*SAMPLES; i++) { | 449 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
449 if (fabsf(stereo_a8[i] - stereo_ref[i]) > 0.00001) { | 450 if (fabsf(stereo_a8[i] - stereo_ref[i]) > 0.00001) { |
450 pa_log_debug("NEON/A8 %d: %.3f != %.3f (%.3f)", i, stereo_a8[i], stereo_ref[i], | 451 pa_log_debug("NEON/A8 %d: %.3f != %.3f (%.3f)", i, stereo_a8[i], stereo_ref[i], |
451 mono[i/2]); | 452 mono[i/2]); |
452 } | 453 } |
453 } | 454 } |
454 for (i = 0; i < 2*SAMPLES; i++) { | 455 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
455 if (fabsf(stereo_gen[i] - stereo_ref[i]) > 0.00001) { | 456 if (fabsf(stereo_gen[i] - stereo_ref[i]) > 0.00001) { |
456 pa_log_debug("generic %d: %.3f != %.3f (%.3f)", i, stereo_gen[i], stereo_ref[i], | 457 pa_log_debug("generic %d: %.3f != %.3f (%.3f)", i, stereo_gen[i], stereo_ref[i], |
457 mono[i/2]); | 458 mono[i/2]); |
458 } | 459 } |
459 } | 460 } |
460 | 461 |
461 start = pa_rtclock_now(); | 462 start = pa_rtclock_now(); |
462 for (i = 0; i < TIMES; i++) { | 463 for (i = 0; i < TIMES; i++) { |
463 remap_mono_to_stereo_c(&remap, stereo_ref, mono, SAMPLES); | 464 remap_mono_to_stereo_c(&remap, stereo_ref+ALIGN, mono+ALIGN, SAMPLES); |
464 } | 465 } |
465 stop = pa_rtclock_now(); | 466 stop = pa_rtclock_now(); |
466 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 467 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
467 | 468 |
468 start = pa_rtclock_now(); | 469 start = pa_rtclock_now(); |
469 for (i = 0; i < TIMES; i++) { | 470 for (i = 0; i < TIMES; i++) { |
470 remap_mono_to_stereo_neon_a9(&remap, stereo_a9, mono, SAMPLES); | 471 remap_mono_to_stereo_neon_a9(&remap, stereo_a9+ALIGN, mono+ALIGN, SAMPLES); |
471 } | 472 } |
472 stop = pa_rtclock_now(); | 473 stop = pa_rtclock_now(); |
473 pa_log_info("NEON/A9:\t%llu usec.", (long long unsigned int)(stop - start)); | 474 pa_log_info("NEON/A9:\t%llu usec.", (long long unsigned int)(stop - start)); |
474 | 475 |
475 start = pa_rtclock_now(); | 476 start = pa_rtclock_now(); |
476 for (i = 0; i < TIMES; i++) { | 477 for (i = 0; i < TIMES; i++) { |
477 remap_mono_to_stereo_neon_a8(&remap, stereo_a8, mono, SAMPLES); | 478 remap_mono_to_stereo_neon_a8(&remap, stereo_a8+ALIGN, mono+ALIGN, SAMPLES); |
478 } | 479 } |
479 stop = pa_rtclock_now(); | 480 stop = pa_rtclock_now(); |
480 pa_log_info("NEON/A8:\t%llu usec.", (long long unsigned int)(stop - start)); | 481 pa_log_info("NEON/A8:\t%llu usec.", (long long unsigned int)(stop - start)); |
481 | 482 |
482 start = pa_rtclock_now(); | 483 start = pa_rtclock_now(); |
483 for (i = 0; i < TIMES; i++) { | 484 for (i = 0; i < TIMES; i++) { |
484 remap_channels_matrix_c(&remap, stereo_gen, mono, SAMPLES); | 485 remap_channels_matrix_c(&remap, stereo_gen+ALIGN, mono+ALIGN, SAMPLES); |
485 } | 486 } |
486 stop = pa_rtclock_now(); | 487 stop = pa_rtclock_now(); |
487 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); | 488 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); |
488 } | 489 } |
489 | 490 |
490 static void run_test_stereo_to_mono_float(void) { | 491 static void run_test_stereo_to_mono_float(void) { |
491 float stereo[2*SAMPLES]; | 492 float stereo[2*SAMPLES+ALIGN]; |
492 float mono_ref[SAMPLES]; | 493 float mono_ref[SAMPLES+ALIGN]; |
493 float mono_gen[SAMPLES]; | 494 float mono_gen[SAMPLES+ALIGN]; |
494 float mono[SAMPLES]; | 495 float mono[SAMPLES+ALIGN]; |
495 int i; | 496 int i; |
496 pa_usec_t start, stop; | 497 pa_usec_t start, stop; |
497 pa_sample_format_t sf; | 498 pa_sample_format_t sf; |
498 pa_sample_spec iss, oss; | 499 pa_sample_spec iss, oss; |
499 pa_remap_t remap; | 500 pa_remap_t remap; |
501 pa_log_debug("checking NEON remap_stereo_to_mono(float, %d)", SAMPLES); | 502 pa_log_debug("checking NEON remap_stereo_to_mono(float, %d)", SAMPLES); |
502 | 503 |
503 memset(mono_ref, 0, sizeof(mono_ref)); | 504 memset(mono_ref, 0, sizeof(mono_ref)); |
504 memset(mono, 0, sizeof(mono)); | 505 memset(mono, 0, sizeof(mono)); |
505 | 506 |
506 for (i = 0; i < 2*SAMPLES; i++) { | 507 for (i = 0; i < 2*SAMPLES+ALIGN; i++) { |
507 stereo[i] = rand()/(float) RAND_MAX - 0.5f; | 508 stereo[i] = rand()/(float) RAND_MAX - 0.5f; |
508 } | 509 } |
509 | 510 |
510 sf = PA_SAMPLE_FLOAT32NE; | 511 sf = PA_SAMPLE_FLOAT32NE; |
511 remap.format = &sf; | 512 remap.format = &sf; |
516 remap.i_ss = &iss; | 517 remap.i_ss = &iss; |
517 remap.o_ss = &oss; | 518 remap.o_ss = &oss; |
518 remap.map_table_f[0][0] = 1.0; | 519 remap.map_table_f[0][0] = 1.0; |
519 remap.map_table_f[0][1] = 1.0; | 520 remap.map_table_f[0][1] = 1.0; |
520 | 521 |
521 remap_stereo_to_mono_c(&remap, mono_ref, stereo, SAMPLES); | 522 remap_stereo_to_mono_c(&remap, mono_ref+ALIGN, stereo+ALIGN, SAMPLES); |
522 remap_channels_matrix_c(&remap, mono_gen, stereo, SAMPLES); | 523 remap_channels_matrix_c(&remap, mono_gen+ALIGN, stereo+ALIGN, SAMPLES); |
523 remap_stereo_to_mono_neon(&remap, mono, stereo, SAMPLES); | 524 remap_stereo_to_mono_neon(&remap, mono+ALIGN, stereo+ALIGN, SAMPLES); |
524 | 525 |
525 for (i = 0; i < SAMPLES; i++) { | 526 for (i = ALIGN; i < SAMPLES+ALIGN; i++) { |
526 if (fabsf(mono[i] - mono_ref[i]) > 0.00001) { | 527 if (fabsf(mono[i] - mono_ref[i]) > 0.00001) { |
527 pa_log_debug("%d: %.3f != %.3f (%.3f %0.3f)", i, mono[i], mono_ref[i], | 528 pa_log_debug("%d: %.3f != %.3f (%.3f %0.3f)", i, mono[i], mono_ref[i], |
528 stereo[2*i+0], stereo[2*i+1]); | 529 stereo[2*i+0], stereo[2*i+1]); |
529 } | 530 } |
530 } | 531 } |
531 | 532 |
532 start = pa_rtclock_now(); | 533 start = pa_rtclock_now(); |
533 for (i = 0; i < TIMES; i++) { | 534 for (i = 0; i < TIMES; i++) { |
534 remap_stereo_to_mono_neon(&remap, mono, stereo, SAMPLES); | 535 remap_stereo_to_mono_neon(&remap, mono+ALIGN, stereo+ALIGN, SAMPLES); |
535 } | 536 } |
536 stop = pa_rtclock_now(); | 537 stop = pa_rtclock_now(); |
537 pa_log_info("NEON:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 538 pa_log_info("NEON:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
538 | 539 |
539 start = pa_rtclock_now(); | 540 start = pa_rtclock_now(); |
540 for (i = 0; i < TIMES; i++) { | 541 for (i = 0; i < TIMES; i++) { |
541 remap_stereo_to_mono_c(&remap, mono_ref, stereo, SAMPLES); | 542 remap_stereo_to_mono_c(&remap, mono_ref+ALIGN, stereo+ALIGN, SAMPLES); |
542 } | 543 } |
543 stop = pa_rtclock_now(); | 544 stop = pa_rtclock_now(); |
544 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 545 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
545 | 546 |
546 start = pa_rtclock_now(); | 547 start = pa_rtclock_now(); |
547 for (i = 0; i < TIMES; i++) { | 548 for (i = 0; i < TIMES; i++) { |
548 remap_channels_matrix_c(&remap, mono_gen, stereo, SAMPLES); | 549 remap_channels_matrix_c(&remap, mono_gen+ALIGN, stereo+ALIGN, SAMPLES); |
549 } | 550 } |
550 stop = pa_rtclock_now(); | 551 stop = pa_rtclock_now(); |
551 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); | 552 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); |
552 } | 553 } |
553 | 554 |
554 static void run_test_mono_to_stereo_s16(void) { | 555 static void run_test_mono_to_stereo_s16(void) { |
555 int16_t stereo_a9[2*SAMPLES]; | 556 int16_t stereo_a9[2*SAMPLES+ALIGN]; |
556 int16_t stereo_a8[2*SAMPLES]; | 557 int16_t stereo_a8[2*SAMPLES+ALIGN]; |
557 int16_t stereo_ref[2*SAMPLES]; | 558 int16_t stereo_ref[2*SAMPLES+ALIGN]; |
558 int16_t stereo_gen[2*SAMPLES]; | 559 int16_t stereo_gen[2*SAMPLES+ALIGN]; |
559 int16_t mono[SAMPLES]; | 560 int16_t mono[SAMPLES+ALIGN]; |
560 int i; | 561 int i; |
561 pa_usec_t start, stop; | 562 pa_usec_t start, stop; |
562 pa_sample_format_t sf; | 563 pa_sample_format_t sf; |
563 pa_sample_spec iss, oss; | 564 pa_sample_spec iss, oss; |
564 pa_remap_t remap; | 565 pa_remap_t remap; |
568 memset(stereo_ref, 0, sizeof(stereo_ref)); | 569 memset(stereo_ref, 0, sizeof(stereo_ref)); |
569 memset(stereo_a9, 0, sizeof(stereo_a9)); | 570 memset(stereo_a9, 0, sizeof(stereo_a9)); |
570 memset(stereo_a8, 0, sizeof(stereo_a8)); | 571 memset(stereo_a8, 0, sizeof(stereo_a8)); |
571 memset(stereo_gen, 0, sizeof(stereo_gen)); | 572 memset(stereo_gen, 0, sizeof(stereo_gen)); |
572 | 573 |
573 for (i = 0; i < SAMPLES; i++) { | 574 for (i = 0; i < SAMPLES+ALIGN; i++) { |
574 mono[i] = rand() - RAND_MAX/2; | 575 mono[i] = rand() - RAND_MAX/2; |
575 } | 576 } |
576 | 577 |
577 sf = PA_SAMPLE_S16NE; | 578 sf = PA_SAMPLE_S16NE; |
578 remap.format = &sf; | 579 remap.format = &sf; |
582 oss.channels = 2; | 583 oss.channels = 2; |
583 remap.i_ss = &iss; | 584 remap.i_ss = &iss; |
584 remap.o_ss = &oss; | 585 remap.o_ss = &oss; |
585 remap.map_table_i[0][0] = 0x10000; | 586 remap.map_table_i[0][0] = 0x10000; |
586 remap.map_table_i[1][0] = 0x10000; | 587 remap.map_table_i[1][0] = 0x10000; |
587 | 588 |
588 remap_mono_to_stereo_c(&remap, stereo_ref, mono, SAMPLES); | 589 remap_mono_to_stereo_c(&remap, stereo_ref+ALIGN, mono+ALIGN, SAMPLES); |
589 remap_channels_matrix_c(&remap, stereo_gen, mono, SAMPLES); | 590 remap_channels_matrix_c(&remap, stereo_gen+ALIGN, mono+ALIGN, SAMPLES); |
590 remap_mono_to_stereo_neon_a9(&remap, stereo_a9, mono, SAMPLES); | 591 remap_mono_to_stereo_neon_a9(&remap, stereo_a9+ALIGN, mono+ALIGN, SAMPLES); |
591 remap_mono_to_stereo_neon_a8(&remap, stereo_a8, mono, SAMPLES); | 592 remap_mono_to_stereo_neon_a8(&remap, stereo_a8+ALIGN, mono+ALIGN, SAMPLES); |
592 | 593 |
593 for (i = 0; i < 2*SAMPLES; i++) { | 594 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
594 if (abs(stereo_a9[i] - stereo_ref[i]) > 0) { | 595 if (abs(stereo_a9[i] - stereo_ref[i]) > 0) { |
595 pa_log_debug("NEON/A9 %d: %d != %d (%d)", i, stereo_a9[i], stereo_ref[i], | 596 pa_log_debug("NEON/A9 %d: %d != %d (%d)", i, stereo_a9[i], stereo_ref[i], |
596 mono[i/2]); | 597 mono[i/2]); |
597 } | 598 } |
598 } | 599 } |
599 for (i = 0; i < 2*SAMPLES; i++) { | 600 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
600 if (abs(stereo_a8[i] - stereo_ref[i]) > 0) { | 601 if (abs(stereo_a8[i] - stereo_ref[i]) > 0) { |
601 pa_log_debug("NEON/A8 %d: %d != %d (%d)", i, stereo_a8[i], stereo_ref[i], | 602 pa_log_debug("NEON/A8 %d: %d != %d (%d)", i, stereo_a8[i], stereo_ref[i], |
602 mono[i/2]); | 603 mono[i/2]); |
603 } | 604 } |
604 } | 605 } |
605 | 606 |
606 for (i = 0; i < 2*SAMPLES; i++) { | 607 for (i = ALIGN; i < 2*SAMPLES+ALIGN; i++) { |
607 if (abs(stereo_gen[i] - stereo_ref[i]) > 0) { | 608 if (abs(stereo_gen[i] - stereo_ref[i]) > 0) { |
608 pa_log_debug("generic %d: %d != %d (%d)", i, stereo_gen[i], stereo_ref[i], | 609 pa_log_debug("generic %d: %d != %d (%d)", i, stereo_gen[i], stereo_ref[i], |
609 mono[i/2]); | 610 mono[i/2]); |
610 } | 611 } |
611 } | 612 } |
612 | 613 |
613 start = pa_rtclock_now(); | 614 start = pa_rtclock_now(); |
614 for (i = 0; i < TIMES; i++) { | 615 for (i = 0; i < TIMES; i++) { |
615 remap_mono_to_stereo_neon_a9(&remap, stereo_a9, mono, SAMPLES); | 616 remap_mono_to_stereo_neon_a9(&remap, stereo_a9+ALIGN, mono+ALIGN, SAMPLES); |
616 } | 617 } |
617 stop = pa_rtclock_now(); | 618 stop = pa_rtclock_now(); |
618 pa_log_info("NEON/A9:\t%llu usec.", (long long unsigned int)(stop - start)); | 619 pa_log_info("NEON/A9:\t%llu usec.", (long long unsigned int)(stop - start)); |
619 | 620 |
620 start = pa_rtclock_now(); | 621 start = pa_rtclock_now(); |
621 for (i = 0; i < TIMES; i++) { | 622 for (i = 0; i < TIMES; i++) { |
622 remap_mono_to_stereo_neon_a8(&remap, stereo_a8, mono, SAMPLES); | 623 remap_mono_to_stereo_neon_a8(&remap, stereo_a8+ALIGN, mono+ALIGN, SAMPLES); |
623 } | 624 } |
624 stop = pa_rtclock_now(); | 625 stop = pa_rtclock_now(); |
625 pa_log_info("NEON/A8:\t%llu usec.", (long long unsigned int)(stop - start)); | 626 pa_log_info("NEON/A8:\t%llu usec.", (long long unsigned int)(stop - start)); |
626 | 627 |
627 start = pa_rtclock_now(); | 628 start = pa_rtclock_now(); |
628 for (i = 0; i < TIMES; i++) { | 629 for (i = 0; i < TIMES; i++) { |
629 remap_mono_to_stereo_c(&remap, stereo_ref, mono, SAMPLES); | 630 remap_mono_to_stereo_c(&remap, stereo_ref+ALIGN, mono+ALIGN, SAMPLES); |
630 } | 631 } |
631 stop = pa_rtclock_now(); | 632 stop = pa_rtclock_now(); |
632 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 633 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
633 | 634 |
634 start = pa_rtclock_now(); | 635 start = pa_rtclock_now(); |
635 for (i = 0; i < TIMES; i++) { | 636 for (i = 0; i < TIMES; i++) { |
636 remap_channels_matrix_c(&remap, stereo_gen, mono, SAMPLES); | 637 remap_channels_matrix_c(&remap, stereo_gen+ALIGN, mono+ALIGN, SAMPLES); |
637 } | 638 } |
638 stop = pa_rtclock_now(); | 639 stop = pa_rtclock_now(); |
639 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); | 640 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); |
640 } | 641 } |
641 | 642 |
642 static void run_test_stereo_to_mono_s16(void) { | 643 static void run_test_stereo_to_mono_s16(void) { |
643 int16_t stereo[2*SAMPLES]; | 644 int16_t stereo[2*SAMPLES+ALIGN]; |
644 int16_t mono_ref[SAMPLES]; | 645 int16_t mono_ref[SAMPLES+ALIGN]; |
645 int16_t mono_gen[SAMPLES]; | 646 int16_t mono_gen[SAMPLES+ALIGN]; |
646 int16_t mono[SAMPLES]; | 647 int16_t mono[SAMPLES+ALIGN]; |
647 int i; | 648 int i; |
648 pa_usec_t start, stop; | 649 pa_usec_t start, stop; |
649 pa_sample_format_t sf; | 650 pa_sample_format_t sf; |
650 pa_sample_spec iss, oss; | 651 pa_sample_spec iss, oss; |
651 pa_remap_t remap; | 652 pa_remap_t remap; |
654 | 655 |
655 memset(mono_ref, 0, sizeof(mono_ref)); | 656 memset(mono_ref, 0, sizeof(mono_ref)); |
656 memset(mono_gen, 0, sizeof(mono_gen)); | 657 memset(mono_gen, 0, sizeof(mono_gen)); |
657 memset(mono, 0, sizeof(mono)); | 658 memset(mono, 0, sizeof(mono)); |
658 | 659 |
659 for (i = 0; i < 2*SAMPLES; i++) { | 660 for (i = 0; i < 2*SAMPLES+ALIGN; i++) { |
660 stereo[i] = rand() - RAND_MAX/2; | 661 stereo[i] = rand() - RAND_MAX/2; |
661 } | 662 } |
662 | 663 |
663 sf = PA_SAMPLE_S16NE; | 664 sf = PA_SAMPLE_S16NE; |
664 remap.format = &sf; | 665 remap.format = &sf; |
668 oss.channels = 1; | 669 oss.channels = 1; |
669 remap.i_ss = &iss; | 670 remap.i_ss = &iss; |
670 remap.o_ss = &oss; | 671 remap.o_ss = &oss; |
671 remap.map_table_i[0][0] = 0x10000; | 672 remap.map_table_i[0][0] = 0x10000; |
672 remap.map_table_i[0][1] = 0x10000; | 673 remap.map_table_i[0][1] = 0x10000; |
673 | 674 |
674 remap_stereo_to_mono_c(&remap, mono_ref, stereo, SAMPLES); | 675 remap_stereo_to_mono_c(&remap, mono_ref+ALIGN, stereo+ALIGN, SAMPLES); |
675 remap_channels_matrix_c(&remap, mono_gen, stereo, SAMPLES); | 676 remap_channels_matrix_c(&remap, mono_gen+ALIGN, stereo+ALIGN, SAMPLES); |
676 remap_stereo_to_mono_neon(&remap, mono, stereo, SAMPLES); | 677 remap_stereo_to_mono_neon(&remap, mono+ALIGN, stereo+ALIGN, SAMPLES); |
677 | 678 |
678 for (i = 0; i < SAMPLES; i++) { | 679 for (i = ALIGN; i < SAMPLES+ALIGN; i++) { |
679 if (abs(mono[i] - mono_ref[i]) > 0) { | 680 if (abs(mono[i] - mono_ref[i]) > 0) { |
680 pa_log_debug("%d: %d != %d (%d)", i, mono[i], mono_ref[i], | 681 pa_log_debug("%d: %d != %d (%d)", i, mono[i], mono_ref[i], |
681 stereo[2*i+0], stereo[2*i+1]); | 682 stereo[2*i+0], stereo[2*i+1]); |
682 } | 683 } |
683 } | 684 } |
684 for (i = 0; i < SAMPLES; i++) { | 685 for (i = ALIGN; i < SAMPLES+ALIGN; i++) { |
685 if (abs(mono[i] - mono_gen[i]) > 0) { | 686 if (abs(mono[i] - mono_gen[i]) > 0) { |
686 pa_log_debug("%d: %d != %d (%d)", i, mono[i], mono_gen[i], | 687 pa_log_debug("%d: %d != %d (%d)", i, mono[i], mono_gen[i], |
687 stereo[2*i+0], stereo[2*i+1]); | 688 stereo[2*i+0], stereo[2*i+1]); |
688 } | 689 } |
689 } | 690 } |
690 | 691 |
691 start = pa_rtclock_now(); | 692 start = pa_rtclock_now(); |
692 for (i = 0; i < TIMES; i++) { | 693 for (i = 0; i < TIMES; i++) { |
693 remap_stereo_to_mono_neon(&remap, mono, stereo, SAMPLES); | 694 remap_stereo_to_mono_neon(&remap, mono+ALIGN, stereo+ALIGN, SAMPLES); |
694 } | 695 } |
695 stop = pa_rtclock_now(); | 696 stop = pa_rtclock_now(); |
696 pa_log_info("NEON:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 697 pa_log_info("NEON:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
697 | 698 |
698 start = pa_rtclock_now(); | 699 start = pa_rtclock_now(); |
699 for (i = 0; i < TIMES; i++) { | 700 for (i = 0; i < TIMES; i++) { |
700 remap_stereo_to_mono_c(&remap, mono_ref, stereo, SAMPLES); | 701 remap_stereo_to_mono_c(&remap, mono_ref+ALIGN, stereo+ALIGN, SAMPLES); |
701 } | 702 } |
702 stop = pa_rtclock_now(); | 703 stop = pa_rtclock_now(); |
703 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); | 704 pa_log_info("ref:\t\t%llu usec.", (long long unsigned int)(stop - start)); |
704 | 705 |
705 start = pa_rtclock_now(); | 706 start = pa_rtclock_now(); |
706 for (i = 0; i < TIMES; i++) { | 707 for (i = 0; i < TIMES; i++) { |
707 remap_channels_matrix_c(&remap, mono_gen, stereo, SAMPLES); | 708 remap_channels_matrix_c(&remap, mono_gen+ALIGN, stereo+ALIGN, SAMPLES); |
708 } | 709 } |
709 stop = pa_rtclock_now(); | 710 stop = pa_rtclock_now(); |
710 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); | 711 pa_log_info("generic:\t%llu usec.", (long long unsigned int)(stop - start)); |
711 } | 712 } |
712 | 713 |