diff --git a/src/Makefile.am b/src/Makefile.am index 4f27c1cb8..41330479f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/driver/audiodec/Makefile.am b/src/driver/audiodec/Makefile.am index 16819b320..f0824e60a 100644 --- a/src/driver/audiodec/Makefile.am +++ b/src/driver/audiodec/Makefile.am @@ -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) diff --git a/src/driver/audiodec/basedec.cpp b/src/driver/audiodec/basedec.cpp index 9c041a6d1..0c4c1bd52 100644 --- a/src/driver/audiodec/basedec.cpp +++ b/src/driver/audiodec/basedec.cpp @@ -40,7 +40,17 @@ #include #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 @@ -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() diff --git a/src/driver/audiodec/basedec.h b/src/driver/audiodec/basedec.h index a582facd3..7e5bd3c27 100644 --- a/src/driver/audiodec/basedec.h +++ b/src/driver/audiodec/basedec.h @@ -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 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; }; diff --git a/src/driver/audiodec/ffmpegdec.cpp b/src/driver/audiodec/ffmpegdec.cpp index a698bbb82..9294ebc9f 100644 --- a/src/driver/audiodec/ffmpegdec.cpp +++ b/src/driver/audiodec/ffmpegdec.cpp @@ -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(); diff --git a/src/driver/audiodec/ffmpegdec.h b/src/driver/audiodec/ffmpegdec.h index 16f618e15..7cafb6e85 100644 --- a/src/driver/audiodec/ffmpegdec.h +++ b/src/driver/audiodec/ffmpegdec.h @@ -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 diff --git a/src/driver/audiometadata.cpp b/src/driver/audiometadata.cpp index 69304bec3..043effd60 100644 --- a/src/driver/audiometadata.cpp +++ b/src/driver/audiometadata.cpp @@ -99,7 +99,7 @@ void CAudioMetaData::operator=( const CAudioMetaData& src ) void CAudioMetaData::clear() { - type=NONE; + type=0; type_info.clear(); filesize=0; bitrate=0; diff --git a/src/driver/audiometadata.h b/src/driver/audiometadata.h index 091927cc9..5d93a4639 100644 --- a/src/driver/audiometadata.h +++ b/src/driver/audiometadata.h @@ -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) */