[sldev] Blowing wind

Tofu Linden tofu at lindenlab.com
Thu Dec 10 07:31:42 PST 2009


I don't have time to investigate properly, but my first guess would be
that this is because our wind is stereo (interleaved
MIXBUFFERFORMAT_Ts).

Aimee Trescothick wrote:
> Can anyone explain how the below piece of the existing code from the wind noise synthesizer has ever actually worked properly, with MIXBUFFERFORMAT_T defined as S16 and stride set to 4 bytes?
> 
>     U8 *cursamplep = (U8*)newbuffer;
> ...
> 
>     MIXBUFFERFORMAT_T sample;
> ...
> 
>     sample = llfloor(((F32)nextSample*32768.f*(1.0f - mCurrentPanGainR))+0.5f);
>     *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768,
>                                                   (MIXBUFFERFORMAT_T)32767);
>     cursamplep += stride;
> 
>     sample = llfloor(((F32)nextSample*32768.f*mCurrentPanGainR)+0.5f);
>     *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768,
>                                                   (MIXBUFFERFORMAT_T)32767);
>     cursamplep += stride;
> 
> On Windows and Linux MIXBUFFERFORMAT_T is defined as S16, and if the FMOD mixer mode is FSOUND_MIXER_QUALITY_FPU or FSOUND_MIXER_BLENDMODE, stride is set to 4 bytes, as these modes both use a 32-bit mix buffer.
> 
> But as far as I can see, that's just going to write signed 16-bit integers into the first two bytes of the 4-byte sample, skipping over the other two bytes, leaving them at whatever they were before (zero, as wind is the first thing that goes in the buffer after it is cleared).  When FMOD tries to read the 4-bytes back as either 32-bit signed integers (FSOUND_MIXER_BLENDMODE), or 32-bit float (FSOUND_MIXER_QUALITY_FPU) that's just going to go horribly wrong.
> 
> MIXBUFFERFORMAT_T is only defined as S32 on the Mac, on Windows and Linux it is S16 as one of FMOD's 16-bit MMX mixers is normally used. The only time I would imagine this situation occurs is on a PC without MMX (or when LL_VALGRIND is defined on Linux for testing, which specifically forces the mixer mode to FSOUND_MIXER_QUALITY_FPU).
> 
> If this has never worked anyway, it would seem to make sense to turn off the wind generator for these mixer modes to avoid making a horrible noise, drop the striding which will simplify things elsewhere, and just declare cursamplep as MIXBUFFERFORMAT_T in the first place, removing the need to typecast it ... or am I missing something?
> 
> (If you followed me this far you're doing better than I am :)
> 
> Aimee.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Policies and (un)subscribe information available here:
> http://wiki.secondlife.com/wiki/SLDev
> Please read the policies before posting to keep unmoderated posting privileges


More information about the SLDev mailing list