diff -urN vdr-1.3.15-orig/device.c vdr-1.3.15-patched/device.c
--- vdr-1.3.15-orig/device.c	2004-10-30 16:53:38.000000000 +0200
+++ vdr-1.3.15-patched/device.c	2004-11-15 22:01:14.000000000 +0100
@@ -31,6 +31,7 @@
 int cDevice::currentChannel = 1;
 cDevice *cDevice::device[MAXDEVICES] = { NULL };
 cDevice *cDevice::primaryDevice = NULL;
+audio_channel_select_t cDevice::currentAudioChannel = AUDIO_STEREO;
 
 cDevice::cDevice(void)
 {
@@ -482,6 +483,11 @@
 {
 }
 
+audio_channel_select_t cDevice::ShiftAudioChannelDevice()
+{
+  return AUDIO_STEREO;
+}
+
 int cDevice::NumAudioTracksDevice(void) const
 {
   return 0;
@@ -524,6 +530,11 @@
      }
 }
 
+void cDevice::ShiftAudioChannel()
+{
+  currentAudioChannel = ShiftAudioChannelDevice();
+}
+
 int cDevice::NumAudioTracks(void) const
 {
   return player ? player->NumAudioTracks() : NumAudioTracksDevice();
diff -urN vdr-1.3.15-orig/device.h vdr-1.3.15-patched/device.h
--- vdr-1.3.15-orig/device.h	2004-10-30 16:49:56.000000000 +0200
+++ vdr-1.3.15-patched/device.h	2004-11-15 22:00:23.000000000 +0100
@@ -10,6 +10,7 @@
 #ifndef __DEVICE_H
 #define __DEVICE_H
 
+#include <linux/dvb/audio.h>
 #include "ci.h"
 #include "eit.h"
 #include "filter.h"
@@ -69,6 +70,8 @@
   static int useDevice;
   static cDevice *device[MAXDEVICES];
   static cDevice *primaryDevice;
+  static audio_channel_select_t currentAudioChannel;
+
 public:
   static int NumDevices(void) { return numDevices; }
          ///< Returns the total number of devices.
@@ -288,9 +291,14 @@
 private:
   bool mute;
   int volume;
+
 protected:
   virtual void SetVolumeDevice(int Volume);
        ///< Sets the audio volume on this device (Volume = 0...255).
+  virtual audio_channel_select_t ShiftAudioChannelDevice();
+       ///< Switches the audio channel cyclic between 
+       ///<      STEREO --> MONO_LEFT --> MONO_RIGHT --> STEREO --> ...
+       ///< Returns the selected audio channel mode.
   virtual int NumAudioTracksDevice(void) const;
        ///< Returns the number of audio tracks that are currently available on this
        ///< device. The default return value is 0, meaning that this device
@@ -335,6 +343,11 @@
        ///< Sets the current audio track to the given value, which should be within the
        ///< range of the list returned by a previous call to GetAudioTracks() (otherwise
        ///< nothing will happen).
+  void ShiftAudioChannel();
+       ///< Switches the audio channel cyclic between 
+       ///<      STEREO --> MONO_LEFT --> MONO_RIGHT --> STEREO --> ...
+  static audio_channel_select_t CurrentAudioChannel(void) { return currentAudioChannel; }
+       ///< Returns the selected audio channel mode.
 
 // Player facilities
 
diff -urN vdr-1.3.15-orig/dvbdevice.c vdr-1.3.15-patched/dvbdevice.c
--- vdr-1.3.15-orig/dvbdevice.c	2004-11-10 23:11:03.000000000 +0100
+++ vdr-1.3.15-patched/dvbdevice.c	2004-11-15 22:03:34.000000000 +0100
@@ -809,6 +809,7 @@
                                                    // to avoid missing audio after replaying a DVD; with 'false' there is an audio disturbance when switching
                                                    // between two channels on the same transponder on DVB-S
      CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
+     CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AUDIO_STEREO));
      }
   else if (StartTransferMode)
      cControl::Launch(new cTransferControl(this, Channel->Vpid(), Channel->Apid1(), Channel->Apid2(), Channel->Dpid1(), Channel->Dpid2()));
@@ -831,6 +832,24 @@
      }
 }
 
+audio_channel_select_t cDvbDevice::ShiftAudioChannelDevice()
+{
+  audio_channel_select_t aChan;
+  audio_status_t aState;
+  if (HasDecoder()) {
+     CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &aState));
+     aChan = aState.channel_select;
+     if (aChan == AUDIO_STEREO) aChan = AUDIO_MONO_LEFT;
+     else { 
+       if (aChan == AUDIO_MONO_LEFT) aChan = AUDIO_MONO_RIGHT;
+       else aChan = AUDIO_STEREO;
+       }
+     CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, aChan));
+     CHECK(ioctl(fd_audio, AUDIO_GET_STATUS, &aState));
+     }
+  return aState.channel_select; 
+}
+
 int cDvbDevice::NumAudioTracksDevice(void) const
 {
   int n = 0;
@@ -894,6 +913,7 @@
          CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_DEMUX));
          CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_DEMUX));
          CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, true));
+         CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AUDIO_STEREO));
          CHECK(ioctl(fd_audio, AUDIO_SET_MUTE, false));
          break;
     case pmAudioVideo:
@@ -904,6 +924,7 @@
          CHECK(ioctl(fd_video, VIDEO_SET_BLANK, true));
          CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
          CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, PlayMode == pmAudioVideo));
+         CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AUDIO_STEREO));
          CHECK(ioctl(fd_audio, AUDIO_PLAY));
          CHECK(ioctl(fd_video, VIDEO_SELECT_SOURCE, VIDEO_SOURCE_MEMORY));
          CHECK(ioctl(fd_video, VIDEO_PLAY));
@@ -914,6 +935,7 @@
          CHECK(ioctl(fd_audio, AUDIO_CLEAR_BUFFER));
          CHECK(ioctl(fd_audio, AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY));
          CHECK(ioctl(fd_audio, AUDIO_SET_AV_SYNC, false));
+         CHECK(ioctl(fd_audio, AUDIO_CHANNEL_SELECT, AUDIO_STEREO));
          CHECK(ioctl(fd_audio, AUDIO_PLAY));
          CHECK(ioctl(fd_video, VIDEO_SET_BLANK, false));
          break;
diff -urN vdr-1.3.15-orig/dvbdevice.h vdr-1.3.15-patched/dvbdevice.h
--- vdr-1.3.15-orig/dvbdevice.h	2004-10-30 16:48:27.000000000 +0200
+++ vdr-1.3.15-patched/dvbdevice.h	2004-11-15 22:04:26.000000000 +0100
@@ -10,6 +10,7 @@
 #ifndef __DVBDEVICE_H
 #define __DVBDEVICE_H
 
+#include <linux/dvb/audio.h>
 #include <linux/dvb/frontend.h>
 #include <linux/dvb/version.h>
 #include "device.h"
@@ -96,6 +97,7 @@
   int aPid1, aPid2;
 protected:
   virtual void SetVolumeDevice(int Volume);
+  virtual audio_channel_select_t ShiftAudioChannelDevice();
   virtual int NumAudioTracksDevice(void) const;
   virtual const char **GetAudioTracksDevice(int *CurrentTrack = NULL) const;
   virtual void SetAudioTrackDevice(int Index);
diff -urN vdr-1.3.15-orig/keys.c vdr-1.3.15-patched/keys.c
--- vdr-1.3.15-orig/keys.c	2003-09-14 12:07:47.000000000 +0200
+++ vdr-1.3.15-patched/keys.c	2004-11-15 17:14:31.000000000 +0100
@@ -59,6 +59,7 @@
                     { kUser7,         "User7"      },
                     { kUser8,         "User8"      },
                     { kUser9,         "User9"      },
+		    { kAudioChan,     "AudioChannel"},
                     { kNone,          ""           },
                     { k_Setup,        "_Setup"     },
                     { kNone,          NULL         },
diff -urN vdr-1.3.15-orig/keys.h vdr-1.3.15-patched/keys.h
--- vdr-1.3.15-orig/keys.h	2002-12-14 16:49:42.000000000 +0100
+++ vdr-1.3.15-patched/keys.h	2004-11-15 17:13:12.000000000 +0100
@@ -45,6 +45,7 @@
              kSetup,
              kCommands,
              kUser1, kUser2, kUser3, kUser4, kUser5, kUser6, kUser7, kUser8, kUser9,
+             kAudioChan,
              kNone,
              kKbd,
              // The following codes are used internally:
diff -urN vdr-1.3.15-orig/menu.c vdr-1.3.15-patched/menu.c
--- vdr-1.3.15-orig/menu.c	2004-11-01 14:49:40.000000000 +0100
+++ vdr-1.3.15-patched/menu.c	2004-11-15 22:07:31.000000000 +0100
@@ -2771,6 +2771,52 @@
   return time_ms() < timeout ? osContinue : osEnd;
 }
 
+// --- cDisplayAChannel --------------------------------------------------------
+
+#define CHANNELTIMEOUT 2000 //ms
+
+cDisplayAChannel *cDisplayAChannel::currentDisplayAChannel = NULL;
+
+cDisplayAChannel::cDisplayAChannel(void)
+:cOsdObject(true)
+{
+  currentDisplayAChannel = this;
+  timeout = time_ms() + CHANNELTIMEOUT;
+  displayAChannel = Skins.Current()->DisplayAChannel();
+  Show();
+}
+
+cDisplayAChannel::~cDisplayAChannel()
+{
+  delete displayAChannel;
+  currentDisplayAChannel = NULL;
+}
+
+void cDisplayAChannel::Show(void)
+{ 
+  displayAChannel->SetAChannel(cDevice::CurrentAudioChannel());
+}
+
+cDisplayAChannel *cDisplayAChannel::Create(void)
+{
+  if (!currentDisplayAChannel)
+     new cDisplayAChannel;
+  return currentDisplayAChannel;
+}
+
+void cDisplayAChannel::Process(eKeys Key)
+{
+  if (currentDisplayAChannel)
+     currentDisplayAChannel->ProcessKey(Key);
+}
+
+eOSState cDisplayAChannel::ProcessKey(eKeys Key)
+{
+  Show();
+  return time_ms() < timeout ? osContinue : osEnd;
+}
+
+
 // --- cRecordControl --------------------------------------------------------
 
 cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
diff -urN vdr-1.3.15-orig/menu.h vdr-1.3.15-patched/menu.h
--- vdr-1.3.15-orig/menu.h	2004-06-13 13:46:03.000000000 +0200
+++ vdr-1.3.15-patched/menu.h	2004-11-14 23:07:49.000000000 +0100
@@ -75,6 +75,20 @@
   eOSState ProcessKey(eKeys Key);
   };
 
+class cDisplayAChannel : public cOsdObject {
+private:
+  cSkinDisplayAChannel *displayAChannel;
+  int timeout;
+  static cDisplayAChannel *currentDisplayAChannel;
+  virtual void Show(void);
+  cDisplayAChannel(void);
+public:
+  virtual ~cDisplayAChannel();
+  static cDisplayAChannel *Create(void);
+  static void Process(eKeys Key);
+  eOSState ProcessKey(eKeys Key);
+  };
+
 class cMenuCam : public cOsdMenu {
 private:
   cCiMenu *ciMenu;
diff -urN vdr-1.3.15-orig/skinclassic.c vdr-1.3.15-patched/skinclassic.c
--- vdr-1.3.15-orig/skinclassic.c	2004-05-29 16:04:50.000000000 +0200
+++ vdr-1.3.15-patched/skinclassic.c	2004-11-14 23:27:06.000000000 +0100
@@ -502,6 +502,53 @@
   osd->Flush();
 }
 
+// --- cSkinClassicDisplayAChannel ---------------------------------------------
+
+class cSkinClassicDisplayAChannel : public cSkinDisplayAChannel {
+private:
+  cOsd *osd;
+public:
+  cSkinClassicDisplayAChannel(void);
+  virtual ~cSkinClassicDisplayAChannel();
+  virtual void SetAChannel(audio_channel_select_t mode);
+  virtual void Flush(void);
+  };
+
+cSkinClassicDisplayAChannel::cSkinClassicDisplayAChannel(void)
+{
+  const cFont *font = cFont::GetFont(fontOsd);
+  int lineHeight = font->Height();
+  osd = cOsdProvider::NewOsd(Setup.OSDLeft, Setup.OSDTop + Setup.OSDHeight - lineHeight);
+  tArea Areas[] = { { 0, 0, Setup.OSDWidth - 1, lineHeight - 1, 4 } };
+  osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
+}
+
+cSkinClassicDisplayAChannel::~cSkinClassicDisplayAChannel()
+{
+  delete osd;
+}
+
+void cSkinClassicDisplayAChannel::SetAChannel(audio_channel_select_t mode)
+{
+  const cFont *font = cFont::GetFont(fontOsd);
+  osd->DrawRectangle(0, 0, osd->Width() - 1, osd->Height() - 1, clrTransparent);
+  switch (mode) {
+    case AUDIO_STEREO:
+      osd->DrawText(0, 0, tr("Stereo"), Theme.Color(clrVolumePrompt), Theme.Color(clrBackground), font);
+      break;
+    case AUDIO_MONO_LEFT:
+      osd->DrawText(0, 0, tr("Mono-Left"), Theme.Color(clrVolumePrompt), Theme.Color(clrBackground), font);
+      break;
+    case AUDIO_MONO_RIGHT:
+      osd->DrawText(0, 0, tr("Mono-Right"), Theme.Color(clrVolumePrompt), Theme.Color(clrBackground), font);
+     }
+}
+
+void cSkinClassicDisplayAChannel::Flush(void)
+{
+  osd->Flush();
+}
+
 // --- cSkinClassicDisplayMessage --------------------------------------------
 
 class cSkinClassicDisplayMessage : public cSkinDisplayMessage {
@@ -571,6 +618,11 @@
   return new cSkinClassicDisplayVolume;
 }
 
+cSkinDisplayAChannel *cSkinClassic::DisplayAChannel(void)
+{
+  return new cSkinClassicDisplayAChannel;
+}
+
 cSkinDisplayMessage *cSkinClassic::DisplayMessage(void)
 {
   return new cSkinClassicDisplayMessage;
diff -urN vdr-1.3.15-orig/skinclassic.h vdr-1.3.15-patched/skinclassic.h
--- vdr-1.3.15-orig/skinclassic.h	2004-04-18 11:38:02.000000000 +0200
+++ vdr-1.3.15-patched/skinclassic.h	2004-11-14 18:35:51.000000000 +0100
@@ -20,6 +20,7 @@
   virtual cSkinDisplayMenu *DisplayMenu(void);
   virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
   virtual cSkinDisplayVolume *DisplayVolume(void);
+  virtual cSkinDisplayAChannel *DisplayAChannel(void);
   virtual cSkinDisplayMessage *DisplayMessage(void);
   };
 
diff -urN vdr-1.3.15-orig/skins.h vdr-1.3.15-patched/skins.h
--- vdr-1.3.15-orig/skins.h	2004-05-29 15:13:21.000000000 +0200
+++ vdr-1.3.15-patched/skins.h	2004-11-15 22:11:37.000000000 +0100
@@ -10,6 +10,7 @@
 #ifndef __SKINS_H
 #define __SKINS_H
 
+#include <linux/dvb/audio.h>
 #include "channels.h"
 #include "epg.h"
 #include "keys.h"
@@ -223,6 +224,13 @@
        ///< indicator shall be displayed.
   };
 
+class cSkinDisplayAChannel : public cSkinDisplay {
+       ///< This class implements the stereo/mono display.
+public:
+  virtual void SetAChannel(audio_channel_select_t mode) = 0;
+       ///< Sets the audio channel to the selected mode
+  };
+
 class cSkinDisplayMessage : public cSkinDisplay {
        ///< This class implements a simple message display.
 public:
@@ -275,6 +283,9 @@
   virtual cSkinDisplayVolume *DisplayVolume(void) = 0;
        ///< Creates and returns a new object for displaying the current volume.
        ///< The caller must delete the object after use.
+  virtual cSkinDisplayAChannel *DisplayAChannel(void) = 0;
+       ///< Creates and returns a new object for displaying the current volume.
+       ///< The caller must delete the object after use.
   virtual cSkinDisplayMessage *DisplayMessage(void) = 0;
        ///< Creates and returns a new object for displaying a message.
        ///< The caller must delete the object after use.
diff -urN vdr-1.3.15-orig/skinsttng.c vdr-1.3.15-patched/skinsttng.c
--- vdr-1.3.15-orig/skinsttng.c	2004-07-18 13:32:42.000000000 +0200
+++ vdr-1.3.15-patched/skinsttng.c	2004-11-15 00:35:11.000000000 +0100
@@ -45,6 +45,9 @@
 #include "symbols/srew3.xpm"
 #include "symbols/teletext.xpm"
 #include "symbols/volume.xpm"
+#include "symbols/stereo.xpm"
+#include "symbols/monol.xpm"
+#include "symbols/monor.xpm"
 
 #define Roundness   10
 #define Gap          5
@@ -822,6 +825,87 @@
   osd->Flush();
 }
 
+// --- cSkinSTTNGDisplayAChannel -----------------------------------------------
+
+class cSkinSTTNGDisplayAChannel : public cSkinDisplayAChannel {
+private:
+  cOsd *osd;
+  int x0, x1, x2, x3, x4, x5, x6, x7;
+  int y0, y1;
+  tColor frameColor;
+  int mute;
+public:
+  cSkinSTTNGDisplayAChannel(void);
+  virtual ~cSkinSTTNGDisplayAChannel();
+  virtual void SetAChannel(audio_channel_select_t mode);
+  virtual void Flush(void);
+  };
+
+cSkinSTTNGDisplayAChannel::cSkinSTTNGDisplayAChannel(void)
+{
+  const cFont *font = cFont::GetFont(fontOsd);
+  int lineHeight = font->Height();
+  frameColor = Theme.Color(clrVolumeFrame);
+  mute = -1;
+  x0 = 0;
+  x1 = lineHeight / 2;
+  x2 = lineHeight;
+  x3 = x2 + Gap;
+  x7 = Setup.OSDWidth;
+  x6 = x7 - lineHeight / 2;
+  x5 = x6 - lineHeight / 2;
+  x4 = x5 - Gap;
+  y0 = 0;
+  y1 = lineHeight;
+  osd = cOsdProvider::NewOsd(Setup.OSDLeft, Setup.OSDTop + Setup.OSDHeight - y1);
+  tArea Areas[] = { { x0, y0, x7 - 1, y1 - 1, 4 } };
+  osd->SetAreas(Areas, sizeof(Areas) / sizeof(tArea));
+  osd->DrawRectangle(x0, y0, x7 - 1, y1 - 1, clrTransparent);
+  osd->DrawEllipse  (x0, y0, x1 - 1, y1 - 1, frameColor, 7);
+  osd->DrawRectangle(x1, y0, x2 - 1, y1 - 1, frameColor);
+  osd->DrawRectangle(x3, y0, x4 - 1, y1 - 1, frameColor);
+  osd->DrawRectangle(x5, y0, x6 - 1, y1 - 1, frameColor);
+  osd->DrawEllipse  (x6, y0, x7 - 1, y1 - 1, frameColor, 5);
+}
+
+cSkinSTTNGDisplayAChannel::~cSkinSTTNGDisplayAChannel()
+{
+  delete osd;
+}
+
+void cSkinSTTNGDisplayAChannel::SetAChannel(audio_channel_select_t mode)
+{
+  int Current=0;
+  int Total=0;
+  bool Mute=true;
+  int xl = x3 + 5;
+  int xr = x4 - 5;
+  int yt = y0 + 3;
+  int yb = y1 - 3;
+  osd->DrawRectangle(x3, y0, x4 - 1, y1 - 1, frameColor);
+  cBitmap bm( (mode == AUDIO_STEREO) ? stereo_xpm : ((mode == AUDIO_MONO_LEFT) ? monol_xpm : monor_xpm));
+  osd->DrawBitmap(xl, y0 + (y1 - y0 - bm.Height()) / 2, bm, Theme.Color(clrVolumeSymbol), frameColor);
+  if (!Mute) {
+     xl += bm.Width() + 5;
+     int w = (y1 - y0) / 3;
+     int d = 3;
+     int n = (xr - xl + d) / (w + d);
+     int x = xr - n * (w + d);
+     tColor Color = Theme.Color(clrVolumeBarLower);
+     for (int i = 0; i < n; i++) {
+         if (Total * i >= Current * n)
+            Color = Theme.Color(clrVolumeBarUpper);
+         osd->DrawRectangle(x, yt, x + w - 1, yb - 1, Color);
+         x += w + d;
+         }
+     }
+}
+
+void cSkinSTTNGDisplayAChannel::Flush(void)
+{
+  osd->Flush();
+}
+
 // --- cSkinSTTNGDisplayMessage ----------------------------------------------
 
 class cSkinSTTNGDisplayMessage : public cSkinDisplayMessage {
@@ -909,6 +993,11 @@
   return new cSkinSTTNGDisplayVolume;
 }
 
+cSkinDisplayAChannel *cSkinSTTNG::DisplayAChannel(void)
+{
+  return new cSkinSTTNGDisplayAChannel;
+}
+
 cSkinDisplayMessage *cSkinSTTNG::DisplayMessage(void)
 {
   return new cSkinSTTNGDisplayMessage;
diff -urN vdr-1.3.15-orig/skinsttng.h vdr-1.3.15-patched/skinsttng.h
--- vdr-1.3.15-orig/skinsttng.h	2004-04-18 11:38:47.000000000 +0200
+++ vdr-1.3.15-patched/skinsttng.h	2004-11-13 13:23:32.000000000 +0100
@@ -20,6 +20,7 @@
   virtual cSkinDisplayMenu *DisplayMenu(void);
   virtual cSkinDisplayReplay *DisplayReplay(bool ModeOnly);
   virtual cSkinDisplayVolume *DisplayVolume(void);
+  virtual cSkinDisplayAChannel *DisplayAChannel(void);
   virtual cSkinDisplayMessage *DisplayMessage(void);
   };
 
diff -urN vdr-1.3.15-orig/symbols/monol.xpm vdr-1.3.15-patched/symbols/monol.xpm
--- vdr-1.3.15-orig/symbols/monol.xpm	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.3.15-patched/symbols/monol.xpm	2004-11-15 00:34:45.000000000 +0100
@@ -0,0 +1,25 @@
+/* XPM */
+static char * monol_xpm[] = {
+"27 20 2 1",
+".	c #FFFFFF",
+"+	c #000000",
+".......................++..",
+".....................++++..",
+"....................++.++..",
+".................+++...++..",
+"...............+++.....++..",
+".++..........++++......++..",
+".++.....++++++++.......++..",
+".++.....+++++++........++..",
+".++.....++...++........++..",
+".++.....++...++........++..",
+".++.....++...++........++..",
+".++.....++...++........++..",
+".++.....+++++++........++..",
+".++.....++++++++.......++..",
+".++..........++++......++..",
+".++............+++.....++..",
+".++..............+++...++..",
+".++++++++++.........++.++..",
+".++++++++++..........++++..",
+".......................++.."};
diff -urN vdr-1.3.15-orig/symbols/monor.xpm vdr-1.3.15-patched/symbols/monor.xpm
--- vdr-1.3.15-orig/symbols/monor.xpm	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.3.15-patched/symbols/monor.xpm	2004-11-13 13:06:45.000000000 +0100
@@ -0,0 +1,25 @@
+/* XPM */
+static char * monor_xpm[] = {
+"33 20 2 1",
+".	c #FFFFFF",
+"+	c #000000",
+".................++..............",
+"...............++++..............",
+"..............++.++..............",
+"...........+++...++..............",
+".........+++.....++..............",
+".......++++......++...+++++......",
+"..++++++++.......++...+++++++....",
+"..+++++++........++...++....+++..",
+"..++...++........++...++......+++",
+"..++...++........++...++.......++",
+"..++...++........++...++......+++",
+"..++...++........++...++....+++..",
+"..+++++++........++...+++++++....",
+"..++++++++.......++...++++++.....",
+".......++++......++...++.++++....",
+".........+++.....++...++...+++...",
+"...........+++...++...++....+++..",
+"..............++.++...++.....+++.",
+"...............++++...++......+++",
+".................++.............."};
diff -urN vdr-1.3.15-orig/symbols/stereo.xpm vdr-1.3.15-patched/symbols/stereo.xpm
--- vdr-1.3.15-orig/symbols/stereo.xpm	1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.3.15-patched/symbols/stereo.xpm	2004-11-15 00:34:33.000000000 +0100
@@ -0,0 +1,25 @@
+/* XPM */
+static char * stereo_xpm[] = {
+"39 20 2 1",
+".	c #FFFFFF",
+"+	c #000000",
+".......................++..............",
+".....................++++..............",
+"....................++.++..............",
+".................+++...++..............",
+"...............+++.....++..............",
+".++..........++++......++...+++++......",
+".++.....++++++++.......++...+++++++....",
+".++.....+++++++........++...++....+++..",
+".++.....++...++........++...++......+++",
+".++.....++...++........++...++.......++",
+".++.....++...++........++...++......+++",
+".++.....++...++........++...++....+++..",
+".++.....+++++++........++...+++++++....",
+".++.....++++++++.......++...++++++.....",
+".++..........++++......++...++.++++....",
+".++............+++.....++...++...+++...",
+".++..............+++...++...++....+++..",
+".++++++++++.........++.++...++.....+++.",
+".++++++++++..........++++...++......+++",
+".......................++.............."};
diff -urN vdr-1.3.15-orig/vdr.c vdr-1.3.15-patched/vdr.c
--- vdr-1.3.15-orig/vdr.c	2004-10-31 11:17:23.000000000 +0100
+++ vdr-1.3.15-patched/vdr.c	2004-11-15 22:12:48.000000000 +0100
@@ -683,6 +683,14 @@
                cDisplayVolume::Process(key);
                key = kNone; // nobody else needs to see these keys
                break;
+          // audio channel setting
+          case kAudioChan:
+               cDevice::PrimaryDevice()->ShiftAudioChannel();
+               if (!Menu && !cOsd::IsOpen())
+                  Menu = Temp = cDisplayAChannel::Create();
+               cDisplayAChannel::Process(key);
+               key = kNone; // nobody else needs to see these keys
+               break;
           // Pausing live video:
           case kPause:
                if (!cControl::Control()) {
