コード例 #1
0
        public SourceVoice Play(EffectSound sound)
        {
            var waveFormat = sound.Stream.Format;
            List <SourceVoice> voices;

            lock (instances)
            {
                if (!instances.TryGetValue(waveFormat, out voices))
                {
                    voices = new List <SourceVoice>();
                    instances.Add(waveFormat, voices);
                }

                // Clean non-playing source
                var voiceToDelete = new List <SourceVoice>();
                foreach (var voice in voices)
                {
                    if (voice.State.BuffersQueued == 0)
                    {
                        voiceToDelete.Add(voice);
                    }
                }
                voiceToDelete.ForEach(x =>
                {
                    voices.Remove(x);
                    x.Stop();
                    x.DestroyVoice();
                    x.Dispose();
                });

                if (voices.Count >= this.maxInstances)
                {
                    // Too many instances
                    return(null);
                }

                var newVoice = new SourceVoice(this.xaudio2, waveFormat, true);
                newVoice.BufferEnd += newVoice_BufferEnd;
                voices.Add(newVoice);

                newVoice.SubmitSourceBuffer(sound.Buffer, sound.Stream.DecodedPacketsInfo);
                newVoice.Start();

                return(newVoice);
            }
        }
コード例 #2
0
ファイル: EffectManager.cs プロジェクト: HakanL/animatroller
        public SourceVoice Play(EffectSound sound)
        {
            var waveFormat = sound.Stream.Format;
            List<SourceVoice> voices;
            lock (instances)
            {
                if (!instances.TryGetValue(waveFormat, out voices))
                {
                    voices = new List<SourceVoice>();
                    instances.Add(waveFormat, voices);
                }

                // Clean non-playing source
                var voiceToDelete = new List<SourceVoice>();
                foreach (var voice in voices)
                {
                    if (voice.State.BuffersQueued == 0)
                        voiceToDelete.Add(voice);
                }
                voiceToDelete.ForEach(x =>
                    {
                        voices.Remove(x);
                        x.Stop();
                        x.DestroyVoice();
                        x.Dispose();
                    });

                if (voices.Count >= this.maxInstances)
                    // Too many instances
                    return null;

                var newVoice = new SourceVoice(this.xaudio2, waveFormat, true);
                newVoice.BufferEnd += newVoice_BufferEnd;
                voices.Add(newVoice);

                newVoice.SubmitSourceBuffer(sound.Buffer, sound.Stream.DecodedPacketsInfo);
                newVoice.Start();

                return newVoice;
            }
        }
コード例 #3
0
ファイル: EffectManager.cs プロジェクト: HakanL/animatroller
 public SourceVoice Play(string filename)
 {
     var effectSound = new EffectSound(Path.Combine(this.soundPath, filename));
     return Play(effectSound);
 }
コード例 #4
0
        public SourceVoice Play(string filename)
        {
            var effectSound = new EffectSound(Path.Combine(this.soundPath, filename));

            return(Play(effectSound));
        }
コード例 #5
0
 public void Dispose()
 {
     EffectSound.DisposeAll();
 }