static public void PlayEffect(string path, CommonSettings.VoidCallBack callback = null)
        {
            if (Configer.Instance.HighQualityAudio)
            {
                path = path.Replace("audios", "audios_source");
            }
            else
            {
                path = path.Replace("audios_source", "audios");
            }
            if (Configer.Instance.ResourceRootMenu != "")
            {
                path = Configer.Instance.ResourceRootMenu + path;
            }
            path = path.Replace("\\", "/");
            int channel = CurrentChannel;

            EffectPool[channel].Source = new Uri(path, UriKind.Relative);
            AudioTag tag = EffectPool[channel].Tag as AudioTag;

            tag.callback = callback;
            EffectPool[channel].Play();
            CurrentChannel++;
            if (CurrentChannel >= EFFECT_POOL_SIZE)
            {
                CurrentChannel = 0;
            }
        }
        static public void Init()
        {
            Canvas container = App.RootCanvas;

            GameMusic = new MediaElement()
            {
                IsHitTestVisible = false,
                Visibility       = System.Windows.Visibility.Collapsed,
                Volume           = 1,
                IsMuted          = !Configer.Instance.Music
            };

            GameMusic.MediaEnded += (s, e) =>
            {
                GameMusic.Stop();
                GameMusic.Play();
            };
            container.Children.Add(GameMusic);

            for (int i = 0; i < EFFECT_POOL_SIZE; ++i)
            {
                MediaElement effectElement = new MediaElement()
                {
                    IsHitTestVisible = false,
                    Visibility       = System.Windows.Visibility.Collapsed,
                    Volume           = 1,
                    IsMuted          = !Configer.Instance.Audio
                };
                EffectPool[i]        = effectElement;
                EffectChannelBusy[i] = false;
                effectElement.Tag    = new AudioTag()
                {
                    Index = i
                };

                effectElement.MediaEnded += (s, e) =>
                {
                    AudioTag tag = effectElement.Tag as AudioTag;
                    if (tag.callback != null)
                    {
                        tag.callback();
                    }
                    tag.callback = null;
                    EffectChannelBusy[tag.Index] = false;
                };

                effectElement.MediaFailed += (s, e) =>
                {
                    AudioTag tag = effectElement.Tag as AudioTag;
                    EffectChannelBusy[tag.Index] = false;
                };


                container.Children.Add(effectElement);
            }
        }