summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/modplug/load_ams.cpp
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/modplug/load_ams.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/modplug/load_ams.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/core/multimedia/opieplayer/modplug/load_ams.cpp b/core/multimedia/opieplayer/modplug/load_ams.cpp
index 3dd1c2b..ad1cc01 100644
--- a/core/multimedia/opieplayer/modplug/load_ams.cpp
+++ b/core/multimedia/opieplayer/modplug/load_ams.cpp
@@ -533,99 +533,99 @@ BOOL CSoundFile::ReadAMS2(LPCBYTE lpStream, DWORD dwMemLength)
533 } else 533 } else
534 { 534 {
535 // TODO: AMS effects 535 // TODO: AMS effects
536 } 536 }
537 } 537 }
538 } 538 }
539 } 539 }
540 if (byte1 & 0x80) row++; 540 if (byte1 & 0x80) row++;
541 } 541 }
542 } 542 }
543 dwMemPos += packedlen; 543 dwMemPos += packedlen;
544 } 544 }
545 // Read Samples 545 // Read Samples
546 for (UINT iSmp=1; iSmp<=m_nSamples; iSmp++) if (Ins[iSmp].nLength) 546 for (UINT iSmp=1; iSmp<=m_nSamples; iSmp++) if (Ins[iSmp].nLength)
547 { 547 {
548 if (dwMemPos >= dwMemLength - 9) return TRUE; 548 if (dwMemPos >= dwMemLength - 9) return TRUE;
549 UINT flags; 549 UINT flags;
550 if (packedsamples[iSmp] & 0x03) 550 if (packedsamples[iSmp] & 0x03)
551 { 551 {
552 flags = (Ins[iSmp].uFlags & CHN_16BIT) ? RS_AMS16 : RS_AMS8; 552 flags = (Ins[iSmp].uFlags & CHN_16BIT) ? RS_AMS16 : RS_AMS8;
553 } else 553 } else
554 { 554 {
555 flags = (Ins[iSmp].uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S; 555 flags = (Ins[iSmp].uFlags & CHN_16BIT) ? RS_PCM16S : RS_PCM8S;
556 } 556 }
557 dwMemPos += ReadSample(&Ins[iSmp], flags, (LPSTR)(lpStream+dwMemPos), dwMemLength-dwMemPos); 557 dwMemPos += ReadSample(&Ins[iSmp], flags, (LPSTR)(lpStream+dwMemPos), dwMemLength-dwMemPos);
558 } 558 }
559 return TRUE; 559 return TRUE;
560} 560}
561 561
562 562
563///////////////////////////////////////////////////////////////////// 563/////////////////////////////////////////////////////////////////////
564// AMS Sample unpacking 564// AMS Sample unpacking
565 565
566void AMSUnpack(const char *psrc, UINT inputlen, char *pdest, UINT dmax, char packcharacter) 566void AMSUnpack(const char *psrc, UINT inputlen, char *pdest, UINT dmax, char packcharacter)
567{ 567{
568 UINT tmplen = dmax; 568 UINT tmplen = dmax;
569 signed char *amstmp = new signed char[tmplen]; 569 signed char *amstmp = new signed char[tmplen];
570 570
571 if (!amstmp) return; 571 if (!amstmp) return;
572 // Unpack Loop 572 // Unpack Loop
573 { 573 {
574 signed char *p = amstmp; 574 signed char *p = amstmp;
575 UINT i=0, j=0; 575 UINT i=0, j=0;
576 while ((i < inputlen) && (j < tmplen)) 576 while ((i < inputlen) && (j < tmplen))
577 { 577 {
578 signed char ch = psrc[i++]; 578 signed char ch = psrc[i++];
579 if (ch == packcharacter) 579 if (ch == packcharacter)
580 { 580 {
581 BYTE ch2 = psrc[i++]; 581 BYTE ch2 = psrc[i++];
582 if (ch2) 582 if (ch2)
583 { 583 {
584 ch = psrc[i++]; 584 ch = psrc[i++];
585 while (ch2--) 585 while (ch2--)
586 { 586 {
587 p[j++] = ch; 587 p[j++] = ch;
588 if (j >= tmplen) break; 588 if (j >= tmplen) break;
589 } 589 }
590 } else p[j++] = packcharacter; 590 } else p[j++] = packcharacter;
591 } else p[j++] = ch; 591 } else p[j++] = ch;
592 } 592 }
593 } 593 }
594 // Bit Unpack Loop 594 // Bit Unpack Loop
595 { 595 {
596 signed char *p = amstmp; 596 signed char *p = amstmp;
597 UINT bitcount = 0x80, dh; 597 UINT bitcount = 0x80, dh;
598 UINT k=0; 598 UINT k=0;
599 for (UINT i=0; i<dmax; i++) 599 for (UINT i=0; i<dmax; i++)
600 { 600 {
601 BYTE al = *p++; 601 BYTE al = *p++;
602 dh = 0; 602 dh = 0;
603 for (UINT count=0; count<8; count++) 603 for (UINT count=0; count<8; count++)
604 { 604 {
605 UINT bl = al & bitcount; 605 UINT bl = al & bitcount;
606 bl = ((bl|(bl<<8)) >> ((dh+8-count) & 7)) & 0xFF; 606 bl = ((bl|(bl<<8)) >> ((dh+8-count) & 7)) & 0xFF;
607 bitcount = ((bitcount|(bitcount<<8)) >> 1) & 0xFF; 607 bitcount = ((bitcount|(bitcount<<8)) >> 1) & 0xFF;
608 pdest[k++] |= bl; 608 pdest[k++] |= bl;
609 if (k >= dmax) 609 if (k >= dmax)
610 { 610 {
611 k = 0; 611 k = 0;
612 dh++; 612 dh++;
613 } 613 }
614 } 614 }
615 bitcount = ((bitcount|(bitcount<<8)) >> dh) & 0xFF; 615 bitcount = ((bitcount|(bitcount<<8)) >> dh) & 0xFF;
616 } 616 }
617 } 617 }
618 // Delta Unpack 618 // Delta Unpack
619 { 619 {
620 signed char old = 0; 620 signed char old = 0;
621 for (UINT i=0; i<dmax; i++) 621 for (UINT i=0; i<dmax; i++)
622 { 622 {
623 int pos = ((LPBYTE)pdest)[i]; 623 int pos = ((LPBYTE)pdest)[i];
624 if ((pos != 128) && (pos & 0x80)) pos = -(pos & 0x7F); 624 if ((pos != 128) && (pos & 0x80)) pos = -(pos & 0x7F);
625 old -= (signed char)pos; 625 old -= (signed char)pos;
626 pdest[i] = old; 626 pdest[i] = old;
627 } 627 }
628 } 628 }
629 delete amstmp; 629 delete [] amstmp;
630} 630}
631 631