Index: xbmc/utils/LCD.cpp
===================================================================
--- xbmc/utils/LCD.cpp	(revision 23196)
+++ xbmc/utils/LCD.cpp	(working copy)
@@ -21,8 +21,12 @@
 
 #include "LCD.h"
 #include "GUISettings.h"
-#include "AdvancedSettings.h"
 #include "Settings.h"
+#include "AdvancedSettings.h"
+#include "Application.h"
+#include "GUIWindowManager.h"
+#include "GUIInfoManager.h"
+#include "PVRManager.h"
 #include "CharsetConverter.h"
 #include "log.h"
 
@@ -485,4 +489,191 @@
   // fill remainder with empty space
   while (outLine < 4)
     SetLine(outLine++, "");
+
+  RenderIcons();
+}
+
+void ILCD::RenderIcons() {
+
+//  ResetModeIcons();
+  SetIconMovie(false);
+  SetIconMusic(false);
+  SetIconTV(false);
+  SetIconPhoto(false);
+
+
+  if (g_application.IsPlayingVideo() && g_application.m_pPlayer) {
+
+    SetIconPlaying(true);
+
+    if (g_application.m_pPlayer->CanSeek())
+      SetIconMovie(true);
+    else
+      SetIconMovie(false);
+
+    if (g_application.m_pPlayer->GetPictureWidth() <= 720)
+      SetIconResolution(LCD_RESOLUTION_SD);
+    else
+      SetIconResolution(LCD_RESOLUTION_HD);
+
+//    g_application.m_pPlayer->GetAudioStream()
+  } else if (g_application.IsPlayingAudio() && g_application.m_pPlayer) {
+    SetIconPlaying(true);
+    SetIconMusic(true);
+  } else {
+//    SetIconMovie(false);
+//    SetIconMusic(false);
+    SetIconResolution(LCD_RESOLUTION_NONE);
+    SetIconPlaying(false);
+  }
+
+  SetCodecInformationIcons();
+
+  SetProgressBar1(g_application.GetPercentage());
+  SetProgressBar2(g_application.GetVolume());
+
+  if (m_gWindowManager.GetActiveWindow() == WINDOW_WEATHER){
+    SetIconWeather(true);
+  }
+
+  if (m_gWindowManager.GetActiveWindow() == WINDOW_TV){
+    SetIconTV(true);
+  }
+
+  if (m_gWindowManager.GetActiveWindow() == WINDOW_VIDEOS){
+    SetIconMovie(true);
+  }
+
+  if (m_gWindowManager.GetActiveWindow() == WINDOW_MUSIC){
+    SetIconMusic(true);
+  }
+
+  if (m_gWindowManager.GetActiveWindow() == WINDOW_PICTURES){
+    SetIconPhoto(true);
+  }
+
+  // Set the volume icon accordingly
+  if (m_gWindowManager.IsWindowActive(WINDOW_DIALOG_VOLUME_BAR)) {
+    SetIconVolume(true);
+  }
+  else {
+    SetIconVolume(false);
+  }
+
+  // Set the alarm icon accordingly - if a pop-up is displayed
+  if (m_gWindowManager.IsWindowActive(WINDOW_DIALOG_KAI_TOAST)) {
+    SetIconAlarm(true);
+  }
+  else {
+    SetIconAlarm(false);
+  }
+
+  // Set the record icon accordingly
+    if (g_application.m_pPlayer != NULL && g_application.m_pPlayer->IsRecording() || g_PVRManager.TranslateBoolInfo(PVR_IS_RECORDING)) {
+      SetIconRecord(true);
+    }
+    else {
+      SetIconRecord(false);
+    }
+
+  // Set the repeat icon accordingly
+  if ((g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ALL)
+      || (g_playlistPlayer.GetRepeat(g_playlistPlayer.GetCurrentPlaylist()) == PLAYLIST::REPEAT_ONE)) {
+    SetIconRepeat(true);
+  }
+  else {
+    SetIconRepeat(false);
+  }
+
+  // Set the shuffle icon accordingly
+  if (g_playlistPlayer.IsShuffled(g_playlistPlayer.GetCurrentPlaylist())) {
+    SetIconShuffle(true);
+  }
+  else {
+    SetIconShuffle(false);
+  }
+
+  // Set the time icon accordingly
+  if (g_application.IsInScreenSaver() || (!g_application.IsPlaying() && g_application.NavigationIdleTime() >= 5)) {
+    SetIconTime(true);
+  }
+  else {
+    SetIconTime(false);
+  }
+
+  // TODO: SPDIF-Icon setzen
+
+  SendIconStatesToDisplay();
+}
+
+void ILCD::SetCodecInformationIcons() {
+  if (g_application.IsPlaying() && g_application.m_pPlayer) {
+
+    if (g_application.IsPlayingVideo()) {
+      CStdString videoCodec = g_application.m_pPlayer->GetVideoCodecName();
+      if ((videoCodec.CompareNoCase("mpg") == 0)
+          || (videoCodec.CompareNoCase("mpeg") == 0)
+          || (videoCodec.CompareNoCase("h264") == 0)
+          || (videoCodec.CompareNoCase("x264") == 0)
+          || (videoCodec.CompareNoCase("mpeg4") == 0)) {
+        SetIconMPEG(true);
+      } else if ((videoCodec.CompareNoCase("divx") == 0)
+          || (videoCodec.CompareNoCase("div3") == 0)) {
+        SetIconDIVX(true);
+      } else if (videoCodec.CompareNoCase("xvid") == 0) {
+        SetIconXVID(true);
+      } else if (videoCodec.CompareNoCase("wmv") == 0) {
+        SetIconWMV(true);
+      }
+    }
+
+    CStdString audioCodec = g_application.m_pPlayer->GetAudioCodecName();
+    if (audioCodec.CompareNoCase("mpga") == 0) {
+      SetIconMPGA(true);
+    } else if (audioCodec.CompareNoCase("ac3") == 0) {
+      SetIconAC3(true);
+    } else if (audioCodec.CompareNoCase("dts") == 0) {
+      SetIconDTS(true);
+    } else if ((audioCodec.CompareNoCase("mp3") == 0)) {
+      SetIconMP3(true);
+    } else if (audioCodec.CompareNoCase("ogg") == 0) {
+      SetIconOGG(true);
+    } else if (audioCodec.CompareNoCase("wma") == 0) {
+      if (g_application.IsPlayingVideo()) {
+        SetIconVWMA(true);
+      }
+      else if (g_application.IsPlayingAudio()) {
+        SetIconAWMA(true);
+      }
+    } else if (audioCodec.CompareNoCase("wav") == 0) {
+      SetIconWAV(true);
+    }
+    CStreamDetails streamDetails;
+
+    if (g_application.m_pPlayer->GetStreamDetails(streamDetails)) {
+      SetIconAudioChannels(streamDetails.GetAudioChannels());
+    }
+  }
+  else {
+    ResetCodecIcons();
+  }
+}
+
+void ILCD::ResetCodecIcons()
+{
+  SetIconMPEG(false);
+  SetIconDIVX(false);
+  SetIconXVID(false);
+  SetIconWMV(false);
+
+  SetIconMPGA(false);
+  SetIconAC3(false);
+  SetIconDTS(false);
+  SetIconMP3(false);
+
+  SetIconOGG(false);
+  SetIconVWMA(false);
+  SetIconAWMA(false);
+  SetIconWAV(false);
+
 }
Index: xbmc/utils/LCD.h
===================================================================
--- xbmc/utils/LCD.h	(revision 23196)
+++ xbmc/utils/LCD.h	(working copy)
@@ -48,6 +48,11 @@
                         CUSTOM_CHARSET_BIGCHAR,
                         CUSTOM_CHARSET_MAX
                 };
+  enum LCD_RESOLUTION {
+                        LCD_RESOLUTION_NONE = 0,
+                        LCD_RESOLUTION_SD,
+                        LCD_RESOLUTION_HD
+    };
   virtual void Initialize();
   virtual void Stop() = 0;
   virtual void Suspend() = 0; 
@@ -66,8 +71,47 @@
   void StringToLCDCharSet(CStdString& strText);
   unsigned char GetLCDCharsetCharacter( UINT _nCharacter, int _nCharset=-1);
   void LoadMode(TiXmlNode *node, LCD_MODE mode);
+
+  void RenderIcons();
+  virtual bool SendIconStatesToDisplay(void) =0;
+//  virtual void ResetModeIcons(void) =0;
+  virtual void SetIconMovie(bool on) =0;
+  virtual void SetIconMusic(bool on) =0;
+  virtual void SetIconWeather(bool on) =0;
+  virtual void SetIconTV(bool on) =0;
+  virtual void SetIconPhoto(bool on) =0;
+  virtual void SetIconResolution(LCD_RESOLUTION resolution) =0;
+  virtual void SetProgressBar1(double progress) =0;
+  virtual void SetProgressBar2(double volume) =0;
+  virtual void SetIconPlaying(bool on) =0;
+  virtual void SetIconRepeat(bool on) =0;
+  virtual void SetIconShuffle(bool on) =0;
+  virtual void SetIconAlarm(bool on) =0;
+  virtual void SetIconRecord(bool on) =0;
+  virtual void SetIconVolume(bool on) =0;
+  virtual void SetIconTime(bool on) =0;
+  // codec icons - video: video stream format
+  virtual void SetIconMPEG(bool on) =0;
+  virtual void SetIconDIVX(bool on) =0;
+  virtual void SetIconXVID(bool on) =0;
+  virtual void SetIconWMV(bool on) =0;
+  // codec icons - video: audio stream format
+  virtual void SetIconMPGA(bool on) =0;
+  virtual void SetIconAC3(bool on) =0;
+  virtual void SetIconDTS(bool on) =0;
+  virtual void SetIconVWMA(bool on) =0;
+  // codec icons - audio format
+  virtual void SetIconMP3(bool on) =0;
+  virtual void SetIconOGG(bool on) =0;
+  virtual void SetIconAWMA(bool on) =0;
+  virtual void SetIconWAV(bool on) =0;
+
+  virtual void SetIconAudioChannels(int channels) =0;
 private:
   std::vector<CGUIInfoLabel> m_lcdMode[LCD_MODE_MAX];
   UINT m_eCurrentCharset;
+
+  void SetCodecInformationIcons();
+  void ResetCodecIcons();
 };
 extern ILCD* g_lcd;
Index: xbmc/Application.h
===================================================================
--- xbmc/Application.h	(revision 23196)
+++ xbmc/Application.h	(working copy)
@@ -198,7 +198,7 @@
   bool ExecuteAction(CGUIActionDescriptor action);
 
   static bool OnEvent(XBMC_Event& newEvent);
-  
+  float NavigationIdleTime();
 
   CApplicationMessenger& getApplicationMessenger();
 #if defined(HAS_LINUX_NETWORK)
@@ -350,7 +350,6 @@
   bool ProcessJoystickEvent(const std::string& joystickName, int button, bool isAxis, float fAmount);
 
   void StartFtpEmergencyRecoveryMode();
-  float NavigationIdleTime();
   void CheckForTitleChange();
   static bool AlwaysProcess(const CAction& action);
 
Index: xbmc/Application.cpp
===================================================================
--- xbmc/Application.cpp	(revision 23196)
+++ xbmc/Application.cpp	(working copy)
@@ -2958,7 +2958,7 @@
 
   if (!g_lcd || g_guiSettings.GetInt("lcd.type") == LCD_TYPE_NONE)
     return ;
-  long lTimeOut = 1000;
+  long lTimeOut = 125;
   if ( m_iPlaySpeed != 1)
     lTimeOut = 0;
   if ( ((long)GetTickCount() - lTickCount) >= lTimeOut)
Index: xbmc/linux/XLCDProc_imon.h
===================================================================
--- xbmc/linux/XLCDProc_imon.h	(revision 0)
+++ xbmc/linux/XLCDProc_imon.h	(revision 0)
@@ -0,0 +1,144 @@
+#ifndef __XLCDProc_imon_H__
+#define __XLCDProc_imon_H__
+
+/*
+ *      Copyright (C) 2005-2008 Team XBMC
+ *      http://www.xbmc.org
+ *
+ *  This Program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This Program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with XBMC; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include <SDL/SDL_thread.h>
+#include "LCD.h"
+#include "XLCDproc.h"
+#include "../utils/Stopwatch.h"
+
+#define IMON_OUTPUT_DISC        0
+#define IMON_OUTPUT_TOP_ROW     1
+#define IMON_OUTPUT_SPKR        4
+#define IMON_OUTPUT_SPDIF       6
+#define IMON_OUTPUT_SRC         7
+#define IMON_OUTPUT_FIT         8
+#define IMON_OUTPUT_TV          9
+#define IMON_OUTPUT_HDTV        10
+#define IMON_OUTPUT_SCR1        11
+#define IMON_OUTPUT_SCR2        12
+#define IMON_OUTPUT_BR_ICONS    13
+#define IMON_OUTPUT_BM_ICONS    16
+#define IMON_OUTPUT_BL_ICONS    19
+#define IMON_OUTPUT_VOL         22
+#define IMON_OUTPUT_TIME        23
+#define IMON_OUTPUT_ALARM       24
+#define IMON_OUTPUT_REC         25
+#define IMON_OUTPUT_REP         26
+#define IMON_OUTPUT_SFL         27
+#define IMON_OUTPUT_PBARS       28
+#define IMON_OUTPUT_DISK_IN     29
+
+/**
+ * Sets the "output state" for the device. We use this to control the icons around the outside the
+ * display. The bits in \c state correspond to the icons as follows:
+ *
+ * bit 0       : disc icon (0=off, 1='spin') , if Toprow==4, use CD-animation, else use "HDD-recording-animation"
+ * bit 1,2,3   : top row (0=none, 1=music, 2=movie, 3=photo, 4=CD/DVD, 5=TV, 6=Web, 7=News/Weather)
+ * bit 4,5     : 'speaker' icons (0=off, 1=L+R, 2=5.1ch, 3=7.1ch)
+ * bit 6       : S/PDIF icon
+ * bit 7       : 'SRC'
+ * bit 8       : 'FIT'
+ * bit 9       : 'TV'
+ * bit 10      : 'HDTV'
+ * bit 11      : 'SRC1'
+ * bit 12      : 'SRC2'
+ * bit 13,14,15: bottom-right icons (0=off, 1=MP3, 2=OGG, 3=WMA, 4=WAV)
+ * bit 16,17,18: bottom-middle icons (0=off, 1=MPG, 2=AC3, 3=DTS, 4=WMA)
+ * bit 19,20,21: bottom-left icons (0=off, 1=MPG, 2=DIVX, 3=XVID, 4=WMV)
+ * bit 22      : 'VOL' (volume)
+ * bit 23      : 'TIME'
+ * bit 24      : 'ALARM'
+ * bit 25      : 'REC' (recording)
+ * bit 26      : 'REP' (repeat)
+ * bit 27      : 'SFL' (shuffle)
+ * bit 28      : Abuse this for progress bars (if set to 1), lower bits represent
+ *               the length (6 bits each: P|6xTP|6xTL|6xBL|6xBP with P = bit 28,
+ *               TP=Top Progress, TL = Top Line, BL = Bottom Line, BP = Bottom Progress).
+ *               If bit 28 is set to 1, lower bits are interpreted as
+ *               lengths; otherwise setting the symbols as usual.
+ *               0 <= length <= 32, bars extend from left to right.
+ *               length > 32, bars extend from right to left, length is counted
+ *               from 32 up (i.e. 35 means a length of 3).
+ *
+ *     Remember: There are two kinds of calls!
+ *               With bit 28 set to 1: Set all bars (leaving the symbols as is),
+ *               with bit 28 set to 0: Set the symbols (leaving the bars as is).
+ *     Beware:   TODO: May become a race condition, if both calls are executed
+ *                     before the display gets updated. Keep this in mind in your
+ *                     client-code.
+ * bit 29      : 'disc-in icon' - half ellipsoid under the disc symbols (0=off, 1=on)
+ */
+
+class XLCDProc_imon: public XLCDproc {
+public:
+  XLCDProc_imon();
+  virtual ~XLCDProc_imon(void);
+
+  // States whether this device sends the icon-information by itself.
+  // Returns true, if the caller does not have to care about sending the information.
+  virtual bool SendIconStatesToDisplay();
+
+  virtual void ResetModeIcons(void);
+  virtual void SetIconMovie(bool on);
+  virtual void SetIconMusic(bool on);
+  virtual void SetIconWeather(bool on);
+  virtual void SetIconTV(bool on);
+  virtual void SetIconPhoto(bool on);
+  virtual void SetIconResolution(ILCD::LCD_RESOLUTION resolution);
+  virtual void SetProgressBar1(double progress); // range from 0 - 100
+  virtual void SetProgressBar2(double volume); // range from 0 - 100
+  virtual void SetIconPlaying(bool on);
+  virtual void SetIconRepeat(bool on);
+  virtual void SetIconShuffle(bool on);
+  virtual void SetIconAlarm(bool on);
+  virtual void SetIconRecord(bool on);
+  virtual void SetIconVolume(bool on);
+  virtual void SetIconTime(bool on);
+  // codec icons - video: video stream format
+  virtual void SetIconMPEG(bool on);
+  virtual void SetIconDIVX(bool on);
+  virtual void SetIconXVID(bool on);
+  virtual void SetIconWMV(bool on);
+    // codec icons - video: audio stream format
+  virtual void SetIconMPGA(bool on);
+  virtual void SetIconAC3(bool on);
+  virtual void SetIconDTS(bool on);
+  virtual void SetIconVWMA(bool on);
+    // codec icons - audio format
+  virtual void SetIconMP3(bool on);
+  virtual void SetIconOGG(bool on);
+  virtual void SetIconAWMA(bool on);
+  virtual void SetIconWAV(bool on);
+
+  virtual void SetIconAudioChannels(int channels);
+
+private:
+  CStopWatch m_outputTimer;
+
+  int volumeBar(int oldValue, double newValue);
+  int progressBar(int oldValue, double newValue);
+  bool isOutputValuesTurn();
+};
+
+#endif // __XLCDProc_imon_H__

Property changes on: xbmc\linux\XLCDProc_imon.h
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: xbmc/linux/XLCDProc_imon.cpp
===================================================================
--- xbmc/linux/XLCDProc_imon.cpp	(revision 0)
+++ xbmc/linux/XLCDProc_imon.cpp	(revision 0)
@@ -0,0 +1,313 @@
+#ifndef __XLCDProc_imon_CPP__
+#define __XLCDProc_imon_CPP__
+
+/*
+ *      Copyright (C) 2005-2008 Team XBMC
+ *      http://www.xbmc.org
+ *
+ *  This Program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2, or (at your option)
+ *  any later version.
+ *
+ *  This Program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with XBMC; see the file COPYING.  If not, write to
+ *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "XLCDProc_imon.h"
+#include "../utils/log.h"
+
+XLCDProc_imon::XLCDProc_imon() {
+  m_outputTimer.StartZero();
+}
+
+XLCDProc_imon::~XLCDProc_imon(void) {
+}
+
+bool XLCDProc_imon::SendIconStatesToDisplay() {
+  char cmd[64];
+
+  if (outputValue != outputValueOld || isOutputValuesTurn()) {
+    // A tweak for the imon-lcd-driver: There is no icon for this bit.
+    // Needed because the driver sets ALL symbols (icons and progress bars) to "off", if there is an outputValue == 0
+    outputValue |= 1 << 30;
+    outputValueOld = outputValue;
+    sprintf(cmd, "output %d\n", outputValue);
+  } else if (outputValueProgressBars != outputValueProgressBarsOld) {
+    outputValueProgressBarsOld = outputValueProgressBars;
+    sprintf(cmd, "output %d\n", outputValueProgressBars);
+  } else
+    return true;
+
+  ResetModeIcons();
+
+  if (write(sockfd, cmd, strlen(cmd)) < 0) {
+    CLog::Log(
+        LOGERROR,
+        "XLCDproc::%s - Unable to write 'outputValue' to socket, LCDd not running?",
+        __FUNCTION__);
+  }
+
+  return true;
+}
+
+void XLCDProc_imon::ResetModeIcons(void) {
+  outputValue &= ~(7 << IMON_OUTPUT_TOP_ROW); // reset entire row
+  outputValue &= ~(7 << IMON_OUTPUT_BL_ICONS); // reset entire row
+  outputValue &= ~(7 << IMON_OUTPUT_BM_ICONS); // reset entire row
+  outputValue &= ~(7 << IMON_OUTPUT_BR_ICONS); // reset entire row
+  outputValue &= ~(3 << IMON_OUTPUT_SPKR); // reset entire block
+}
+
+void XLCDProc_imon::SetIconMovie(bool on) {
+
+  if (on)
+    outputValue |= 2 << IMON_OUTPUT_TOP_ROW;
+//  else
+//    outputValue &= ~(2 << IMON_OUTPUT_TOP_ROW);
+}
+
+void XLCDProc_imon::SetIconMusic(bool on) {
+
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_TOP_ROW;
+//  else
+//    outputValue &= ~(1 << IMON_OUTPUT_TOP_ROW);
+}
+
+void XLCDProc_imon::SetIconWeather(bool on) {
+  if (on)
+    outputValue |= 7 << IMON_OUTPUT_TOP_ROW;
+//  else
+//    outputValue &= ~(7 << IMON_OUTPUT_TOP_ROW);
+}
+
+void XLCDProc_imon::SetIconTV(bool on) {
+  if (on)
+    outputValue |= 5 << IMON_OUTPUT_TOP_ROW;
+//  else
+//    outputValue &= ~(5 << IMON_OUTPUT_TOP_ROW);
+}
+
+void XLCDProc_imon::SetIconPhoto(bool on) {
+  if (on)
+    outputValue |= 3 << IMON_OUTPUT_TOP_ROW;
+//  else
+//    outputValue &= ~(3 << IMON_OUTPUT_TOP_ROW);
+}
+
+void XLCDProc_imon::SetIconResolution(ILCD::LCD_RESOLUTION resolution) {
+  // reset both icons to avoid that they may be lit at the same time
+  outputValue &= ~(1 << IMON_OUTPUT_TV);
+  outputValue &= ~(1 << IMON_OUTPUT_HDTV);
+
+  if (resolution == LCD_RESOLUTION_SD)
+    outputValue |= 1 << IMON_OUTPUT_TV;
+  else if (resolution == LCD_RESOLUTION_HD)
+    outputValue |= 1 << IMON_OUTPUT_HDTV;
+}
+
+void XLCDProc_imon::SetProgressBar1(double progress) {
+  XLCDproc::outputValueProgressBars = progressBar(XLCDproc::outputValueProgressBars, progress);
+}
+
+void XLCDProc_imon::SetProgressBar2(double volume) {
+  XLCDproc::outputValueProgressBars = volumeBar(XLCDproc::outputValueProgressBars, volume);
+}
+
+inline int XLCDProc_imon::volumeBar(int oldValue, double newValue) {
+  oldValue &= ~0x00FC0000;
+  oldValue |= ((int) (32 * (newValue / 100)) << 18) & 0x00FC0000;
+  oldValue |= 1 << IMON_OUTPUT_PBARS;
+  return oldValue;
+}
+
+inline int XLCDProc_imon::progressBar(int oldValue, double newValue) {
+  oldValue &= ~0x00000FC0;
+  oldValue |= ((int) (32 * (newValue / 100)) << 6) & 0x00000FC0;
+  oldValue |= 1 << IMON_OUTPUT_PBARS;
+  return oldValue;
+}
+
+bool XLCDProc_imon::isOutputValuesTurn() {
+  if (m_outputTimer.GetElapsedMilliseconds() > 1000) {
+    m_outputTimer.Reset();
+    return true;
+  } else {
+    return false;
+  }
+}
+
+// codec icons - video: video stream format ###################################
+void XLCDProc_imon::SetIconMPEG(bool on) {
+  if (on) {
+    outputValue |= 1 << IMON_OUTPUT_BL_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(1 << IMON_OUTPUT_BL_ICONS);
+}
+
+void XLCDProc_imon::SetIconDIVX(bool on) {
+  if (on) {
+    outputValue |= 2 << IMON_OUTPUT_BL_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(2 << IMON_OUTPUT_BL_ICONS);
+}
+
+void XLCDProc_imon::SetIconXVID(bool on) {
+  if (on) {
+    outputValue |= 3 << IMON_OUTPUT_BL_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(3 << IMON_OUTPUT_BL_ICONS);
+}
+
+void XLCDProc_imon::SetIconWMV(bool on) {
+  if (on) {
+    outputValue |= 4 << IMON_OUTPUT_BL_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(4 << IMON_OUTPUT_BL_ICONS);
+}
+// codec icons - video: audio stream format #################################
+void XLCDProc_imon::SetIconMPGA(bool on) {
+  if (on) {
+    outputValue |= 1 << IMON_OUTPUT_BM_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(1 << IMON_OUTPUT_BM_ICONS);
+}
+
+void XLCDProc_imon::SetIconAC3(bool on) {
+  if (on) {
+    outputValue |= 2 << IMON_OUTPUT_BM_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(2 << IMON_OUTPUT_BM_ICONS);
+}
+
+void XLCDProc_imon::SetIconDTS(bool on) {
+  if (on) {
+    outputValue |= 3 << IMON_OUTPUT_BM_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(3 << IMON_OUTPUT_BM_ICONS);
+}
+
+void XLCDProc_imon::SetIconVWMA(bool on) {
+  if (on) {
+    outputValue |= 4 << IMON_OUTPUT_BM_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(4 << IMON_OUTPUT_BM_ICONS);
+}
+// codec icons - audio format ###############################################
+void XLCDProc_imon::SetIconMP3(bool on) {
+  if (on) {
+    outputValue |= 1 << IMON_OUTPUT_BR_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(1 << IMON_OUTPUT_BR_ICONS);
+}
+
+void XLCDProc_imon::SetIconOGG(bool on) {
+  if (on) {
+    outputValue |= 2 << IMON_OUTPUT_BR_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(2 << IMON_OUTPUT_BR_ICONS);
+}
+
+void XLCDProc_imon::SetIconAWMA(bool on) {
+  if (on) {
+    outputValue |= 3 << IMON_OUTPUT_BR_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(3 << IMON_OUTPUT_BR_ICONS);
+}
+
+void XLCDProc_imon::SetIconWAV(bool on) {
+  if (on) {
+    outputValue |= 4 << IMON_OUTPUT_BR_ICONS;
+  }
+  //  else
+  //    outputValue &= ~(4 << IMON_OUTPUT_BR_ICONS);
+}
+
+void XLCDProc_imon::SetIconPlaying(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_DISC;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_DISC);
+}
+
+void XLCDProc_imon::SetIconRepeat(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_REP;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_REP);
+}
+
+void XLCDProc_imon::SetIconShuffle(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_SFL;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_SFL);
+}
+
+void XLCDProc_imon::SetIconAlarm(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_ALARM;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_ALARM);
+}
+
+void XLCDProc_imon::SetIconRecord(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_REC;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_REC);
+}
+
+void XLCDProc_imon::SetIconVolume(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_VOL;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_VOL);
+}
+
+void XLCDProc_imon::SetIconTime(bool on) {
+  if (on)
+    outputValue |= 1 << IMON_OUTPUT_TIME;
+  else
+    outputValue &= ~(1 << IMON_OUTPUT_TIME);
+}
+
+void XLCDProc_imon::SetIconAudioChannels(int channels) {
+
+  switch (channels) {
+    case 1:
+    case 2:
+    case 3:
+      outputValue |= 1 << IMON_OUTPUT_SPKR; break;
+    case 5:
+    case 6:
+      outputValue |= 2 << IMON_OUTPUT_SPKR; break;
+    case 7:
+    case 8:
+      outputValue |= 3 << IMON_OUTPUT_SPKR; break;
+    default:
+      outputValue &= ~(3 << IMON_OUTPUT_SPKR); break;
+  }
+}
+
+#endif // __XLCDProc_imon_CPP__

Property changes on: xbmc\linux\XLCDProc_imon.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: xbmc/linux/XLCDproc.h
===================================================================
--- xbmc/linux/XLCDproc.h	(revision 23196)
+++ xbmc/linux/XLCDproc.h	(working copy)
@@ -38,9 +38,50 @@
   virtual void SetBackLight(int iLight);
   virtual void SetContrast(int iContrast);
 
+  bool SendIconStatesToDisplay(); // States whether the icon-information has been sent.
+  //  void ResetModeIcons(void);
+  void SetIconMovie(bool on);
+  void SetIconMusic(bool on);
+  void SetIconWeather(bool on);
+  void SetIconTV(bool on);
+  void SetIconPhoto(bool on);
+  void SetIconResolution(LCD_RESOLUTION resolution);
+  void SetProgressBar1(double progress); // range from 0 - 100
+  void SetProgressBar2(double volume); // range from 0 - 100
+  void SetIconPlaying(bool on);
+  void SetIconRepeat(bool on);
+  void SetIconShuffle(bool on);
+  void SetIconAlarm(bool on);
+  void SetIconRecord(bool on);
+  void SetIconVolume(bool on);
+  void SetIconTime(bool on);
+
+  // codec icons - video: video stream format
+  void SetIconMPEG(bool on);
+  void SetIconDIVX(bool on);
+  void SetIconXVID(bool on);
+  void SetIconWMV(bool on);
+  // codec icons - video: audio stream format
+  void SetIconMPGA(bool on);
+  void SetIconAC3(bool on);
+  void SetIconDTS(bool on);
+  void SetIconVWMA(bool on);
+  // codec icons - audio format
+  void SetIconMP3(bool on);
+  void SetIconOGG(bool on);
+  void SetIconAWMA(bool on);
+  void SetIconWAV(bool on);
+
+  void SetIconAudioChannels(int channels);
+
+private:
+  XLCDproc *m_lcdprocIconDevice; // serves as a decorator for various LCDProc-displays that have special icons around the display.
+                                 // Works like strategy pattern in this context.
+
 protected:
   virtual void Process();
   virtual void SetLine(int iLine, const CStdString& strLine);
+  void RecognizeAndSetDriver();
   unsigned int m_iColumns;        // display columns for each line
   unsigned int m_iRows;           // total number of rows
   unsigned int m_iRow1adr;
@@ -55,7 +96,11 @@
   int          m_iPos[MAX_ROWS];
   DWORD        m_dwSleep[MAX_ROWS];
   CEvent       m_event;
-  int          sockfd;
+  static int   sockfd;
+  static int outputValue;
+  static int outputValueProgressBars;
+  static int outputValueOld;
+  static int outputValueProgressBarsOld;
 };
 
 #endif
Index: xbmc/linux/Makefile.in
===================================================================
--- xbmc/linux/Makefile.in	(revision 23196)
+++ xbmc/linux/Makefile.in	(working copy)
@@ -7,7 +7,7 @@
 
 CXXFLAGS+=-fPIC #-DHAS_SDL
 
-SRCS=ConvUtils.cpp XEventUtils.cpp XFileUtils.cpp XHandle.cpp XSyncUtils.cpp XTimeUtils.cpp XMemUtils.cpp XThreadUtils.cpp NetworkLinux.cpp LinuxResourceCounter.cpp LinuxTimezone.cpp XRandR.cpp LinuxFileSystem.cpp XCriticalSection.cpp XLCDproc.cpp HalManager.cpp DBusPowerSyscall.cpp ZeroconfAvahi.cpp ZeroconfBrowserAvahi.cpp
+SRCS=ConvUtils.cpp XEventUtils.cpp XFileUtils.cpp XHandle.cpp XSyncUtils.cpp XTimeUtils.cpp XMemUtils.cpp XThreadUtils.cpp NetworkLinux.cpp LinuxResourceCounter.cpp LinuxTimezone.cpp XRandR.cpp LinuxFileSystem.cpp XCriticalSection.cpp XLCDproc.cpp XLCDProc_imon.cpp HalManager.cpp DBusPowerSyscall.cpp ZeroconfAvahi.cpp ZeroconfBrowserAvahi.cpp
 
 LIB=linux.a
 
Index: xbmc/linux/XLCDproc.cpp
===================================================================
--- xbmc/linux/XLCDproc.cpp	(revision 23196)
+++ xbmc/linux/XLCDproc.cpp	(working copy)
@@ -24,9 +24,16 @@
 #include "../utils/log.h"
 #include "AdvancedSettings.h"
 #include "GUISettings.h"
+#include "XLCDProc_imon.h"
 
 #define SCROLL_SPEED_IN_MSEC 250
 
+// initialize class variables
+int XLCDproc::outputValue = 0;
+int XLCDproc::outputValueProgressBars = 0;
+int XLCDproc::outputValueOld = 1; // for correct icon-initialization this needs to be different to the actual value
+int XLCDproc::outputValueProgressBarsOld = 1; // for correct icon-initialization this needs to be different to the actual value
+int XLCDproc::sockfd = -1;
 
 XLCDproc::XLCDproc()
 {
@@ -34,11 +41,12 @@
   m_iBackLight   = 32;
   m_iLCDContrast = 50;
   m_bStop	       = true;
-  sockfd         = -1;
+  m_lcdprocIconDevice = NULL;
 }
 
 XLCDproc::~XLCDproc()
 {
+  delete m_lcdprocIconDevice;
 }
 
 void XLCDproc::Initialize()
@@ -120,7 +128,47 @@
   if (write(sockfd,cmd.c_str(),cmd.size()) < 0)
     CLog::Log(LOGERROR, "XLCDproc::%s - Unable to write to socket", __FUNCTION__);
   m_bStop = false;
+
+  if (read(sockfd, reply, 1024) < 0)
+    CLog::Log(LOGERROR, "XLCDproc::%s - Unable to read from socket", __FUNCTION__);
+
+  RecognizeAndSetDriver();
 }
+
+void XLCDproc::RecognizeAndSetDriver() {
+  // Receive LCDproc data to determine the driver
+  char reply[1024];
+
+  // Get information about the driver
+  CStdString info;
+  info = "info\n";
+
+  // Send to server
+  if (write(sockfd, info.c_str(), info.size()) < 0)
+    CLog::Log(LOGERROR, "XLCDproc::%s - Unable to write to socket",
+        __FUNCTION__);
+
+  unsigned int msWaitTime = 10000;
+  unsigned int msTimeout = 250000;
+  for (unsigned int ms = 0; ms < msTimeout; ms += msWaitTime) {
+    usleep(msWaitTime); // wait for the answer
+
+    // Receive server's reply
+    if (read(sockfd, reply, 1024) < 0)
+      CLog::Log(LOGERROR, "XLCDproc::%s - Unable to read from socket", __FUNCTION__);
+
+    CStdString driverString = "SoundGraph iMON OEM (and others) LCD driver";
+
+    if (strstr(reply, driverString.c_str()) != NULL) {
+      CLog::Log(LOGINFO, "XLCDproc::%s - Driver is: %s", __FUNCTION__,
+          "SoundGraph iMON OEM (and others) LCD driver");
+      m_lcdprocIconDevice = new XLCDProc_imon(); // move this into the specific device?!
+      break;
+    }
+//    CLog::Log(LOGERROR, "XLCDproc::%s - Driver is: %s", __FUNCTION__, reply);
+  }
+}
+
 void XLCDproc::SetBackLight(int iLight)
 {
   if (sockfd > 0) 
@@ -220,8 +268,11 @@
   strLineLong.Trim();
   StringToLCDCharSet(strLineLong);
 
+  if (strLineLong.size() > m_iColumns)
+    strLineLong += " * "; // make a nicer separator that also has an additional blank at the end
+
   while (strLineLong.size() < m_iColumns)
-    strLineLong += " ";
+    strLineLong += " ";  // fill rest of the line with spaces
 
   if (strLineLong != m_strLine[iLine])
   {
@@ -247,3 +298,163 @@
 void XLCDproc::Process()
 {
 }
+
+bool XLCDproc::SendIconStatesToDisplay() {
+  char cmd[64];
+
+  if ((m_lcdprocIconDevice != NULL)
+      && (!m_lcdprocIconDevice->SendIconStatesToDisplay())) {
+    outputValueOld = outputValue;
+    sprintf(cmd, "output %d\n", outputValue);
+
+    if (write(sockfd, cmd, strlen(cmd)) < 0) {
+      CLog::Log(
+          LOGERROR,
+          "XLCDproc::%s - Unable to write 'outputValue' to socket, LCDd not running?",
+          __FUNCTION__);
+    }
+    return true;
+  }
+  return false;
+}
+
+void XLCDproc::SetIconMovie(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconMovie(on);
+}
+
+void XLCDproc::SetIconMusic(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconMusic(on);
+}
+
+void XLCDproc::SetIconWeather(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconWeather(on);
+}
+
+void XLCDproc::SetIconTV(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconTV(on);
+}
+
+void XLCDproc::SetIconPhoto(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconPhoto(on);
+}
+
+void XLCDproc::SetIconResolution(LCD_RESOLUTION resolution) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconResolution(resolution);
+}
+
+void XLCDproc::SetProgressBar1(double progress) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetProgressBar1(progress);
+}
+
+void XLCDproc::SetProgressBar2(double volume) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetProgressBar2(volume);
+}
+
+void XLCDproc::SetIconPlaying(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconPlaying(on);
+}
+
+void XLCDproc::SetIconRepeat(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconRepeat(on);
+}
+
+void XLCDproc::SetIconShuffle(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconShuffle(on);
+}
+
+void XLCDproc::SetIconAlarm(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconAlarm(on);
+}
+
+void XLCDproc::SetIconRecord(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconRecord(on);
+}
+
+void XLCDproc::SetIconVolume(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconVolume(on);
+}
+
+void XLCDproc::SetIconTime(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconTime(on);
+}
+
+// codec icons - video: video stream format ###################################
+void XLCDproc::SetIconMPEG(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconMPEG(on);
+}
+
+void XLCDproc::SetIconDIVX(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconDIVX(on);
+}
+
+void XLCDproc::SetIconXVID(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconXVID(on);
+}
+
+void XLCDproc::SetIconWMV(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconWMV(on);
+}
+// codec icons - video: audio stream format #################################
+void XLCDproc::SetIconMPGA(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconMPGA(on);
+}
+
+void XLCDproc::SetIconAC3(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconAC3(on);
+}
+
+void XLCDproc::SetIconDTS(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconDTS(on);
+}
+
+void XLCDproc::SetIconVWMA(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconVWMA(on);
+}
+// codec icons - audio format ###############################################
+void XLCDproc::SetIconMP3(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconMP3(on);
+}
+
+void XLCDproc::SetIconOGG(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconOGG(on);
+}
+
+void XLCDproc::SetIconAWMA(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconAWMA(on);
+}
+
+void XLCDproc::SetIconWAV(bool on) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconWAV(on);
+}
+
+void XLCDproc::SetIconAudioChannels(int channels) {
+  if (m_lcdprocIconDevice != NULL)
+    m_lcdprocIconDevice->SetIconAudioChannels(channels);
+}
