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
_______________________________________________
Policies and (un)subscribe information available here:
http://wiki.secondlife.com/wiki/SLDev
Please read the policies before posting to keep unmoderated posting privileges

Reply via email to