[mythtv] LiveTV OSD Bug - Investigation
Johan Venter
johan at vulturest.com
Mon Apr 3 12:50:03 UTC 2006
Hi all,
I have been experiencing the following issue:
After certain channel changes in LiveTV (DVB), the frontend ceases to
respond to input from either a keyboard or LIRC while continuing to
play the tuned channel - nothing out of the ordinary occurs, nor
does the OSD display any dialog.
Before I continue, some of you have already dismissed this as a focus
issue: this is most certainly not a focus issue, and if you will read on
I will convince you.
At first I believed this may be focus related, and as I wasn't running a
window manager at the time I installed ratpoison to put that issue at
rest. When LiveTV stops responding, I continue to switch windows with
ratpoison using the keyboard just fine, and no amount of switching away
from and back to myth fixed the issue.
Now for some code. I will describe this in point form as the steps I
undertook in attemping to debug this issue.
It is long-winded and thorough for the following reasons:
1. I want to be clear about why I think this is a problem and
2. I don't understand how to fix it, so someone else with better
understanding of what should happen will need to provide some
assistance.
Thanks for your attention.
-----
1. Inserted VERBOSE debugging statements in
MythMainWindow::TranslateKeyPress (line 622
libs/libmythui/mythmainwindow.cpp) and LircClient::Process (line 61
libs/libmyth/lirc.cpp)
RESULT:
Debugging continues to be printed each time a key is pressed on either
the remote or the keyboard after LiveTV has ceased to respond
thus indicating Myth is still receiving my input.
-----
2. Inserted VERBOSE statements inside each if block in
TV::ProcessKeypress (line 1853 libs/libmythtv/tv_play.cpp).
RESULT:
After LiveTV has stopped responding the following condition is true.
2057: if (dialogname != "" && GetOSD() &&
GetOSD()->DialogShowing(dialogname))
2058: {
-----
3. Some more debugging indicates that the dialog that the OSD still
thinks is showing is the "channel_timed_out" dialog. Pushing escape
results in the GetOSD->AbortDialog(dialogname) (~ line 2075, give or
take some debugging) and the GetOSD->TurnOffDialog (~ line 2079) both
geting called. The routine then steps into the following loop from which
it never returns (~ line 2157):
while (GetOSD()->DialogShowing(dialogname))
{
usleep(1000);
}
-----
3. So, an OSD issue then, apparently the "channel_timed_out" dialog is
never getting closed. A quick look in libs/libmythtv/osd.cpp shows the
OSD::TurnDialogOff retrieves the current OSDSet and makes a call to
OSDSet::Hide:
void OSDSet::Hide(void)
{
m_timeleft = -1;
m_fadetime = 0;
m_notimeout = false;
m_displaying = false;
if (currentOSDFunctionalType)
{
emit OSDClosed(currentOSDFunctionalType);
currentOSDFunctionalType = 0;
}
}
Debugging in here shows that the "if (currentOSDFunctionalType)" is
never entered as this value is never set to anything other than 0 when a
"channel_timed_out" dialog is created by OSD::NewDialogBox when it calls
OSDSet::Display.
-----
4. A grep for OSDFunctionalType gave me this enum in libs/libmythtv/osd.h:
enum OSDFunctionalType
{
kOSDFunctionalType_Default = 0,
kOSDFunctionalType_PictureAdjust,
kOSDFunctionalType_RecPictureAdjust,
kOSDFunctionalType_SmartForward,
kOSDFunctionalType_TimeStretchAdjust,
kOSDFunctionalType_AudioSyncAdjust
};
This seems to indicate that a functionaltype of 0 is not uncommon and is
in fact the rule, rather than the exception. I fail to understand then
how OSDSet::Hide and also the duplicated code at line 619 of
osdtypes.cpp in OSDSet::Draw can succeed in hiding OSD dialogs.
Could someone with more understanding of the code and the OSD please
help me out with a patch or information on how to fix the
currentOSDFunctionalType issue such that both OSDSet::Hide and
OSDSet::Draw are given a chance to succeed --- this not responding thing
is driving me insane!!
Johan.
PS. No ticket yet in Trac simply because I have no patch - I know how
the devs feel about tickets without patches :)
More information about the mythtv-dev
mailing list