- val = (*p * snd_vol) >> 8;
- p+= step;
- if (val > 0x7fff)
- val = 0x7fff;
- else if (val < (short)0x8000)
- val = (short)0x8000;
- out[out_idx] = val;
- out_idx = (out_idx + 1) & out_mask;
- }
- }
- else if (shm->samplebits == 8)
- {
- unsigned char *out = (unsigned char *) pbuf;
- while (count--)
- {
- val = (*p * snd_vol) >> 8;
- p+= step;
- if (val > 0x7fff)
- val = 0x7fff;
- else if (val < (short)0x8000)
- val = (short)0x8000;
- out[out_idx] = (val>>8) + 128;
- out_idx = (out_idx + 1) & out_mask;
+ // 8bit
+ unsigned char *snd_out;
+ if (shm->format.channels == 2)
+ {
+ // 8bit 2 channels (stereo)
+ while (lpaintedtime < endtime)
+ {
+ // handle recirculating buffer issues
+ i = lpaintedtime & ((shm->samples >> 1) - 1);
+ snd_out = (unsigned char *) pbuf + (i << 1);
+ snd_linear_count = (shm->samples >> 1) - i;
+ if (snd_linear_count > endtime - lpaintedtime)
+ snd_linear_count = endtime - lpaintedtime;
+ snd_linear_count <<= 1;
+ if (snd_swapstereo.value)
+ {
+ for (i = 0;i < snd_linear_count;i += 2)
+ {
+ val = ((snd_p[i + 1] * snd_vol) >> 16) + 128;
+ snd_out[i ] = bound(0, val, 255);
+ val = ((snd_p[i ] * snd_vol) >> 16) + 128;
+ snd_out[i + 1] = bound(0, val, 255);
+ }
+ }
+ else
+ {
+ for (i = 0;i < snd_linear_count;i += 2)
+ {
+ val = ((snd_p[i ] * snd_vol) >> 16) + 128;
+ snd_out[i ] = bound(0, val, 255);
+ val = ((snd_p[i + 1] * snd_vol) >> 16) + 128;
+ snd_out[i + 1] = bound(0, val, 255);
+ }
+ }
+ snd_p += snd_linear_count;
+ lpaintedtime += (snd_linear_count >> 1);
+ }
+ }
+ else
+ {
+ // 8bit 1 channel (mono)
+ while (lpaintedtime < endtime)
+ {
+ // handle recirculating buffer issues
+ i = lpaintedtime & (shm->samples - 1);
+ snd_out = (unsigned char *) pbuf + i;
+ snd_linear_count = shm->samples - i;
+ if (snd_linear_count > endtime - lpaintedtime)
+ snd_linear_count = endtime - lpaintedtime;
+ for (i = 0;i < snd_linear_count;i++)
+ {
+ val = (((snd_p[i * 2] + snd_p[i * 2 + 1]) * snd_vol) >> 17) + 128;
+ snd_out[i ] = bound(0, val, 255);
+ }
+ snd_p += snd_linear_count << 1;
+ lpaintedtime += snd_linear_count;
+ }
+ }