taglib: Remove virtual functions workaround in audioproperties

This commit is contained in:
Jonas Kvinge 2020-06-22 03:20:17 +02:00
parent ad4230f7fa
commit 2beb4b8c6f
2 changed files with 16 additions and 63 deletions

View File

@ -23,79 +23,27 @@
* http://www.mozilla.org/MPL/ *
***************************************************************************/
#include <tbytevector.h>
#include "aiffproperties.h"
#include "apeproperties.h"
#include "asfproperties.h"
#include "flacproperties.h"
#include "mp4properties.h"
#include "mpcproperties.h"
#include "mpegproperties.h"
#include "opusproperties.h"
#include "speexproperties.h"
#include "trueaudioproperties.h"
#include "vorbisproperties.h"
#include "wavproperties.h"
#include "wavpackproperties.h"
#include "dsfproperties.h"
#include "dsdiffproperties.h"
#include <tstringlist.h>
#include "audioproperties.h"
using namespace Strawberry_TagLib::TagLib;
// This macro is a workaround for the fact that we can't add virtual functions.
// Should be true virtual functions in taglib2.
#define VIRTUAL_FUNCTION_WORKAROUND(function_name, default_value) \
if (dynamic_cast<const APE::AudioProperties*>(this)) \
return dynamic_cast<const APE::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const ASF::AudioProperties*>(this)) \
return dynamic_cast<const ASF::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const FLAC::AudioProperties*>(this)) \
return dynamic_cast<const FLAC::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const MP4::AudioProperties*>(this)) \
return dynamic_cast<const MP4::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const MPC::AudioProperties*>(this)) \
return dynamic_cast<const MPC::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const MPEG::AudioProperties*>(this)) \
return dynamic_cast<const MPEG::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const Ogg::Opus::AudioProperties*>(this)) \
return dynamic_cast<const Ogg::Opus::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const Ogg::Speex::AudioProperties*>(this)) \
return dynamic_cast<const Ogg::Speex::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const TrueAudio::AudioProperties*>(this)) \
return dynamic_cast<const TrueAudio::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const RIFF::AIFF::AudioProperties*>(this)) \
return dynamic_cast<const RIFF::AIFF::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const RIFF::WAV::AudioProperties*>(this)) \
return dynamic_cast<const RIFF::WAV::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const Vorbis::AudioProperties*>(this)) \
return dynamic_cast<const Vorbis::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const WavPack::AudioProperties*>(this)) \
return dynamic_cast<const WavPack::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const DSF::AudioProperties*>(this)) \
return dynamic_cast<const DSF::AudioProperties*>(this)->function_name(); \
else if (dynamic_cast<const DSDIFF::AudioProperties*>(this)) \
return dynamic_cast<const DSDIFF::AudioProperties*>(this)->function_name(); \
else \
return (default_value);
class AudioProperties::AudioPropertiesPrivate {};
////////////////////////////////////////////////////////////////////////////////
// public methods
////////////////////////////////////////////////////////////////////////////////
AudioProperties::~AudioProperties() {}
int AudioProperties::lengthInSeconds() const {
VIRTUAL_FUNCTION_WORKAROUND(lengthInSeconds, 0)
}
int AudioProperties::lengthInMilliseconds() const {
VIRTUAL_FUNCTION_WORKAROUND(lengthInMilliseconds, 0)
String AudioProperties::toString() const {
StringList desc;
desc.append("Audio");
desc.append(String::number(lengthInSeconds()) + " seconds");
desc.append(String::number(bitrate()) + " kbps");
return desc.toString(", ");
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -67,14 +67,14 @@ class TAGLIB_EXPORT AudioProperties {
*
* \see lengthInMilliseconds()
*/
virtual int lengthInSeconds() const;
virtual int lengthInSeconds() const = 0;
/*!
* Returns the length of the file in milliseconds.
*
* \see lengthInSeconds()
*/
virtual int lengthInMilliseconds() const;
virtual int lengthInMilliseconds() const = 0;
/*!
* Returns the most appropriate bit rate for the file in kb/s. For constant bitrate formats this is simply the bitrate of the file.
@ -92,6 +92,11 @@ class TAGLIB_EXPORT AudioProperties {
*/
virtual int channels() const = 0;
/*!
* Returns description of the audio file.
*/
virtual String toString() const;
protected:
/*!
* Construct an audio properties instance.