forked from mia/Aegisub
If Ctrl is held when video playback is started, no audio resync is attempted during that playback.
Originally committed to SVN as r1201.
This commit is contained in:
parent
59aad1f044
commit
5a4e03312a
3 changed files with 12 additions and 4 deletions
|
@ -196,14 +196,18 @@ END_EVENT_TABLE()
|
||||||
//////////////
|
//////////////
|
||||||
// Play video
|
// Play video
|
||||||
void VideoBox::OnVideoPlay(wxCommandEvent &event) {
|
void VideoBox::OnVideoPlay(wxCommandEvent &event) {
|
||||||
VideoContext::Get()->Play();
|
VideoContext *ctx = VideoContext::Get();
|
||||||
|
ctx->EnableAudioSync(wxGetMouseState().ControlDown() == false);
|
||||||
|
ctx->Play();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
///////////////////
|
||||||
// Play video line
|
// Play video line
|
||||||
void VideoBox::OnVideoPlayLine(wxCommandEvent &event) {
|
void VideoBox::OnVideoPlayLine(wxCommandEvent &event) {
|
||||||
VideoContext::Get()->PlayLine();
|
VideoContext *ctx = VideoContext::Get();
|
||||||
|
ctx->EnableAudioSync(wxGetMouseState().ControlDown() == false);
|
||||||
|
ctx->PlayLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,7 @@ VideoContext::VideoContext() {
|
||||||
arValue = 1.0;
|
arValue = 1.0;
|
||||||
isPlaying = false;
|
isPlaying = false;
|
||||||
nextFrame = -1;
|
nextFrame = -1;
|
||||||
|
keepAudioSync = true;
|
||||||
|
|
||||||
// Threads
|
// Threads
|
||||||
threaded = Options.AsBool(_T("Threaded Video"));
|
threaded = Options.AsBool(_T("Threaded Video"));
|
||||||
|
@ -723,7 +724,7 @@ void VideoContext::OnPlayTimer(wxTimerEvent &event) {
|
||||||
if (nextFrame == frame_n) return;
|
if (nextFrame == frame_n) return;
|
||||||
|
|
||||||
// Next frame is before or over 2 frames ahead, so force audio resync
|
// Next frame is before or over 2 frames ahead, so force audio resync
|
||||||
if (nextFrame < frame_n || nextFrame > frame_n + 2) audio->player->SetCurrentPosition(audio->GetSampleAtMS(VFR_Output.GetTimeAtFrame(nextFrame)));
|
if (keepAudioSync && (nextFrame < frame_n || nextFrame > frame_n + 2)) audio->player->SetCurrentPosition(audio->GetSampleAtMS(VFR_Output.GetTimeAtFrame(nextFrame)));
|
||||||
|
|
||||||
// Jump to next frame
|
// Jump to next frame
|
||||||
playNextFrame = nextFrame;
|
playNextFrame = nextFrame;
|
||||||
|
@ -731,7 +732,7 @@ void VideoContext::OnPlayTimer(wxTimerEvent &event) {
|
||||||
JumpToFrame(nextFrame);
|
JumpToFrame(nextFrame);
|
||||||
|
|
||||||
// Sync audio
|
// Sync audio
|
||||||
if (nextFrame % 10 == 0) {
|
if (keepAudioSync && nextFrame % 10 == 0) {
|
||||||
__int64 audPos = audio->GetSampleAtMS(VFR_Output.GetTimeAtFrame(nextFrame));
|
__int64 audPos = audio->GetSampleAtMS(VFR_Output.GetTimeAtFrame(nextFrame));
|
||||||
__int64 curPos = audio->player->GetCurrentPosition();
|
__int64 curPos = audio->player->GetCurrentPosition();
|
||||||
int delta = int(audPos-curPos);
|
int delta = int(audPos-curPos);
|
||||||
|
|
|
@ -103,6 +103,7 @@ private:
|
||||||
bool loaded;
|
bool loaded;
|
||||||
bool isInverted;
|
bool isInverted;
|
||||||
bool isPlaying;
|
bool isPlaying;
|
||||||
|
bool keepAudioSync;
|
||||||
|
|
||||||
float texW,texH;
|
float texW,texH;
|
||||||
int w,h;
|
int w,h;
|
||||||
|
@ -146,6 +147,8 @@ public:
|
||||||
bool IsPlaying() { return isPlaying; }
|
bool IsPlaying() { return isPlaying; }
|
||||||
bool IsInverted() { return isInverted; }
|
bool IsInverted() { return isInverted; }
|
||||||
|
|
||||||
|
void EnableAudioSync(bool sync = true) { keepAudioSync = sync; }
|
||||||
|
|
||||||
int GetWidth() { return w; }
|
int GetWidth() { return w; }
|
||||||
int GetHeight() { return h; }
|
int GetHeight() { return h; }
|
||||||
int GetLength() { return length; }
|
int GetLength() { return length; }
|
||||||
|
|
Loading…
Reference in a new issue