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