- int fa,ns,ns_from,ns_to;
-#if !defined(_MACOSX) && !defined(__arm__)
- int voldiv = iVolume;
+ int level, shift, bit;
+ int ret = -1, d;
+
+ s_chan[ch].spos += s_chan[ch].sinc * (ns_to - ns);
+ while (s_chan[ch].spos >= 28*0x10000)
+ {
+ d = skip_block(ch);
+ if (d)
+ ret = ns_to;
+ s_chan[ch].spos -= 28*0x10000;
+ }
+
+ // modified from DrHell/shalma, no fraction
+ level = (spuCtrl >> 10) & 0x0f;
+ level = 0x8000 >> level;
+
+ for (; ns < ns_to; ns++)
+ {
+ dwNoiseCount += 2;
+ if (dwNoiseCount >= level)
+ {
+ dwNoiseCount -= level;
+ shift = (dwNoiseVal >> 10) & 0x1f;
+ bit = (0x69696969 >> shift) & 1;
+ if (dwNoiseVal & 0x8000)
+ bit ^= 1;
+ dwNoiseVal = (dwNoiseVal << 1) | bit;
+ }
+
+ ChanBuf[ns] = (signed short)dwNoiseVal;
+ }
+
+ return ret;
+}
+
+#ifdef HAVE_ARMV5
+// asm code; lv and rv must be 0-3fff
+extern void mix_chan(int start, int count, int lv, int rv);
+extern void mix_chan_rvb(int start, int count, int lv, int rv);