From 4c3834cdb5ea91b4f7252a9df2ef686590674479 Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sun, 19 Jun 2011 12:16:33 -0700 Subject: [PATCH] Avoid calling function pointers for FLAC directly --- src/codec_flac.cpp | 58 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/src/codec_flac.cpp b/src/codec_flac.cpp index f45317f..5e6b0bd 100644 --- a/src/codec_flac.cpp +++ b/src/codec_flac.cpp @@ -33,14 +33,7 @@ #include -#ifdef _WIN32 -#define FLAC_LIB "libFLAC.dll" -#elif defined(__APPLE__) -#define FLAC_LIB "libFLAC.8.dylib" -#else -#define FLAC_LIB "libFLAC.so.8" -#endif - +#ifdef DYNLOAD static void *flac_handle; #define MAKE_FUNC(x) static typeof(x)* p##x MAKE_FUNC(FLAC__stream_decoder_get_state); @@ -53,6 +46,18 @@ MAKE_FUNC(FLAC__stream_decoder_process_single); MAKE_FUNC(FLAC__stream_decoder_init_stream); #undef MAKE_FUNC +#define FLAC__stream_decoder_get_state pFLAC__stream_decoder_get_state +#define FLAC__stream_decoder_finish pFLAC__stream_decoder_finish +#define FLAC__stream_decoder_new pFLAC__stream_decoder_new +#define FLAC__stream_decoder_seek_absolute pFLAC__stream_decoder_seek_absolute +#define FLAC__stream_decoder_delete pFLAC__stream_decoder_delete +#define FLAC__stream_decoder_get_total_samples pFLAC__stream_decoder_get_total_samples +#define FLAC__stream_decoder_process_single pFLAC__stream_decoder_process_single +#define FLAC__stream_decoder_init_stream pFLAC__stream_decoder_init_stream +#else +#define flac_handle 1 +#endif + struct flacStream : public alureStream { private: @@ -69,8 +74,17 @@ private: ALuint outLen; public: +#ifdef DYNLOAD static void Init() { +#ifdef _WIN32 +#define FLAC_LIB "libFLAC.dll" +#elif defined(__APPLE__) +#define FLAC_LIB "libFLAC.8.dylib" +#else +#define FLAC_LIB "libFLAC.so.8" +#endif + flac_handle = OpenLib(FLAC_LIB); if(!flac_handle) return; @@ -89,6 +103,10 @@ public: CloseLib(flac_handle); flac_handle = NULL; } +#else + static void Init() { } + static void Deinit() { } +#endif virtual bool IsValid() { return flacFile != NULL; } @@ -117,8 +135,8 @@ public: while(outLen < outMax) { - if(pFLAC__stream_decoder_process_single(flacFile) == false || - pFLAC__stream_decoder_get_state(flacFile) == FLAC__STREAM_DECODER_END_OF_STREAM) + if(FLAC__stream_decoder_process_single(flacFile) == false || + FLAC__stream_decoder_get_state(flacFile) == FLAC__STREAM_DECODER_END_OF_STREAM) break; } @@ -127,7 +145,7 @@ public: virtual bool Rewind() { - if(pFLAC__stream_decoder_seek_absolute(flacFile, 0) != false) + if(FLAC__stream_decoder_seek_absolute(flacFile, 0) != false) { initialData.clear(); return true; @@ -139,7 +157,7 @@ public: virtual alureInt64 GetLength() { - return pFLAC__stream_decoder_get_total_samples(flacFile); + return FLAC__stream_decoder_get_total_samples(flacFile); } flacStream(std::istream *_fstream) @@ -148,10 +166,10 @@ public: { if(!flac_handle) return; - flacFile = pFLAC__stream_decoder_new(); + flacFile = FLAC__stream_decoder_new(); if(flacFile) { - if(pFLAC__stream_decoder_init_stream(flacFile, ReadCallback, SeekCallback, TellCallback, LengthCallback, EofCallback, WriteCallback, MetadataCallback, ErrorCallback, this) == FLAC__STREAM_DECODER_INIT_STATUS_OK) + if(FLAC__stream_decoder_init_stream(flacFile, ReadCallback, SeekCallback, TellCallback, LengthCallback, EofCallback, WriteCallback, MetadataCallback, ErrorCallback, this) == FLAC__STREAM_DECODER_INIT_STATUS_OK) { if(InitFlac()) { @@ -159,9 +177,9 @@ public: return; } - pFLAC__stream_decoder_finish(flacFile); + FLAC__stream_decoder_finish(flacFile); } - pFLAC__stream_decoder_delete(flacFile); + FLAC__stream_decoder_delete(flacFile); flacFile = NULL; } } @@ -170,8 +188,8 @@ public: { if(flacFile) { - pFLAC__stream_decoder_finish(flacFile); - pFLAC__stream_decoder_delete(flacFile); + FLAC__stream_decoder_finish(flacFile); + FLAC__stream_decoder_delete(flacFile); flacFile = NULL; } } @@ -188,8 +206,8 @@ private: outLen = 0; while(initialData.size() == 0) { - if(pFLAC__stream_decoder_process_single(flacFile) == false || - pFLAC__stream_decoder_get_state(flacFile) == FLAC__STREAM_DECODER_END_OF_STREAM) + if(FLAC__stream_decoder_process_single(flacFile) == false || + FLAC__stream_decoder_get_state(flacFile) == FLAC__STREAM_DECODER_END_OF_STREAM) break; } -- 2.11.4.GIT