Index: mythtv/libs/libs.pro
diff -u mythtv/libs/libs.pro:1.1.1.1 mythtv/libs/libs.pro:1.2
--- mythtv/libs/libs.pro:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libs.pro	Sun Mar 21 11:46:49 2004
@@ -1,4 +1,4 @@
-######################################################################
+#####################################################################
 # Automatically generated by qmake (1.02a) Tue Jul 16 20:59:39 2002
 ######################################################################
 
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.cpp
diff -u mythtv/libs/libmythtv/NuppelVideoPlayer.cpp:1.1.1.1 mythtv/libs/libmythtv/NuppelVideoPlayer.cpp:1.2
--- mythtv/libs/libmythtv/NuppelVideoPlayer.cpp:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.cpp	Sun Mar 21 11:46:49 2004
@@ -1709,8 +1709,8 @@
  
     if (!disableaudio)
     {
-        audioOutput = AudioOutput::OpenAudio(audiodevice, audio_bits,
-                                             audio_channels, audio_samplerate);
+	   SetAudioOutput(AudioOutput::OpenAudio(audiodevice, audio_bits,
+											 audio_channels, audio_samplerate));
     }
 
     InitVideo();
@@ -1932,6 +1932,26 @@
     audio_samplerate = samplerate;
 }
 
+void NuppelVideoPlayer::SetDualAudioMode(DualAudioMode mode)
+{
+   if(audioOutput)
+	  audioOutput->SetDualAudioMode(mode);
+}
+DualAudioMode NuppelVideoPlayer::GetDualAudioMode()
+{
+   if(audioOutput)
+	  return audioOutput->GetDualAudioMode();
+   return DUAL_AUDIO_STEREO;
+}
+
+void NuppelVideoPlayer::SetAudioOutput(AudioOutput *ao)
+{
+   if(!ao)
+	  audioOutput=NULL;
+   else
+	  audioOutput = new DualAudioOutput(ao, audio_bits, audio_channels); 
+}
+
 void NuppelVideoPlayer::SetEffDsp(int dsprate)
 {
     if (audioOutput)
Index: mythtv/libs/libmythtv/NuppelVideoPlayer.h
diff -u mythtv/libs/libmythtv/NuppelVideoPlayer.h:1.1.1.1 mythtv/libs/libmythtv/NuppelVideoPlayer.h:1.2
--- mythtv/libs/libmythtv/NuppelVideoPlayer.h:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libmythtv/NuppelVideoPlayer.h	Sun Mar 21 11:46:49 2004
@@ -13,6 +13,7 @@
 #include "recordingprofile.h"
 #include "commercial_skip.h"
 #include "videooutbase.h"
+#include "dualaudiooutput.h"
 
 extern "C" {
 #include "filter.h"
@@ -75,6 +76,9 @@
               bool unpauseaudio = true); 
     bool GetPause(void);
 
+	DualAudioMode GetDualAudioMode(void);
+	void SetDualAudioMode(DualAudioMode mode);
+
     bool FastForward(float seconds);
     bool Rewind(float seconds);
 
@@ -104,7 +108,7 @@
     int GetLength(void) { return totalLength; }
 
     QString GetEncodingType(void);
-    void SetAudioOutput (AudioOutput *ao) { audioOutput = ao; }
+    void SetAudioOutput (AudioOutput *ao);
     void FlushTxtBuffers(void) { rtxt = wtxt; }
     bool WriteStoredData(RingBuffer *outRingBuffer, bool writevideo);
     long UpdateStoredFrameNum(long curFrameNum);
@@ -291,7 +295,7 @@
     int audio_bits;
     int audio_samplerate;
 
-    AudioOutput *audioOutput;
+    DualAudioOutput *audioOutput;
 
     bool paused, previously_paused, pausevideo;
     bool actuallypaused, video_actually_paused;
Index: mythtv/libs/libmythtv/dualaudiooutput.cpp
diff -u /dev/null mythtv/libs/libmythtv/dualaudiooutput.cpp:1.1
--- /dev/null	Sun Mar 21 11:47:31 2004
+++ mythtv/libs/libmythtv/dualaudiooutput.cpp	Sun Mar 21 11:46:49 2004
@@ -0,0 +1,111 @@
+#include "mythcontext.h"
+#include "dualaudiooutput.h"
+
+DualAudioOutput::DualAudioOutput(AudioOutput* real, int bits, int channels, DualAudioMode mode)
+{
+   this->real = real;
+   this->mode = mode;
+   this->channels = channels;
+   this->bits = bits;
+   fflush(stdout);
+}
+DualAudioOutput::~DualAudioOutput() 
+{
+   delete this->real;
+}
+void DualAudioOutput::Reset(void)
+{
+   this->real->Reset();
+}
+
+void DualAudioOutput::Reconfigure(int audio_bits, 
+								  int audio_channels, 
+								  int audio_samplerate)
+{
+   this->real->Reconfigure(audio_bits, audio_channels, audio_samplerate);
+   this->channels=audio_channels;
+   this->bits=audio_bits;
+   fflush(stdout);
+}
+void DualAudioOutput::SetBlocking(bool blocking)
+{
+   this->real->SetBlocking(blocking);
+}
+   
+void DualAudioOutput::AddSamples(char *buffer, int samples, long long timecode)
+{
+   // interleaved buffers... that sucks...
+   DualAudioMode mode = this->mode;
+   if(this->channels==2 && mode!=DUAL_AUDIO_STEREO)
+	  {
+		 /* I'm not supposed to do that to the buffer I'm passed.
+		  * Yet, it's sooo easy and faster, too. After all, it hasn't
+		  * been declared const...
+		  */
+		 const int bits = this->bits;
+		 int bit;
+		 const char *from;
+		 char *to;
+		 const int samplesize = (bits/8)*2;
+		 const int halfsample = bits/8;
+		 int sample;
+		 if(mode==DUAL_AUDIO_LEFT)
+			{
+			   from=buffer;
+			   to=buffer+halfsample;
+			}
+		 else // DUAL_AUDIO_RIGHT
+			{
+			   from=buffer+halfsample;
+			   to=buffer;
+			}
+
+		 for(sample=0; samplereal->AddSamples(buffer, samples, timecode);
+}
+void DualAudioOutput::AddSamples(char *buffers[], int samples, long long timecode)
+{
+   /* non-interleaved buffers, one for each channel. 
+	* this one's easy... 
+	*/
+   DualAudioMode mode = this->mode;
+   if(this->channels==2 && mode!=DUAL_AUDIO_STEREO)
+	  {
+		 char* newbuffers[] = { buffers[0], buffers[1] };
+		 if(mode==DUAL_AUDIO_LEFT)
+			newbuffers[1]=buffers[0];
+		 else 
+			newbuffers[0]=buffers[1];
+		 this->real->AddSamples(newbuffers, samples, timecode);
+	  }
+   else
+	  this->real->AddSamples(buffers, samples, timecode);
+}
+void DualAudioOutput::SetEffDsp(int dsprate)
+{
+   this->real->SetEffDsp(dsprate);
+}
+void DualAudioOutput::SetTimecode(long long timecode)
+{
+   this->real->SetTimecode(timecode);
+}
+   
+bool DualAudioOutput::GetPause(void)
+{
+   return this->real->GetPause();
+}
+void DualAudioOutput::Pause(bool paused)
+{
+   this->real->Pause(paused);
+}
+   
+int DualAudioOutput::GetAudiotime(void)
+{
+   return this->real->GetAudiotime();
+}
+
Index: mythtv/libs/libmythtv/dualaudiooutput.h
diff -u /dev/null mythtv/libs/libmythtv/dualaudiooutput.h:1.1
--- /dev/null	Sun Mar 21 11:47:31 2004
+++ mythtv/libs/libmythtv/dualaudiooutput.h	Sun Mar 21 11:46:49 2004
@@ -0,0 +1,44 @@
+#ifndef DUALAUDIOOUTPUT_H
+#define DUALAUDIOOUTPUT_H
+
+#include "audiooutput.h"
+
+typedef enum
+{
+   DUAL_AUDIO_STEREO=0,
+   DUAL_AUDIO_LEFT,
+   DUAL_AUDIO_RIGHT
+} DualAudioMode;
+
+class DualAudioOutput : public AudioOutput 
+{
+ public:
+   DualAudioOutput(AudioOutput* real, int bits, int channels, DualAudioMode mode=DUAL_AUDIO_STEREO);
+   virtual ~DualAudioOutput();
+
+   virtual void Reset(void);
+   virtual void Reconfigure(int audio_bits, 
+							int audio_channels, int audio_samplerate);
+   virtual void SetBlocking(bool blocking);
+   
+   virtual void AddSamples(char *buffer, int samples, long long timecode);
+   virtual void AddSamples(char *buffers[], int samples, long long timecode);
+   virtual void SetEffDsp(int dsprate);
+   virtual void SetTimecode(long long timecode);
+   
+   virtual bool GetPause(void);
+   virtual void Pause(bool paused);
+   
+   virtual int GetAudiotime(void);
+
+   void SetDualAudioMode(DualAudioMode mode) { this->mode=mode; }
+   DualAudioMode GetDualAudioMode() { return this->mode; } 
+   
+ private:
+   AudioOutput* real;
+   DualAudioMode mode;
+   int channels;
+   int bits;
+};
+
+#endif
Index: mythtv/libs/libmythtv/libmythtv.pro
diff -u mythtv/libs/libmythtv/libmythtv.pro:1.1.1.1 mythtv/libs/libmythtv/libmythtv.pro:1.2
--- mythtv/libs/libmythtv/libmythtv.pro:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libmythtv/libmythtv.pro	Sun Mar 21 11:46:49 2004
@@ -47,6 +47,7 @@
 HEADERS += recorderbase.h channelbase.h vsync.h proglist.h hdtvrecorder.h 
 HEADERS += fifowriter.h filtermanager.h videooutbase.h videoout_null.h xbox.h
 HEADERS += dbcheck.h udpnotify.h channeleditor.h channelsettings.h
+HEADERS += dualaudiooutput.h
 
 SOURCES += commercial_skip.cpp frequencies.c guidegrid.cpp infodialog.cpp 
 SOURCES += infostructs.cpp jitterometer.cpp minilzo.cpp NuppelVideoPlayer.cpp 
@@ -57,6 +58,7 @@
 SOURCES += recorderbase.cpp filtermanager.cpp proglist.cpp videooutbase.cpp 
 SOURCES += videoout_null.cpp xbox.cpp dbcheck.cpp profilegroup.cpp
 SOURCES += udpnotify.cpp channeleditor.cpp channelsettings.cpp
+SOURCES += dualaudiooutput.cpp
 
 !win32 {
     HEADERS += channel.h
Index: mythtv/libs/libmythtv/tv_play.cpp
diff -u mythtv/libs/libmythtv/tv_play.cpp:1.1.1.1 mythtv/libs/libmythtv/tv_play.cpp:1.2
--- mythtv/libs/libmythtv/tv_play.cpp:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libmythtv/tv_play.cpp	Sun Mar 21 11:46:49 2004
@@ -24,6 +24,7 @@
 #include "NuppelVideoPlayer.h"
 #include "programinfo.h"
 #include "udpnotify.h"
+#include "dualaudiooutput.h"
 
 struct SeekSpeedInfo {
     QString   dispString;
@@ -119,6 +120,7 @@
     REG_KEY("TV Playback", "TOGGLERECCONTROLS", "Turn on the recording picture "
             "adjustment controls", "G");
     REG_KEY("TV Playback", "TOGGLEEDIT", "Start Edit Mode", "E");
+    REG_KEY("TV Playback", "STEREOMODE", "Toggle stereo mode (mono/stereo/lang1/lang2)", "S");
 
 
 
@@ -1198,6 +1200,8 @@
             ChangeSpeed(1);
         else if (action == "SPEEDDEC")
             ChangeSpeed(-1);
+		else if (action == "STEREOMODE")
+  		    ToggleDualAudioMode();
         else if (action == "TOGGLEPICCONTROLS")
         {
             if (usePicControls)
@@ -2624,6 +2628,48 @@
     }
 }
 
+void TV::ToggleDualAudioMode(void)
+{
+   QString text;
+   DualAudioMode mode = activenvp->GetDualAudioMode();
+   switch(mode)
+	  {
+	  case DUAL_AUDIO_STEREO:
+		 mode=DUAL_AUDIO_LEFT;
+		 break;
+	  case DUAL_AUDIO_LEFT:
+		 mode=DUAL_AUDIO_RIGHT;
+		 break;
+
+	  case DUAL_AUDIO_RIGHT:
+		 mode=DUAL_AUDIO_STEREO;
+		 break;
+	  }
+   activenvp->SetDualAudioMode(mode);
+
+   // display the *real* audio mode
+   if(osd && !browsemode)
+	  {
+		 mode = activenvp->GetDualAudioMode();
+		 
+		 switch(mode)
+			{
+			case DUAL_AUDIO_STEREO:
+			   text=tr("Stereo");
+			   break;
+			   
+			case DUAL_AUDIO_RIGHT:
+			   text=tr("Right (lang2)");
+			   break;
+			   
+			case DUAL_AUDIO_LEFT:
+			   text=tr("Left (lang1)");
+			   break;
+			}
+		 osd->SetSettingsText(text, 3);
+	  }
+}
+
 void TV::ToggleMute(void)
 {
     if (!volumeControl)
Index: mythtv/libs/libmythtv/tv_play.h
diff -u mythtv/libs/libmythtv/tv_play.h:1.1.1.1 mythtv/libs/libmythtv/tv_play.h:1.2
--- mythtv/libs/libmythtv/tv_play.h:1.1.1.1	Sun Mar  7 16:52:05 2004
+++ mythtv/libs/libmythtv/tv_play.h	Sun Mar 21 11:46:49 2004
@@ -115,6 +115,7 @@
 
     void ChangeVolume(bool up);
     void ToggleMute(void);
+	void ToggleDualAudioMode(void);
     void ToggleLetterbox(void);
     void ChangeContrast(bool up, bool recorder);
     void ChangeBrightness(bool up, bool recorder);

    Source: geocities.com/szermatt