---
 mythplugins/mythgallery/mythgallery/imageview.cpp |    2 
 mythplugins/mythmusic/mythmusic/main.cpp          |   11 
 mythplugins/mythvideo/mythvideo/main.cpp          |    1 
 mythplugins/mythvideo/mythvideo/playercommand.cpp |    9 
 mythplugins/mythweather/mythweather/main.cpp      |    4 
 mythtv/libs/libmyth/audiooutputbase.cpp           |    6 
 mythtv/libs/libmythdb/lcddevice.cpp               |  360 ++++++++++++++++++++++
 mythtv/libs/libmythdb/lcddevice.h                 |   85 +++++
 mythtv/libs/libmythdb/libmythdb.pro               |    2 
 mythtv/libs/libmythtv/avformatdecoder.cpp         |   56 +++
 mythtv/libs/libmythtv/tv_play.cpp                 |   11 
 11 files changed, 545 insertions(+), 2 deletions(-)

Index: mythplugins/mythmusic/mythmusic/main.cpp
===================================================================
--- mythplugins/mythmusic/mythmusic/main.cpp	(revision 22413)
+++ mythplugins/mythmusic/mythmusic/main.cpp	(working copy)
@@ -21,6 +21,7 @@
 #include <mythtv/compat.h>
 #include <mythtv/libmythui/mythuihelper.h>
 #include <mythtv/libmythui/mythprogressdialog.h>
+#include <mythtv/lcddevice.h>
 
 // MythMusic headers
 #include "decoder.h"
@@ -527,6 +528,11 @@ static void preMusic()
     gMusicData->startdir = startdir;
     gMusicData->all_playlists = all_playlists;
     gMusicData->all_music = all_music;
+
+    if (LCD *lcd = LCD::Get())
+    {
+        lcd->setFunctionLEDs(FUNC_MUSIC, true);
+    }
 }
 
 static void postMusic()
@@ -548,6 +554,11 @@ static void postMusic()
     gMusicData->all_music = NULL;
     delete gMusicData->all_playlists;
     gMusicData->all_playlists = NULL;
+
+    if (LCD *lcd = LCD::Get())
+    {
+        lcd->setFunctionLEDs(FUNC_MUSIC, false);
+    }
 }
 
 int mythplugin_run(void)
Index: mythplugins/mythgallery/mythgallery/imageview.cpp
===================================================================
--- mythplugins/mythgallery/mythgallery/imageview.cpp	(revision 22413)
+++ mythplugins/mythgallery/mythgallery/imageview.cpp	(working copy)
@@ -152,9 +152,11 @@ void ImageView::UpdateLCD(const ThumbItem *item)
 
     if (!item)
     {
+        lcd->setFunctionLEDs(FUNC_PHOTO, false);
         lcd->switchToTime();
         return;
     }
+    lcd->setFunctionLEDs(FUNC_PHOTO, true);
 
     QString name = item->GetName();
     QString desc = QString::number(m_pos + 1) + " / " +
Index: mythplugins/mythweather/mythweather/main.cpp
===================================================================
--- mythplugins/mythweather/mythweather/main.cpp	(revision 22413)
+++ mythplugins/mythweather/mythweather/main.cpp	(working copy)
@@ -142,8 +142,10 @@ int mythplugin_config()
     menu->setKillable();
     if (menu->foundTheme())
     {
-        if (LCD *lcd = LCD::Get())
+        if (LCD *lcd = LCD::Get()) {
+            lcd->setFunctionLEDs(FUNC_NEWS, false);
             lcd->switchToTime();
+        }
 
         GetMythMainWindow()->GetMainStack()->AddScreen(menu);
         return 0;
Index: mythplugins/mythvideo/mythvideo/main.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/main.cpp	(revision 22413)
+++ mythplugins/mythvideo/mythvideo/main.cpp	(working copy)
@@ -517,6 +517,7 @@ namespace
         {
             if (LCD *lcd = LCD::Get())
             {
+                lcd->setFunctionLEDs(FUNC_MOVIE, false);
                 lcd->switchToTime();
             }
             GetMythMainWindow()->GetMainStack()->AddScreen(diag);
Index: mythplugins/mythvideo/mythvideo/playercommand.cpp
===================================================================
--- mythplugins/mythvideo/mythvideo/playercommand.cpp	(revision 22413)
+++ mythplugins/mythvideo/mythvideo/playercommand.cpp	(working copy)
@@ -5,6 +5,7 @@
 #include <mythtv/libmythui/mythmainwindow.h>
 #include <mythtv/libmythui/mythsystem.h>
 #include <mythtv/libmyth/remoteutil.h>
+#include <mythtv/lcddevice.h>
 
 #include "dbaccess.h"
 #include "metadata.h"
@@ -391,11 +392,19 @@ VideoPlayerCommand &VideoPlayerCommand::operator=(
 
 void VideoPlayerCommand::Play() const
 {
+    class LCD *lcd = LCD::Get();
+
+    if (lcd) {
+        lcd->setFunctionLEDs(FUNC_TV, false);
+        lcd->setFunctionLEDs(FUNC_MOVIE, true);
+    }
     m_d->Play();
     gContext->GetMainWindow()->raise();
     gContext->GetMainWindow()->activateWindow();
     if (gContext->GetMainWindow()->currentWidget())
         gContext->GetMainWindow()->currentWidget()->setFocus();
+    if (lcd)
+        lcd->setFunctionLEDs(FUNC_MOVIE, false);
 }
 
 QString VideoPlayerCommand::GetCommandDisplayName() const
Index: mythtv/libs/libmythtv/avformatdecoder.cpp
===================================================================
--- mythtv/libs/libmythtv/avformatdecoder.cpp	(revision 22413)
+++ mythtv/libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -29,6 +29,8 @@ using namespace std;
 #include "mythuihelper.h"
 #include "myth_imgconvert.h"
 
+#include "lcddevice.h"
+
 #include "videoout_dvdv.h"    // AvFormatDecoderPrivate has DVDV ptr
 #include "videoout_quartz.h"  // For VOQ::GetBestSupportedCodec()
 
@@ -519,6 +521,15 @@ AvFormatDecoder::~AvFormatDecoder()
 
     if (avfRingBuffer)
         delete avfRingBuffer;
+
+    if (LCD *lcd = LCD::Get())
+    {
+        VERBOSE(VB_GENERAL, QString("LCD: Switch all codec/hdtv/spdif OFF"));
+        lcd->setAVFormatLEDs(CODEC_ID_MPEG2VIDEO, false);
+        lcd->setAVFormatLEDs(CODEC_ID_MP2, false);
+        lcd->setVariousLEDs(VARIOUS_HDTV, false);
+        lcd->setVariousLEDs(VARIOUS_SPDIF, false);
+    }
 }
 
 void AvFormatDecoder::CloseCodecs()
@@ -1290,6 +1301,15 @@ void AvFormatDecoder::InitVideoCodec(AVStream *str
         GetNVP()->SetVideoParams(width, height, fps,
                                  keyframedist, aspect_ratio, kScan_Detect,
                                  dvd_video_codec_changed);
+        if (LCD *lcd = LCD::Get())
+        {
+            VERBOSE(VB_GENERAL, QString("LCD: Set AVFormat to Codec %1").arg(enc->codec_id));
+            lcd->setAVFormatLEDs(enc->codec_id, true);
+            if(height >= 720)
+                lcd->setVariousLEDs(VARIOUS_HDTV, true);
+            else
+                lcd->setVariousLEDs(VARIOUS_HDTV, false);
+        }
     }
 }
 
@@ -4307,6 +4327,42 @@ bool AvFormatDecoder::SetupAudioStream(void)
     GetNVP()->SetAudioCodec((using_passthru) ? codec_ctx : NULL);
     GetNVP()->ReinitAudio();
 
+    if (LCD *lcd = LCD::Get())
+    {
+        VERBOSE(VB_GENERAL, QString("LCD: Set Audio Codec %1")
+                .arg(codec_id_string(codec_ctx->codec_id)));
+        lcd->setAVFormatLEDs(codec_ctx->codec_id, true);
+
+        VERBOSE(VB_GENERAL, QString("LCD: Set SPDIF LED %1")
+                .arg((using_passthru) ? "on" : "off"));
+        if (using_passthru)
+            lcd->setVariousLEDs(VARIOUS_SPDIF, true);
+        else
+            lcd->setVariousLEDs(VARIOUS_SPDIF, false);
+
+        VERBOSE(VB_GENERAL, QString("LCD: setting speaker LEDs for %1 channels")
+                .arg(audioIn.channels));
+        switch (audioIn.channels)
+        {
+            case 0:
+                lcd->setSpeakerLEDs(SPEAKER_LR, false);
+                break;
+            case 1:
+            case 2:
+                lcd->setSpeakerLEDs(SPEAKER_LR, true);
+                break;
+            case 3:
+            case 4:
+            case 5:
+            case 6:
+                lcd->setSpeakerLEDs(SPEAKER_51, true);
+                break;
+            default:
+                lcd->setSpeakerLEDs(SPEAKER_71, true);
+                break;
+        }
+
+    }
     return true;
 }
 
Index: mythtv/libs/libmythtv/tv_play.cpp
===================================================================
--- mythtv/libs/libmythtv/tv_play.cpp	(revision 22413)
+++ mythtv/libs/libmythtv/tv_play.cpp	(working copy)
@@ -1084,7 +1084,11 @@ TV::~TV(void)
         delete lastProgram;
 
     if (class LCD * lcd = LCD::Get())
+    {
+        lcd->setFunctionLEDs(FUNC_TV, false);
+        lcd->setFunctionLEDs(FUNC_MOVIE, false);
         lcd->switchToTime();
+    }
 
     if (ddMapLoaderRunning)
     {
@@ -1659,8 +1663,13 @@ int TV::Playback(const ProgramInfo &rcinfo)
 
     ReturnPlayerLock(mctx);
 
-    if (class LCD * lcd = LCD::Get())
+    if (class LCD * lcd = LCD::Get()) {
         lcd->switchToChannel(rcinfo.chansign, rcinfo.title, rcinfo.subtitle);
+        if (rcinfo.isVideo)
+            lcd->setFunctionLEDs(FUNC_MOVIE, true);
+        else
+            lcd->setFunctionLEDs(FUNC_TV, true);
+    }
 
     return 1;
 }
Index: mythtv/libs/libmyth/audiooutputbase.cpp
===================================================================
--- mythtv/libs/libmyth/audiooutputbase.cpp	(revision 22413)
+++ mythtv/libs/libmyth/audiooutputbase.cpp	(working copy)
@@ -14,6 +14,7 @@
 #include "audiooutputdigitalencoder.h"
 #include "SoundTouch.h"
 #include "freesurround.h"
+#include "lcddevice.h"
 
 #define LOC QString("AO: ")
 #define LOC_ERR QString("AO, ERROR: ")
@@ -475,6 +476,11 @@ void AudioOutputBase::KillAudio()
     CloseDevice();
 
     killAudioLock.unlock();
+    if (LCD *lcd = LCD::Get())
+    {
+        lcd->setAVFormatLEDs(CODEC_ID_MP2, false); // which codec is not important, only that it was a audio codec
+        lcd->setSpeakerLEDs(SPEAKER_71, false);    // should clear any and all speaker LEDs
+    }
 }
 
 void AudioOutputBase::Pause(bool paused)
Index: mythtv/libs/libmythdb/lcddevice.cpp
===================================================================
--- mythtv/libs/libmythdb/lcddevice.cpp	(revision 22413)
+++ mythtv/libs/libmythdb/lcddevice.cpp	(working copy)
@@ -47,6 +47,13 @@
 #include "mythdirs.h"
 #include "mythevent.h"
 
+
+// Necessary for codec icon support
+extern "C" {
+#include <stdint.h>
+#include "avutil.h"
+#include "avcodec.h"
+}
 static QString LOC = "lcddevice: ";
 
 LCD::LCD()
@@ -70,6 +77,7 @@ LCD::LCD()
       lcd_showmusic_items(),
       lcd_keystring(),
 
+      lcd_ledmask(0),
       GetLEDMask(NULL)
 {
     send_buffer.clear(); last_command.clear();
@@ -405,6 +413,354 @@ void LCD::stopAll()
     sendToServer("STOP_ALL");
 }
 
+void LCD::setSpeakerLEDs(enum LCDSpeakerSet speaker, bool on)
+{
+    if (!lcd_ready)
+        return;
+    lcd_ledmask &= ~SPEAKER_MASK;
+    if (on)
+        lcd_ledmask |= speaker;
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
+void LCD::setAVFormatLEDs(int codec_id, bool on)
+{
+    if (!lcd_ready)
+        return;
+
+    int mask = 0;
+
+    VERBOSE(VB_AUDIO, LOC + QString("LEDs AVFormat %1/%2").arg(codec_id).arg(codec_id_string((CodecID)codec_id)));
+
+    switch (codec_id) {
+    case CODEC_ID_MPEG1VIDEO:
+    case CODEC_ID_MPEG2VIDEO:	/* preferred ID for MPEG-1/2 video decoding */
+    case CODEC_ID_MPEG2VIDEO_XVMC:
+    case CODEC_ID_MPEG2VIDEO_XVMC_VLD:
+    case CODEC_ID_MPEG2VIDEO_DVDV:
+    case CODEC_ID_H261:
+    case CODEC_ID_RV10:
+    case CODEC_ID_RV20:
+    case CODEC_ID_MJPEG:
+    case CODEC_ID_MJPEGB:
+    case CODEC_ID_LJPEG:
+    case CODEC_ID_SP5X:
+    case CODEC_ID_JPEGLS:
+    case CODEC_ID_RAWVIDEO:
+    case CODEC_ID_FLV1:
+    case CODEC_ID_SVQ1:
+    case CODEC_ID_SVQ3:
+    case CODEC_ID_DVVIDEO:
+    case CODEC_ID_HUFFYUV:
+    case CODEC_ID_CYUV:
+    case CODEC_ID_H264:
+    case CODEC_ID_INDEO3:
+    case CODEC_ID_VP3:
+    case CODEC_ID_THEORA:
+    case CODEC_ID_ASV1:
+    case CODEC_ID_ASV2:
+    case CODEC_ID_FFV1:
+    case CODEC_ID_4XM:
+    case CODEC_ID_VCR1:
+    case CODEC_ID_CLJR:
+    case CODEC_ID_MDEC:
+    case CODEC_ID_ROQ:
+    case CODEC_ID_INTERPLAY_VIDEO:
+    case CODEC_ID_XAN_WC3:
+    case CODEC_ID_XAN_WC4:
+    case CODEC_ID_RPZA:
+    case CODEC_ID_CINEPAK:
+    case CODEC_ID_WS_VQA:
+    case CODEC_ID_MSRLE:
+    case CODEC_ID_MSVIDEO1:
+    case CODEC_ID_IDCIN:
+    case CODEC_ID_8BPS:
+    case CODEC_ID_SMC:
+    case CODEC_ID_FLIC:
+    case CODEC_ID_TRUEMOTION1:
+    case CODEC_ID_VMDVIDEO:
+    case CODEC_ID_MSZH:
+    case CODEC_ID_ZLIB:
+    case CODEC_ID_QTRLE:
+    case CODEC_ID_SNOW:
+    case CODEC_ID_TSCC:
+    case CODEC_ID_ULTI:
+    case CODEC_ID_QDRAW:
+    case CODEC_ID_VIXL:
+    case CODEC_ID_QPEG:
+    case CODEC_ID_PNG:
+    case CODEC_ID_PPM:
+    case CODEC_ID_PBM:
+    case CODEC_ID_PGM:
+    case CODEC_ID_PGMYUV:
+    case CODEC_ID_PAM:
+    case CODEC_ID_FFVHUFF:
+    case CODEC_ID_RV30:
+    case CODEC_ID_RV40:
+    case CODEC_ID_VC1:
+    case CODEC_ID_WMV3:
+    case CODEC_ID_LOCO:
+    case CODEC_ID_WNV1:
+    case CODEC_ID_AASC:
+    case CODEC_ID_INDEO2:
+    case CODEC_ID_FRAPS:
+    case CODEC_ID_TRUEMOTION2:
+    case CODEC_ID_BMP:
+    case CODEC_ID_CSCD:
+    case CODEC_ID_MMVIDEO:
+    case CODEC_ID_ZMBV:
+    case CODEC_ID_AVS:
+    case CODEC_ID_SMACKVIDEO:
+    case CODEC_ID_NUV:
+    case CODEC_ID_KMVC:
+    case CODEC_ID_FLASHSV:
+    case CODEC_ID_CAVS:
+    case CODEC_ID_JPEG2000:
+    case CODEC_ID_VMNC:
+    case CODEC_ID_VP5:
+    case CODEC_ID_VP6:
+    case CODEC_ID_VP6F:
+    case CODEC_ID_TARGA:
+    case CODEC_ID_DSICINVIDEO:
+    case CODEC_ID_TIERTEXSEQVIDEO:
+    case CODEC_ID_TIFF:
+    case CODEC_ID_GIF:
+    case CODEC_ID_FFH264:
+    case CODEC_ID_DXA:
+    case CODEC_ID_DNXHD:
+    case CODEC_ID_THP:
+    case CODEC_ID_SGI:
+    case CODEC_ID_C93:
+    case CODEC_ID_BETHSOFTVID:
+    case CODEC_ID_PTX:
+    case CODEC_ID_TXD:
+    case CODEC_ID_VP6A:
+    case CODEC_ID_AMV:
+    case CODEC_ID_VB:
+    case CODEC_ID_MPEG2TS: /* _FAKE_ codec to indicate a raw MPEG-2 TS */
+        mask |= VIDEO_MPG;
+        break;
+
+    case CODEC_ID_H263:
+    case CODEC_ID_MPEG4:
+    case CODEC_ID_MSMPEG4V1:
+    case CODEC_ID_MSMPEG4V2:
+    case CODEC_ID_MSMPEG4V3:
+    case CODEC_ID_H263P:
+    case CODEC_ID_H263I:
+        mask |= VIDEO_DIVX;
+        break;
+
+    case CODEC_ID_WMV1:
+    case CODEC_ID_WMV2:
+        mask |= VIDEO_WMV;
+        break;
+
+    case CODEC_ID_XVID:
+        mask |= VIDEO_XVID;
+        break;
+
+    /* various PCM "codecs" */
+    case CODEC_ID_PCM_S16LE:
+    case CODEC_ID_PCM_S16BE:
+    case CODEC_ID_PCM_U16LE:
+    case CODEC_ID_PCM_U16BE:
+    case CODEC_ID_PCM_S8:
+    case CODEC_ID_PCM_U8:
+    case CODEC_ID_PCM_MULAW:
+    case CODEC_ID_PCM_ALAW:
+    case CODEC_ID_PCM_S32LE:
+    case CODEC_ID_PCM_S32BE:
+    case CODEC_ID_PCM_U32LE:
+    case CODEC_ID_PCM_U32BE:
+    case CODEC_ID_PCM_S24LE:
+    case CODEC_ID_PCM_S24BE:
+    case CODEC_ID_PCM_U24LE:
+    case CODEC_ID_PCM_U24BE:
+    case CODEC_ID_PCM_S24DAUD:
+    case CODEC_ID_PCM_ZORK:
+
+    /* various ADPCM codecs */
+    case CODEC_ID_ADPCM_IMA_QT:
+    case CODEC_ID_ADPCM_IMA_WAV:
+    case CODEC_ID_ADPCM_IMA_DK3:
+    case CODEC_ID_ADPCM_IMA_DK4:
+    case CODEC_ID_ADPCM_IMA_WS:
+    case CODEC_ID_ADPCM_IMA_SMJPEG:
+    case CODEC_ID_ADPCM_MS:
+    case CODEC_ID_ADPCM_4XM:
+    case CODEC_ID_ADPCM_XA:
+    case CODEC_ID_ADPCM_ADX:
+    case CODEC_ID_ADPCM_EA:
+    case CODEC_ID_ADPCM_G726:
+    case CODEC_ID_ADPCM_CT:
+    case CODEC_ID_ADPCM_SWF:
+    case CODEC_ID_ADPCM_YAMAHA:
+    case CODEC_ID_ADPCM_SBPRO_4:
+    case CODEC_ID_ADPCM_SBPRO_3:
+    case CODEC_ID_ADPCM_SBPRO_2:
+    case CODEC_ID_ADPCM_THP:
+    case CODEC_ID_ADPCM_IMA_AMV:
+    case CODEC_ID_ADPCM_EA_R1:
+    case CODEC_ID_ADPCM_EA_R3:
+    case CODEC_ID_ADPCM_EA_R2:
+    case CODEC_ID_ADPCM_IMA_EA_SEAD:
+    case CODEC_ID_ADPCM_IMA_EA_EACS:
+    case CODEC_ID_ADPCM_EA_XAS:
+
+    /* AMR */
+    case CODEC_ID_AMR_NB:
+    case CODEC_ID_AMR_WB:
+
+    /* RealAudio codecs*/
+    case CODEC_ID_RA_144:
+    case CODEC_ID_RA_288:
+
+    /* various DPCM codecs */
+    case CODEC_ID_ROQ_DPCM:
+    case CODEC_ID_INTERPLAY_DPCM:
+    case CODEC_ID_XAN_DPCM:
+    case CODEC_ID_SOL_DPCM:
+
+    /* more misc things we'll call WAV */
+    case CODEC_ID_AAC:
+    case CODEC_ID_DVAUDIO:
+    case CODEC_ID_MACE3:
+    case CODEC_ID_MACE6:
+    case CODEC_ID_VMDAUDIO:
+    case CODEC_ID_SONIC:
+    case CODEC_ID_SONIC_LS:
+    case CODEC_ID_FLAC:
+    case CODEC_ID_MP3ADU:
+    case CODEC_ID_MP3ON4:
+    case CODEC_ID_SHORTEN:
+    case CODEC_ID_ALAC:
+    case CODEC_ID_WESTWOOD_SND1:
+    case CODEC_ID_GSM: /* as in Berlin toast format */
+    case CODEC_ID_QDM2:
+    case CODEC_ID_COOK:
+    case CODEC_ID_TRUESPEECH:
+    case CODEC_ID_TTA:
+    case CODEC_ID_SMACKAUDIO:
+    case CODEC_ID_QCELP:
+    case CODEC_ID_WAVPACK:
+    case CODEC_ID_DSICINAUDIO:
+    case CODEC_ID_IMC:
+    case CODEC_ID_MUSEPACK7:
+    case CODEC_ID_MLP:
+    case CODEC_ID_GSM_MS: /* as found in WAV */
+    case CODEC_ID_ATRAC3:
+    case CODEC_ID_VOXWARE:
+    case CODEC_ID_APE:
+    case CODEC_ID_NELLYMOSER:
+    case CODEC_ID_MUSEPACK8:
+        mask |= AUDIO_WAV;
+        break;
+
+    case CODEC_ID_MP2:
+        mask |= AUDIO_MPEG2;
+        break;
+
+    case CODEC_ID_MP3: /* preferred ID for decoding MPEG audio layer 1: 2 or 3 */
+        mask |= AUDIO_MP3;
+        break;
+
+    case CODEC_ID_AC3:
+        mask |= AUDIO_AC3;
+        break;
+
+    case CODEC_ID_DTS:
+        mask |= AUDIO_DTS;
+        break;
+
+    case CODEC_ID_VORBIS:
+        mask |= AUDIO_OGG;
+        break;
+
+    case CODEC_ID_WMAV1:
+        mask |= AUDIO_WMA;
+        break;
+
+    case CODEC_ID_WMAV2:
+        mask |= AUDIO_WMA2;
+        break;
+
+    /* subtitle codecs */
+    case CODEC_ID_DVD_SUBTITLE:
+    case CODEC_ID_DVB_SUBTITLE:
+    case CODEC_ID_TEXT:
+    case CODEC_ID_XSUB:
+    /* teletext codecs */
+    case CODEC_ID_MPEG2VBI:
+    case CODEC_ID_DVB_VBI:
+    /* DSMCC codec */
+    case CODEC_ID_DSMCC_B:
+        mask |= 0;
+        break;
+    }
+
+    if(mask & AUDIO_MASK)
+    {
+        lcd_ledmask &= ~AUDIO_MASK;
+        if (on)
+            lcd_ledmask |= (mask & AUDIO_MASK);
+    }
+    if(mask & VIDEO_MASK)
+    {
+        lcd_ledmask &= ~VIDEO_MASK;
+        if (on)
+            lcd_ledmask |= (mask & VIDEO_MASK);
+    }
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
+
+void LCD::setVideoSrcLEDs(enum LCDVideoSourceSet vsrc, bool on)
+{
+    if (!lcd_ready)
+        return;
+    lcd_ledmask &= ~VSRC_MASK;
+    if (on)
+        lcd_ledmask |=  vsrc;
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
+void LCD::setFunctionLEDs(enum LCDFunctionSet func, bool on)
+{
+    if (!lcd_ready)
+        return;
+    lcd_ledmask &= ~FUNC_MASK;
+    if (on)
+        lcd_ledmask |=  func;
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
+void LCD::setVariousLEDs(enum LCDVariousFlags various, bool on)
+{
+    if (!lcd_ready)
+        return;
+    if (on) {
+        lcd_ledmask |=  various;
+        if (various == VARIOUS_SPDIF)
+            lcd_ledmask |= SPDIF_MASK;
+    } else {
+        lcd_ledmask &=  ~various;
+        if (various == VARIOUS_SPDIF)
+            lcd_ledmask &= ~SPDIF_MASK;
+    }
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
+void LCD::setTunerLEDs(enum LCDTunerSet tuner, bool on)
+{
+    if (!lcd_ready)
+        return;
+    lcd_ledmask &= ~TUNER_MASK;
+    if (on)
+        lcd_ledmask |=  tuner;
+    sendToServer(QString("UPDATE_LEDS %1").arg(lcd_ledmask));
+}
+
 void LCD::setChannelProgress(float value)
 {
     if (!lcd_ready || !lcd_showchannel)
@@ -480,6 +836,9 @@ void LCD::setupLEDs(int(*LedMaskFunc)(void))
 
 void LCD::outputLEDs()
 {
+    /* now implemented elsewhere for advanced icon control */
+    return;
+#if 0
     if (!lcd_ready)
         return;
 
@@ -490,6 +849,7 @@ void LCD::outputLEDs()
     aString = "UPDATE_LEDS ";
     aString += QString::number(mask);
     sendToServer(aString);
+#endif
 }
 
 void LCD::switchToTime()
Index: mythtv/libs/libmythdb/lcddevice.h
===================================================================
--- mythtv/libs/libmythdb/lcddevice.h	(revision 22413)
+++ mythtv/libs/libmythdb/lcddevice.h	(working copy)
@@ -94,6 +94,81 @@ class MPUBLIC LCDTextItem
     bool itemScrollable;
 };
 
+//only one active at a time
+enum LCDSpeakerSet {
+	SPEAKER_MASK = 0x00000030,
+	SPEAKER_LR = 1 << 4,
+	SPEAKER_51 = 2 << 4,
+	SPEAKER_71 = 3 << 4,
+};
+
+//only one active at a time
+enum LCDAudioFormatSet {
+	AUDIO_MASK = 0x0000E000 | 0x00070000,
+
+	AUDIO_MP3  = 1 << 13,
+	AUDIO_OGG  = 2 << 13,
+	AUDIO_WMA2 = 3 << 13,
+	AUDIO_WAV  = 4 << 13,
+
+	AUDIO_MPEG2 = 1 << 16,
+	AUDIO_AC3   = 2 << 16,
+	AUDIO_DTS   = 3 << 16,
+	AUDIO_WMA   = 4 << 16,
+};
+
+//only one active at a time
+enum LCDVideoFormatSet {
+	VIDEO_MASK = 0x00380000,
+	VIDEO_MPG  = 1 << 19,
+	VIDEO_DIVX = 2 << 19,
+	VIDEO_XVID = 3 << 19,
+	VIDEO_WMV  = 4 << 19,
+};
+
+//only one active at a time
+enum LCDTunerSet {
+	TUNER_MASK = 0x00000080 | 0x00000800 | 0x00001000,
+	TUNER_SRC  = 0x00000080,
+	TUNER_SRC1 = 0x00000800,
+	TUNER_SRC2 = 0x00001000,
+};
+
+//only one active at a time
+enum LCDVideoSourceSet {
+	VSRC_MASK = 0x00000100 | 0x00000200,
+	VSRC_FIT  = 0x00000100,
+	VSRC_TV   = 0x00000200,
+};
+
+//can be enabled/disabled separately
+enum LCDVariousFlags {
+	VARIOUS_VOL = 0x00400000,
+	VARIOUS_TIME = 0x00800000,
+	VARIOUS_ALARM = 0x01000000,
+	VARIOUS_RECORD = 0x02000000,
+	VARIOUS_REPEAT = 0x04000000,
+	VARIOUS_SHUFFLE = 0x08000000,
+	VARIOUS_DISC_IN = 0x20000000,
+	VARIOUS_HDTV = 0x00000400,
+	VARIOUS_SPDIF = 0x1 << 9,
+	SPDIF_MASK = 0x00000040,
+};
+
+
+//only one active at a time
+enum LCDFunctionSet {
+	//0=none, 1=music, 2=movie, 3=photo, 4=CD/DVD, 5=TV, 6=Web, 7=News/Weather  * 2
+	FUNC_MASK = 0xE,
+	FUNC_MUSIC = 1 << 1,
+	FUNC_MOVIE = 2 << 1,
+	FUNC_PHOTO = 3 << 1,
+	FUNC_DVD = 4 << 1,
+	FUNC_TV = 5 << 1,
+	FUNC_WEB = 6 << 1,
+	FUNC_NEWS = 7 << 1,
+};
+
 class MPUBLIC LCD : public QObject, public MythSocketCBs
 {
     Q_OBJECT
@@ -131,6 +206,14 @@ class MPUBLIC LCD : public QObject, public MythSoc
     // When nothing else is going on, show the time
     void switchToTime();
 
+    // Extended functionality for eg SoundGraph iMON LCD devices
+    void setSpeakerLEDs(enum LCDSpeakerSet speaker, bool on);
+    void setAVFormatLEDs(int codec_id, bool on);
+    void setVideoSrcLEDs(enum LCDVideoSourceSet vsrc, bool on);
+    void setFunctionLEDs(enum LCDFunctionSet video, bool on);
+    void setTunerLEDs(enum LCDTunerSet tuner, bool on);
+    void setVariousLEDs(enum LCDVariousFlags various, bool on);
+
     // When playing music, switch to this and give artist and track name
     //
     // Note: the use of switchToMusic and setLevels is discouraged, because it
@@ -262,6 +345,8 @@ class MPUBLIC LCD : public QObject, public MythSoc
     QString lcd_showmusic_items;
     QString lcd_keystring;
 
+    int lcd_ledmask;
+
     int (*GetLEDMask)(void);
 };
 
Index: mythtv/libs/libmythdb/libmythdb.pro
===================================================================
--- mythtv/libs/libmythdb/libmythdb.pro	(revision 22413)
+++ mythtv/libs/libmythdb/libmythdb.pro	(working copy)
@@ -22,6 +22,8 @@ SOURCES += mythdbcon.cpp mythdb.cpp oldsettings.cp
 SOURCES += mythobservable.cpp httpcomms.cpp qcodecs.cpp mythdirs.cpp
 SOURCES += lcddevice.cpp mythstorage.cpp remotefile.cpp decodeencode.cpp
 
+INCLUDEPATH += ../libavcodec ../libavutil ../
+
 win32:SOURCES += msocketdevice_win.cpp
 unix {
     SOURCES += msocketdevice_unix.cpp
