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
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
neutrino_SOURCES = neutrino_menue.cpp neutrino.cpp
@@ -90,7 +111,7 @@ neutrino_LDADD = \
@AVFORMAT_LIBS@ \
@AVUTIL_LIBS@ \
@AVCODEC_LIBS@ \
@SWRESAMPLE_LIBS@ \
$(ADEC_LIBS) \
-ldvbsi++ \
-ljpeg \
-lOpenThreads \

View File

@@ -23,6 +23,19 @@ endif
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 = \
basedec.cpp \
ffmpegdec.cpp
$(ASOURCES)

View File

@@ -40,7 +40,17 @@
#include <zapit/client/zapittools.h>
#include "basedec.h"
#ifdef ENABLE_FFMPEGDEC
#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>
@@ -77,13 +87,57 @@ CBaseDec::RetCode CBaseDec::DecoderBase(CAudiofile* const in,
if ( Status == OK )
{
CFile::FileType ft;
#ifndef ENABLE_FFMPEGDEC
if( in->FileType == CFile::STREAM_AUDIO )
{
if ( fstatus( fp, ShoutcastCallback ) < 0 )
fprintf( stderr, "Error adding shoutcast callback: %s",
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"))
ft = CFile::FILE_OGG;
@@ -96,12 +150,13 @@ CBaseDec::RetCode CBaseDec::DecoderBase(CAudiofile* const in,
{
struct stat 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 )
{
@@ -151,75 +206,80 @@ bool CBaseDec::GetMetaDataBase(CAudiofile* const in, const bool nice)
return true;
bool Status = true;
FILE* fp = fopen( in->Filename.c_str(), "r" );
if ( fp == NULL )
#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
{
fprintf( stderr, "Error opening file %s for meta data reading.\n",
in->Filename.c_str() );
Status = false;
}
else
{
struct stat st;
if (!fstat(fileno(fp), &st))
in->MetaData.filesize = st.st_size;
CFfmpegDec d;
Status = d.GetMetaData(fp, in->FileType, nice, &in->MetaData);
if (Status)
CacheMetaData(in);
if ( fclose( fp ) == EOF )
FILE* fp = fopen( in->Filename.c_str(), "r" );
if ( fp == NULL )
{
fprintf( stderr, "Could not close file %s.\n",
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;
fprintf( stderr, "Error opening file %s for meta data reading.\n",
in->Filename.c_str() );
Status = false;
}
else
{
#if 0
unsigned int rs = 0;
::ioctl(soundfd, SNDCTL_DSP_SPEED, &rs);
mSamplerate = dsp_speed;
// disable iec aka digi out (avia reset enables it again)
//g_Zapit->IecOff();
#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
}
//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;
}
#else
struct stat st;
if (!fstat(fileno(fp), &st))
in->MetaData.filesize = st.st_size;
in->MetaData.type = in->FileType;
bool CBaseDec::avs_mute(bool /*mute*/)
{
return true;
CFfmpegDec d;
Status = d.GetMetaData(fp, nice, &in->MetaData);
#endif
if (Status)
CacheMetaData(in);
if ( fclose( fp ) == EOF )
{
fprintf( stderr, "Could not close file %s.\n",
in->Filename.c_str() );
}
}
}
#ifndef ENABLE_FFMPEGDEC
else
{
fprintf( stderr, "GetMetaDataBase: Filetype is not supported for " );
fprintf( stderr, "meta data reading.\n" );
Status = false;
}
#endif
return Status;
}
void CBaseDec::Init()

View File

@@ -45,8 +45,8 @@ public:
// 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
// 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 bool GetMetaData(FILE *in, const CFile::FileType ft, const bool nice, CAudioMetaData* m)=0;
virtual RetCode Decoder(FILE *, const int, State* const, CAudioMetaData*, time_t* const, unsigned int* const)=0;
virtual bool GetMetaData(FILE *in, const bool nice, CAudioMetaData* m)=0;
static RetCode DecoderBase(CAudiofile* const in, const int OutputFd,
State* const state, time_t* const t,
@@ -55,7 +55,6 @@ public:
static void Init();
CBaseDec() {};
static bool SetDSP(int soundfd, int fmt, unsigned int dsp_speed, unsigned int channels);
static OpenThreads::Mutex metaDataMutex;
static std::map<const std::string,CAudiofile> metaDataCache;
@@ -63,7 +62,6 @@ public:
static bool LookupMetaData(CAudiofile* const in);
static void ClearMetaData();
private:
static bool avs_mute(bool mute);
unsigned static int mSamplerate;
};

View File

@@ -200,13 +200,13 @@ void CFfmpegDec::DeInit(void)
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;
RetCode Status=OK;
is_stream = fseek((FILE *)in, 0, SEEK_SET);
if (!SetMetaData((FILE *)in, ft, _meta_data, true)) {
if (!SetMetaData((FILE *)in, _meta_data, true)) {
DeInit();
Status=DATA_ERR;
return Status;
@@ -384,9 +384,9 @@ CBaseDec::RetCode CFfmpegDec::Decoder(FILE *_in, const CFile::FileType ft, int /
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()
@@ -399,11 +399,11 @@ CFfmpegDec* CFfmpegDec::getInstance()
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 (!Init(_in, ft))
if (!Init(_in, (const CFile::FileType) m->type))
return false;
mutex.lock();

View File

@@ -73,14 +73,14 @@ private:
public:
static CFfmpegDec* getInstance();
virtual RetCode Decoder(FILE *, const CFile::FileType ft, int, State*, CAudioMetaData* m, time_t* t, unsigned int* secondsToSkip);
bool GetMetaData(FILE *in, const CFile::FileType ft, const bool nice, CAudioMetaData* m);
virtual RetCode Decoder(FILE *, int, State*, CAudioMetaData* m, time_t* t, unsigned int* secondsToSkip);
bool GetMetaData(FILE *in, const bool nice, CAudioMetaData* m);
CFfmpegDec();
~CFfmpegDec();
int Read(void *buf, size_t buf_size);
int64_t Seek(int64_t offset, int whence);
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

View File

@@ -99,7 +99,7 @@ void CAudioMetaData::operator=( const CAudioMetaData& src )
void CAudioMetaData::clear()
{
type=NONE;
type=0;
type_info.clear();
filesize=0;
bitrate=0;

View File

@@ -61,7 +61,7 @@ public:
WAV,
FLAC
};
AudioType type;
int type;
std::string type_info;
long filesize; /* filesize in bits (for mp3: without leading id3 tag) */