public CriAtomClipWaveformPreviewer(CriAtomClip criAtomClip)
        {
            if (!CriAtomTimelinePreviewer.IsInitialized || string.IsNullOrEmpty(criAtomClip.cueSheet))
            {
                return;
            }
            var acb = CriAtomTimelinePreviewer.Instance.GetAcb(criAtomClip.cueSheet);

            if (acb == null)
            {
                Debug.LogError("[CRIWARE][Timeline] faild to load acb object.");
                return;
            }
            this.material = new Material(Shader.Find(atomClipWaveformRenderShader));

            decodeTask = Task.Run(() =>
            {
                this.atomClipWaveformInfo = new CriAtomClipWaveformInfo();
                if (!acb.GetWaveFormInfo(criAtomClip.cueName, out this.atomClipWaveformInfo.waveformInfo))
                {
                    /* without waveform */
                    return;
                }
                this.atomClipWaveformInfo.lpcmBufferByInterleave = new Int16[this.atomClipWaveformInfo.waveformInfo.numSamples * this.atomClipWaveformInfo.waveformInfo.numChannels];
                if (!this.LoadWaveform(acb.nativeHandle, criAtomClip.cueName, ref this.atomClipWaveformInfo.lpcmBufferByInterleave))
                {
                    this.atomClipWaveformInfo.lpcmBufferByInterleave = null;
                    return;
                }
                this.atomClipWaveformInfo.waveDurationSecond = this.atomClipWaveformInfo.waveformInfo.numSamples / (double)this.atomClipWaveformInfo.waveformInfo.samplingRate;
            });
        }
        public override void OnCreate(TimelineClip clip, TrackAsset track, TimelineClip clonedFrom)
        {
            base.OnCreate(clip, track, clonedFrom);
#if CRI_TIMELINE_ATOM_VERBOSE_DEBUG
            Debug.Log("[CRIWARE][Timeline] OnCreate");
#endif

            atomClipPreviewDirectory.Clear();

            CriAtomClip atomClip = clip.asset as CriAtomClip;
            atomClipPreviewDirectory.Add(atomClip, new CriAtomClipWaveformPreviewer(atomClip));
        }
        public override void OnClipChanged(TimelineClip clip)
        {
            base.OnClipChanged(clip);
#if CRI_TIMELINE_ATOM_VERBOSE_DEBUG
            Debug.Log("[CRIWARE][Timeline] OnClipChanged");
#endif

            CriAtomClip atomClip = clip.asset as CriAtomClip;
            if (atomClipPreviewDirectory.ContainsKey(atomClip))
            {
                return;
            }
            atomClipPreviewDirectory.Add(atomClip, new CriAtomClipWaveformPreviewer(atomClip));
        }
        public override void DrawBackground(TimelineClip clip, ClipBackgroundRegion region)
        {
            base.DrawBackground(clip, region);
#if CRI_TIMELINE_ATOM_VERBOSE_DEBUG
            Debug.Log("[CRIWARE][Timeline] DrawBackground");

            Debug.Log("region.startTime : " + region.startTime.ToString() + "region.endTime : " + region.endTime.ToString());
#endif

            CriAtomClip atomClip = clip.asset as CriAtomClip;
            CriAtomClipWaveformPreviewer atomClipPreviewer;
            if (!atomClipPreviewDirectory.TryGetValue(atomClip, out atomClipPreviewer))
            {
#if CRI_TIMELINE_ATOM_VERBOSE_DEBUG
                Debug.LogError("[CRIWARE][Timeline] not contains key : " + clip.displayName);
#endif
                return;
            }
            if (!atomClipPreviewer.HasDecodeTask())
            {
                atomClipPreviewDirectory.Remove(atomClip);
                atomClipPreviewDirectory.Add(atomClip, new CriAtomClipWaveformPreviewer(atomClip));
            }

            if (!atomClipPreviewer.HasPreviewData())
            {
                /* While decoding or decode error. Skip renderring. */
                return;
            }

            atomClipPreviewer.IsLooping = atomClip.loopWithinClip;
            atomClipPreviewer.IsMuted   = atomClip.muted;
            CriAtomTrack atomTrack = clip.parentTrack as CriAtomTrack;
            if (atomTrack.m_IsRenderMono)
            {
                atomClipPreviewer.ChannelMode = CriAtomClipWaveformPreviewer.RenderChannelMode.Mono;
            }
            else
            {
                atomClipPreviewer.ChannelMode = CriAtomClipWaveformPreviewer.RenderChannelMode.All;
            }

            atomClipPreviewer.RenderMaterial(region);
        }
Example #5
0
        public override void ProcessFrame(Playable playable, FrameData info, object playerData)
        {
            if (playerData == null || m_Director.time == m_lastDirectorTime)
            {
                return;
            }

            bool wrapped = false;

            if (m_Director.state == PlayState.Playing && m_Director.time < m_lastDirectorTime)
            {
                wrapped = true;
            }
            m_lastDirectorTime = m_Director.time;

            int inputPort = 0;

            foreach (var clip in m_Clips)
            {
                ScriptPlayable <CriAtomBehaviour> inputPlayable = (ScriptPlayable <CriAtomBehaviour>)playable.GetInput(inputPort);
                CriAtomBehaviour clipBehaviour = inputPlayable.GetBehaviour();
                CriAtomClip      criAtomClip   = clip.asset as CriAtomClip;
                float            inputWeight   = criAtomClip.ignoreBlend ? 1f : playable.GetInputWeight(inputPort);

                if (clipBehaviour != null)
                {
                    if (m_StopOnWrapping && wrapped)
                    {
                        if (clipBehaviour.IsClipPlaying)
                        {
                            clipBehaviour.Stop(criAtomClip.stopWithoutRelease);
                        }
                    }

                    if (m_Director.time >= clip.end ||
                        m_Director.time <= clip.start)
                    {
                        if (clipBehaviour.IsClipPlaying)
                        {
                            clipBehaviour.Stop(criAtomClip.stopWithoutRelease);
                        }
                    }
                    else if (criAtomClip.muted == false)
                    {
                        long seekTimeMs       = (long)((m_Director.time - clip.start) * 1000.0);
                        bool isDirectorPaused = (m_Director.state == PlayState.Paused);

                        var playConfig = new CriAtomClipPlayConfig(
                            criAtomClip.cueSheet,
                            criAtomClip.cueName,
                            seekTimeMs,
                            clip.timeScale,
                            criAtomClip.loopWithinClip
                            );

                        if (clipBehaviour.IsClipPlaying == false)                           /* Entering clip for the first time */
                        {
                            if (IsEditor == false)
                            {
                                clipBehaviour.Play(m_Bind, playConfig);
                            }
                            else
                            {
                                clipBehaviour.PreviewPlay(m_Guid, isDirectorPaused, playConfig);
                                m_lastScrubTime = DateTime.Now;
                            }
                            criAtomClip.SetClipDuration(clipBehaviour.CueLength);
                        }
                        else
                        {
                            var now = DateTime.Now;
                            if (IsEditor == true && isDirectorPaused &&
                                now - m_lastScrubTime > new TimeSpan(0, 0, 0, 0, cScratchTimeIntervalMs))                                   /* Scrubing the track */
                            {
                                clipBehaviour.Stop(true);
                                clipBehaviour.PreviewPlay(m_Guid, isDirectorPaused, playConfig);
                                m_lastScrubTime = now;
                            }
                        }

                        if (IsEditor == true)
                        {
                            CriAtomTimelinePreviewer.Instance.SetVolume(m_Guid, clipBehaviour.volume * inputWeight);
                            CriAtomTimelinePreviewer.Instance.SetPitch(m_Guid, clipBehaviour.pitch);
                            if (string.IsNullOrEmpty(m_AisacControls) == false)
                            {
                                CriAtomTimelinePreviewer.Instance.SetAISAC(m_Guid, m_AisacControls, clipBehaviour.AISACValue);
                            }
                            CriAtomTimelinePreviewer.Instance.PlayerUpdateParameter(m_Guid, clipBehaviour.playback);
                        }
                        else
                        {
                            m_Bind.player.SetVolume(clipBehaviour.volume * inputWeight);
                            m_Bind.player.SetPitch(clipBehaviour.pitch);
                            if (string.IsNullOrEmpty(m_AisacControls) == false)
                            {
                                m_Bind.player.SetAisacControl(m_AisacControls, clipBehaviour.AISACValue);
                            }
                            m_Bind.player.Update(clipBehaviour.playback);
                        }
                    }
                }

                inputPort++;
            }
        }