summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrwastl <mrwastl@users.sourceforge.net>2011-10-01 13:16:40 +0200
committermrwastl <mrwastl@users.sourceforge.net>2011-10-01 13:16:40 +0200
commit898a8985746efb429d721f42c0d380a59be98828 (patch)
tree72f355678275a9991e3d841645fcd0f348d830b4
parentd4dc62c55c2b5c4713df89a12a33b55c0085ed6b (diff)
downloadvdr-plugin-graphlcd-898a8985746efb429d721f42c0d380a59be98828.tar.gz
vdr-plugin-graphlcd-898a8985746efb429d721f42c0d380a59be98828.tar.bz2
support added for audio track selection / audio channel display (new tokens: 'AudioTrackItem', 'AudioTrackCurrent', 'IsAudioTrackCurrent', 'AudioChannel'); skins: support for new display section 'audio'; default.skin: bug fixes, enhancements
-rw-r--r--display.c38
-rw-r--r--display.h1
-rw-r--r--graphlcd/skins/default/default.skin67
-rw-r--r--skinconfig.c66
-rw-r--r--state.c46
-rw-r--r--state.h12
6 files changed, 213 insertions, 17 deletions
diff --git a/display.c b/display.c
index 79cb236..ba96d9c 100644
--- a/display.c
+++ b/display.c
@@ -50,6 +50,7 @@ cGraphLCDDisplay::cGraphLCDDisplay()
LastTimeDisplayMode = 0;
mShowVolume = false;
+ mShowAudio = false;
nCurrentBrightness = -1;
LastTimeBrightness = 0;
@@ -226,6 +227,35 @@ void cGraphLCDDisplay::Action(void)
}
}
+ if (GraphLCDSetup.ShowMenu)
+ {
+ tAudioState audio;
+ audio = mGraphLCDState->GetAudioState();
+
+ if (audio.tracks.size() == 0) {
+ mShowAudio = false;
+ } else
+ if (audio.lastChange > 0)
+ {
+ if (!mShowAudio)
+ {
+ if (currTimeMs - audio.lastChange < 5000)
+ {
+ mShowAudio = true;
+ mUpdate = true;
+ }
+ }
+ else
+ {
+ if (currTimeMs - audio.lastChange > 5000)
+ {
+ mShowAudio = false;
+ mUpdate = true;
+ }
+ }
+ }
+ }
+
/* display mode (normal or interactive): reset after 10 secs if not normal */
if ( (mDisplayMode != DisplayModeNormal) && ( (uint32_t)(currTimeMs - LastTimeDisplayMode) > (uint32_t)(10000)) ) {
mDisplayMode = DisplayModeNormal;
@@ -259,6 +289,7 @@ void cGraphLCDDisplay::Action(void)
bool bActive = bBrightnessActive
|| (mState != StateNormal)
|| (GraphLCDSetup.ShowVolume && mShowVolume)
+ || (GraphLCDSetup.ShowMenu && mShowAudio)
|| (GraphLCDSetup.ShowMessages && mGraphLCDState->ShowMessage())
|| (GraphLCDSetup.BrightnessDelay == 900);
@@ -324,6 +355,12 @@ void cGraphLCDDisplay::Action(void)
if (display)
display->Render(mScreen);
}
+ if (mShowAudio)
+ {
+ display = mSkin->GetDisplay("audio");
+ if (display)
+ display->Render(mScreen);
+ }
if (GraphLCDSetup.ShowMessages && mGraphLCDState->ShowMessage())
{
display = mSkin->GetDisplay("message");
@@ -455,6 +492,7 @@ void cGraphLCDDisplay::SetBrightness()
bool bActive = bBrightnessActive
|| (mState != StateNormal)
|| (GraphLCDSetup.ShowVolume && mShowVolume)
+ || (GraphLCDSetup.ShowMenu && mShowAudio)
|| (GraphLCDSetup.ShowMessages && mGraphLCDState->ShowMessage())
|| (GraphLCDSetup.BrightnessDelay == 900);
if (bActive)
diff --git a/display.h b/display.h
index 3c7d7dd..993c077 100644
--- a/display.h
+++ b/display.h
@@ -92,6 +92,7 @@ private:
cGraphLCDState * mGraphLCDState;
bool mShowVolume;
+ bool mShowAudio;
void UpdateIn(uint64_t msec);
diff --git a/graphlcd/skins/default/default.skin b/graphlcd/skins/default/default.skin
index d04e8a8..9c7a335 100644
--- a/graphlcd/skins/default/default.skin
+++ b/graphlcd/skins/default/default.skin
@@ -24,7 +24,7 @@
<font id="FontMenuButton" url="ft2:VeraBd.ttf:9"/>
<font id="FontTitle" url="ft2:VeraBd.ttf:20" />
<font id="FontTitleSmall" url="ft2:Vera.ttf:14" />
- <font id="FontInfoSmall" url="ft2:VeraBd.ttf:12"/>
+ <font id="FontInfoSmall" url="ft2:VeraBd.ttf:10"/>
<font id="FontInfoSmall2" url="ft2:Vera.ttf:10"/>
<font id="FontTimes" url="ft2:Vera.ttf:14"/>
@@ -63,6 +63,13 @@
<variable id="ColVolumeBG" value="'black'" default="#ColMonoBG" />
<variable id="ColVolumeFG" value="'white'" default="#ColMonoFG" />
<variable id="ColVolumeBar" value="'green'" default="#ColMonoFG" />
+ <!-- display id audio -->
+ <variable id="ColAudioBG" value="'0x77300060'" default="#ColMonoBG" />
+ <variable id="ColAudioHeaderBG" value="'green'" default="#ColMonoFG" />
+ <variable id="ColAudioHeaderFG" value="'black'" default="#ColMonoBG" />
+ <variable id="ColAudioEntry" value="'white'" default="#ColMonoFG" />
+ <variable id="ColAudioEntryCurr" value="'black'" default="#ColMonoBG" />
+ <variable id="ColAudioSelected" value="'cyan'" default="#ColMonoFG" />
<!-- display id message -->
<variable id="ColMessageBG" value="'0xAA000000'" default="#ColMonoBG" />
<variable id="ColMessageFG" value="'red'" default="#ColMonoFG" />
@@ -192,8 +199,8 @@
default="add(#LogoSymbY,#LogoSymbH,#PaddingH)" />
<!--variable id="PresentTextY" value="sub(sub(#RecordingsLineY,FontLineHeight('FontInfo')),2)"/-->
- <variable id="ProginfoLines" value="5" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'),FontLineHeight('FontInfoSmall2'),FontLineHeight('FontInfoSmall2')))" />
- <variable id="ProginfoLines" value="4" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'),FontLineHeight('FontSmall2')))" />
+ <variable id="ProginfoLines" value="5" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'),FontLineHeight('FontInfoSmall2'),#LineThickness,1,FontLineHeight('FontInfoSmall2')))" />
+ <variable id="ProginfoLines" value="4" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'),#LineThickness,1,FontLineHeight('FontInfoSmall2')))" />
<variable id="ProginfoLines" value="3" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall')))" />
<variable id="ProginfoLines" value="2" condition="gt(sub({ScreenHeight},#ProginfoPlaceY,1),add(FontLineHeight('FontTitle'),FontLineHeight('FontInfoSmall')))" />
<variable id="ProginfoLines" value="1" />
@@ -203,13 +210,17 @@
<variable id="ProginfoLine3YRaw" value="add(#ProginfoPlaceY,FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'))" />
<variable id="ProginfoLine4YRaw" value="add(#ProginfoPlaceY,FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'))" />
<variable id="ProginfoLine5YRaw" value="add(#ProginfoPlaceY,FontLineHeight('FontTitle'),FontLineHeight('FontTitleSmall'),FontLineHeight('FontInfoSmall'),FontLineHeight('FontInfoSmall'))" />
-
- <!-- big displays: divide free space and add as gap(s) // TODO -->
- <variable id="ProginfoLine1Y" value="#ProginfoLine1YRaw" />
- <variable id="ProginfoLine2Y" value="#ProginfoLine2YRaw" />
- <variable id="ProginfoLine3Y" value="#ProginfoLine3YRaw" />
- <variable id="ProginfoLine4Y" value="#ProginfoLine4YRaw" />
- <variable id="ProginfoLine5Y" value="#ProginfoLine5YRaw" />
+
+ <variable id="ProginfoGapH" value="sub(#ProginfoLine5YRaw,#ProginfoLine4YRaw)" condition="eq(#ProginfoLines,5)" />
+ <variable id="ProginfoGapH" value="sub(#ProginfoLine4YRaw,#ProginfoLine3YRaw)" condition="eq(#ProginfoLines,4)" />
+ <variable id="ProginfoGapH" value="0" />
+
+ <!-- big displays: divide free space and add as gap(s) -->
+ <variable id="ProginfoLine1Y" value="add(#ProginfoLine1YRaw,div(#ProginfoGapH,2))" />
+ <variable id="ProginfoLine2Y" value="add(#ProginfoLine2YRaw,div(#ProginfoGapH,2))" />
+ <variable id="ProginfoLine3Y" value="add(#ProginfoLine3YRaw,#ProginfoGapH)" />
+ <variable id="ProginfoLine4Y" value="add(#ProginfoLine4YRaw,#ProginfoGapH)" />
+ <variable id="ProginfoLine5Y" value="add(#ProginfoLine5YRaw,#ProginfoGapH)" />
<!-- Y starts for information lines -->
<variable id="PresentTitleY" value="#ProginfoLine1Y" />
@@ -220,7 +231,7 @@
<variable id="RecordingsAreaY" value="#ProginfoLine4Y" condition="eq(#ProginfoLines,4)" />
<variable id="RecordingsAreaY" value="#ProginfoLine3Y" condition="eq(#ProginfoLines,3)" default="#ProginfoLine2Y" />
- <!-- width for information lines (default: screenwidth, expect a line would overlap logo/symbol area -->
+ <!-- width for information lines (default: screenwidth, except a line would overlap logo/symbol area -->
<variable id="PresentTitleW" value="-1" condition="ge(#PresentTitleY,#ProginfoPlaceYLim)" default="sub(#LogoSymbX,1,#PaddingW)" />
<variable id="PresentShortTextW" value="-1" condition="ge(#PresentShortTextY,#ProginfoPlaceYLim)" default="sub(#LogoSymbX,1,#PaddingW)" />
<variable id="FollowingTitleW" value="-1" condition="ge(#FollowingTitleY,#ProginfoPlaceYLim)" default="sub(#LogoSymbX,1,#PaddingW)" />
@@ -240,24 +251,24 @@
{PresentTitle}
</text>
- <text x="0" y="#PresentShortTextY" condition="gt(#ProginfoLines,3)" width="#PresentShortTextW" height="FontLineHeight('FontTitleSmall')" color="#ColPresentTitle" align="left" font="FontTitleSmall">
+ <text x="0" y="#PresentShortTextY" condition="gt(#ProginfoLines,2)" width="#PresentShortTextW" height="FontLineHeight('FontTitleSmall')" color="#ColPresentTitle" align="left" font="FontTitleSmall">
{PresentShortText}
</text>
<block condition="{FollowingValid}">
- <text x="0" y="#FollowingTitleY" condition="or(gt(#ProginfoLines,3),not({IsRecording}))" height="FontLineHeight('FontInfoSmall')" color="#ColPresentTitle" align="left" font="FontInfoSmall">
+ <text x="0" y="#FollowingTitleY" condition="or(gt(#ProginfoLines,3),and(ge(#ProginfoLines,2),not({IsRecording})))" height="FontLineHeight('FontInfoSmall')" color="#ColPresentTitle" align="left" font="FontInfoSmall">
{FollowingStartDateTime:%H\:%M}
</text>
- <text x="FontTextWidth('FontInfoSmall','00:00 ')" condition="or(gt(#ProginfoLines,3),not({IsRecording}))" y="#FollowingTitleY" width="sub(#FollowingTitleW,FontTextWidth('FontInfoSmall','00:00 '))" height="FontLineHeight('FontInfoSmall')" color="#ColPresentTitle" align="left" font="FontInfoSmall">
+ <text x="FontTextWidth('FontInfoSmall','00:00 ')" condition="or(gt(#ProginfoLines,3),and(ge(#ProginfoLines,2),not({IsRecording})))" y="#FollowingTitleY" width="sub(#FollowingTitleW,FontTextWidth('FontInfoSmall','00:00 '))" height="FontLineHeight('FontInfoSmall')" color="#ColPresentTitle" align="left" font="FontInfoSmall">
{FollowingTitle}
</text>
- <text x="FontTextWidth('FontInfoSmall','00:00 ')" condition="or(gt(#ProginfoLines,4),not({IsRecording}))" y="#FollowingShortTextY" width="sub(#FollowingShortTextW,FontTextWidth('FontInfoSmall','00:00 '))" height="FontLineHeight('FontInfoSmall2')" color="#ColPresentTitle" align="left" font="FontInfoSmall2">
+ <text x="FontTextWidth('FontInfoSmall','00:00 ')" condition="or(gt(#ProginfoLines,4),and(eq(#ProginfoLines,4),not({IsRecording})))" y="#FollowingShortTextY" width="sub(#FollowingShortTextW,FontTextWidth('FontInfoSmall','00:00 '))" height="FontLineHeight('FontInfoSmall2')" color="#ColPresentTitle" align="left" font="FontInfoSmall2">
{FollowingShortText}
</text>
</block>
- <rectangle x1="0" x2="-1" y1="#RecordingsLineY" height="#LineThickness" condition="{IsRecording}" color="#ColBorder" filled="yes"/>
+ <rectangle x1="0" x2="-1" y="#RecordingsLineY" height="#LineThickness" condition="{IsRecording}" color="#ColBorder" filled="yes"/>
<image x="0" y="#RecordingsSymbolY" color="#ColSymbol" path="#SymbolRecording" condition="{IsRecording}"/>
- <text x1="add(#SymbolW,2)" x2="-1" y1="#RecordingsTextY" height="FontLineHeight('FontInfoSmall2')" color="#ColRecText" align="left" font="FontInfoSmall2">
+ <text x1="add(#SymbolW,2)" x2="-1" y="#RecordingsTextY" height="FontLineHeight('FontInfoSmall2')" color="#ColRecText" align="left" font="FontInfoSmall2">
{Recordings}
</text>
</display>
@@ -280,6 +291,28 @@
</block>
</display>
+ <display id="audio">
+ <variable id="AudioX" value="10"/>
+ <variable id="AudioW" value="sub({ScreenWidth},mul(4,#AudioX))"/>
+ <variable id="AudioH" value="sub(div({ScreenHeight},2),4)"/>
+ <variable id="AudioY" value="sub({ScreenHeight},div({ScreenHeight},2))"/>
+ <variable id="AudioHeaderH" value="add(FontLineHeight('FontMenuTitle'),1,#PaddingH,#PaddingH)"/>
+
+ <rectangle x="#AudioX" y="#AudioY" width="#AudioW" height="#AudioHeaderH" color="#ColAudioHeaderBG" filled="yes"/>
+ <text x="add(#PaddingW,#AudioX)" y="add(#PaddingH,#AudioY)" width="sub(#AudioW,#PaddingW,#PaddingW)" height="FontLineHeight('FontMenuTitle')" color="#ColAudioHeaderFG" font="FontMenuTitle">Audio</text>
+ <!--rectangle x1="0" y1="add(FontLineHeight('FontMenuTitle'),2)" x2="-1" height="#LineThickness" color="#ColMenuBorder" filled="yes"/-->
+ <rectangle x="#AudioX" y="add(#AudioY,#AudioHeaderH)" width="#AudioW" height="sub(#AudioH,#AudioHeaderH)" color="#ColAudioBG" filled="yes"/>
+ <list x="#AudioX" y="add(#AudioY,#AudioHeaderH)" width="#AudioW" height="sub(#AudioH,#AudioHeaderH)">
+ <item height="#ItemHeight"/>
+ <rectangle x="0" y="0" width="#AudioW" height="add(#ItemHeight,1)" color="#ColAudioSelected" condition="{IsAudioTrackCurrent}" filled="yes"/>
+ <text x1="#PaddingW" x2="-1" y1="0" height="#ItemHeight" color="#ColAudioEntryCurr" font="FontMenuItem">{AudioTrackCurrent}</text>
+ <text x1="#PaddingW" x2="-1" y1="0" height="#ItemHeight" color="#ColAudioEntry" font="FontMenuItem">{AudioTrackItem}</text>
+ <!--text x1="#ArrowWidth" x2="-1" y1="0" height="#ItemHeight" color="#ColMenuEntryCurr" font="FontMenuItem">{MenuCurrent}</text-->
+ <!--image x="0" y="#ArrowY" color="#ColMenuEntryMarker" path="#ArrowBitmap" condition="{IsMenuCurrent}"/-->
+ <!--text x1="#ArrowWidth" x2="-1" y1="0" height="#ItemHeight" color="#ColMenuEntry" font="FontMenuItem">{MenuItem}</text-->
+ </list>
+ </display>
+
<display id="message">
<variable id="MessageX" value="10"/>
<variable id="MessageW" value="sub({ScreenWidth},mul(2,#MessageX))"/>
diff --git a/skinconfig.c b/skinconfig.c
index 5f0f847..51ecc69 100644
--- a/skinconfig.c
+++ b/skinconfig.c
@@ -84,6 +84,14 @@ typedef enum _eTokenId
tokVolumeIsMute,
tokPrivateVolumeEnd,
+ // audio display
+ tokPrivateAudioStart,
+ tokAudioTrackItem,
+ tokAudioTrackCurrent,
+ tokIsAudioTrackCurrent,
+ tokAudioChannel,
+ tokPrivateAudioEnd,
+
tokPrivateReplayStart,
tokReplayTitle,
tokReplayPositionIndex,
@@ -219,6 +227,13 @@ static const std::string Tokens[tokCountToken] =
"VolumeIsMute",
"privateVolumeEnd",
+ "privateAudioStart",
+ "AudioTrackItem",
+ "AudioTrackCurrent",
+ "IsAudioTrackCurrent",
+ "AudioChannel",
+ "privateAudioEnd",
+
"privateReplayStart",
"ReplayTitle",
"ReplayPositionIndex",
@@ -498,6 +513,57 @@ GLCD::cType cGraphLCDSkinConfig::GetToken(const GLCD::tSkinToken & Token)
break;
}
}
+ else if (Token.Id > tokPrivateAudioStart && Token.Id < tokPrivateAudioEnd)
+ {
+ tAudioState audio = mState->GetAudioState();
+ switch (Token.Id)
+ {
+ case tokAudioTrackItem:
+ case tokAudioTrackCurrent:
+ case tokIsAudioTrackCurrent:
+ {
+ if (audio.tracks.size() == 0
+ || audio.currentTrack == -1)
+ {
+ return false;
+ }
+ int maxItems = Token.MaxItems;
+ if (maxItems > (int) audio.tracks.size())
+ maxItems = audio.tracks.size();
+ int currentIndex = maxItems / 2;
+ if (audio.currentTrack < currentIndex)
+ currentIndex = audio.currentTrack;
+ int topIndex = audio.currentTrack - currentIndex;
+ if ((topIndex + maxItems) > (int) audio.tracks.size())
+ {
+ currentIndex += (topIndex + maxItems) - audio.tracks.size();
+ topIndex = audio.currentTrack - currentIndex;
+ }
+ if (Token.Id == tokAudioTrackItem)
+ {
+ if (Token.Index < maxItems && Token.Index != currentIndex)
+ return audio.tracks[topIndex + Token.Index];
+ }
+ else if (Token.Id == tokAudioTrackCurrent)
+ {
+ if (Token.Index < maxItems && Token.Index == currentIndex)
+ return audio.tracks[topIndex + Token.Index];
+ else if (Token.Index < 0) // outside of <list/>: return last MenuCurrent
+ return audio.tracks[topIndex];
+ }
+ else if (Token.Id == tokIsAudioTrackCurrent)
+ {
+ if (Token.Index < maxItems && Token.Index == currentIndex)
+ return true;
+ }
+ return false;
+ }
+ case tokAudioChannel:
+ return audio.currentChannel;
+ default:
+ break;
+ }
+ }
else if (Token.Id > tokPrivateReplayStart && Token.Id < tokPrivateReplayEnd)
{
tReplayState replay = mState->GetReplayState();
diff --git a/state.c b/state.c
index b2adb37..a70f16c 100644
--- a/state.c
+++ b/state.c
@@ -79,6 +79,10 @@ cGraphLCDState::cGraphLCDState(cGraphLCDDisplay * Display)
mVolume.value = -1;
mVolume.lastChange = 0;
+ mAudio.currentTrack = -1;
+ mAudio.currentChannel = -1;
+ mAudio.lastChange = 0;
+
SetChannel(cDevice::CurrentChannel());
}
@@ -359,6 +363,32 @@ void cGraphLCDState::SetVolume(int Volume, bool Absolute)
}
}
+void cGraphLCDState::SetAudioTrack(int Index, const char * const *Tracks) {
+ if (GraphLCDSetup.PluginActive) {
+ mutex.Lock();
+ mAudio.currentTrack = Index;
+ mAudio.tracks.clear();
+ int i = 0;
+ while (Tracks[i]) {
+ mAudio.tracks.push_back(Tracks[i]);
+ i++;
+ }
+ mAudio.lastChange = cTimeMs::Now();
+ mutex.Unlock();
+ //mDisplay->Update(); -> will be done in SetAudioChannel
+ }
+}
+
+void cGraphLCDState::SetAudioChannel(int AudioChannel) {
+ if (GraphLCDSetup.PluginActive) {
+ mutex.Lock();
+ mAudio.currentChannel = AudioChannel;
+ mAudio.lastChange = cTimeMs::Now();
+ mutex.Unlock();
+ mDisplay->Update();
+ }
+}
+
void cGraphLCDState::Tick()
{
//printf("graphlcd plugin: cGraphLCDState::Tick\n");
@@ -410,6 +440,11 @@ void cGraphLCDState::OsdClear()
mOsd.currentTextItemScroll = 0;
mOsd.currentTextItemScrollReset = false;
+ mAudio.currentTrack = -1;
+ mAudio.currentChannel = -1;
+ mAudio.tracks.clear();
+ mAudio.lastChange = 0;
+
mutex.Unlock();
mDisplay->SetMenuClear();
}
@@ -892,6 +927,17 @@ tVolumeState cGraphLCDState::GetVolumeState()
return ret;
}
+tAudioState cGraphLCDState::GetAudioState()
+{
+ tAudioState ret;
+
+ mutex.Lock();
+ ret = mAudio;
+ mutex.Unlock();
+
+ return ret;
+}
+
bool cGraphLCDState::ShowMessage()
{
bool ret;
diff --git a/state.h b/state.h
index d2a8304..e8b9768 100644
--- a/state.h
+++ b/state.h
@@ -95,6 +95,14 @@ struct tVolumeState
uint64_t lastChange;
};
+struct tAudioState
+{
+ int currentTrack;
+ std::vector <std::string> tracks;
+ int currentChannel;
+ uint64_t lastChange;
+};
+
class cGraphLCDDisplay;
class cGraphLCDState : public cStatus
@@ -113,6 +121,7 @@ private:
std::vector <tRecording> mRecordings;
tOsdState mOsd;
tVolumeState mVolume;
+ tAudioState mAudio;
void SetChannel(int ChannelNumber);
void UpdateChannelInfo(void);
@@ -123,6 +132,8 @@ protected:
virtual void Recording(const cDevice *Device, const char *Name, const char *FileName, bool On);
virtual void Replaying(const cControl *Control, const char *Name, const char *FileName, bool On);
virtual void SetVolume(int Volume, bool Absolute);
+ virtual void SetAudioTrack(int Index, const char * const *Tracks);
+ virtual void SetAudioChannel(int AudioChannel);
virtual void OsdClear();
virtual void OsdTitle(const char *Title);
virtual void OsdStatusMessage(const char *Message);
@@ -148,6 +159,7 @@ public:
tOsdState GetOsdState();
void ResetOsdStateScroll();
tVolumeState GetVolumeState();
+ tAudioState GetAudioState();
bool ShowMessage();
};