mirror of
https://github.com/VDR4Arch/vdr.git
synced 2023-10-10 13:36:52 +02:00
99 lines
2.1 KiB
C
99 lines
2.1 KiB
C
/*
|
|
* audio.c: The basic audio interface
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: audio.c 1.2 2002/11/03 11:53:34 kls Exp $
|
|
*/
|
|
|
|
#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();
|
|
}
|