Skip to content

Commit

Permalink
refactor: move internalpayerbackend out of config.cc to src/audio
Browse files Browse the repository at this point in the history
  • Loading branch information
shenlebantongying authored Nov 16, 2024
1 parent c7d0feb commit bd13598
Show file tree
Hide file tree
Showing 9 changed files with 157 additions and 143 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/PR-check-cmake.yml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ jobs:
libzim \
qt
wget ftp://ftp.sra.co.jp/pub/misc/eb/eb-4.4.3.tar.bz2
wget https://github.com/mistydemeo/eb/releases/download/v4.4.3/eb-4.4.3.tar.bz2
tar xvjf eb-4.4.3.tar.bz2
cd eb-4.4.3 && ./configure && make -j 8 && sudo make install && cd ..
Expand Down
33 changes: 19 additions & 14 deletions src/audio/audioplayerfactory.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,39 @@

#include <QScopedPointer>
#include <QObject>
#include <utility>
#include "audioplayerfactory.hh"
#include "ffmpegaudioplayer.hh"
#include "multimediaaudioplayer.hh"
#include "externalaudioplayer.hh"
#include "gddebug.hh"

AudioPlayerFactory::AudioPlayerFactory( Config::Preferences const & p ):
useInternalPlayer( p.useInternalPlayer ),
internalPlayerBackend( p.internalPlayerBackend ),
audioPlaybackProgram( p.audioPlaybackProgram )
AudioPlayerFactory::AudioPlayerFactory( bool useInternalPlayer,
InternalPlayerBackend internalPlayerBackend,
QString audioPlaybackProgram ):
useInternalPlayer( useInternalPlayer ),
internalPlayerBackend( std::move( internalPlayerBackend ) ),
audioPlaybackProgram( std::move( audioPlaybackProgram ) )
{
reset();
}

void AudioPlayerFactory::setPreferences( Config::Preferences const & p )
void AudioPlayerFactory::setPreferences( bool new_useInternalPlayer,
const InternalPlayerBackend & new_internalPlayerBackend,
const QString & new_audioPlaybackProgram )
{
if ( p.useInternalPlayer != useInternalPlayer ) {
useInternalPlayer = p.useInternalPlayer;
internalPlayerBackend = p.internalPlayerBackend;
audioPlaybackProgram = p.audioPlaybackProgram;
if ( useInternalPlayer != new_useInternalPlayer ) {
useInternalPlayer = new_useInternalPlayer;
internalPlayerBackend = new_internalPlayerBackend;
audioPlaybackProgram = new_audioPlaybackProgram;
reset();
}
else if ( useInternalPlayer && p.internalPlayerBackend != internalPlayerBackend ) {
internalPlayerBackend = p.internalPlayerBackend;
else if ( useInternalPlayer && internalPlayerBackend != new_internalPlayerBackend ) {
internalPlayerBackend = new_internalPlayerBackend;
reset();
}
else if ( !useInternalPlayer && p.audioPlaybackProgram != audioPlaybackProgram ) {
audioPlaybackProgram = p.audioPlaybackProgram;
else if ( !useInternalPlayer && new_audioPlaybackProgram != audioPlaybackProgram ) {
audioPlaybackProgram = new_audioPlaybackProgram;
ExternalAudioPlayer * const externalPlayer = qobject_cast< ExternalAudioPlayer * >( playerPtr.data() );
if ( externalPlayer ) {
setAudioPlaybackProgram( *externalPlayer );
Expand All @@ -50,7 +55,7 @@ void AudioPlayerFactory::reset()
// another object of the same type.

#ifdef MAKE_FFMPEG_PLAYER
Q_ASSERT( Config::InternalPlayerBackend::defaultBackend().isFfmpeg()
Q_ASSERT( InternalPlayerBackend::defaultBackend().isFfmpeg()
&& "Adjust the code below after changing the default backend." );

if ( !internalPlayerBackend.isQtmultimedia() ) {
Expand Down
12 changes: 8 additions & 4 deletions src/audio/audioplayerfactory.hh
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#pragma once

#include "audioplayerinterface.hh"
#include "config.hh"
#include "internalplayerbackend.hh"

class ExternalAudioPlayer;

Expand All @@ -13,8 +13,12 @@ class AudioPlayerFactory
Q_DISABLE_COPY( AudioPlayerFactory )

public:
explicit AudioPlayerFactory( Config::Preferences const & );
void setPreferences( Config::Preferences const & );
explicit AudioPlayerFactory( bool useInternalPlayer,
InternalPlayerBackend internalPlayerBackend,
QString audioPlaybackProgram );
void setPreferences( bool new_useInternalPlayer,
const InternalPlayerBackend & new_internalPlayerBackend,
const QString & new_audioPlaybackProgram );
/// The returned reference to a smart pointer is valid as long as this object
/// exists. The pointer to the owned AudioPlayerInterface may change after the
/// call to setPreferences(), but it is guaranteed to never be null.
Expand All @@ -28,7 +32,7 @@ private:
void setAudioPlaybackProgram( ExternalAudioPlayer & externalPlayer );

bool useInternalPlayer;
Config::InternalPlayerBackend internalPlayerBackend;
InternalPlayerBackend internalPlayerBackend;
QString audioPlaybackProgram;
AudioPlayerPtr playerPtr;
};
51 changes: 51 additions & 0 deletions src/audio/internalplayerbackend.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#include "internalplayerbackend.hh"

bool InternalPlayerBackend::anyAvailable()
{
#if defined( MAKE_FFMPEG_PLAYER ) || defined( MAKE_QTMULTIMEDIA_PLAYER )
return true;
#else
return false;
#endif
}

InternalPlayerBackend InternalPlayerBackend::defaultBackend()
{
#if defined( MAKE_FFMPEG_PLAYER )
return ffmpeg();
#elif defined( MAKE_QTMULTIMEDIA_PLAYER )
return qtmultimedia();
#else
return InternalPlayerBackend( QString() );
#endif
}

QStringList InternalPlayerBackend::nameList()
{
QStringList result;
#ifdef MAKE_FFMPEG_PLAYER
result.push_back( ffmpeg().uiName() );
#endif
#ifdef MAKE_QTMULTIMEDIA_PLAYER
result.push_back( qtmultimedia().uiName() );
#endif
return result;
}

bool InternalPlayerBackend::isFfmpeg() const
{
#ifdef MAKE_FFMPEG_PLAYER
return *this == ffmpeg();
#else
return false;
#endif
}

bool InternalPlayerBackend::isQtmultimedia() const
{
#ifdef MAKE_QTMULTIMEDIA_PLAYER
return *this == qtmultimedia();
#else
return false;
#endif
}
61 changes: 61 additions & 0 deletions src/audio/internalplayerbackend.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#pragma once
#include <QStringList>

/// Overly engineered dummy/helper/wrapper "backend", which is not, to manage backends.
class InternalPlayerBackend
{
public:
/// Returns true if at least one backend is available.
static bool anyAvailable();
/// Returns the default backend or null backend if none is available.
static InternalPlayerBackend defaultBackend();
/// Returns the name list of supported backends.
static QStringList nameList();

/// Returns true if built with FFmpeg player support and the name matches.
bool isFfmpeg() const;
/// Returns true if built with Qt Multimedia player support and the name matches.
bool isQtmultimedia() const;

QString const & uiName() const
{
return name;
}

void setUiName( QString const & name_ )
{
name = name_;
}

bool operator==( InternalPlayerBackend const & other ) const
{
return name == other.name;
}

bool operator!=( InternalPlayerBackend const & other ) const
{
return !operator==( other );
}

private:
#ifdef MAKE_FFMPEG_PLAYER
static InternalPlayerBackend ffmpeg()
{
return InternalPlayerBackend( "FFmpeg" );
}
#endif

#ifdef MAKE_QTMULTIMEDIA_PLAYER
static InternalPlayerBackend qtmultimedia()
{
return InternalPlayerBackend( "Qt Multimedia" );
}
#endif

explicit InternalPlayerBackend( QString const & name_ ):
name( name_ )
{
}

QString name;
};
51 changes: 0 additions & 51 deletions src/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -119,57 +119,6 @@ QKeySequence HotKey::toKeySequence() const
;
}


bool InternalPlayerBackend::anyAvailable()
{
#if defined( MAKE_FFMPEG_PLAYER ) || defined( MAKE_QTMULTIMEDIA_PLAYER )
return true;
#else
return false;
#endif
}

InternalPlayerBackend InternalPlayerBackend::defaultBackend()
{
#if defined( MAKE_FFMPEG_PLAYER )
return ffmpeg();
#elif defined( MAKE_QTMULTIMEDIA_PLAYER )
return qtmultimedia();
#else
return InternalPlayerBackend( QString() );
#endif
}

QStringList InternalPlayerBackend::nameList()
{
QStringList result;
#ifdef MAKE_FFMPEG_PLAYER
result.push_back( ffmpeg().uiName() );
#endif
#ifdef MAKE_QTMULTIMEDIA_PLAYER
result.push_back( qtmultimedia().uiName() );
#endif
return result;
}

bool InternalPlayerBackend::isFfmpeg() const
{
#ifdef MAKE_FFMPEG_PLAYER
return *this == ffmpeg();
#else
return false;
#endif
}

bool InternalPlayerBackend::isQtmultimedia() const
{
#ifdef MAKE_QTMULTIMEDIA_PLAYER
return *this == qtmultimedia();
#else
return false;
#endif
}

QString Preferences::sanitizeInputPhrase( QString const & inputWord ) const
{
QString result = inputWord;
Expand Down
79 changes: 10 additions & 69 deletions src/config.hh
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,20 @@

#pragma once

#include <QObject>
#include <QList>
#include <QString>
#include <QSize>
#include <QDateTime>
#include <QKeySequence>
#include <QSet>
#include <QMetaType>
#include "audio/internalplayerbackend.hh"
#include "ex.hh"
#include <QDateTime>
#include <QDomDocument>
#include <QKeySequence>
#include <QList>
#include <QLocale>
#include <optional>
#include <QMetaType>
#include <QObject>
#include <QSet>
#include <QSize>
#include <QString>
#include <QThread>
#include <optional>

/// Special group IDs
enum GroupId : unsigned {
Expand Down Expand Up @@ -269,66 +270,6 @@ struct CustomFonts
}
};

/// This class encapsulates supported backend preprocessor logic,
/// discourages duplicating backend names in code, which is error-prone.
class InternalPlayerBackend
{
public:
/// Returns true if at least one backend is available.
static bool anyAvailable();
/// Returns the default backend or null backend if none is available.
static InternalPlayerBackend defaultBackend();
/// Returns the name list of supported backends.
static QStringList nameList();

/// Returns true if built with FFmpeg player support and the name matches.
bool isFfmpeg() const;
/// Returns true if built with Qt Multimedia player support and the name matches.
bool isQtmultimedia() const;

QString const & uiName() const
{
return name;
}

void setUiName( QString const & name_ )
{
name = name_;
}

bool operator==( InternalPlayerBackend const & other ) const
{
return name == other.name;
}

bool operator!=( InternalPlayerBackend const & other ) const
{
return !operator==( other );
}

private:
#ifdef MAKE_FFMPEG_PLAYER
static InternalPlayerBackend ffmpeg()
{
return InternalPlayerBackend( "FFmpeg" );
}
#endif

#ifdef MAKE_QTMULTIMEDIA_PLAYER
static InternalPlayerBackend qtmultimedia()
{
return InternalPlayerBackend( "Qt Multimedia" );
}
#endif

explicit InternalPlayerBackend( QString const & name_ ):
name( name_ )
{
}

QString name;
};

/// Various user preferences
struct Preferences
{
Expand Down
7 changes: 5 additions & 2 deletions src/ui/mainwindow.cc
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ MainWindow::MainWindow( Config::Class & cfg_ ):
cfg.preferences.disallowContentFromOtherSites,
cfg.preferences.hideGoldenDictHeader ),
dictNetMgr( this ),
audioPlayerFactory( cfg.preferences ),
audioPlayerFactory(
cfg.preferences.useInternalPlayer, cfg.preferences.internalPlayerBackend, cfg.preferences.audioPlaybackProgram ),
wordFinder( this ),
wordListSelChanged( false ),
wasMaximized( false ),
Expand Down Expand Up @@ -2356,7 +2357,9 @@ void MainWindow::editPreferences()
#endif
}

audioPlayerFactory.setPreferences( cfg.preferences );
audioPlayerFactory.setPreferences( cfg.preferences.useInternalPlayer,
cfg.preferences.internalPlayerBackend,
cfg.preferences.audioPlaybackProgram );

trayIconUpdateOrInit();
applyProxySettings();
Expand Down
Loading

0 comments on commit bd13598

Please sign in to comment.