extern cvar_t snd_softclip;
static portable_sampleframe_t paintbuffer[PAINTBUFFER_SIZE];
-static portable_sampleframe_t paintbuffer_unswapped[PAINTBUFFER_SIZE];
extern speakerlayout_t snd_speakerlayout; // for querying the listeners
-extern void SCR_CaptureVideo_SoundFrame(const portable_sampleframe_t *paintbuffer, size_t length);
-static void S_CaptureAVISound(const portable_sampleframe_t *paintbuffer, size_t length)
+#ifdef CONFIG_VIDEO_CAPTURE
+static portable_sampleframe_t paintbuffer_unswapped[PAINTBUFFER_SIZE];
+
+static void S_CaptureAVISound(const portable_sampleframe_t *sampleframes, size_t length)
{
size_t i;
unsigned int j;
{
unsigned int j0 = snd_speakerlayout.listeners[j].channel_unswapped;
for(i = 0; i < length; ++i)
- paintbuffer_unswapped[i].sample[j0] = paintbuffer[i].sample[j];
+ paintbuffer_unswapped[i].sample[j0] = sampleframes[i].sample[j];
}
SCR_CaptureVideo_SoundFrame(paintbuffer_unswapped, length);
}
+#endif
extern cvar_t snd_softclip;
-static void S_SoftClipPaintBuffer(portable_sampleframe_t *painted_ptr, int nbframes, int width, int channels)
+static void S_SoftClipPaintBuffer(portable_sampleframe_t *painted_ptr, int nbframes, int width, int nchannels)
{
int i;
maxvol = max(1.0f, maxvol * (1.0f - nbframes / (0.4f * snd_renderbuffer->format.speed)));
#define SOFTCLIP(x) if(fabs(x)>maxvol) maxvol=fabs(x); (x) /= maxvol;
- if (channels == 8) // 7.1 surround
+ if (nchannels == 8) // 7.1 surround
{
for (i = 0;i < nbframes;i++, p++)
{
SOFTCLIP(p->sample[7]);
}
}
- else if (channels == 6) // 5.1 surround
+ else if (nchannels == 6) // 5.1 surround
{
for (i = 0; i < nbframes; i++, p++)
{
SOFTCLIP(p->sample[5]);
}
}
- else if (channels == 4) // 4.0 surround
+ else if (nchannels == 4) // 4.0 surround
{
for (i = 0; i < nbframes; i++, p++)
{
SOFTCLIP(p->sample[3]);
}
}
- else if (channels == 2) // 2.0 stereo
+ else if (nchannels == 2) // 2.0 stereo
{
for (i = 0; i < nbframes; i++, p++)
{
SOFTCLIP(p->sample[1]);
}
}
- else if (channels == 1) // 1.0 mono
+ else if (nchannels == 1) // 1.0 mono
{
for (i = 0; i < nbframes; i++, p++)
{
}
}
-static void S_ConvertPaintBuffer(portable_sampleframe_t *painted_ptr, void *rb_ptr, int nbframes, int width, int channels)
+static void S_ConvertPaintBuffer(portable_sampleframe_t *painted_ptr, void *rb_ptr, int nbframes, int width, int nchannels)
{
- int i, val;
+ int i;
+ float val;
+ if (width == 4) // 32bit float
+ {
+ float *snd_out = (float*)rb_ptr;
+ if (nchannels == 8) // 7.1 surround
+ {
+ for (i = 0; i < nbframes; i++, painted_ptr++)
+ {
+ *snd_out++ = painted_ptr->sample[0];
+ *snd_out++ = painted_ptr->sample[1];
+ *snd_out++ = painted_ptr->sample[2];
+ *snd_out++ = painted_ptr->sample[3];
+ *snd_out++ = painted_ptr->sample[4];
+ *snd_out++ = painted_ptr->sample[5];
+ *snd_out++ = painted_ptr->sample[6];
+ *snd_out++ = painted_ptr->sample[7];
+ }
+ }
+ else if (nchannels == 6) // 5.1 surround
+ {
+ for (i = 0; i < nbframes; i++, painted_ptr++)
+ {
+ *snd_out++ = painted_ptr->sample[0];
+ *snd_out++ = painted_ptr->sample[1];
+ *snd_out++ = painted_ptr->sample[2];
+ *snd_out++ = painted_ptr->sample[3];
+ *snd_out++ = painted_ptr->sample[4];
+ *snd_out++ = painted_ptr->sample[5];
+ }
+ }
+ else if (nchannels == 4) // 4.0 surround
+ {
+ for (i = 0; i < nbframes; i++, painted_ptr++)
+ {
+ *snd_out++ = painted_ptr->sample[0];
+ *snd_out++ = painted_ptr->sample[1];
+ *snd_out++ = painted_ptr->sample[2];
+ *snd_out++ = painted_ptr->sample[3];
+ }
+ }
+ else if (nchannels == 2) // 2.0 stereo
+ {
+ for (i = 0; i < nbframes; i++, painted_ptr++)
+ {
+ *snd_out++ = painted_ptr->sample[0];
+ *snd_out++ = painted_ptr->sample[1];
+ }
+ }
+ else if (nchannels == 1) // 1.0 mono
+ {
+ for (i = 0; i < nbframes; i++, painted_ptr++)
+ {
+ *snd_out++ = painted_ptr->sample[0];
+ }
+ }
- // FIXME: add 24bit and 32bit float formats
- // FIXME: optimize with SSE intrinsics?
- if (width == 2) // 16bit
+ // noise is really really annoying
+ if (cls.timedemo)
+ memset(rb_ptr, 0, nbframes * nchannels * width);
+ }
+ else if (width == 2) // 16bit
{
short *snd_out = (short*)rb_ptr;
- if (channels == 8) // 7.1 surround
+ if (nchannels == 8) // 7.1 surround
{
for (i = 0;i < nbframes;i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[7] * 32768.0f);*snd_out++ = bound(-32768, val, 32767);
}
}
- else if (channels == 6) // 5.1 surround
+ else if (nchannels == 6) // 5.1 surround
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[5] * 32768.0f);*snd_out++ = bound(-32768, val, 32767);
}
}
- else if (channels == 4) // 4.0 surround
+ else if (nchannels == 4) // 4.0 surround
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[3] * 32768.0f);*snd_out++ = bound(-32768, val, 32767);
}
}
- else if (channels == 2) // 2.0 stereo
+ else if (nchannels == 2) // 2.0 stereo
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[1] * 32768.0f);*snd_out++ = bound(-32768, val, 32767);
}
}
- else if (channels == 1) // 1.0 mono
+ else if (nchannels == 1) // 1.0 mono
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
// noise is really really annoying
if (cls.timedemo)
- memset(rb_ptr, 0, nbframes * channels * width);
+ memset(rb_ptr, 0, nbframes * nchannels * width);
}
else // 8bit
{
unsigned char *snd_out = (unsigned char*)rb_ptr;
- if (channels == 8) // 7.1 surround
+ if (nchannels == 8) // 7.1 surround
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[7] * 128.0f) + 128; *snd_out++ = bound(0, val, 255);
}
}
- else if (channels == 6) // 5.1 surround
+ else if (nchannels == 6) // 5.1 surround
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[5] * 128.0f) + 128; *snd_out++ = bound(0, val, 255);
}
}
- else if (channels == 4) // 4.0 surround
+ else if (nchannels == 4) // 4.0 surround
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[3] * 128.0f) + 128; *snd_out++ = bound(0, val, 255);
}
}
- else if (channels == 2) // 2.0 stereo
+ else if (nchannels == 2) // 2.0 stereo
{
for (i = 0; i < nbframes; i++, painted_ptr++)
{
val = (int)(painted_ptr->sample[1] * 128.0f) + 128; *snd_out++ = bound(0, val, 255);
}
}
- else if (channels == 1) // 1.0 mono
+ else if (nchannels == 1) // 1.0 mono
{
for (i = 0;i < nbframes;i++, painted_ptr++)
{
// noise is really really annoying
if (cls.timedemo)
- memset(rb_ptr, 128, nbframes * channels);
+ memset(rb_ptr, 128, nbframes * nchannels);
}
}
double posd;
double speedd;
float maxvol;
- qboolean looping;
- qboolean silent;
+ qbool looping;
+ qbool silent;
// mix as many times as needed to fill the requested buffer
while (bufferframes)
// paint in the channels.
// channels with zero volumes still advance in time but don't paint.
- ch = channels;
+ ch = channels; // cppcheck complains here but it is wrong, channels is a channel_t[MAX_CHANNELS] and not an int
for (channelindex = 0;channelindex < (int)total_channels;channelindex++, ch++)
{
sfx = ch->sfx;
// do the actual paint now (may skip work if silent)
paint = paintbuffer;
- wantframes = totalmixframes;
istartframe = 0;
for (wantframes = totalmixframes;wantframes > 0;posd += count * speedd, wantframes -= count)
{
S_SoftClipPaintBuffer(paintbuffer, totalmixframes, snd_renderbuffer->format.width, snd_renderbuffer->format.channels);
+#ifdef CONFIG_VIDEO_CAPTURE
if (!snd_usethreadedmixing)
S_CaptureAVISound(paintbuffer, totalmixframes);
+#endif
S_ConvertPaintBuffer(paintbuffer, outbytes, totalmixframes, snd_renderbuffer->format.width, snd_renderbuffer->format.channels);