Exemplo n.º 1
0
        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();
            }
        }
Exemplo n.º 2
0
        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();
        }