| 508 | | // 5 Channel |
| 509 | | case A52_3F2R: |
| 510 | | |
| 511 | | // With LFE |
| 512 | | if (a52_flags & A52_LFE) { |
| 513 | | //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running 5.1\n"); |
| 514 | | |
| 515 | | for (int k = 0; k < 256; k++) { |
| 516 | | output_data[6*k + output_data_offset + 3] = cast_samples[k + 256*0]; // LFE chan |
| 517 | | output_data[6*k + output_data_offset + 0] = cast_samples[k + 256*1]; // left chan |
| 518 | | output_data[6*k + output_data_offset + 2] = cast_samples[k + 256*2]; // center chan |
| 519 | | output_data[6*k + output_data_offset + 1] = cast_samples[k + 256*3]; // right chan |
| 520 | | output_data[6*k + output_data_offset + 4] = cast_samples[k + 256*4]; // left surround chan |
| 521 | | output_data[6*k + output_data_offset + 5] = cast_samples[k + 256*5]; // right surround chan |
| 522 | | } |
| 523 | | |
| 524 | | return 6 * 256; // Number of 'UInt16' we processed |
| 525 | | |
| 526 | | } else { |
| 527 | | //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running 5.0\n"); |
| 528 | | for (int k = 0; k < 256; k++) { |
| 529 | | output_data[5*k + output_data_offset + 0] = cast_samples[k + 256*0]; // left chan |
| 530 | | output_data[5*k + output_data_offset + 2] = cast_samples[k + 256*1]; // center chan |
| 531 | | output_data[5*k + output_data_offset + 1] = cast_samples[k + 256*2]; // right chan |
| 532 | | output_data[5*k + output_data_offset + 3] = cast_samples[k + 256*3]; // left surround chan |
| 533 | | output_data[5*k + output_data_offset + 4] = cast_samples[k + 256*4]; // right surround chan |
| 534 | | } |
| 535 | | |
| 536 | | return 5 * 256; // Number of 'UInt16' we processed |
| 537 | | } |
| 538 | | break; |
| 539 | | |
| 540 | | // Stereo |
| 541 | | case A52_STEREO: |
| 542 | | case A52_DOLBY: |
| 543 | | //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running stereo\n"); |
| 544 | | |
| 545 | | for (int k = 0; k < 256; k++) { |
| 546 | | output_data[2*k + output_data_offset] = cast_samples[k]; // left chan |
| 547 | | output_data[2*k + output_data_offset + 1] = cast_samples[k + 256]; // right chan |
| 548 | | } |
| 549 | | |
| 550 | | return 2 * 256; // Number of 'UInt16' we processed |
| 551 | | |
| 552 | | break; |
| 553 | | |
| 554 | | // Mono |
| 555 | | case A52_MONO: |
| 556 | | //fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Running mono\n"); |
| 557 | | |
| 558 | | for (int k = 0; k < 256; k++) { |
| 559 | | output_data[k + output_data_offset] = cast_samples[k]; // mono chan |
| 560 | | } |
| 561 | | |
| 562 | | return 256; // Number of 'UInt16' we processed |
| 563 | | |
| 564 | | break; |
| 565 | | |
| 566 | | default: |
| 567 | | fprintf(stderr, "ACShepA52Decoder::Process16BitSignedInts: Failed to match output channels\n"); |
| | 520 | if (centerPresent) { |
| | 521 | chanMap[5] = chanMap[4]; // right surround |
| | 522 | chanMap[4] = chanMap[3]; // left surround |
| | 523 | chanMap[3] = 0; // LFE |
| | 524 | } else { |
| | 525 | chanMap[4] = chanMap[3]; // right surround |
| | 526 | chanMap[3] = chanMap[2]; // left surround |
| | 527 | chanMap[2] = 0; // LFE |
| | 528 | } |
| | 529 | } |
| | 530 | |
| | 531 | for (int i = 0; i < 256; i++) { |
| | 532 | for (int j = 0; j < chans; j++) { |
| | 533 | output_data[chans*i + output_data_offset + j] = cast_samples[i + 256*chanMap[j]]; |
| | 534 | } |