public void Play(float volume, AudioEngine engine) { _cueVolume = volume; var category = engine.Categories[_categoryId]; int currentInstanceCount = category.GetPlayingInstanceCount(); if (currentInstanceCount >= category.maxInstances) { var prevSound = category.GetOldestInstance(); if (prevSound != null) { prevSound.SetFade(0f, category.fadeOut); prevSound.Stop(AudioStopOptions.Immediate); SetFade(category.fadeIn, 0f); } } float finalVolume = _volume * _cueVolume * category.Volume; float finalPitch = _pitch + _cuePitch; float finalMix = _useReverb ? _cueReverbMix : 0f; if (_complexSound) { foreach (XactClip clip in _soundClips !) { clip.UpdateState(finalVolume, finalPitch, finalMix, _cueFilterFrequency, _cueFilterQFactor); clip.Play(); } } else { if (_wave != null) { if (_streaming) { _wave.Dispose(); } else { _wave._isXAct = false; } _wave = null; } _wave = _soundBank.GetSoundEffectInstance(_waveBankIndex, _trackIndex, out _streaming); if (_wave == null) { // We couldn't create a sound effect instance, // most likely because we've reached the sound pool limits. return; } _wave.Pitch = finalPitch; _wave.Volume = finalVolume; _wave.PlatformSetReverbMix(finalMix); _wave.Play(); } }
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; } ; } _wave = _soundBank.GetSoundEffectInstance(_waveBanks[_wavIndex], _tracks[_wavIndex], out _streaming); if (_wave == 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. _wave.IsLooped = _loopCount == 255 && trackCount == 1; // Update all the wave states then play. UpdateState(); _wave.Play(); }