private void Play(bool pickNewWav) { var trackCount = _tracks.Length; // Do we need to pick a new wav to play first? if (pickNewWav) { switch (_variation) { case VariationType.Ordered: _wavIndex = (_wavIndex + 1) % trackCount; break; case VariationType.OrderedFromRandom: _wavIndex = (_wavIndex + 1) % trackCount; break; case VariationType.Random: if (_weights == null || trackCount == 1) { _wavIndex = XactHelpers.Random.Next() % trackCount; } else { var sum = XactHelpers.Random.Next(_totalWeights); for (var i = 0; i < trackCount; i++) { sum -= _weights[i]; if (sum <= 0) { _wavIndex = i; break; } } } break; case VariationType.RandomNoImmediateRepeats: { if (_weights == null || trackCount == 1) { _wavIndex = XactHelpers.Random.Next() % trackCount; } else { var last = _wavIndex; var sum = XactHelpers.Random.Next(_totalWeights); for (var i = 0; i < trackCount; i++) { sum -= _weights[i]; if (sum <= 0) { _wavIndex = i; break; } } if (_wavIndex == last) { _wavIndex = (_wavIndex + 1) % trackCount; } } break; } case VariationType.Shuffle: // TODO: Need some sort of deck implementation. _wavIndex = XactHelpers.Random.Next() % trackCount; break; } ; } _wav = _soundBank.GetSoundEffectInstance(_waveBanks[_wavIndex], _tracks[_wavIndex], out _streaming); if (_wav == null) { // We couldn't create a sound effect instance, most likely // because we've reached the sound pool limits. return; } // Do all the randoms before we play. if (_volumeVar.HasValue) { _trackVolume = _volumeVar.Value.X + ((float)XactHelpers.Random.NextDouble() * _volumeVar.Value.Y); } if (_pitchVar.HasValue) { _trackPitch = _pitchVar.Value.X + ((float)XactHelpers.Random.NextDouble() * _pitchVar.Value.Y); } if (_clip.FilterEnabled) { if (_filterVar.HasValue) { _trackFilterFrequency = _filterVar.Value.X + ((float)XactHelpers.Random.NextDouble() * _filterVar.Value.Y); _trackFilterQFactor = _filterVar.Value.Z + ((float)XactHelpers.Random.NextDouble() * _filterVar.Value.W); } else { _trackFilterFrequency = _clip.FilterFrequency; _trackFilterQFactor = _clip.FilterQ; } } // This is a shortcut for infinite looping of a single track. _wav.IsLooped = _loopCount == 255 && trackCount == 1; // Update all the wave states then play. UpdateState(); _wav.Play(); }