Keep video in sync with audio

This commit is contained in:
Paul Chote
2010-08-11 23:02:45 +12:00
parent ca6debde66
commit b88512df43
2 changed files with 42 additions and 29 deletions

View File

@@ -12,6 +12,7 @@ using System;
using System.Drawing;
using OpenRA.FileFormats;
using OpenRA.Graphics;
using OpenRA.Support;
namespace OpenRA.Widgets
{
@@ -23,41 +24,42 @@ namespace OpenRA.Widgets
Sprite videoSprite;
VqaReader video = null;
float invLength;
public void LoadVideo(string filename)
{
video = new VqaReader(FileSystem.Open(filename));
timestep = 1e3f/video.Framerate;
timestep = 1f/video.Framerate;
invLength = video.Framerate*1f/video.Frames;
var size = OpenRA.Graphics.Util.NextPowerOf2(Math.Max(video.Width, video.Height));
videoSprite = new Sprite(new Sheet(new Size(size,size)), new Rectangle( 0, 0, video.Width, video.Height ), TextureChannel.Alpha);
}
int lastTime;
bool first = true;
bool advanceNext = false;
Stopwatch sw = new Stopwatch();
public override void DrawInner(World world)
{
if (video == null)
{
LoadVideo(Video);
Sound.PlayRaw(video.AudioData);
}
int t = Environment.TickCount;
int dt = t - lastTime;
if (advanceNext)
{
if (video.CurrentFrame == 0)
Sound.PlayRaw(video.AudioData);
advanceNext = false;
video.AdvanceFrame();
}
if (dt > timestep)
LoadVideo(Video);
var nextFrame = (int)float2.Lerp(0, video.Frames, (float)(sw.ElapsedTime()*invLength));
if (first || nextFrame > video.Frames)
{
lastTime = t;
advanceNext = true;
video.Reset();
sw.Reset();
Sound.PlayRaw(video.AudioData);
nextFrame = 0;
videoSprite.sheet.Texture.SetData(video.FrameData());
first = false;
}
while (nextFrame > video.CurrentFrame)
{
video.AdvanceFrame();
if (nextFrame == video.CurrentFrame)
videoSprite.sheet.Texture.SetData(video.FrameData());
}
Game.Renderer.RgbaSpriteRenderer.DrawSprite(videoSprite, new int2(RenderBounds.X,RenderBounds.Y), "chrome");