public void init(uint samplingRate, MDSound mds, VGM_PCM_BANK[] PCMBank) { this.mds = mds; this.samplingRate = samplingRate; pcmStep = samplingRate / (double)DAC_SMPL_RATE; pcmExecDelta = 0; this.PCMBank = PCMBank; refresh(); DacCtrlUsed = 0x00; for (byte CurChip = 0x00; CurChip < 0xFF; CurChip++) { DacCtrl[CurChip] = new DACCTRL_DATA(); DacCtrl[CurChip].Enable = false; } }
/** * PCM_Update(): Update the PCM buffer. * @param buf PCM buffer. * @param Length Buffer length. */ private int PCM_Update(byte ChipID, int[][] buf, int Length) { pcm_chip_ chip = PCM_Chip[ChipID]; int i, j; int[] bufL, bufR; //, *volL, *volR; uint Addr, k; pcm_chan_ CH; bufL = buf[0]; bufR = buf[1]; // clear buffers for (int d = 0; d < Length; d++) { bufL[d] = 0; bufR[d] = 0; } // if PCM disable, no sound if (chip.Enable == 0) { return(1); } // for long update for (i = 0; i < 8; i++) { CH = chip.Channel[i]; // only loop when sounding and on if (CH.Enable > 0 && CH.Muted == 0) { Addr = CH.Addr >> PCM_STEP_SHIFT; //volL = &(PCM_Volume_Tab[CH->MUL_L << 8]); //volR = &(PCM_Volume_Tab[CH->MUL_R << 8]); for (j = 0; j < Length; j++) { // test for loop signal if (chip.RAM[Addr] == 0xFF) { CH.Addr = (Addr = CH.Loop_Addr) << PCM_STEP_SHIFT; if (chip.RAM[Addr] == 0xFF) { break; } else { j--; } } else { if ((chip.RAM[Addr] & 0x80) != 0) { CH.Data = chip.RAM[Addr] & 0x7F; bufL[j] -= (int)(CH.Data * CH.MUL_L); bufR[j] -= (int)(CH.Data * CH.MUL_R); } else { CH.Data = chip.RAM[Addr]; // this improves the sound of Cosmic Fantasy Stories, // although it's definately false behaviour if (CH.Data == 0 && chip.Smpl0Patch != 0) { CH.Data = -0x7F; } bufL[j] += (int)(CH.Data * CH.MUL_L); bufR[j] += (int)(CH.Data * CH.MUL_R); } bufL[j] = MDSound.Limit(bufL[j], Int16.MaxValue, Int16.MinValue); bufR[j] = MDSound.Limit(bufR[j], Int16.MaxValue, Int16.MinValue); // update address register k = Addr + 1; CH.Addr = (CH.Addr + CH.Step) & 0x7FFFFFF; Addr = CH.Addr >> PCM_STEP_SHIFT; for (; k < Addr; k++) { if (chip.RAM[k] == 0xFF) { CH.Addr = (Addr = CH.Loop_Addr) << PCM_STEP_SHIFT; break; } } } } if (chip.RAM[Addr] == 0xFF) { CH.Addr = CH.Loop_Addr << PCM_STEP_SHIFT; } } } return(0); }
public dacControl(uint samplingRate, MDSound mds) { init(samplingRate, mds, null); }