SegaPCM: fix loop
This commit is contained in:
		
							parent
							
								
									f20da3e7e4
								
							
						
					
					
						commit
						7525a07936
					
				|  | @ -136,11 +136,11 @@ void DivPlatformSegaPCM::tick(bool sysTick) { | ||||||
|             rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |             rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|             rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); |             rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); | ||||||
|             rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); |             rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); | ||||||
|             rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-1)>>8)); |             rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-2)>>8)); | ||||||
|             if (loopStart<0 || loopStart>=actualLength) { |             if (loopStart<0 || loopStart>=actualLength) { | ||||||
|               rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |               rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|             } else { |             } else { | ||||||
|               int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart+sampleLoopOff[chan[i].pcm.sample]; |               int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; | ||||||
|               rWrite(4+(i<<3),loopPos&0xff); |               rWrite(4+(i<<3),loopPos&0xff); | ||||||
|               rWrite(5+(i<<3),(loopPos>>8)&0xff); |               rWrite(5+(i<<3),(loopPos>>8)&0xff); | ||||||
|               rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |               rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|  | @ -153,11 +153,11 @@ void DivPlatformSegaPCM::tick(bool sysTick) { | ||||||
|             rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |             rWrite(0x86+(i<<3),3+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|             rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); |             rWrite(0x84+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample])&0xff); | ||||||
|             rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); |             rWrite(0x85+(i<<3),(sampleOffSegaPCM[chan[i].pcm.sample]>>8)&0xff); | ||||||
|             rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-1)>>8)); |             rWrite(6+(i<<3),MIN(255,((sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+actualLength-2)>>8)); | ||||||
|             if (loopStart<0 || loopStart>=actualLength) { |             if (loopStart<0 || loopStart>=actualLength) { | ||||||
|               rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |               rWrite(0x86+(i<<3),2+((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|             } else { |             } else { | ||||||
|               int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart+sampleLoopOff[chan[i].pcm.sample]; |               int loopPos=(sampleOffSegaPCM[chan[i].pcm.sample]&0xffff)+loopStart; | ||||||
|               rWrite(4+(i<<3),loopPos&0xff); |               rWrite(4+(i<<3),loopPos&0xff); | ||||||
|               rWrite(5+(i<<3),(loopPos>>8)&0xff); |               rWrite(5+(i<<3),(loopPos>>8)&0xff); | ||||||
|               rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); |               rWrite(0x86+(i<<3),((sampleOffSegaPCM[chan[i].pcm.sample]>>16)<<3)); | ||||||
|  | @ -458,27 +458,20 @@ void DivPlatformSegaPCM::reset() { | ||||||
|     if ((memPos&0xff0000)!=((memPos+alignedSize)&0xff0000)) { |     if ((memPos&0xff0000)!=((memPos+alignedSize)&0xff0000)) { | ||||||
|       memPos=(memPos+0xffff)&0xff0000; |       memPos=(memPos+0xffff)&0xff0000; | ||||||
|     } |     } | ||||||
|  |     if (alignedSize&(~0xff)) { | ||||||
|  |       memPos+=256-(alignedSize&0xff); | ||||||
|  |     } | ||||||
|     logV("- sample %d will be at %x with length %x",i,memPos,alignedSize); |     logV("- sample %d will be at %x with length %x",i,memPos,alignedSize); | ||||||
|     sampleLoaded[i]=true; |     sampleLoaded[i]=true; | ||||||
|     if (memPos>=16777216) break; |     if (memPos>=16777216) break; | ||||||
|     sampleOffSegaPCM[i]=memPos; |     sampleOffSegaPCM[i]=memPos; | ||||||
|     unsigned int readPos=0; |  | ||||||
|     for (unsigned int j=0; j<alignedSize; j++) { |     for (unsigned int j=0; j<alignedSize; j++) { | ||||||
|       if (readPos>=(unsigned int)sample->getLoopEndPosition(DIV_SAMPLE_DEPTH_8BIT)) { |       sampleMem[memPos++]=((unsigned char)sample->data8[j]+0x80); | ||||||
|         if (sample->isLoopable()) { |  | ||||||
|           readPos=sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT); |  | ||||||
|           sampleMem[memPos++]=((unsigned char)sample->data8[readPos]+0x80); |  | ||||||
|         } else { |  | ||||||
|           sampleMem[memPos++]=0x80; |  | ||||||
|         } |  | ||||||
|       } else { |  | ||||||
|         sampleMem[memPos++]=((unsigned char)sample->data8[readPos]+0x80); |  | ||||||
|       } |  | ||||||
|       readPos++; |  | ||||||
|       if (memPos>=16777216) break; |       if (memPos>=16777216) break; | ||||||
|     } |     } | ||||||
|     sampleLoopOff[i]=readPos-sample->getLoopStartPosition(DIV_SAMPLE_DEPTH_8BIT); |  | ||||||
|     if (memPos>=16777216) break; |     if (memPos>=16777216) break; | ||||||
|  | 
 | ||||||
|  |     memPos&=~0xff; | ||||||
|   } |   } | ||||||
|   sampleMemLen=memPos; |   sampleMemLen=memPos; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -76,7 +76,6 @@ class DivPlatformSegaPCM: public DivDispatch { | ||||||
|     short pendingWrites[256]; |     short pendingWrites[256]; | ||||||
| 
 | 
 | ||||||
|     unsigned int sampleOffSegaPCM[256]; |     unsigned int sampleOffSegaPCM[256]; | ||||||
|     unsigned int sampleLoopOff[256]; |  | ||||||
|     bool sampleLoaded[256]; |     bool sampleLoaded[256]; | ||||||
|    |    | ||||||
|     friend void putDispatchChip(void*,int); |     friend void putDispatchChip(void*,int); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 tildearrow
						tildearrow