public void Play(int nativeTextureID_, Action <int /*nativeTextureID*/, AbstractMovieTextureComponent.CompletedType> delegate_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            editorMovieTexture.delegatePlayComplete = delegate_;
            if (null != editorMovieTexture.movieTexture)
            {
                editorMovieTexture.movieTexture.loop = editorMovieTexture.isLooping;
                editorMovieTexture.movieTexture.Play();
                if (null != editorMovieTexture.audioSource)
                {
                    editorMovieTexture.audioSource.clip   = editorMovieTexture.movieTexture.audioClip;
                    editorMovieTexture.audioSource.volume = editorMovieTexture.normalizeVolume;
                    editorMovieTexture.audioSource.Play();
                }
                editorMovieTexture.mediaState = MediaState.STARTED;
                if (null != editorMovieTexture.ownedMovieTextureComponent)
                {
                    editorMovieTexture.ownedMovieTextureComponent.StartCoroutine(_CoroutineUpdatePlaying(editorMovieTexture));
                }
            }
        }
    }
    public bool IsPaused(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            return(editorMovieTexture.mediaState == MediaState.PAUSED ? true : false);
        }
        return(false);
    }
    public bool IsLooping(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            return(editorMovieTexture.isLooping);
        }
        return(false);
    }
    private IEnumerator _LoadAsync(SEditorMovieTexture editorMovieTexture_)
    {
        yield return(null);

        if (null != editorMovieTexture_.delegateLoadComplete)
        {
            editorMovieTexture_.delegateLoadComplete(editorMovieTexture_.nativeTextureID, AbstractMovieTextureComponent.ResultType.SUCCESS, "");
        }
        editorMovieTexture_.mediaState = MediaState.PREPARED;
    }
    public void SetLooping(int nativeTextureID_, bool loop_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            editorMovieTexture.isLooping = loop_;
            if (null != editorMovieTexture.movieTexture)
            {
                editorMovieTexture.movieTexture.loop = editorMovieTexture.isLooping;
            }
        }
    }
    public void SetVolume(int nativeTextureID_, float normalizeVolume_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            editorMovieTexture.normalizeVolume = normalizeVolume_;
            if (null != editorMovieTexture.audioSource)
            {
                editorMovieTexture.audioSource.volume = editorMovieTexture.normalizeVolume;
            }
        }
    }
    public void Pause(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            if (null != editorMovieTexture.movieTexture)
            {
                editorMovieTexture.movieTexture.Pause();
            }
            if (null != editorMovieTexture.audioSource)
            {
                editorMovieTexture.audioSource.Pause();
            }
            editorMovieTexture.mediaState = MediaState.PAUSED;
        }
    }
    public int GetDuration(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            if (null != editorMovieTexture.audioSource && null != editorMovieTexture.audioSource.clip)
            {
                return((int)(editorMovieTexture.audioSource.clip.length * 1000f));
            }
            if (null != editorMovieTexture.movieTexture)
            {
                return((int)(editorMovieTexture.movieTexture.duration * 1000f));
            }
        }

        return(0);
    }
    public void Resume(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            if (null != editorMovieTexture.movieTexture)
            {
                editorMovieTexture.movieTexture.Play();
                if (null != editorMovieTexture.audioSource)
                {
                    editorMovieTexture.audioSource.clip = editorMovieTexture.movieTexture.audioClip;
                    editorMovieTexture.audioSource.Play();
                }
                editorMovieTexture.mediaState = MediaState.STARTED;
            }
        }
    }
    public void BindRenderTarget(int nativeTextureID_, AbstractMovieTextureComponent ownedMovieTextureComponent_, Material targetMaterial_)
    {
        if (null == targetMaterial_)
        {
            return;
        }

        if (true == this._editorMovieTextureDic.ContainsKey(nativeTextureID_))
        {
            this._editorMovieTextureDic.Remove(nativeTextureID_);
        }

        SPluginsMovieTexture spluginsMovieTexture = ownedMovieTextureComponent_ as SPluginsMovieTexture;

        if (null == spluginsMovieTexture)
        {
            return;
        }

        UnityEngine.MovieTexture movieTexture = spluginsMovieTexture.movieTextureObject as UnityEngine.MovieTexture;
        if (null == movieTexture)
        {
            return;
        }

        targetMaterial_.mainTexture = movieTexture;

        SEditorMovieTexture editorMovieTexture = new SEditorMovieTexture();

        editorMovieTexture.nativeTextureID            = nativeTextureID_;
        editorMovieTexture.movieTexture               = movieTexture;
        editorMovieTexture.ownedMovieTextureComponent = ownedMovieTextureComponent_;
        editorMovieTexture.mediaState = MediaState.IDLE;
        if (null != editorMovieTexture.ownedMovieTextureComponent)
        {
            editorMovieTexture.audioSource = editorMovieTexture.ownedMovieTextureComponent.GetComponent <AudioSource>();
            if (null == editorMovieTexture.audioSource)
            {
                editorMovieTexture.audioSource = editorMovieTexture.ownedMovieTextureComponent.gameObject.AddComponent <AudioSource>();
            }
        }
        this._editorMovieTextureDic.Add(nativeTextureID_, editorMovieTexture);
    }
    private IEnumerator _CoroutineUpdatePlaying(SEditorMovieTexture editorMovieTexture_)
    {
        while (true)
        {
            if (MediaState.STARTED == editorMovieTexture_.mediaState && null != editorMovieTexture_.movieTexture && false == editorMovieTexture_.movieTexture.isPlaying)
            {
                if (null != editorMovieTexture_.delegatePlayComplete)
                {
                    editorMovieTexture_.delegatePlayComplete(editorMovieTexture_.nativeTextureID, AbstractMovieTextureComponent.CompletedType.PLAYBACK_COMPLETION);
                }
            }

            if (MediaState.STOPPED == editorMovieTexture_.mediaState)
            {
                break;
            }
            yield return(null);
        }
    }
    public void LoadAsync(int nativeTextureID_,
                          Action <int /*nativeTextureID*/, AbstractMovieTextureComponent.ResultType, string /*description*/> delegate_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            editorMovieTexture.mediaState           = MediaState.PREPARING;
            editorMovieTexture.delegateLoadComplete = delegate_;
            if (null != editorMovieTexture.ownedMovieTextureComponent)
            {
                editorMovieTexture.ownedMovieTextureComponent.StartCoroutine(_LoadAsync(editorMovieTexture));
            }
        }
        else if (null != delegate_)
        {
            delegate_(nativeTextureID_, AbstractMovieTextureComponent.ResultType.FAILED_FILE_NOT_EXIST, "MovieTexture is None");
        }
    }
    public int GetCurrentPosition(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            if (null != editorMovieTexture.audioSource)
            {
                int currentPosition = (int)(editorMovieTexture.audioSource.time * 1000f);
                int duration        = GetDuration(nativeTextureID_);
                if (currentPosition > duration)
                {
                    currentPosition = currentPosition % duration;
                }
                return(currentPosition);
            }
        }

        return(0);
    }
    public void Stop(int nativeTextureID_)
    {
        SEditorMovieTexture editorMovieTexture = null;

        if (true == this._editorMovieTextureDic.TryGetValue(nativeTextureID_, out editorMovieTexture))
        {
            if (null != editorMovieTexture.movieTexture)
            {
                editorMovieTexture.movieTexture.Stop();
            }
            if (null != editorMovieTexture.audioSource)
            {
                editorMovieTexture.audioSource.Stop();
            }
            editorMovieTexture.mediaState = MediaState.STOPPED;
            if (null != editorMovieTexture.delegatePlayComplete)
            {
                editorMovieTexture.delegatePlayComplete(editorMovieTexture.nativeTextureID, AbstractMovieTextureComponent.CompletedType.FORCE_STOP);
            }
        }
    }