mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
Implemented audio plugin interface
This commit is contained in:
parent
2e26a1d607
commit
0a517afdf8
21
HISTORY
21
HISTORY
@ -1671,7 +1671,7 @@ Video Disk Recorder Revision History
|
|||||||
buttons of those that have already been learned (thanks to Oliver Endriss for
|
buttons of those that have already been learned (thanks to Oliver Endriss for
|
||||||
reporting this one).
|
reporting this one).
|
||||||
|
|
||||||
2002-11-02: Version 1.1.15
|
2002-11-03: Version 1.1.15
|
||||||
|
|
||||||
- Completely switched to the new CVS HEAD version of the linux-dvb driver.
|
- Completely switched to the new CVS HEAD version of the linux-dvb driver.
|
||||||
The NEWSTRUCT compile time switch is now obsolete. The required driver is now
|
The NEWSTRUCT compile time switch is now obsolete. The required driver is now
|
||||||
@ -1697,3 +1697,22 @@ Video Disk Recorder Revision History
|
|||||||
your existing plugin directory - make a backup copy first!).
|
your existing plugin directory - make a backup copy first!).
|
||||||
- Fixed reading EPG data via the SVDRP command PUTE (it changed the current
|
- Fixed reading EPG data via the SVDRP command PUTE (it changed the current
|
||||||
service ID).
|
service ID).
|
||||||
|
- Fixed closing all dup'ed file descriptors in cPipe.
|
||||||
|
- Implemented a plugin interface for additional audio processing (see PLUGINS.html
|
||||||
|
under "Dolby Digital").
|
||||||
|
The functionality of the '-a' command line option has been reactivated.
|
||||||
|
Since the author doesn't have any Dolby Digital equipment this may or may not
|
||||||
|
work as expected. There may still be some places where a call to cAudios::Clear()
|
||||||
|
or cAudios::Mute() is necessary. Those with Dolby Digital equipment should please
|
||||||
|
take a look at this and maybe send patches.
|
||||||
|
Replaying Dolby Digital in ways other than through VDR's '-a' option will have to
|
||||||
|
be implemented as plugins. Those who have written patches for VDR version 1.0.x
|
||||||
|
should convert their work into the proper plugins for version 1.1.x.
|
||||||
|
Note to authors of cPlayer derived plugins: please read the modified comments
|
||||||
|
in device.h regarding the member functions cDevice::Clear(), cDevice::Mute() and
|
||||||
|
cDevice::PlayAudio(). Derived classes must call these base class member functions
|
||||||
|
to make sure all registered cAudio objects are properly handled. Also note that
|
||||||
|
the return type of cDevice::PlayAudio() has been changed to 'void', since this
|
||||||
|
function always has to accept the entire data block immediately and there is
|
||||||
|
nothing that could be reasonably done in case an error occurs in one of the
|
||||||
|
cAudio objects.
|
||||||
|
78
PLUGINS.html
78
PLUGINS.html
@ -21,18 +21,18 @@ VDR program and present itself to the user.
|
|||||||
The <i>inside</i> interface provides the plugin code access to VDR's internal data
|
The <i>inside</i> interface provides the plugin code access to VDR's internal data
|
||||||
structures and allows it to hook itself into specific areas to perform special actions.
|
structures and allows it to hook itself into specific areas to perform special actions.
|
||||||
<p>
|
<p>
|
||||||
<!--X1.1.11--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
<!--X1.1.12--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||||
Important modifications introduced in version 1.1.11 are marked like this.
|
|
||||||
<!--X1.1.11--></td></tr></table>
|
|
||||||
<!--X1.1.12--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
|
||||||
Important modifications introduced in version 1.1.12 are marked like this.
|
Important modifications introduced in version 1.1.12 are marked like this.
|
||||||
<!--X1.1.12--></td></tr></table>
|
<!--X1.1.12--></td></tr></table>
|
||||||
<!--X1.1.13--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
<!--X1.1.13--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||||
Important modifications introduced in version 1.1.13 are marked like this.
|
Important modifications introduced in version 1.1.13 are marked like this.
|
||||||
<!--X1.1.13--></td></tr></table>
|
<!--X1.1.13--></td></tr></table>
|
||||||
<!--X1.1.14--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
<!--X1.1.14--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||||
Important modifications introduced in version 1.1.14 are marked like this.
|
Important modifications introduced in version 1.1.14 are marked like this.
|
||||||
<!--X1.1.14--></td></tr></table>
|
<!--X1.1.14--></td></tr></table>
|
||||||
|
<!--X1.1.15--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||||
|
Important modifications introduced in version 1.1.15 are marked like this.
|
||||||
|
<!--X1.1.15--></td></tr></table>
|
||||||
|
|
||||||
<a name="Part I - The Outside Interface"><hr><center><h1>Part I - The Outside Interface</h1></center>
|
<a name="Part I - The Outside Interface"><hr><center><h1>Part I - The Outside Interface</h1></center>
|
||||||
|
|
||||||
@ -964,7 +964,7 @@ bool DevicePoll(cPoller &Poller, int TimeoutMs = 0);
|
|||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
to determine whether the device is ready for further data.
|
to determine whether the device is ready for further data.
|
||||||
<!--X1.1.13--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
<!--X1.1.13--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||||
<p>
|
<p>
|
||||||
If the player can provide more than a single audio track, it can implement the
|
If the player can provide more than a single audio track, it can implement the
|
||||||
following functions to make them available:
|
following functions to make them available:
|
||||||
@ -977,7 +977,16 @@ virtual void SetAudioTrack(int Index);
|
|||||||
|
|
||||||
<!--X1.1.13--></td></tr></table>
|
<!--X1.1.13--></td></tr></table>
|
||||||
<p>
|
<p>
|
||||||
TODO: PlayAudio()???
|
<!--X1.1.15--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||||
|
If there is an additional audio track that has to be replayed with external hardware,
|
||||||
|
the player shall call its member function
|
||||||
|
|
||||||
|
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||||
|
void PlayAudio(const uchar *Data, int Length);
|
||||||
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
|
where <tt>Data</tt> points to a complete audio PES packet of <tt>Length</tt> bytes.
|
||||||
|
<!--X1.1.15--></td></tr></table>
|
||||||
<p>
|
<p>
|
||||||
The second part needed here is a control object that receives user input from the main
|
The second part needed here is a control object that receives user input from the main
|
||||||
program loop and reacts on this by telling the player what to do:
|
program loop and reacts on this by telling the player what to do:
|
||||||
@ -1196,7 +1205,7 @@ If the new device can receive, it most likely needs to provide a way of
|
|||||||
selecting which channel it shall tune to:
|
selecting which channel it shall tune to:
|
||||||
|
|
||||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||||
<!--X1.1.12--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
<!--X1.1.12--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||||
virtual bool ProvidesSource(int Source) const;
|
virtual bool ProvidesSource(int Source) const;
|
||||||
<!--X1.1.12--></td></tr></table>
|
<!--X1.1.12--></td></tr></table>
|
||||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL);
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL);
|
||||||
@ -1206,7 +1215,7 @@ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
|||||||
These functions will be called with the desired source or channel and shall return whether
|
These functions will be called with the desired source or channel and shall return whether
|
||||||
this device can provide the requested source or channel and whether tuning to it was successful,
|
this device can provide the requested source or channel and whether tuning to it was successful,
|
||||||
repectively.
|
repectively.
|
||||||
<!--X1.1.13--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
<!--X1.1.13--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||||
<p>
|
<p>
|
||||||
<b>Audio selection</b>
|
<b>Audio selection</b>
|
||||||
<p>
|
<p>
|
||||||
@ -1253,7 +1262,7 @@ The functions to implement replaying capabilites are
|
|||||||
|
|
||||||
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||||
virtual bool HasDecoder(void) const;
|
virtual bool HasDecoder(void) const;
|
||||||
<!--X1.1.14--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
<!--X1.1.14--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||||
virtual bool CanReplay(void) const;
|
virtual bool CanReplay(void) const;
|
||||||
<!--X1.1.14--></td></tr></table>
|
<!--X1.1.14--></td></tr></table>
|
||||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||||
@ -1315,7 +1324,51 @@ shut down (delete) all devices when the program terminates. It is therefore
|
|||||||
important that the devices are created on the heap, using the <tt>new</tt>
|
important that the devices are created on the heap, using the <tt>new</tt>
|
||||||
operator!
|
operator!
|
||||||
|
|
||||||
<!--X1.1.11--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
<!--X1.1.15--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||||
|
<hr><h2>Dolby Digital</h2>
|
||||||
|
|
||||||
|
<center><i><b>"The stereo effect may only be experienced if stereo equipment is used!"</b></i></center><p>
|
||||||
|
|
||||||
|
There are many different ways to replay additional audio tracks, like Dolby Digital.
|
||||||
|
So VDR offers a plugin interface that allows for the implementation of any kind of
|
||||||
|
audio replay facility.
|
||||||
|
<p>
|
||||||
|
To implement a new audio output facility, simply derive a class from <tt>cAudio</tt>,
|
||||||
|
as in
|
||||||
|
|
||||||
|
<p><table><tr><td bgcolor=#F0F0F0><pre><br>
|
||||||
|
#include <vdr/audio.h>
|
||||||
|
#include <vdr/thread.h>
|
||||||
|
|
||||||
|
class cMyAudio : public cAudio, private cThread {
|
||||||
|
private:
|
||||||
|
virtual void Action(void);
|
||||||
|
public:
|
||||||
|
cMyAudio(void);
|
||||||
|
virtual void Play(const uchar *Data, int Length);
|
||||||
|
virtual void Mute(bool On);
|
||||||
|
virtual void Clear(void);
|
||||||
|
};
|
||||||
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
|
You should create your derived audio object in the
|
||||||
|
<a href="#Getting started"><tt>Start()</tt></a> function of your plugin.
|
||||||
|
Note that the object has to be created on the heap (using <tt>new</tt>),
|
||||||
|
and you shall not delete it at any point (it will be deleted automatically
|
||||||
|
when the program ends).
|
||||||
|
<p>
|
||||||
|
The <tt>Play()</tt> function will be offered complete audio PES packets
|
||||||
|
and has to accept each packet immediately. It must return as soon as possible,
|
||||||
|
in order to not delay the overall replay process. Therefore you may want to
|
||||||
|
also derive your class from <tt>cThread</tt> and run the actual audio processing
|
||||||
|
as a separate thread. Note that the offered data is only valid within the call
|
||||||
|
to <tt>Play()</tt>, so if you can't process the entire block immediately, you
|
||||||
|
will need to copy it for later processing in your thread.
|
||||||
|
<p>
|
||||||
|
The <tt>Mute()</tt> and <tt>Clear()</tt> functions will be called whenever the audio shall
|
||||||
|
be muted, or any buffered data shall be cleared, respectively.
|
||||||
|
<!--X1.1.15--></td></tr></table>
|
||||||
|
|
||||||
<hr><h2>Remote Control</h2>
|
<hr><h2>Remote Control</h2>
|
||||||
|
|
||||||
<center><i><b>The joy of zapping!</b></i></center><p>
|
<center><i><b>The joy of zapping!</b></i></center><p>
|
||||||
@ -1427,7 +1480,6 @@ Put(uint64 Code, bool Repeat = false, bool Release = false);
|
|||||||
</pre></td></tr></table><p>
|
</pre></td></tr></table><p>
|
||||||
|
|
||||||
The other parameters have the same meaning as in the first version of this function.
|
The other parameters have the same meaning as in the first version of this function.
|
||||||
<!--X1.1.11--></td></tr></table>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
89
audio.c
89
audio.c
@ -4,8 +4,95 @@
|
|||||||
* 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: audio.c 1.1 2002/06/10 16:30:00 kls Exp $
|
* $Id: audio.c 1.2 2002/11/03 11:53:34 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
|
||||||
|
// --- cAudio ----------------------------------------------------------------
|
||||||
|
|
||||||
|
cAudio::cAudio(void)
|
||||||
|
{
|
||||||
|
Audios.Add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
cAudio::~cAudio()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- cAudios ---------------------------------------------------------------
|
||||||
|
|
||||||
|
cAudios Audios;
|
||||||
|
|
||||||
|
void cAudios::PlayAudio(const uchar *Data, int Length)
|
||||||
|
{
|
||||||
|
for (cAudio *audio = First(); audio; audio = Next(audio))
|
||||||
|
audio->Play(Data, Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cAudios::MuteAudio(bool On)
|
||||||
|
{
|
||||||
|
for (cAudio *audio = First(); audio; audio = Next(audio))
|
||||||
|
audio->Mute(On);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cAudios::ClearAudio(void)
|
||||||
|
{
|
||||||
|
for (cAudio *audio = First(); audio; audio = Next(audio))
|
||||||
|
audio->Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- cExternalAudio --------------------------------------------------------
|
||||||
|
|
||||||
|
cExternalAudio::cExternalAudio(const char *Command)
|
||||||
|
{
|
||||||
|
command = strdup(Command);
|
||||||
|
mute = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
cExternalAudio::~cExternalAudio()
|
||||||
|
{
|
||||||
|
free(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cExternalAudio::Play(const uchar *Data, int Length)
|
||||||
|
{
|
||||||
|
if (command && !mute) {
|
||||||
|
if (pipe || pipe.Open(command, "w")) {
|
||||||
|
if (Data[0] == 0x00 && Data[1] == 0x00 && Data[2] == 0x01) {
|
||||||
|
if (Data[3] == 0xBD) { // dolby
|
||||||
|
//XXX??? int written = Data[8] + (skipAC3bytes ? 13 : 9); // skips the PES header
|
||||||
|
int written = Data[8] + 9; // skips the PES header
|
||||||
|
Length -= written;
|
||||||
|
while (Length > 0) {
|
||||||
|
int w = fwrite(Data + written, 1, Length, pipe);
|
||||||
|
if (w < 0) {
|
||||||
|
LOG_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Length -= w;
|
||||||
|
written += w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
esyslog("ERROR: can't open pipe to audio command '%s'", command);
|
||||||
|
free(command);
|
||||||
|
command = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void cExternalAudio::Mute(bool On)
|
||||||
|
{
|
||||||
|
mute = On;
|
||||||
|
if (mute)
|
||||||
|
Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void cExternalAudio::Clear(void)
|
||||||
|
{
|
||||||
|
pipe.Close();
|
||||||
|
}
|
||||||
|
44
audio.h
44
audio.h
@ -4,10 +4,52 @@
|
|||||||
* 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: audio.h 1.1 2002/06/10 16:30:00 kls Exp $
|
* $Id: audio.h 1.2 2002/11/03 11:50:02 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __AUDIO_H
|
#ifndef __AUDIO_H
|
||||||
#define __AUDIO_H
|
#define __AUDIO_H
|
||||||
|
|
||||||
|
#include "thread.h"
|
||||||
|
#include "tools.h"
|
||||||
|
|
||||||
|
class cAudio : public cListObject {
|
||||||
|
protected:
|
||||||
|
cAudio(void);
|
||||||
|
public:
|
||||||
|
virtual ~cAudio();
|
||||||
|
virtual void Play(const uchar *Data, int Length) = 0;
|
||||||
|
// Plays the given block of audio Data. Must return as soon as possible.
|
||||||
|
// If the entire block of data can't be processed immediately, it must
|
||||||
|
// be copied and processed in a separate thread. The Data is always a
|
||||||
|
// complete PES audio packet.
|
||||||
|
virtual void Mute(bool On) = 0;
|
||||||
|
// Immediately sets the audio device to be silent (On==true) or to
|
||||||
|
// normal replay (On==false).
|
||||||
|
virtual void Clear(void) = 0;
|
||||||
|
// Clears all data that might still be awaiting processing.
|
||||||
|
};
|
||||||
|
|
||||||
|
class cAudios : public cList<cAudio> {
|
||||||
|
public:
|
||||||
|
void PlayAudio(const uchar *Data, int Length);
|
||||||
|
void MuteAudio(bool On);
|
||||||
|
void ClearAudio(void);
|
||||||
|
};
|
||||||
|
|
||||||
|
extern cAudios Audios;
|
||||||
|
|
||||||
|
class cExternalAudio : public cAudio {
|
||||||
|
private:
|
||||||
|
char *command;
|
||||||
|
cPipe pipe;
|
||||||
|
bool mute;
|
||||||
|
public:
|
||||||
|
cExternalAudio(const char *Command);
|
||||||
|
virtual ~cExternalAudio();
|
||||||
|
virtual void Play(const uchar *Data, int Length);
|
||||||
|
virtual void Mute(bool On);
|
||||||
|
virtual void Clear(void);
|
||||||
|
};
|
||||||
|
|
||||||
#endif //__AUDIO_H
|
#endif //__AUDIO_H
|
||||||
|
14
device.c
14
device.c
@ -4,13 +4,14 @@
|
|||||||
* 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: device.c 1.33 2002/11/01 11:08:57 kls Exp $
|
* $Id: device.c 1.34 2002/11/03 11:51:24 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
#include "audio.h"
|
||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
@ -416,6 +417,7 @@ bool cDevice::ToggleMute(void)
|
|||||||
mute = !mute;
|
mute = !mute;
|
||||||
SetVolume(0, mute);
|
SetVolume(0, mute);
|
||||||
volume = OldVolume;
|
volume = OldVolume;
|
||||||
|
Audios.MuteAudio(mute);
|
||||||
return mute;
|
return mute;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,8 +426,10 @@ void cDevice::SetVolume(int Volume, bool Absolute)
|
|||||||
volume = min(max(Absolute ? Volume : volume + Volume, 0), MAXVOLUME);
|
volume = min(max(Absolute ? Volume : volume + Volume, 0), MAXVOLUME);
|
||||||
SetVolumeDevice(volume);
|
SetVolumeDevice(volume);
|
||||||
cStatus::MsgSetVolume(volume, Absolute);
|
cStatus::MsgSetVolume(volume, Absolute);
|
||||||
if (volume > 0)
|
if (volume > 0) {
|
||||||
mute = false;
|
mute = false;
|
||||||
|
Audios.MuteAudio(mute);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int cDevice::NumAudioTracks(void) const
|
int cDevice::NumAudioTracks(void) const
|
||||||
@ -462,6 +466,7 @@ void cDevice::TrickSpeed(int Speed)
|
|||||||
|
|
||||||
void cDevice::Clear(void)
|
void cDevice::Clear(void)
|
||||||
{
|
{
|
||||||
|
Audios.ClearAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cDevice::Play(void)
|
void cDevice::Play(void)
|
||||||
@ -474,6 +479,7 @@ void cDevice::Freeze(void)
|
|||||||
|
|
||||||
void cDevice::Mute(void)
|
void cDevice::Mute(void)
|
||||||
{
|
{
|
||||||
|
Audios.MuteAudio(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cDevice::StillPicture(const uchar *Data, int Length)
|
void cDevice::StillPicture(const uchar *Data, int Length)
|
||||||
@ -529,9 +535,9 @@ int cDevice::PlayVideo(const uchar *Data, int Length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cDevice::PlayAudio(const uchar *Data, int Length)
|
void cDevice::PlayAudio(const uchar *Data, int Length)
|
||||||
{
|
{
|
||||||
return -1;
|
Audios.PlayAudio(Data, Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
int cDevice::Ca(void) const
|
int cDevice::Ca(void) const
|
||||||
|
10
device.h
10
device.h
@ -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: device.h 1.26 2002/11/01 11:03:56 kls Exp $
|
* $Id: device.h 1.27 2002/11/03 11:16:11 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DEVICE_H
|
#ifndef __DEVICE_H
|
||||||
@ -290,6 +290,8 @@ public:
|
|||||||
// times.
|
// times.
|
||||||
virtual void Clear(void);
|
virtual void Clear(void);
|
||||||
// Clears all video and audio data from the device.
|
// Clears all video and audio data from the device.
|
||||||
|
// A derived class must call the base class function to make sure
|
||||||
|
// all registered cAudio objects are notified.
|
||||||
virtual void Play(void);
|
virtual void Play(void);
|
||||||
// Sets the device into play mode (after a previous trick
|
// Sets the device into play mode (after a previous trick
|
||||||
// mode).
|
// mode).
|
||||||
@ -297,6 +299,8 @@ public:
|
|||||||
// Puts the device into "freeze frame" mode.
|
// Puts the device into "freeze frame" mode.
|
||||||
virtual void Mute(void);
|
virtual void Mute(void);
|
||||||
// Turns off audio while replaying.
|
// Turns off audio while replaying.
|
||||||
|
// A derived class must call the base class function to make sure
|
||||||
|
// all registered cAudio objects are notified.
|
||||||
virtual void StillPicture(const uchar *Data, int Length);
|
virtual void StillPicture(const uchar *Data, int Length);
|
||||||
// Displays the given I-frame as a still picture.
|
// Displays the given I-frame as a still picture.
|
||||||
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
|
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
|
||||||
@ -309,8 +313,10 @@ public:
|
|||||||
// Actually plays the given data block as video. The data must be
|
// Actually plays the given data block as video. The data must be
|
||||||
// part of a PES (Packetized Elementary Stream) which can contain
|
// part of a PES (Packetized Elementary Stream) which can contain
|
||||||
// one video and one audio strem.
|
// one video and one audio strem.
|
||||||
virtual int PlayAudio(const uchar *Data, int Length);
|
virtual void PlayAudio(const uchar *Data, int Length);
|
||||||
// Plays additional audio streams, like Dolby Digital.
|
// Plays additional audio streams, like Dolby Digital.
|
||||||
|
// A derived class must call the base class function to make sure data
|
||||||
|
// is distributed to all registered cAudio objects.
|
||||||
bool Replaying(void) const;
|
bool Replaying(void) const;
|
||||||
// Returns true if we are currently replaying.
|
// Returns true if we are currently replaying.
|
||||||
void StopReplay(void);
|
void StopReplay(void);
|
||||||
|
@ -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: dvbdevice.c 1.32 2002/11/01 11:24:47 kls Exp $
|
* $Id: dvbdevice.c 1.33 2002/11/03 11:51:29 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbdevice.h"
|
#include "dvbdevice.h"
|
||||||
@ -792,10 +792,10 @@ int cDvbDevice::PlayVideo(const uchar *Data, int Length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cDvbDevice::PlayAudio(const uchar *Data, int Length)
|
void cDvbDevice::PlayAudio(const uchar *Data, int Length)
|
||||||
{
|
{
|
||||||
//XXX+
|
//XXX actually this function will only be needed to implement replaying AC3 over the DVB card's S/PDIF
|
||||||
return -1;
|
cDevice::PlayAudio(Data, Length);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cDvbDevice::OpenDvr(void)
|
bool cDvbDevice::OpenDvr(void)
|
||||||
|
@ -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: dvbdevice.h 1.16 2002/11/01 10:05:41 kls Exp $
|
* $Id: dvbdevice.h 1.17 2002/11/02 14:32:25 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DVBDEVICE_H
|
#ifndef __DVBDEVICE_H
|
||||||
@ -103,7 +103,7 @@ public:
|
|||||||
virtual void StillPicture(const uchar *Data, int Length);
|
virtual void StillPicture(const uchar *Data, int Length);
|
||||||
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
|
virtual bool Poll(cPoller &Poller, int TimeoutMs = 0);
|
||||||
virtual int PlayVideo(const uchar *Data, int Length);
|
virtual int PlayVideo(const uchar *Data, int Length);
|
||||||
virtual int PlayAudio(const uchar *Data, int Length);
|
virtual void PlayAudio(const uchar *Data, int Length);
|
||||||
|
|
||||||
// Receiver facilities
|
// Receiver facilities
|
||||||
|
|
||||||
|
@ -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: dvbplayer.c 1.15 2002/10/13 16:08:40 kls Exp $
|
* $Id: dvbplayer.c 1.16 2002/11/03 11:23:47 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "dvbplayer.h"
|
#include "dvbplayer.h"
|
||||||
@ -219,7 +219,7 @@ void cDvbPlayer::StripAudioPackets(uchar *b, int Length, uchar Except)
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case 0xBD: // dolby
|
case 0xBD: // dolby
|
||||||
if (Except)
|
if (Except)
|
||||||
;//XXX+ PlayExternalDolby(&b[i], Length - i);
|
PlayAudio(&b[i], l);
|
||||||
// continue with deleting the data - otherwise it disturbs DVB replay
|
// continue with deleting the data - otherwise it disturbs DVB replay
|
||||||
case 0xC0 ... 0xC1: // audio
|
case 0xC0 ... 0xC1: // audio
|
||||||
if (c == 0xC1)
|
if (c == 0xC1)
|
||||||
|
11
player.c
11
player.c
@ -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: player.c 1.5 2002/08/15 10:29:17 kls Exp $
|
* $Id: player.c 1.6 2002/11/02 14:55:37 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
@ -31,12 +31,13 @@ int cPlayer::PlayVideo(const uchar *Data, int Length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cPlayer::PlayAudio(const uchar *Data, int Length)
|
void cPlayer::PlayAudio(const uchar *Data, int Length)
|
||||||
{
|
{
|
||||||
if (device)
|
if (device) {
|
||||||
return device->PlayAudio(Data, Length);
|
device->PlayAudio(Data, Length);
|
||||||
|
return;
|
||||||
|
}
|
||||||
esyslog("ERROR: attempt to use cPlayer::PlayAudio() without attaching to a cDevice!");
|
esyslog("ERROR: attempt to use cPlayer::PlayAudio() without attaching to a cDevice!");
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cPlayer::Detach(void)
|
void cPlayer::Detach(void)
|
||||||
|
6
player.h
6
player.h
@ -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: player.h 1.9 2002/10/12 11:17:02 kls Exp $
|
* $Id: player.h 1.10 2002/11/03 11:27:30 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __PLAYER_H
|
#ifndef __PLAYER_H
|
||||||
@ -35,8 +35,8 @@ protected:
|
|||||||
// Sends the given Data to the video device and returns the number of
|
// Sends the given Data to the video device and returns the number of
|
||||||
// bytes that have actually been accepted by the video device (or a
|
// bytes that have actually been accepted by the video device (or a
|
||||||
// negative value in case of an error).
|
// negative value in case of an error).
|
||||||
int PlayAudio(const uchar *Data, int Length);
|
void PlayAudio(const uchar *Data, int Length);
|
||||||
// XXX+ TODO
|
// Plays additional audio streams, like Dolby Digital.
|
||||||
public:
|
public:
|
||||||
cPlayer(ePlayMode PlayMode = pmAudioVideo);
|
cPlayer(ePlayMode PlayMode = pmAudioVideo);
|
||||||
virtual ~cPlayer();
|
virtual ~cPlayer();
|
||||||
|
@ -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: transfer.c 1.6 2002/10/26 10:17:17 kls Exp $
|
* $Id: transfer.c 1.7 2002/11/03 11:24:02 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "transfer.h"
|
#include "transfer.h"
|
||||||
@ -123,7 +123,7 @@ void cTransfer::StripAudioPackets(uchar *b, int Length, uchar Except)
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case 0xBD: // dolby
|
case 0xBD: // dolby
|
||||||
if (Except)
|
if (Except)
|
||||||
;//XXX+ PlayExternalDolby(&b[i], Length - i);
|
PlayAudio(&b[i], l);
|
||||||
// continue with deleting the data - otherwise it disturbs DVB replay
|
// continue with deleting the data - otherwise it disturbs DVB replay
|
||||||
case 0xC0 ... 0xC1: // audio
|
case 0xC0 ... 0xC1: // audio
|
||||||
if (c == 0xC1)
|
if (c == 0xC1)
|
||||||
|
14
vdr.c
14
vdr.c
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
* The project's page is at http://www.cadsoft.de/people/kls/vdr
|
* The project's page is at http://www.cadsoft.de/people/kls/vdr
|
||||||
*
|
*
|
||||||
* $Id: vdr.c 1.130 2002/10/27 15:20:56 kls Exp $
|
* $Id: vdr.c 1.131 2002/11/03 11:44:17 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -30,6 +30,7 @@
|
|||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "audio.h"
|
||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "cutter.h"
|
#include "cutter.h"
|
||||||
@ -87,6 +88,7 @@ int main(int argc, char *argv[])
|
|||||||
#define DEFAULTPLUGINDIR "./PLUGINS/lib"
|
#define DEFAULTPLUGINDIR "./PLUGINS/lib"
|
||||||
|
|
||||||
int SVDRPport = DEFAULTSVDRPPORT;
|
int SVDRPport = DEFAULTSVDRPPORT;
|
||||||
|
const char *AudioCommand = NULL;
|
||||||
const char *ConfigDirectory = NULL;
|
const char *ConfigDirectory = NULL;
|
||||||
bool DisplayHelp = false;
|
bool DisplayHelp = false;
|
||||||
bool DisplayVersion = false;
|
bool DisplayVersion = false;
|
||||||
@ -121,10 +123,8 @@ int main(int argc, char *argv[])
|
|||||||
int c;
|
int c;
|
||||||
while ((c = getopt_long(argc, argv, "a:c:dD:E:hl:L:mp:P:r:s:t:v:Vw:", long_options, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, "a:c:dD:E:hl:L:mp:P:r:s:t:v:Vw:", long_options, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
/*XXX+
|
case 'a': AudioCommand = optarg;
|
||||||
case 'a': cDevice::SetAudioCommand(optarg);
|
|
||||||
break;
|
break;
|
||||||
XXX*/
|
|
||||||
case 'c': ConfigDirectory = optarg;
|
case 'c': ConfigDirectory = optarg;
|
||||||
break;
|
break;
|
||||||
case 'd': DaemonMode = true; break;
|
case 'd': DaemonMode = true; break;
|
||||||
@ -365,6 +365,11 @@ int main(int argc, char *argv[])
|
|||||||
#endif
|
#endif
|
||||||
Interface->LearnKeys();
|
Interface->LearnKeys();
|
||||||
|
|
||||||
|
// External audio:
|
||||||
|
|
||||||
|
if (AudioCommand)
|
||||||
|
new cExternalAudio(AudioCommand);
|
||||||
|
|
||||||
// Channel:
|
// Channel:
|
||||||
|
|
||||||
Channels.SwitchTo(Setup.CurrentChannel);
|
Channels.SwitchTo(Setup.CurrentChannel);
|
||||||
@ -676,6 +681,7 @@ int main(int argc, char *argv[])
|
|||||||
delete Interface;
|
delete Interface;
|
||||||
cOsd::Shutdown();
|
cOsd::Shutdown();
|
||||||
Remotes.Clear();
|
Remotes.Clear();
|
||||||
|
Audios.Clear();
|
||||||
Setup.CurrentChannel = cDevice::CurrentChannel();
|
Setup.CurrentChannel = cDevice::CurrentChannel();
|
||||||
Setup.CurrentVolume = cDevice::CurrentVolume();
|
Setup.CurrentVolume = cDevice::CurrentVolume();
|
||||||
Setup.Save();
|
Setup.Save();
|
||||||
|
Loading…
Reference in New Issue
Block a user