Mailing List archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[vdr] VDR (1.2.6) PATCH: dvbplayer.c



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

...

ok .. this is a bugfix version of my previous one

new behavior:
	- the dolby track is now taken and choosen as an 
	  own one - e.g.
		0 - ac3
		1 - mp2
		2 - mp2

	- needed to play a single track properly with
	  any audio plugin - e.g. bitstreamout ;-)

@Klaus:

this is good for the new bitstreamout 0.48pre3,
or any other audio plugin ..

please have a lock into it !

i hope this patch _now_ can make it to 1.2.6 ..

cheers, sven
- -- 
health & wealth
mailto:sgoethel@jausoft.com
www   : http://www.jausoft.com ; pgp: http://www.jausoft.com/gpg/
voice : +49-5121-999600 ; fax : +49-5121-999602
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3 (GNU/Linux)

iD8DBQE/ldH6HdOA30NoFAARAiVoAJ9aMXF1kHgMyq6F0QCU91n7GAtsXACfetlV
P8DwOU9F15oQKaqOoQiwOIM=
=XnhF
-----END PGP SIGNATURE-----
--- ../vdr-1.2.6pre2/dvbplayer.c	2003-05-24 11:04:26.000000000 +0200
+++ dvbplayer.c	2003-10-22 01:41:05.000000000 +0200
@@ -198,6 +198,7 @@
   int trickSpeed;
   int readIndex, writeIndex;
   bool canToggleAudioTrack;
+  bool seenDolbyAudioTrack;
   uchar audioTrack;
   cFrame *readFrame;
   cFrame *playFrame;
@@ -248,6 +249,7 @@
   playDir = pdForward;
   trickSpeed = NORMAL_SPEED;
   canToggleAudioTrack = false;
+  seenDolbyAudioTrack = false;
   audioTrack = 0xC0;
   readIndex = writeIndex = -1;
   readFrame = NULL;
@@ -312,6 +314,7 @@
   backTrace->Clear();
   DeviceClear();
   firstPacket = true;
+  seenDolbyAudioTrack=false;
 }
 
 void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
@@ -322,15 +325,20 @@
             uchar c = b[i + 3];
             int l = b[i + 4] * 256 + b[i + 5] + 6;
             switch (c) {
-              case 0xBD: // dolby
-                   if (Except)
-                      PlayAudio(&b[i], l);
-                   // continue with deleting the data - otherwise it disturbs DVB replay
+              case 0xBD: // dolby 
+  		   seenDolbyAudioTrack=true;
+		   if (Except && c==Except) 
+		      PlayAudio(&b[i], l);
+                   // deleting the data - otherwise it disturbs DVB replay
+                   memset(&b[i], 0x00, min(l, Length-i));
+		   break;
               case 0xC0 ... 0xC1: // audio
                    if (c == 0xC1)
                       canToggleAudioTrack = true;
-                   if (!Except || c != Except)
+                   if (!Except || c != Except) 
                       memset(&b[i], 0x00, min(l, Length-i));
+                   else if (Except && c==Except) 
+                      PlayAudio(&b[i], l);
                    break;
               case 0xE0 ... 0xEF: // video
                    break;
@@ -761,27 +769,56 @@
 
 int cDvbPlayer::NumAudioTracks(void) const
 {
-  return canToggleAudioTrack ? 2 : 1;
+  int num = canToggleAudioTrack ? 2 : 1;
+  if( seenDolbyAudioTrack ) num++;
+  return num;
 }
 
 const char **cDvbPlayer::GetAudioTracks(int *CurrentTrack) const
 {
   if (NumAudioTracks()) {
-     if (CurrentTrack)
-        *CurrentTrack = (audioTrack == 0xC0) ? 0 : 1;
+     if (CurrentTrack) {
+	switch (audioTrack) {
+		case 0xBD:
+			*CurrentTrack = -1;
+			break;
+		case 0xC0:
+			*CurrentTrack = 0;
+			break;
+		default:
+			*CurrentTrack = 1;
+			break;
+	}
+	if ( seenDolbyAudioTrack )
+			*CurrentTrack += 1;
+     }
      static const char *audioTracks1[] = { "Audio 1", NULL };
      static const char *audioTracks2[] = { "Audio 1", "Audio 2", NULL };
-     return NumAudioTracks() > 1 ? audioTracks2 : audioTracks1;
+     static const char *audioTracks3[] = { "Audio 1", "Audio 2", "Audio 3", NULL };
+     switch ( NumAudioTracks() ) {
+	case 1: return audioTracks1;
+	case 2: return audioTracks2;
+	default: return audioTracks3;
      }
+  }
   return NULL;
 }
 
 void cDvbPlayer::SetAudioTrack(int Index)
 {
-  if ((audioTrack == 0xC0) != (Index == 0)) {
-     audioTrack = (Index == 1) ? 0xC1 : 0xC0;
-     Empty();
-     }
+  if ( NumAudioTracks() <= 1 ||
+       Index>=NumAudioTracks() )
+	return;
+
+  if ( seenDolbyAudioTrack )
+		Index -= 1;
+
+  switch ( Index ) {
+	case -1: audioTrack=0xBD; break;
+	case  0: audioTrack=0xC0; break;
+	default: audioTrack=0xC1; break;
+  }
+  Empty();
 }
 
 // --- cDvbPlayerControl -----------------------------------------------------

Home | Main Index | Thread Index