| 1 | Index: /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp |
|---|
| 2 | =================================================================== |
|---|
| 3 | --- /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp (revision 20635) |
|---|
| 4 | +++ /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.cpp (working copy) |
|---|
| 5 | @@ -297,6 +297,13 @@ |
|---|
| 6 | text_size = 8 * (sizeof(teletextsubtitle) + VT_WIDTH); |
|---|
| 7 | for (int i = 0; i < MAXTBUFFER; i++) |
|---|
| 8 | txtbuffers[i].buffer = new unsigned char[text_size + 1]; |
|---|
| 9 | + |
|---|
| 10 | + // Read the global audio sync (lipsync) settings |
|---|
| 11 | + db_audio_sync = gContext->GetNumSettingOnHost( |
|---|
| 12 | + "AudioSync", gContext->GetHostName(), 0); |
|---|
| 13 | + SaveAudioTimecodeOffset(db_audio_sync); |
|---|
| 14 | + |
|---|
| 15 | + |
|---|
| 16 | } |
|---|
| 17 | |
|---|
| 18 | NuppelVideoPlayer::~NuppelVideoPlayer(void) |
|---|
| 19 | Index: /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.h |
|---|
| 20 | =================================================================== |
|---|
| 21 | --- /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.h (revision 20635) |
|---|
| 22 | +++ /home/andreas/devel/mythtv/mythtv/libs/libmythtv/NuppelVideoPlayer.h (working copy) |
|---|
| 23 | @@ -803,6 +803,7 @@ |
|---|
| 24 | bool decode_extra_audio; |
|---|
| 25 | float m_stored_audio_stretchfactor; |
|---|
| 26 | bool audio_paused; |
|---|
| 27 | + long long db_audio_sync; |
|---|
| 28 | |
|---|
| 29 | // Audio warping stuff |
|---|
| 30 | bool usevideotimebase; |
|---|
| 31 | Index: /home/andreas/devel/mythtv/mythtv/libs/libmythtv/tv_play.cpp |
|---|
| 32 | =================================================================== |
|---|
| 33 | --- /home/andreas/devel/mythtv/mythtv/libs/libmythtv/tv_play.cpp (revision 20635) |
|---|
| 34 | +++ /home/andreas/devel/mythtv/mythtv/libs/libmythtv/tv_play.cpp (working copy) |
|---|
| 35 | @@ -8001,7 +8001,7 @@ |
|---|
| 36 | // dir in 10ms jumps |
|---|
| 37 | void TV::ChangeAudioSync(PlayerContext *ctx, int dir, bool allowEdit) |
|---|
| 38 | { |
|---|
| 39 | - long long newval; |
|---|
| 40 | + long long newval = 0; |
|---|
| 41 | |
|---|
| 42 | ctx->LockDeleteNVP(__FILE__, __LINE__); |
|---|
| 43 | if (!ctx->nvp) |
|---|
| 44 | @@ -8009,10 +8009,14 @@ |
|---|
| 45 | ctx->UnlockDeleteNVP(__FILE__, __LINE__); |
|---|
| 46 | return; |
|---|
| 47 | } |
|---|
| 48 | - |
|---|
| 49 | + |
|---|
| 50 | + VERBOSE(VB_PLAYBACK, LOC + "ChangeAudioSync("<<audiosyncBaseline<<", "<<audiosyncAdjustment<<")"); |
|---|
| 51 | + |
|---|
| 52 | if (!audiosyncAdjustment && LONG_LONG_MIN == audiosyncBaseline) |
|---|
| 53 | - audiosyncBaseline = ctx->nvp->GetAudioTimecodeOffset(); |
|---|
| 54 | - |
|---|
| 55 | + audiosyncBaseline = ctx->nvp->GetAudioTimecodeOffset(); |
|---|
| 56 | + |
|---|
| 57 | + VERBOSE(VB_PLAYBACK, LOC + "ChangeAudioSync("<<audiosyncBaseline<<", "<<audiosyncAdjustment<<", " <<dir<< ")"); |
|---|
| 58 | + |
|---|
| 59 | audiosyncAdjustment = allowEdit; |
|---|
| 60 | |
|---|
| 61 | if (dir == 1000000) |
|---|
| 62 | @@ -8027,11 +8031,14 @@ |
|---|
| 63 | audiosyncBaseline; |
|---|
| 64 | audiosyncBaseline = ctx->nvp->GetAudioTimecodeOffset(); |
|---|
| 65 | } |
|---|
| 66 | - else |
|---|
| 67 | + else if (dir != 0) |
|---|
| 68 | { |
|---|
| 69 | newval = ctx->nvp->AdjustAudioTimecodeOffset(dir*10) - |
|---|
| 70 | audiosyncBaseline; |
|---|
| 71 | - } |
|---|
| 72 | + } |
|---|
| 73 | + |
|---|
| 74 | + VERBOSE(VB_PLAYBACK, LOC + "ChangeAudioSync - newval: "<<newval<<""); |
|---|
| 75 | + |
|---|
| 76 | ctx->UnlockDeleteNVP(__FILE__, __LINE__); |
|---|
| 77 | |
|---|
| 78 | OSD *osd = GetOSDLock(ctx); |
|---|
| 79 | @@ -8037,7 +8044,7 @@ |
|---|
| 80 | OSD *osd = GetOSDLock(ctx); |
|---|
| 81 | if (osd && !browsemode) |
|---|
| 82 | { |
|---|
| 83 | - QString text = QString(" %1 ms").arg(newval); |
|---|
| 84 | + QString text = QString(" %1 ms (+ %2 ms)").arg(newval).arg(audiosyncBaseline); |
|---|
| 85 | int val = (int)newval; |
|---|
| 86 | if (dir == 1000000 || dir == -1000000) |
|---|
| 87 | { |
|---|
| 88 | Index: /home/andreas/devel/mythtv/mythtv/programs/mythfrontend/globalsettings.cpp |
|---|
| 89 | =================================================================== |
|---|
| 90 | --- /home/andreas/devel/mythtv/mythtv/programs/mythfrontend/globalsettings.cpp (revision 20635) |
|---|
| 91 | +++ /home/andreas/devel/mythtv/mythtv/programs/mythfrontend/globalsettings.cpp (working copy) |
|---|
| 92 | @@ -2728,7 +2728,6 @@ |
|---|
| 93 | |
|---|
| 94 | static HostCheckBox *UseFixedWindowSize() |
|---|
| 95 | { |
|---|
| 96 | -{ |
|---|
| 97 | HostCheckBox *gc = new HostCheckBox("UseFixedWindowSize"); |
|---|
| 98 | gc->setLabel(QObject::tr("Use fixed window size")); |
|---|
| 99 | gc->setValue(true); |
|---|
| 100 | @@ -2737,7 +2736,6 @@ |
|---|
| 101 | "window can be resized")); |
|---|
| 102 | return gc; |
|---|
| 103 | } |
|---|
| 104 | -} |
|---|
| 105 | |
|---|
| 106 | |
|---|
| 107 | static HostCheckBox *RandomTheme() |
|---|
| 108 | @@ -2872,6 +2870,16 @@ |
|---|
| 109 | return gc; |
|---|
| 110 | } |
|---|
| 111 | |
|---|
| 112 | +static HostSpinBox *AudioSync() |
|---|
| 113 | +{ |
|---|
| 114 | + HostSpinBox *gs = new HostSpinBox("AudioSync", -1600, 1600, 8, true); |
|---|
| 115 | + gs->setLabel(QObject::tr("Audio sync offset")); |
|---|
| 116 | + gs->setValue(0); |
|---|
| 117 | + gs->setHelpText(QObject::tr("The global offset for audio synchronization " |
|---|
| 118 | + "(Lipsync)")); |
|---|
| 119 | + return gs; |
|---|
| 120 | +} |
|---|
| 121 | + |
|---|
| 122 | ThemeSelector::ThemeSelector(QString label): |
|---|
| 123 | HostImageSelect(label) { |
|---|
| 124 | |
|---|
| 125 | @@ -3446,6 +3454,7 @@ |
|---|
| 126 | |
|---|
| 127 | addChild(MaxAudioChannels()); |
|---|
| 128 | addChild(AudioUpmixType()); |
|---|
| 129 | + addChild(AudioSync()); |
|---|
| 130 | |
|---|
| 131 | // General boolean settings |
|---|
| 132 | addChild(AC3PassThrough()); |
|---|