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:
[CST] Focus
2013-12-15 14:31:39 +04:00
parent 64e2a0c2ad
commit 0cb07d75d9
8 changed files with 177 additions and 85 deletions

View File

@@ -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 \

View File

@@ -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)

View File

@@ -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()

View File

@@ -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;
}; };

View File

@@ -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();

View File

@@ -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

View File

@@ -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;

View File

@@ -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) */