Index: libs/libmythtv/NuppelVideoPlayer.cpp
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.cpp	(revision 12692)
+++ libs/libmythtv/NuppelVideoPlayer.cpp	(working copy)
@@ -274,6 +274,7 @@
     m_DeintSetting   = gContext->GetNumSetting("Deinterlace", 0);
     decode_extra_audio=gContext->GetNumSetting("DecodeExtraAudio", 0);
     itvEnabled       = gContext->GetNumSetting("EnableMHEG", 0);
+    passthru_enabled  = gContext->GetNumSetting("InitPassThrough", 1);
 
     lastIgnoredManualSkip = QDateTime::currentDateTime().addSecs(-10);
 
@@ -3779,6 +3780,39 @@
     paused = actuallypaused = true;
 }
 
+
+bool NuppelVideoPlayer::ToggleAudioPassThrough(void)
+{
+    passthru_enabled = !passthru_enabled;
+    if (decoder) {
+        bool disabled = DoSetDisableAudioPassThrough();
+
+        VERBOSE(VB_IMPORTANT, QString("PassThrough: %1").arg(disabled ? "Disabled" : "Enabled"));
+    }
+    return passthru_enabled;
+}
+
+
+bool NuppelVideoPlayer::AudioPassThroughAvailable(void)
+{
+    return (play_speed == 1.00f) && decoder && decoder->CouldPassThrough();
+}
+
+
+bool NuppelVideoPlayer::DoSetDisableAudioPassThrough()
+{
+    bool disabled = !passthru_enabled;
+    
+    if (!disabled) {
+        disabled = !AudioPassThroughAvailable();
+    }
+    if (decoder) {
+        decoder->SetDisablePassThrough(disabled);
+    }
+    return disabled;
+}
+
+
 void NuppelVideoPlayer::DoPlay(void)
 {
     bool skip_changed;
@@ -3874,12 +3908,12 @@
         audio_stretchfactor = play_speed;
         if (decoder)
         {
-            bool disable = (play_speed < 0.99f) || (play_speed > 1.01f);
+            bool disable = DoSetDisableAudioPassThrough();
+
             VERBOSE(VB_PLAYBACK, LOC +
                     QString("Stretch Factor %1, %2 passthru ")
                     .arg(audio_stretchfactor)
                     .arg((disable) ? "disable" : "allow"));
-            decoder->SetDisablePassThrough(disable);
         }
         if (audioOutput)
         {
@@ -6450,6 +6484,7 @@
         decoder = dec;
         delete d;
     }
+    DoSetDisableAudioPassThrough();
 }
 
 /** \fn NuppelVideoPlayer::LoadExternalSubtitles(const QString&)
Index: libs/libmythtv/decoderbase.h
===================================================================
--- libs/libmythtv/decoderbase.h	(revision 12692)
+++ libs/libmythtv/decoderbase.h	(working copy)
@@ -68,6 +68,8 @@
     void SetLowBuffers(bool low) { lowbuffers = low; }
     /// Disables AC3/DTS pass through
     virtual void SetDisablePassThrough(bool disable) { (void)disable; }
+    // Checks if could potentially passthrough (ignoring disable flag)
+    virtual bool CouldPassThrough(void) { return false; }
 
     virtual void setWatchingRecording(bool mode);
     virtual bool GetFrame(int onlyvideo) = 0;
Index: libs/libmythtv/avformatdecoder.cpp
===================================================================
--- libs/libmythtv/avformatdecoder.cpp	(revision 12692)
+++ libs/libmythtv/avformatdecoder.cpp	(working copy)
@@ -3397,6 +3397,38 @@
     }
 }
 
+
+bool AvFormatDecoder::CouldPassThrough(void)
+{
+    bool could_passthru = false;
+    AVStream *curstream = NULL;
+
+    if ((currentTrack[kTrackTypeAudio] >= 0) &&
+        (selectedTrack[kTrackTypeAudio].av_stream_index <= ic->nb_streams) &&
+        (curstream = ic->streams[selectedTrack[kTrackTypeAudio]
+                                 .av_stream_index]))
+    {
+        could_passthru = DoCheckPassThrough(curstream->codec);        
+    }
+    return could_passthru;
+}
+
+
+bool AvFormatDecoder::DoCheckPassThrough(AVCodecContext *codec_ctx)
+{
+    bool could_passthru = false;
+
+    if (codec_ctx && !transcoding)
+    {
+        could_passthru = (allow_ac3_passthru &&
+                                (codec_ctx->codec_id == CODEC_ID_AC3));
+        could_passthru |= (allow_dts_passthru &&
+                                (codec_ctx->codec_id == CODEC_ID_DTS));
+    }
+    return could_passthru;
+}
+
+
 /** \fn AvFormatDecoder::SetupAudioStream(void)
  *  \brief Reinitializes audio if it needs to be reinitialized.
  *
@@ -3420,15 +3452,9 @@
         assert(curstream);
         assert(curstream->codec);
         codec_ctx = curstream->codec;        
-        bool do_ac3_passthru = (allow_ac3_passthru && !transcoding &&
-                                !disable_passthru &&
-                                (codec_ctx->codec_id == CODEC_ID_AC3));
-        bool do_dts_passthru = (allow_dts_passthru && !transcoding &&
-                                !disable_passthru &&
-                                (codec_ctx->codec_id == CODEC_ID_DTS));
         info = AudioInfo(codec_ctx->codec_id,
                          codec_ctx->sample_rate, codec_ctx->channels,
-                         do_ac3_passthru || do_dts_passthru);
+                         !disable_passthru && DoCheckPassThrough(codec_ctx));
     }
 
     if (info == audioIn)
Index: libs/libmythtv/tv_play.h
===================================================================
--- libs/libmythtv/tv_play.h	(revision 12692)
+++ libs/libmythtv/tv_play.h	(working copy)
@@ -235,6 +235,8 @@
     void ToggleMute(void);
     void ToggleLetterbox(int letterboxMode = -1);
 
+    void ToggleAudioPassThrough();
+
     bool FillMenuTracks(OSDGenericTree*, uint type);
     void ChangeTrack(uint type, int dir);
     void SetTrack(uint type, int trackNo);
Index: libs/libmythtv/NuppelVideoPlayer.h
===================================================================
--- libs/libmythtv/NuppelVideoPlayer.h	(revision 12692)
+++ libs/libmythtv/NuppelVideoPlayer.h	(working copy)
@@ -390,6 +390,9 @@
         hidedvdbutton = hide;
     }
 
+    bool ToggleAudioPassThrough(void);
+    bool AudioPassThroughAvailable(void);
+
   protected:
     void DisplayPauseFrame(void);
     void DisplayNormalFrame(void);
@@ -502,6 +505,8 @@
     long long GetDVDBookmark(void) const;
     void SetDVDBookmark(long long frames);
 
+    bool DoSetDisableAudioPassThrough(void);
+
   private:
     VideoOutputType forceVideoOutput;
 
@@ -776,6 +781,8 @@
 
     // Debugging variables
     Jitterometer *output_jmeter;
+
+    bool passthru_enabled;
 };
 
 #endif
Index: libs/libmythtv/tv_play.cpp
===================================================================
--- libs/libmythtv/tv_play.cpp	(revision 12692)
+++ libs/libmythtv/tv_play.cpp	(working copy)
@@ -326,6 +326,8 @@
     REG_KEY("TV Playback", "JUMPTODVDROOTMENU", "Jump to the DVD Root Menu", "");
     REG_KEY("TV Playback", "EXITSHOWNOPROMPTS","Exit Show without any prompts", "");
 
+    REG_KEY("TV Playback", "TOGGLEPASSTHRU", "Toggle Audio PassThrough","");
+
     /* Editing keys */
     REG_KEY("TV Editing", "CLEARMAP", "Clear editing cut points", "C,Q,Home");
     REG_KEY("TV Editing", "INVERTMAP", "Invert Begin/End cut points", "I");
@@ -2237,7 +2239,8 @@
                 ToggleRecord();
             else if (action == "VOLUMEDOWN" || action == "VOLUMEUP" ||
                      action == "STRETCHINC" || action == "STRETCHDEC" ||
-                     action == "MUTE" || action == "TOGGLEASPECT")
+                     action == "MUTE" || action == "TOGGLEASPECT" ||
+                     action == "TOGGLEPASSTHRU")
             {
                 passThru = 1;
                 handled = false;
@@ -2288,7 +2291,7 @@
             else if (action == "VOLUMEDOWN" || action == "VOLUMEUP" ||
                      action == "STRETCHINC" || action == "STRETCHDEC" ||
                      action == "MUTE" || action == "PAUSE" ||
-                     action == "CLEAROSD")
+                     action == "CLEAROSD" || action == "TOGGLEPASSTHRU")
             {
                 passThru = 1;
                 handled = false;
@@ -2811,6 +2814,8 @@
             ChangeVolume(true);
         else if (action == "MUTE")
             ToggleMute();
+        else if (action == "TOGGLEPASSTHRU") 
+            ToggleAudioPassThrough();
         else if (action == "STRETCHINC")
             ChangeTimeStretch(1);
         else if (action == "STRETCHDEC")
@@ -4891,7 +4896,6 @@
     tHrsMin.sprintf("%d:%02d", hours, min);
 }
 
-
 void TV::ShowLCDDVDInfo(void)
 {
     class LCD * lcd = LCD::Get();
@@ -5386,6 +5390,23 @@
         GetOSD()->SetSettingsText(text, 5);
 }
 
+
+void TV::ToggleAudioPassThrough(void)
+{
+    QString text;
+    if (nvp->AudioPassThroughAvailable()) {
+        bool passThr = nvp->ToggleAudioPassThrough();
+
+        text = tr("PassThrough: %1").arg(passThr ? tr("Enabled") :
+                                                   tr("Disabled")); 
+        
+        if (GetOSD() && !browsemode)
+            GetOSD()->SetSettingsText(text, 5);
+    }
+}
+
+
+
 void TV::ToggleSleepTimer(void)
 {
     QString text;
@@ -6540,6 +6561,8 @@
             DoQueueTranscode("Medium Quality");
         else if (action == "QUEUETRANSCODE_LOW")
             DoQueueTranscode("Low Quality");
+        else if (action == "TOGGLEPASSTHRU")
+            ToggleAudioPassThrough();
         else if (action.left(8) == "JUMPPROG")
         {
             SetJumpToProgram(action.section(" ",1,-2),
@@ -6701,6 +6724,10 @@
     FillMenuTracks(treeMenu, kTrackTypeSubtitle);
     FillMenuTracks(treeMenu, kTrackTypeCC708);
 
+    if (nvp->AudioPassThroughAvailable()) 
+        item = new OSDGenericTree(treeMenu, tr("Toggle Audio PassThrough"),
+                                  "TOGGLEPASSTHRU");
+
     if (VBIMode::NTSC_CC == vbimode)
         FillMenuTracks(treeMenu, kTrackTypeCC608);
     else if (VBIMode::PAL_TT == vbimode)
Index: libs/libmythtv/avformatdecoder.h
===================================================================
--- libs/libmythtv/avformatdecoder.h	(revision 12692)
+++ libs/libmythtv/avformatdecoder.h	(working copy)
@@ -123,6 +123,7 @@
     MythCodecID GetVideoCodecID() const { return video_codec_id; }
 
     virtual void SetDisablePassThrough(bool disable);
+    virtual bool CouldPassThrough(void);
     void AddTextData(unsigned char *buf, int len, long long timecode, char type);
 
     virtual QString GetTrackDesc(uint type, uint trackNo) const;
@@ -186,6 +187,7 @@
                         int width, int height);
 
     void SeekReset(long long, uint skipFrames, bool doFlush, bool discardFrames);
+    bool DoCheckPassThrough(AVCodecContext *codec_ctx);
 
     bool SetupAudioStream(void);
     void SetupAudioStreamSubIndexes(int streamIndex);
@@ -259,6 +261,7 @@
     bool dvd_xvmc_enabled;
     bool dvd_video_codec_changed;
 
+
 };
 
 #endif
