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);