mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-28 07:51:19 +02:00
driver/audiodec: get back old audio decoders code, use configure option ENABLE_FFMPEGDEC
to switch between old code and ffmpegdec
This commit is contained in:
@@ -35,6 +35,27 @@ SUBDIRS += lcddisplay
|
|||||||
AM_CPPFLAGS += -I$(top_srcdir)/lib/libtriple
|
AM_CPPFLAGS += -I$(top_srcdir)/lib/libtriple
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if USE_TREMOR
|
||||||
|
VORBISLIBS = @VORBISIDEC_LIBS@
|
||||||
|
else
|
||||||
|
VORBISLIBS = -lvorbisfile -lvorbis -logg
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ENABLE_FLAC
|
||||||
|
FLACLIBS = -lFLAC
|
||||||
|
else
|
||||||
|
FLACLIBS =
|
||||||
|
endif
|
||||||
|
|
||||||
|
if ENABLE_FFMPEGDEC
|
||||||
|
ADEC_LIBS = @SWRESAMPLE_LIBS@
|
||||||
|
else
|
||||||
|
ADEC_LIBS = @MAD_LIBS@ \
|
||||||
|
@ID3TAG_LIBS@ \
|
||||||
|
$(FLACLIBS) \
|
||||||
|
$(VORBISLIBS)
|
||||||
|
endif
|
||||||
|
|
||||||
bin_PROGRAMS = neutrino rcsim
|
bin_PROGRAMS = neutrino rcsim
|
||||||
|
|
||||||
neutrino_SOURCES = neutrino_menue.cpp neutrino.cpp
|
neutrino_SOURCES = neutrino_menue.cpp neutrino.cpp
|
||||||
@@ -90,7 +111,7 @@ neutrino_LDADD = \
|
|||||||
@AVFORMAT_LIBS@ \
|
@AVFORMAT_LIBS@ \
|
||||||
@AVUTIL_LIBS@ \
|
@AVUTIL_LIBS@ \
|
||||||
@AVCODEC_LIBS@ \
|
@AVCODEC_LIBS@ \
|
||||||
@SWRESAMPLE_LIBS@ \
|
$(ADEC_LIBS) \
|
||||||
-ldvbsi++ \
|
-ldvbsi++ \
|
||||||
-ljpeg \
|
-ljpeg \
|
||||||
-lOpenThreads \
|
-lOpenThreads \
|
||||||
|
@@ -23,6 +23,19 @@ endif
|
|||||||
|
|
||||||
noinst_LIBRARIES = libneutrino_driver_audiodec.a
|
noinst_LIBRARIES = libneutrino_driver_audiodec.a
|
||||||
|
|
||||||
|
if ENABLE_FFMPEGDEC
|
||||||
|
ASOURCES = ffmpegdec.cpp
|
||||||
|
else
|
||||||
|
ASOURCES = cdrdec.cpp \
|
||||||
|
crc.c \
|
||||||
|
flacdec.cpp \
|
||||||
|
mp3dec.cpp \
|
||||||
|
oggdec.cpp \
|
||||||
|
tag.c \
|
||||||
|
vis.cpp \
|
||||||
|
wavdec.cpp
|
||||||
|
endif
|
||||||
|
|
||||||
libneutrino_driver_audiodec_a_SOURCES = \
|
libneutrino_driver_audiodec_a_SOURCES = \
|
||||||
basedec.cpp \
|
basedec.cpp \
|
||||||
ffmpegdec.cpp
|
$(ASOURCES)
|
||||||
|
@@ -40,7 +40,17 @@
|
|||||||
#include <zapit/client/zapittools.h>
|
#include <zapit/client/zapittools.h>
|
||||||
|
|
||||||
#include "basedec.h"
|
#include "basedec.h"
|
||||||
|
#ifdef ENABLE_FFMPEGDEC
|
||||||
#include "ffmpegdec.h"
|
#include "ffmpegdec.h"
|
||||||
|
#else
|
||||||
|
#include "cdrdec.h"
|
||||||
|
#include "mp3dec.h"
|
||||||
|
#include "oggdec.h"
|
||||||
|
#include "wavdec.h"
|
||||||
|
#ifdef ENABLE_FLAC
|
||||||
|
#include "flacdec.h"
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <driver/netfile.h>
|
#include <driver/netfile.h>
|
||||||
|
|
||||||
@@ -77,13 +87,57 @@ CBaseDec::RetCode CBaseDec::DecoderBase(CAudiofile* const in,
|
|||||||
|
|
||||||
if ( Status == OK )
|
if ( Status == OK )
|
||||||
{
|
{
|
||||||
CFile::FileType ft;
|
#ifndef ENABLE_FFMPEGDEC
|
||||||
if( in->FileType == CFile::STREAM_AUDIO )
|
if( in->FileType == CFile::STREAM_AUDIO )
|
||||||
{
|
{
|
||||||
if ( fstatus( fp, ShoutcastCallback ) < 0 )
|
if ( fstatus( fp, ShoutcastCallback ) < 0 )
|
||||||
{
|
fprintf( stderr, "Error adding shoutcast callback: %s",
|
||||||
fprintf( stderr, "Error adding shoutcast callback: %s", err_txt );
|
err_txt );
|
||||||
|
|
||||||
|
if (ftype(fp, "ogg"))
|
||||||
|
Status = COggDec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
else
|
||||||
|
Status = CMP3Dec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
}
|
}
|
||||||
|
else if( in->FileType == CFile::FILE_MP3)
|
||||||
|
Status = CMP3Dec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
else if( in->FileType == CFile::FILE_OGG )
|
||||||
|
Status = COggDec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
else if( in->FileType == CFile::FILE_WAV )
|
||||||
|
Status = CWavDec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
else if( in->FileType == CFile::FILE_CDR )
|
||||||
|
Status = CCdrDec::getInstance()->Decoder( fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
#ifdef ENABLE_FLAC
|
||||||
|
else if (in->FileType == CFile::FILE_FLAC)
|
||||||
|
Status = CFlacDec::getInstance()->Decoder(fp, OutputFd, state,
|
||||||
|
&in->MetaData, t,
|
||||||
|
secondsToSkip );
|
||||||
|
#endif
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf( stderr, "DecoderBase: Supplied filetype is not " );
|
||||||
|
fprintf( stderr, "supported by Audioplayer.\n" );
|
||||||
|
Status = INTERNAL_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
CFile::FileType ft = in->FileType;
|
||||||
|
if( in->FileType == CFile::STREAM_AUDIO )
|
||||||
|
{
|
||||||
|
if ( fstatus( fp, ShoutcastCallback ) < 0 )
|
||||||
|
fprintf( stderr, "Error adding shoutcast callback: %s", err_txt );
|
||||||
|
|
||||||
if (ftype(fp, "ogg"))
|
if (ftype(fp, "ogg"))
|
||||||
ft = CFile::FILE_OGG;
|
ft = CFile::FILE_OGG;
|
||||||
@@ -98,10 +152,11 @@ CBaseDec::RetCode CBaseDec::DecoderBase(CAudiofile* const in,
|
|||||||
if (!fstat(fileno(fp), &st))
|
if (!fstat(fileno(fp), &st))
|
||||||
in->MetaData.filesize = st.st_size;
|
in->MetaData.filesize = st.st_size;
|
||||||
|
|
||||||
ft = in->FileType;
|
|
||||||
}
|
}
|
||||||
|
in->MetaData.type = ft;
|
||||||
|
|
||||||
Status = CFfmpegDec::getInstance()->Decoder(fp, ft, OutputFd, state, &in->MetaData, t, secondsToSkip );
|
Status = CFfmpegDec::getInstance()->Decoder(fp, OutputFd, state, &in->MetaData, t, secondsToSkip );
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( fclose( fp ) == EOF )
|
if ( fclose( fp ) == EOF )
|
||||||
{
|
{
|
||||||
@@ -151,6 +206,15 @@ bool CBaseDec::GetMetaDataBase(CAudiofile* const in, const bool nice)
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
bool Status = true;
|
bool Status = true;
|
||||||
|
#ifndef ENABLE_FFMPEGDEC
|
||||||
|
if (in->FileType == CFile::FILE_MP3 || in->FileType == CFile::FILE_OGG
|
||||||
|
|| in->FileType == CFile::FILE_WAV || in->FileType == CFile::FILE_CDR
|
||||||
|
#ifdef ENABLE_FLAC
|
||||||
|
|| in->FileType == CFile::FILE_FLAC
|
||||||
|
#endif
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
FILE* fp = fopen( in->Filename.c_str(), "r" );
|
FILE* fp = fopen( in->Filename.c_str(), "r" );
|
||||||
if ( fp == NULL )
|
if ( fp == NULL )
|
||||||
{
|
{
|
||||||
@@ -160,66 +224,62 @@ bool CBaseDec::GetMetaDataBase(CAudiofile* const in, const bool nice)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
#ifndef ENABLE_FFMPEGDEC
|
||||||
|
if(in->FileType == CFile::FILE_MP3)
|
||||||
|
{
|
||||||
|
Status = CMP3Dec::getInstance()->GetMetaData(fp, nice,
|
||||||
|
&in->MetaData);
|
||||||
|
}
|
||||||
|
else if(in->FileType == CFile::FILE_OGG)
|
||||||
|
{
|
||||||
|
Status = COggDec::getInstance()->GetMetaData(fp, nice,
|
||||||
|
&in->MetaData);
|
||||||
|
}
|
||||||
|
else if(in->FileType == CFile::FILE_WAV)
|
||||||
|
{
|
||||||
|
Status = CWavDec::getInstance()->GetMetaData(fp, nice,
|
||||||
|
&in->MetaData);
|
||||||
|
}
|
||||||
|
else if(in->FileType == CFile::FILE_CDR)
|
||||||
|
{
|
||||||
|
Status = CCdrDec::getInstance()->GetMetaData(fp, nice,
|
||||||
|
&in->MetaData);
|
||||||
|
}
|
||||||
|
#ifdef ENABLE_FLAC
|
||||||
|
else if (in->FileType == CFile::FILE_FLAC)
|
||||||
|
{
|
||||||
|
CFlacDec FlacDec;
|
||||||
|
Status = FlacDec.GetMetaData(fp, nice, &in->MetaData);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (!fstat(fileno(fp), &st))
|
if (!fstat(fileno(fp), &st))
|
||||||
in->MetaData.filesize = st.st_size;
|
in->MetaData.filesize = st.st_size;
|
||||||
|
in->MetaData.type = in->FileType;
|
||||||
|
|
||||||
CFfmpegDec d;
|
CFfmpegDec d;
|
||||||
Status = d.GetMetaData(fp, in->FileType, nice, &in->MetaData);
|
Status = d.GetMetaData(fp, nice, &in->MetaData);
|
||||||
|
#endif
|
||||||
if (Status)
|
if (Status)
|
||||||
CacheMetaData(in);
|
CacheMetaData(in);
|
||||||
|
|
||||||
if ( fclose( fp ) == EOF )
|
if ( fclose( fp ) == EOF )
|
||||||
{
|
{
|
||||||
fprintf( stderr, "Could not close file %s.\n",
|
fprintf( stderr, "Could not close file %s.\n",
|
||||||
in->Filename.c_str() );
|
in->Filename.c_str() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBaseDec::SetDSP(int soundfd, int fmt, unsigned int dsp_speed, unsigned int channels)
|
|
||||||
{
|
|
||||||
bool crit_error=false;
|
|
||||||
|
|
||||||
if (::ioctl(soundfd, SNDCTL_DSP_RESET))
|
|
||||||
printf("reset failed\n");
|
|
||||||
if(::ioctl(soundfd, SNDCTL_DSP_SETFMT, &fmt))
|
|
||||||
printf("setfmt failed\n");
|
|
||||||
if(::ioctl(soundfd, SNDCTL_DSP_CHANNELS, &channels))
|
|
||||||
printf("channel set failed\n");
|
|
||||||
if (dsp_speed != mSamplerate)
|
|
||||||
{
|
|
||||||
// mute audio to reduce pops when changing samplerate (avia_reset)
|
|
||||||
//bool was_muted = avs_mute(true);
|
|
||||||
if (::ioctl(soundfd, SNDCTL_DSP_SPEED, &dsp_speed))
|
|
||||||
{
|
|
||||||
printf("speed set failed\n");
|
|
||||||
crit_error=true;
|
|
||||||
}
|
}
|
||||||
|
#ifndef ENABLE_FFMPEGDEC
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if 0
|
fprintf( stderr, "GetMetaDataBase: Filetype is not supported for " );
|
||||||
unsigned int rs = 0;
|
fprintf( stderr, "meta data reading.\n" );
|
||||||
::ioctl(soundfd, SNDCTL_DSP_SPEED, &rs);
|
Status = false;
|
||||||
mSamplerate = dsp_speed;
|
}
|
||||||
// disable iec aka digi out (avia reset enables it again)
|
|
||||||
//g_Zapit->IecOff();
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
//usleep(400000);
|
|
||||||
//if (!was_muted)
|
|
||||||
// avs_mute(false);
|
|
||||||
}
|
|
||||||
//printf("Debug: SNDCTL_DSP_RESET %d / SNDCTL_DSP_SPEED %d / SNDCTL_DSP_CHANNELS %d / SNDCTL_DSP_SETFMT %d\n",
|
|
||||||
// SNDCTL_DSP_RESET, SNDCTL_DSP_SPEED, SNDCTL_DSP_CHANNELS, SNDCTL_DSP_SETFMT);
|
|
||||||
return crit_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CBaseDec::avs_mute(bool /*mute*/)
|
return Status;
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CBaseDec::Init()
|
void CBaseDec::Init()
|
||||||
|
@@ -45,8 +45,8 @@ public:
|
|||||||
// the follwing two methods have to be implemented for new decoders
|
// the follwing two methods have to be implemented for new decoders
|
||||||
//@param secondsToSkip: a value of 0 indicates that normal FF/REV operation was requested
|
//@param secondsToSkip: a value of 0 indicates that normal FF/REV operation was requested
|
||||||
// a value > 0 indicates that *one* jump forwards (FF) or backwards (REV) was requested
|
// a value > 0 indicates that *one* jump forwards (FF) or backwards (REV) was requested
|
||||||
virtual RetCode Decoder(FILE *, const CFile::FileType ft, const int, State* const, CAudioMetaData*, time_t* const, unsigned int* const)=0;
|
virtual RetCode Decoder(FILE *, const int, State* const, CAudioMetaData*, time_t* const, unsigned int* const)=0;
|
||||||
virtual bool GetMetaData(FILE *in, const CFile::FileType ft, const bool nice, CAudioMetaData* m)=0;
|
virtual bool GetMetaData(FILE *in, const bool nice, CAudioMetaData* m)=0;
|
||||||
|
|
||||||
static RetCode DecoderBase(CAudiofile* const in, const int OutputFd,
|
static RetCode DecoderBase(CAudiofile* const in, const int OutputFd,
|
||||||
State* const state, time_t* const t,
|
State* const state, time_t* const t,
|
||||||
@@ -55,7 +55,6 @@ public:
|
|||||||
static void Init();
|
static void Init();
|
||||||
|
|
||||||
CBaseDec() {};
|
CBaseDec() {};
|
||||||
static bool SetDSP(int soundfd, int fmt, unsigned int dsp_speed, unsigned int channels);
|
|
||||||
|
|
||||||
static OpenThreads::Mutex metaDataMutex;
|
static OpenThreads::Mutex metaDataMutex;
|
||||||
static std::map<const std::string,CAudiofile> metaDataCache;
|
static std::map<const std::string,CAudiofile> metaDataCache;
|
||||||
@@ -63,7 +62,6 @@ public:
|
|||||||
static bool LookupMetaData(CAudiofile* const in);
|
static bool LookupMetaData(CAudiofile* const in);
|
||||||
static void ClearMetaData();
|
static void ClearMetaData();
|
||||||
private:
|
private:
|
||||||
static bool avs_mute(bool mute);
|
|
||||||
unsigned static int mSamplerate;
|
unsigned static int mSamplerate;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -200,13 +200,13 @@ void CFfmpegDec::DeInit(void)
|
|||||||
in = NULL;
|
in = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
CBaseDec::RetCode CFfmpegDec::Decoder(FILE *_in, const CFile::FileType ft, int /*OutputFd*/, State* state, CAudioMetaData* _meta_data, time_t* time_played, unsigned int* secondsToSkip)
|
CBaseDec::RetCode CFfmpegDec::Decoder(FILE *_in, int /*OutputFd*/, State* state, CAudioMetaData* _meta_data, time_t* time_played, unsigned int* secondsToSkip)
|
||||||
{
|
{
|
||||||
in = _in;
|
in = _in;
|
||||||
RetCode Status=OK;
|
RetCode Status=OK;
|
||||||
is_stream = fseek((FILE *)in, 0, SEEK_SET);
|
is_stream = fseek((FILE *)in, 0, SEEK_SET);
|
||||||
|
|
||||||
if (!SetMetaData((FILE *)in, ft, _meta_data, true)) {
|
if (!SetMetaData((FILE *)in, _meta_data, true)) {
|
||||||
DeInit();
|
DeInit();
|
||||||
Status=DATA_ERR;
|
Status=DATA_ERR;
|
||||||
return Status;
|
return Status;
|
||||||
@@ -384,9 +384,9 @@ CBaseDec::RetCode CFfmpegDec::Decoder(FILE *_in, const CFile::FileType ft, int /
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFfmpegDec::GetMetaData(FILE *_in, const CFile::FileType ft, const bool /*nice*/, CAudioMetaData* m)
|
bool CFfmpegDec::GetMetaData(FILE *_in, const bool /*nice*/, CAudioMetaData* m)
|
||||||
{
|
{
|
||||||
return SetMetaData(_in, ft, m);
|
return SetMetaData(_in, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
CFfmpegDec* CFfmpegDec::getInstance()
|
CFfmpegDec* CFfmpegDec::getInstance()
|
||||||
@@ -399,11 +399,11 @@ CFfmpegDec* CFfmpegDec::getInstance()
|
|||||||
return FfmpegDec;
|
return FfmpegDec;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CFfmpegDec::SetMetaData(FILE *_in, CFile::FileType ft, CAudioMetaData* m, bool save_cover)
|
bool CFfmpegDec::SetMetaData(FILE *_in, CAudioMetaData* m, bool save_cover)
|
||||||
{
|
{
|
||||||
if (!meta_data_valid)
|
if (!meta_data_valid)
|
||||||
{
|
{
|
||||||
if (!Init(_in, ft))
|
if (!Init(_in, (const CFile::FileType) m->type))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
mutex.lock();
|
mutex.lock();
|
||||||
|
@@ -73,14 +73,14 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
static CFfmpegDec* getInstance();
|
static CFfmpegDec* getInstance();
|
||||||
virtual RetCode Decoder(FILE *, const CFile::FileType ft, int, State*, CAudioMetaData* m, time_t* t, unsigned int* secondsToSkip);
|
virtual RetCode Decoder(FILE *, int, State*, CAudioMetaData* m, time_t* t, unsigned int* secondsToSkip);
|
||||||
bool GetMetaData(FILE *in, const CFile::FileType ft, const bool nice, CAudioMetaData* m);
|
bool GetMetaData(FILE *in, const bool nice, CAudioMetaData* m);
|
||||||
CFfmpegDec();
|
CFfmpegDec();
|
||||||
~CFfmpegDec();
|
~CFfmpegDec();
|
||||||
int Read(void *buf, size_t buf_size);
|
int Read(void *buf, size_t buf_size);
|
||||||
int64_t Seek(int64_t offset, int whence);
|
int64_t Seek(int64_t offset, int whence);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool SetMetaData(FILE* in, const CFile::FileType ft, CAudioMetaData* m, bool save_cover = false);
|
virtual bool SetMetaData(FILE* in, CAudioMetaData* m, bool save_cover = false);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -99,7 +99,7 @@ void CAudioMetaData::operator=( const CAudioMetaData& src )
|
|||||||
|
|
||||||
void CAudioMetaData::clear()
|
void CAudioMetaData::clear()
|
||||||
{
|
{
|
||||||
type=NONE;
|
type=0;
|
||||||
type_info.clear();
|
type_info.clear();
|
||||||
filesize=0;
|
filesize=0;
|
||||||
bitrate=0;
|
bitrate=0;
|
||||||
|
@@ -61,7 +61,7 @@ public:
|
|||||||
WAV,
|
WAV,
|
||||||
FLAC
|
FLAC
|
||||||
};
|
};
|
||||||
AudioType type;
|
int type;
|
||||||
std::string type_info;
|
std::string type_info;
|
||||||
|
|
||||||
long filesize; /* filesize in bits (for mp3: without leading id3 tag) */
|
long filesize; /* filesize in bits (for mp3: without leading id3 tag) */
|
||||||
|
Reference in New Issue
Block a user