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
