1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Support for two audio channels

This commit is contained in:
Klaus Schmidinger 2001-06-03 13:07:20 +02:00
parent b41adae497
commit a9b2afd28b
11 changed files with 149 additions and 46 deletions

View File

@ -25,7 +25,7 @@ Video Disk Recorder File Formats
- Diseqc number ** - Diseqc number **
- Symbol rate - Symbol rate
- Video PID - Video PID
- Audio PID - Audio PID (either one number, or two, separated by a comma)
- Teletext PID - Teletext PID
- Conditional Access (0 = Free To Air, 1 = can be decrypted by the first - Conditional Access (0 = Free To Air, 1 = can be decrypted by the first
DVB card, 2 = can be decrypted by the second DVB card) DVB card, 2 = can be decrypted by the second DVB card)

11
HISTORY
View File

@ -490,3 +490,14 @@ Video Disk Recorder Revision History
a new recording with higher priority needs disk space. a new recording with higher priority needs disk space.
- Updated version of Matthias Schniedermeyer's 'schnitt' tools. - Updated version of Matthias Schniedermeyer's 'schnitt' tools.
- New 'master-timer' tool (thanks to Matthias Schniedermeyer). - New 'master-timer' tool (thanks to Matthias Schniedermeyer).
2001-06-03: Version 0.81
- Fixed handling the case where the driver reports EAGAIN during recording,
but no data comes within 5 seconds.
- Fixed EPG scanning on single DVB card systems.
- There can now be two audio PIDs per channel, which can be toggled via the
"Green" button in the "Main" menu. The "Edit Channel" menu therefore now
has two audio PID fields (Apid1 and Apid2). By default, Apid2 is 0, which
means there is no alternate audio track.

13
MANUAL
View File

@ -18,7 +18,7 @@ Video Disk Recorder User's Manual
Menu Menu on Menu off Menu off Menu off Menu off Menu off Menu on Menu Menu on Menu off Menu off Menu off Menu off Menu off Menu on
Back - Menu off Main menu Main menu Discard Main menu Recordings menu Back - Menu off Main menu Main menu Discard Main menu Recordings menu
Red - Record Edit Edit - Play - Red - Record Edit Edit - Play -
Green - - New New - Rewind Skip -60s Green - Language New New - Rewind Skip -60s
Yellow - - Delete Delete - Delete Skip +60s Yellow - - Delete Delete - Delete Skip +60s
Blue - Resume Mark Mark - Summary Stop Blue - Resume Mark Mark - Summary Stop
0..9 Ch select - - - Numeric inp. - Editing 0..9 Ch select - - - Numeric inp. - Editing
@ -115,6 +115,14 @@ Video Disk Recorder User's Manual
To bring up the channel display without switching channels you can press To bring up the channel display without switching channels you can press
the "Ok" button. the "Ok" button.
* Selecting language specific audio track
If the current channel provides different audio tracks (typically for
different languages), the "Green" button in the "Main" menu can be pressed
to toggle between these. There can be two different audio PIDs per channel,
assuming that typically a channel broadcasts a country specific language
plus the movie's original soundtrack.
* Switching through channel groups * Switching through channel groups
If the 'channels.conf' file contains "group separators" you can switch If the 'channels.conf' file contains "group separators" you can switch
@ -257,6 +265,9 @@ Video Disk Recorder User's Manual
to free up space for a new recording. Note that setting this to free up space for a new recording. Note that setting this
parameter to very high values for all recordings may soon fill up parameter to very high values for all recordings may soon fill up
the entire disk and cause new recordings to fail due to low disk the entire disk and cause new recordings to fail due to low disk
space. The special value 99 means that this recording will live
"forever", and a value of 0 means that this recording can be
deleted any time if a recording with a higher priority needs disk
space. space.
File: The name under which a recording created through this timer will File: The name under which a recording created through this timer will
be stored on disk (the actual name will also contain the date and be stored on disk (the actual name will also contain the date and

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.c 1.45 2001/06/02 09:42:25 kls Exp $ * $Id: config.c 1.46 2001/06/02 13:57:25 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -200,7 +200,8 @@ cChannel::cChannel(const cChannel *Channel)
diseqc = Channel ? Channel->diseqc : 0; diseqc = Channel ? Channel->diseqc : 0;
srate = Channel ? Channel->srate : 27500; srate = Channel ? Channel->srate : 27500;
vpid = Channel ? Channel->vpid : 255; vpid = Channel ? Channel->vpid : 255;
apid = Channel ? Channel->apid : 256; apid1 = Channel ? Channel->apid1 : 256;
apid2 = Channel ? Channel->apid2 : 0;
tpid = Channel ? Channel->tpid : 32; tpid = Channel ? Channel->tpid : 32;
ca = Channel ? Channel->ca : 0; ca = Channel ? Channel->ca : 0;
pnr = Channel ? Channel->pnr : 0; pnr = Channel ? Channel->pnr : 0;
@ -218,8 +219,15 @@ const char *cChannel::ToText(cChannel *Channel)
delete buffer; delete buffer;
if (Channel->groupSep) if (Channel->groupSep)
asprintf(&buffer, ":%s\n", s); asprintf(&buffer, ":%s\n", s);
else else {
asprintf(&buffer, "%s:%d:%c:%d:%d:%d:%d:%d:%d:%d\n", s, Channel->frequency, Channel->polarization, Channel->diseqc, Channel->srate, Channel->vpid, Channel->apid, Channel->tpid, Channel->ca, Channel->pnr); char apidbuf[20];
char *q = apidbuf;
q += snprintf(q, sizeof(apidbuf), "%d", Channel->apid1);
if (Channel->apid2)
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->apid2);
*q = 0;
asprintf(&buffer, "%s:%d:%c:%d:%d:%d:%s:%d:%d:%d\n", s, Channel->frequency, Channel->polarization, Channel->diseqc, Channel->srate, Channel->vpid, apidbuf, Channel->tpid, Channel->ca, Channel->pnr);
}
return buffer; return buffer;
} }
@ -242,8 +250,11 @@ bool cChannel::Parse(const char *s)
} }
else { else {
groupSep = false; groupSep = false;
//XXX char *apidbuf = NULL;
int fields = sscanf(s, "%a[^:]:%d:%c:%d:%d:%d:%d:%d:%d:%d", &buffer, &frequency, &polarization, &diseqc, &srate, &vpid, &apid, &tpid, &ca, &pnr); int fields = sscanf(s, "%a[^:]:%d:%c:%d:%d:%d:%a[^:]:%d:%d:%d", &buffer, &frequency, &polarization, &diseqc, &srate, &vpid, &apidbuf, &tpid, &ca, &pnr);
apid1 = apid2 = 0;
sscanf(apidbuf, "%d,%d", &apid1, &apid2);
delete apidbuf;
if (fields >= 9) { if (fields >= 9) {
if (fields == 9) { if (fields == 9) {
// allow reading of old format // allow reading of old format
@ -275,7 +286,7 @@ bool cChannel::Switch(cDvbApi *DvbApi, bool Log)
isyslog(LOG_INFO, "switching to channel %d", number); isyslog(LOG_INFO, "switching to channel %d", number);
} }
for (int i = 3; i--;) { for (int i = 3; i--;) {
if (DvbApi->SetChannel(number, frequency, polarization, diseqc, srate, vpid, apid, tpid, ca, pnr)) if (DvbApi->SetChannel(number, frequency, polarization, diseqc, srate, vpid, apid1, apid2, tpid, ca, pnr))
return true; return true;
esyslog(LOG_ERR, "retrying"); esyslog(LOG_ERR, "retrying");
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: config.h 1.45 2001/06/02 09:43:04 kls Exp $ * $Id: config.h 1.46 2001/06/02 12:26:13 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -95,7 +95,7 @@ public:
int diseqc; int diseqc;
int srate; int srate;
int vpid; int vpid;
int apid; int apid1, apid2;
int tpid; int tpid;
int ca; int ca;
int pnr; int pnr;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbapi.c 1.68 2001/06/02 12:20:13 kls Exp $ * $Id: dvbapi.c 1.69 2001/06/03 13:07:20 kls Exp $
*/ */
#include "dvbapi.h" #include "dvbapi.h"
@ -1018,6 +1018,7 @@ class cTransferBuffer : public cRingBuffer {
private: private:
cDvbApi *dvbApi; cDvbApi *dvbApi;
int fromDevice, toDevice; int fromDevice, toDevice;
bool gotBufferReserve;
cRemux remux; cRemux remux;
protected: protected:
virtual void Input(void); virtual void Input(void);
@ -1025,6 +1026,7 @@ protected:
public: public:
cTransferBuffer(cDvbApi *DvbApi, int ToDevice, dvb_pid_t VPid, dvb_pid_t APid); cTransferBuffer(cDvbApi *DvbApi, int ToDevice, dvb_pid_t VPid, dvb_pid_t APid);
virtual ~cTransferBuffer(); virtual ~cTransferBuffer();
void SetAudioPid(int APid);
}; };
cTransferBuffer::cTransferBuffer(cDvbApi *DvbApi, int ToDevice, dvb_pid_t VPid, dvb_pid_t APid) cTransferBuffer::cTransferBuffer(cDvbApi *DvbApi, int ToDevice, dvb_pid_t VPid, dvb_pid_t APid)
@ -1034,6 +1036,7 @@ cTransferBuffer::cTransferBuffer(cDvbApi *DvbApi, int ToDevice, dvb_pid_t VPid,
dvbApi = DvbApi; dvbApi = DvbApi;
fromDevice = dvbApi->SetModeRecord(); fromDevice = dvbApi->SetModeRecord();
toDevice = ToDevice; toDevice = ToDevice;
gotBufferReserve = false;
Start(); Start();
} }
@ -1043,6 +1046,15 @@ cTransferBuffer::~cTransferBuffer()
dvbApi->SetModeNormal(true); dvbApi->SetModeNormal(true);
} }
void cTransferBuffer::SetAudioPid(int APid)
{
Clear();
//XXX we may need to have access to the audio device, too, in order to clear it
CHECK(ioctl(toDevice, VIDEO_CLEAR_BUFFER));
gotBufferReserve = false;
remux.SetAudioPid(APid);
}
void cTransferBuffer::Input(void) void cTransferBuffer::Input(void)
{ {
dsyslog(LOG_INFO, "input thread started (pid=%d)", getpid()); dsyslog(LOG_INFO, "input thread started (pid=%d)", getpid());
@ -1084,14 +1096,13 @@ void cTransferBuffer::Output(void)
{ {
dsyslog(LOG_INFO, "output thread started (pid=%d)", getpid()); dsyslog(LOG_INFO, "output thread started (pid=%d)", getpid());
bool GotBufferReserve = false;
uchar b[MINVIDEODATA]; uchar b[MINVIDEODATA];
while (Busy()) { while (Busy()) {
if (!GotBufferReserve) { if (!gotBufferReserve) {
if (Available() < MAXFRAMESIZE) if (Available() < MAXFRAMESIZE)
usleep(100000); // allow the buffer to collect some reserve usleep(100000); // allow the buffer to collect some reserve
else else
GotBufferReserve = true; gotBufferReserve = true;
} }
int r = Get(b, sizeof(b)); int r = Get(b, sizeof(b));
if (r > 0) { if (r > 0) {
@ -1302,7 +1313,7 @@ cDvbApi *cDvbApi::PrimaryDvbApi = NULL;
cDvbApi::cDvbApi(int n) cDvbApi::cDvbApi(int n)
{ {
vPid = aPid = 0; vPid = aPid1 = aPid2 = 0;
siProcessor = NULL; siProcessor = NULL;
recordBuffer = NULL; recordBuffer = NULL;
replayBuffer = NULL; replayBuffer = NULL;
@ -2011,10 +2022,10 @@ bool cDvbApi::SetPid(int fd, dmxPesType_t PesType, dvb_pid_t Pid, dmxOutput_t Ou
bool cDvbApi::SetPids(bool ForRecording) bool cDvbApi::SetPids(bool ForRecording)
{ {
return SetVpid(vPid, ForRecording ? DMX_OUT_TS_TAP : DMX_OUT_DECODER) && return SetVpid(vPid, ForRecording ? DMX_OUT_TS_TAP : DMX_OUT_DECODER) &&
SetApid(aPid, ForRecording ? DMX_OUT_TS_TAP : DMX_OUT_DECODER); SetApid(aPid1, ForRecording ? DMX_OUT_TS_TAP : DMX_OUT_DECODER);
} }
bool cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Tpid, int Ca, int Pnr) bool cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Tpid, int Ca, int Pnr)
{ {
// Make sure the siProcessor won't access the device while switching // Make sure the siProcessor won't access the device while switching
cThreadLock ThreadLock(siProcessor); cThreadLock ThreadLock(siProcessor);
@ -2127,7 +2138,8 @@ bool cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization,
// PID settings: // PID settings:
vPid = Vpid; vPid = Vpid;
aPid = Apid; aPid1 = Apid1;
aPid2 = Apid2;
if (!SetPids(false)) { if (!SetPids(false)) {
esyslog(LOG_ERR, "ERROR: failed to set PIDs for channel %d", ChannelNumber); esyslog(LOG_ERR, "ERROR: failed to set PIDs for channel %d", ChannelNumber);
return false; return false;
@ -2146,7 +2158,7 @@ bool cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization,
cDvbApi *CaDvbApi = GetDvbApi(Ca, 0); cDvbApi *CaDvbApi = GetDvbApi(Ca, 0);
if (CaDvbApi) { if (CaDvbApi) {
if (!CaDvbApi->Recording()) { if (!CaDvbApi->Recording()) {
if (CaDvbApi->SetChannel(ChannelNumber, FrequencyMHz, Polarization, Diseqc, Srate, Vpid, Apid, Tpid, Ca, Pnr)) { if (CaDvbApi->SetChannel(ChannelNumber, FrequencyMHz, Polarization, Diseqc, Srate, Vpid, Apid1, Apid2, Tpid, Ca, Pnr)) {
SetModeReplay(); SetModeReplay();
transferringFromDvbApi = CaDvbApi->StartTransfer(fd_video); transferringFromDvbApi = CaDvbApi->StartTransfer(fd_video);
} }
@ -2161,6 +2173,28 @@ bool cDvbApi::SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization,
return true; return true;
} }
bool cDvbApi::CanToggleAudioPid(void)
{
return aPid1 && aPid2 && aPid1 != aPid2;
}
bool cDvbApi::ToggleAudioPid(void)
{
if (CanToggleAudioPid()) {
int a = aPid2;
aPid2 = aPid1;
aPid1 = a;
if (transferringFromDvbApi)
return transferringFromDvbApi->ToggleAudioPid();
else {
if (transferBuffer)
transferBuffer->SetAudioPid(aPid1);
return SetPids(transferBuffer != NULL);
}
}
return false;
}
bool cDvbApi::Transferring(void) bool cDvbApi::Transferring(void)
{ {
return transferBuffer; return transferBuffer;
@ -2169,7 +2203,7 @@ bool cDvbApi::Transferring(void)
cDvbApi *cDvbApi::StartTransfer(int TransferToVideoDev) cDvbApi *cDvbApi::StartTransfer(int TransferToVideoDev)
{ {
StopTransfer(); StopTransfer();
transferBuffer = new cTransferBuffer(this, TransferToVideoDev, vPid, aPid); transferBuffer = new cTransferBuffer(this, TransferToVideoDev, vPid, aPid1);
return this; return this;
} }
@ -2230,7 +2264,7 @@ bool cDvbApi::StartRecord(const char *FileName, int Ca, int Priority)
// Create recording buffer: // Create recording buffer:
recordBuffer = new cRecordBuffer(this, FileName, vPid, aPid); recordBuffer = new cRecordBuffer(this, FileName, vPid, aPid1);
if (recordBuffer) { if (recordBuffer) {
ca = Ca; ca = Ca;
@ -2384,7 +2418,7 @@ void cEITScanner::Process(void)
time_t now = time(NULL); time_t now = time(NULL);
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) { if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
for (int i = 0; i < cDvbApi::NumDvbApis; i++) { for (int i = 0; i < cDvbApi::NumDvbApis; i++) {
cDvbApi *DvbApi = cDvbApi::GetDvbApi(i + 1, 0); cDvbApi *DvbApi = cDvbApi::GetDvbApi(i + 1, MAXPRIORITY);
if (DvbApi) { if (DvbApi) {
if (DvbApi != cDvbApi::PrimaryDvbApi || (cDvbApi::NumDvbApis == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { if (DvbApi != cDvbApi::PrimaryDvbApi || (cDvbApi::NumDvbApis == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
if (!(DvbApi->Recording() || DvbApi->Replaying() || DvbApi->Transferring())) { if (!(DvbApi->Recording() || DvbApi->Replaying() || DvbApi->Transferring())) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbapi.h 1.36 2001/06/02 09:44:00 kls Exp $ * $Id: dvbapi.h 1.37 2001/06/03 11:51:30 kls Exp $
*/ */
#ifndef __DVBAPI_H #ifndef __DVBAPI_H
@ -67,7 +67,7 @@ class cDvbApi {
private: private:
int videoDev; int videoDev;
int fd_osd, fd_qpskfe, fd_qamfe, fd_sec, fd_dvr, fd_audio, fd_video, fd_demuxa, fd_demuxv, fd_demuxt; int fd_osd, fd_qpskfe, fd_qamfe, fd_sec, fd_dvr, fd_audio, fd_video, fd_demuxa, fd_demuxv, fd_demuxt;
int vPid, aPid; int vPid, aPid1, aPid2;
bool SetPid(int fd, dmxPesType_t PesType, dvb_pid_t Pid, dmxOutput_t Output); bool SetPid(int fd, dmxPesType_t PesType, dvb_pid_t Pid, dmxOutput_t Output);
bool SetVpid(int Vpid, dmxOutput_t Output) { return SetPid(fd_demuxv, DMX_PES_VIDEO, Vpid, Output); } bool SetVpid(int Vpid, dmxOutput_t Output) { return SetPid(fd_demuxv, DMX_PES_VIDEO, Vpid, Output); }
bool SetApid(int Apid, dmxOutput_t Output) { return SetPid(fd_demuxa, DMX_PES_AUDIO, Apid, Output); } bool SetApid(int Apid, dmxOutput_t Output) { return SetPid(fd_demuxa, DMX_PES_AUDIO, Apid, Output); }
@ -177,9 +177,11 @@ public:
private: private:
int currentChannel; int currentChannel;
public: public:
bool SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Tpid, int Ca, int Pnr); bool SetChannel(int ChannelNumber, int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid1, int Apid2, int Tpid, int Ca, int Pnr);
static int CurrentChannel(void) { return PrimaryDvbApi ? PrimaryDvbApi->currentChannel : 0; } static int CurrentChannel(void) { return PrimaryDvbApi ? PrimaryDvbApi->currentChannel : 0; }
int Channel(void) { return currentChannel; } int Channel(void) { return currentChannel; }
bool CanToggleAudioPid(void);
bool ToggleAudioPid(void);
// Transfer facilities // Transfer facilities

24
i18n.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: i18n.c 1.17 2001/06/02 09:39:36 kls Exp $ * $Id: i18n.c 1.18 2001/06/03 12:57:21 kls Exp $
* *
* Slovenian translations provided by Miha Setina <mihasetina@softhome.net> * Slovenian translations provided by Miha Setina <mihasetina@softhome.net>
* Italian translations provided by Alberto Carraro <bertocar@tin.it> * Italian translations provided by Alberto Carraro <bertocar@tin.it>
@ -225,6 +225,12 @@ const tPhrase Phrases[] = {
"Programma", "Programma",
"Programma", "Programma",
}, },
{ "Language",
"Sprache",
"Jezik",
"Linguaggio",
"Taal",
},
// Confirmations: // Confirmations:
{ "Delete channel?", { "Delete channel?",
"Kanal löschen?", "Kanal löschen?",
@ -293,11 +299,17 @@ const tPhrase Phrases[] = {
"Vpid", "Vpid",
"Vpid", "Vpid",
}, },
{ "Apid", { "Apid1",
"Apid", "Apid1",
"Apid", "Apid1",
"Apid", "Apid1",
"Apid", "Apid1",
},
{ "Apid2",
"Apid2",
"Apid2",
"Apid2",
"Apid2",
}, },
{ "Tpid", { "Tpid",
"Tpid", "Tpid",

13
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 1.71 2001/06/02 09:59:54 kls Exp $ * $Id: menu.c 1.72 2001/06/02 13:51:28 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -540,7 +540,8 @@ cMenuEditChannel::cMenuEditChannel(int Index)
Add(new cMenuEditIntItem( tr("Diseqc"), &data.diseqc, 0, 10)); //TODO exact limits??? Add(new cMenuEditIntItem( tr("Diseqc"), &data.diseqc, 0, 10)); //TODO exact limits???
Add(new cMenuEditIntItem( tr("Srate"), &data.srate, 22000, 27500)); //TODO exact limits - toggle??? Add(new cMenuEditIntItem( tr("Srate"), &data.srate, 22000, 27500)); //TODO exact limits - toggle???
Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Vpid"), &data.vpid, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("Apid"), &data.apid, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Apid1"), &data.apid1, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("Apid2"), &data.apid2, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0xFFFE)); Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0xFFFE));
Add(new cMenuEditIntItem( tr("CA"), &data.ca, 0, cDvbApi::NumDvbApis)); Add(new cMenuEditIntItem( tr("CA"), &data.ca, 0, cDvbApi::NumDvbApis));
Add(new cMenuEditIntItem( tr("Pnr"), &data.pnr, 0)); Add(new cMenuEditIntItem( tr("Pnr"), &data.pnr, 0));
@ -1725,7 +1726,7 @@ cMenuMain::cMenuMain(bool Replaying)
} }
if (cVideoCutter::Active()) if (cVideoCutter::Active())
Add(new cOsdItem(tr(" Cancel editing"), osCancelEdit)); Add(new cOsdItem(tr(" Cancel editing"), osCancelEdit));
SetHelp(tr("Record"), NULL, NULL, cReplayControl::LastReplayed() ? tr("Resume") : NULL); SetHelp(tr("Record"), cDvbApi::PrimaryDvbApi->CanToggleAudioPid() ? tr("Language") : NULL, NULL, cReplayControl::LastReplayed() ? tr("Resume") : NULL);
Display(); Display();
lastActivity = time(NULL); lastActivity = time(NULL);
SetHasHotkeys(); SetHasHotkeys();
@ -1760,6 +1761,12 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
case kRed: if (!HasSubMenu()) case kRed: if (!HasSubMenu())
state = osRecord; state = osRecord;
break; break;
case kGreen: if (cDvbApi::PrimaryDvbApi->CanToggleAudioPid()) {
Interface->Clear();
cDvbApi::PrimaryDvbApi->ToggleAudioPid();
state = osEnd;
}
break;
case kBlue: if (!HasSubMenu()) case kBlue: if (!HasSubMenu())
state = osReplay; state = osReplay;
break; break;

16
remux.c
View File

@ -8,7 +8,7 @@
* the Linux DVB driver's 'tuxplayer' example and were rewritten to suit * the Linux DVB driver's 'tuxplayer' example and were rewritten to suit
* VDR's needs. * VDR's needs.
* *
* $Id: remux.c 1.2 2001/05/27 10:27:15 kls Exp $ * $Id: remux.c 1.3 2001/06/02 15:39:16 kls Exp $
*/ */
/* The calling interface of the 'cRemux::Process()' function is defined /* The calling interface of the 'cRemux::Process()' function is defined
@ -135,6 +135,7 @@ public:
cTS2PES(uint8_t *ResultBuffer, int *ResultCount, int Size); cTS2PES(uint8_t *ResultBuffer, int *ResultCount, int Size);
~cTS2PES(); ~cTS2PES();
void ts_to_pes(const uint8_t *Buf); // don't need count (=188) void ts_to_pes(const uint8_t *Buf); // don't need count (=188)
void Clear(void);
}; };
uint8_t cTS2PES::headr[] = { 0x00, 0x00, 0x01 }; uint8_t cTS2PES::headr[] = { 0x00, 0x00, 0x01 };
@ -156,6 +157,11 @@ cTS2PES::~cTS2PES()
delete buf; delete buf;
} }
void cTS2PES::Clear(void)
{
reset_ipack();
}
void cTS2PES::store(uint8_t *Data, int Count) void cTS2PES::store(uint8_t *Data, int Count)
{ {
//XXX overflow check??? //XXX overflow check???
@ -455,6 +461,14 @@ int cRemux::ScanVideoPacket(const uchar *Data, int Count, int Offset, uchar &Pic
return -1; return -1;
} }
void cRemux::SetAudioPid(int APid)
{
aPid = APid;
vTS2PES->Clear();
aTS2PES->Clear();
resultCount = resultDelivered = 0;
}
const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType) const uchar *cRemux::Process(const uchar *Data, int &Count, int &Result, uchar *PictureType)
{ {
uchar dummyPictureType; uchar dummyPictureType;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remux.h 1.2 2001/05/26 11:50:52 kls Exp $ * $Id: remux.h 1.3 2001/06/02 15:15:43 kls Exp $
*/ */
#ifndef __REMUX_H #ifndef __REMUX_H
@ -50,6 +50,7 @@ private:
public: public:
cRemux(dvb_pid_t VPid, dvb_pid_t APid, bool ExitOnFailure = false); cRemux(dvb_pid_t VPid, dvb_pid_t APid, bool ExitOnFailure = false);
~cRemux(); ~cRemux();
void SetAudioPid(int APid);
const uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL); const uchar *Process(const uchar *Data, int &Count, int &Result, uchar *PictureType = NULL);
}; };