diff options
author | mrwastl <mrwastl@users.sourceforge.net> | 2011-10-01 13:16:40 +0200 |
---|---|---|
committer | mrwastl <mrwastl@users.sourceforge.net> | 2011-10-01 13:16:40 +0200 |
commit | 898a8985746efb429d721f42c0d380a59be98828 (patch) | |
tree | 72f355678275a9991e3d841645fcd0f348d830b4 | |
parent | d4dc62c55c2b5c4713df89a12a33b55c0085ed6b (diff) | |
download | vdr-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.c | 38 | ||||
-rw-r--r-- | display.h | 1 | ||||
-rw-r--r-- | graphlcd/skins/default/default.skin | 67 | ||||
-rw-r--r-- | skinconfig.c | 66 | ||||
-rw-r--r-- | state.c | 46 | ||||
-rw-r--r-- | state.h | 12 |
6 files changed, 213 insertions, 17 deletions
@@ -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) @@ -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(); @@ -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; @@ -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(); }; |