mirror of
https://github.com/tuxbox-neutrino/neutrino.git
synced 2025-08-27 23:42:58 +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
|
||||
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 \
|
||||
|
@@ -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)
|
||||
|
@@ -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 );
|
||||
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;
|
||||
@@ -98,10 +152,11 @@ CBaseDec::RetCode CBaseDec::DecoderBase(CAudiofile* const in,
|
||||
if (!fstat(fileno(fp), &st))
|
||||
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,6 +206,15 @@ bool CBaseDec::GetMetaDataBase(CAudiofile* const in, const bool nice)
|
||||
return 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" );
|
||||
if ( fp == NULL )
|
||||
{
|
||||
@@ -160,66 +224,62 @@ bool CBaseDec::GetMetaDataBase(CAudiofile* const in, const bool nice)
|
||||
}
|
||||
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;
|
||||
if (!fstat(fileno(fp), &st))
|
||||
in->MetaData.filesize = st.st_size;
|
||||
in->MetaData.type = in->FileType;
|
||||
|
||||
CFfmpegDec d;
|
||||
Status = d.GetMetaData(fp, in->FileType, nice, &in->MetaData);
|
||||
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() );
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
#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();
|
||||
fprintf( stderr, "GetMetaDataBase: Filetype is not supported for " );
|
||||
fprintf( stderr, "meta data reading.\n" );
|
||||
Status = false;
|
||||
}
|
||||
#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 true;
|
||||
return Status;
|
||||
}
|
||||
|
||||
void CBaseDec::Init()
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
|
@@ -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();
|
||||
|
@@ -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
|
||||
|
@@ -99,7 +99,7 @@ void CAudioMetaData::operator=( const CAudioMetaData& src )
|
||||
|
||||
void CAudioMetaData::clear()
|
||||
{
|
||||
type=NONE;
|
||||
type=0;
|
||||
type_info.clear();
|
||||
filesize=0;
|
||||
bitrate=0;
|
||||
|
@@ -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) */
|
||||
|
Reference in New Issue
Block a user