--- hatari/src/falcon/crossbar.c 2019/04/09 08:53:22 1.1.1.5 +++ hatari/src/falcon/crossbar.c 2019/04/09 08:54:35 1.1.1.6 @@ -1780,8 +1780,8 @@ static void Crossbar_SendDataToDAC(Sint1 */ void Crossbar_GenerateSamples(int nMixBufIdx, int nSamplesToGenerate) { - int i, nBufIdx; - unsigned n; + int i, j, nBufIdx; + int n; Sint16 adc_leftData, adc_rightData, dac_LeftData, dac_RightData; if (crossbar.isDacMuted) { @@ -1844,8 +1844,6 @@ void Crossbar_GenerateSamples(int nMixBu /* Crossbar->DAC sound only */ dac_LeftData = dac.buffer_left[dac.readPosition]; dac_RightData = dac.buffer_right[dac.readPosition]; - dac.buffer_left[dac.readPosition] = 0; - dac.buffer_right[dac.readPosition] = 0; break; case 3: /* Mixing Direct ADC sound with Crossbar->DMA sound */ @@ -1853,8 +1851,6 @@ void Crossbar_GenerateSamples(int nMixBu dac.buffer_left[dac.readPosition]; dac_RightData = ((adc_rightData * crossbar.gainSettingRight) >> 14) + dac.buffer_right[dac.readPosition]; - dac.buffer_left[dac.readPosition] = 0; - dac.buffer_right[dac.readPosition] = 0; break; } @@ -1864,6 +1860,15 @@ void Crossbar_GenerateSamples(int nMixBu /* Upgrade dac's buffer read pointer */ dac.readPosition_float += crossbar.frequence_ratio; n = dac.readPosition_float >> 32; /* number of samples to skip */ + + if (n) { + // It becomes safe to zero old data if tail has moved + for (j=0; j> 13) & 0x3) { + case 0 : + /* DAC connexion with DMA Playback */ + if ((IoMem_ReadWord(0xff8930) & 0x1) == 1) + strcpy(matrixDAC, "OOXO"); + else + strcpy(matrixDAC, "OOHO"); + break; + case 1 : + /* DAC connexion with DSP Transmit */ + if ((IoMem_ReadWord(0xff8930) & 0x10) == 0x10) + strcpy(matrixDAC, "OXOO"); + else + strcpy(matrixDAC, "OHOO"); + break; + case 2 : + /* DAC connexion with External Input */ + if ((IoMem_ReadWord(0xff8930) & 0x100) == 0x100) + strcpy(matrixDAC, "XOOO"); + else + strcpy(matrixDAC, "HOOO"); + break; + case 3 : + /* DAC connexion with ADC */ + strcpy(matrixDAC, "OOOX"); + break; + } + + /* DMA connexion */ + switch (IoMem_ReadWord(0xff8932) & 0x7) { + case 0 : strcpy(matrixDMA, "OOHO"); break; + case 1 : strcpy(matrixDMA, "OOXO"); break; + case 2 : strcpy(matrixDMA, "OHOO"); break; + case 3 : strcpy(matrixDMA, "OXOO"); break; + case 4 : strcpy(matrixDMA, "HOOO"); break; + case 5 : strcpy(matrixDMA, "XOOO"); break; + case 6 : strcpy(matrixDMA, "OOOH"); break; + case 7 : strcpy(matrixDMA, "OOOX"); break; + } + + /* DSP connexion */ + switch ((IoMem_ReadWord(0xff8932) >> 4) & 0x7) { + case 0 : strcpy(matrixDSP, "OOHO"); break; + case 1 : strcpy(matrixDSP, "OOXO"); break; + case 2 : strcpy(matrixDSP, "OHOO"); break; + case 3 : strcpy(matrixDSP, "OXOO"); break; + case 4 : strcpy(matrixDSP, "HOOO"); break; + case 5 : strcpy(matrixDSP, "XOOO"); break; + case 6 : strcpy(matrixDSP, "OOOH"); break; + case 7 : strcpy(matrixDSP, "OOOX"); break; + } + + /* External input connexion */ + switch ((IoMem_ReadWord(0xff8932) >> 8) & 0x7) { + case 0 : strcpy(matrixEXT, "OOHO"); break; + case 1 : strcpy(matrixEXT, "OOXO"); break; + case 2 : strcpy(matrixEXT, "OHOO"); break; + case 3 : strcpy(matrixEXT, "OXOO"); break; + case 4 : strcpy(matrixEXT, "HOOO"); break; + case 5 : strcpy(matrixEXT, "XOOO"); break; + case 6 : strcpy(matrixEXT, "OOOH"); break; + case 7 : strcpy(matrixEXT, "OOOX"); break; + } + + if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { + strcpy(frqDSP, "(STe Freq)"); + strcpy(frqDMA, "(STe Freq)"); + strcpy(frqEXT, "(STe Freq)"); + strcpy(frqDAC, "(STe Freq)"); + } + else { + /* DSP Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 5) & 0x3) { + case 0: strcpy(frqDSP, " (25 Mhz) "); break; + case 1: strcpy(frqDSP, "(External)"); break; + case 2: strcpy(frqDSP, " (32 Mhz) "); break; + default: strcpy(frqDSP, "undefined "); break; + } + + /* DMA Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 1) & 0x3) { + case 0: strcpy(frqDMA, " (25 Mhz) "); break; + case 1: strcpy(frqDMA, "(External)"); break; + case 2: strcpy(frqDMA, " (32 Mhz) "); break; + default: strcpy(frqDMA, "undefined "); break; + } + + /* External Clock */ + switch ((IoMem_ReadWord(0xff8930) >> 9) & 0x3) { + case 0: strcpy(frqEXT, " (25 Mhz) "); break; + case 1: strcpy(frqEXT, "(External)"); break; + case 2: strcpy(frqEXT, " (32 Mhz) "); break; + default: strcpy(frqEXT, "undefined "); break; + } + + /* DAC Clock */ + strcpy(frqDAC, " (25 Mhz) "); + } + + /* data size */ + switch ((IoMem_ReadByte(0xff8921) >> 6) & 0x3) { + case 0: strcpy (dataSize, "8 bits stereo"); break; + case 1: strcpy (dataSize, "16 bits stereo"); break; + case 2: strcpy (dataSize, "8 bits mono"); break; + default: strcpy (dataSize, "undefined"); break; + } + + /* STE, 25Mhz and 32 Mhz sound frequencies */ + if ((IoMem_ReadByte(0xff8935) & 0xf) == 0) { + sprintf(frqSTE, "Ste Freq : %d Khz", Ste_SampleRates[IoMem_ReadByte(0xff8921) & 0x3]); + strcpy (frq25Mhz, "25 Mhz Freq : - Khz"); + strcpy (frq32Mhz, "32 Mzh Freq : - Khz"); + } + else { + strcpy (frqSTE, "Ste Freq : - Khz"); + sprintf(frq25Mhz, "25 Mhz Freq : %d Khz", Falcon_SampleRates_25Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + sprintf(frq32Mhz, "32 Mzh Freq : %d Khz", Falcon_SampleRates_32Mhz[(IoMem_ReadByte(0xff8935) & 0xf) - 1]); + } + + /* Display the crossbar Matrix */ + fprintf(stderr, " INPUT\n"); + fprintf(stderr, "External Imp ---%c------%c------%c------%c\n", matrixDAC[0], matrixDMA[0], matrixDSP[0], matrixEXT[0]); + fprintf(stderr, "%s | | | | O = no connexion\n", frqEXT); + fprintf(stderr, " | | | | X = connexion\n"); + fprintf(stderr, "Dsp Transmit ---%c------%c------%c------%c H = Handshake connexion\n", matrixDAC[1], matrixDMA[1], matrixDSP[1], matrixEXT[1]); + fprintf(stderr, "%s | | | |\n", frqDSP); + fprintf(stderr, " | | | | %s\n", dataSize); + fprintf(stderr, "DMA PlayBack ---%c------%c------%c------%c\n", matrixDAC[2], matrixDMA[2], matrixDSP[2], matrixEXT[2]); + fprintf(stderr, "%s | | | | Sound Freq :\n", frqDMA); + fprintf(stderr, " | | | | %s\n", frqSTE); + fprintf(stderr, "ADC ---%c------%c------%c------%c %s\n", matrixDAC[3], matrixDMA[3], matrixDSP[3], matrixEXT[3], frq25Mhz); + fprintf(stderr, "%s | | | | %s\n", frqDAC, frq32Mhz); + fprintf(stderr, " | | | |\n"); + fprintf(stderr, " DAC DMA DSP External OUTPUT\n"); + fprintf(stderr, " Record Record Out\n"); + fprintf(stderr, "\n"); +} +