Use C++11 enum class

This commit is contained in:
Jonas Kvinge
2023-02-18 14:09:27 +01:00
parent e6c5f76872
commit dd72fb4ca5
237 changed files with 2915 additions and 2840 deletions

View File

@@ -81,8 +81,8 @@ const char *CommandlineOptions::kVersionText = "Strawberry %1";
CommandlineOptions::CommandlineOptions(int argc, char **argv)
: argc_(argc),
argv_(argv),
url_list_action_(UrlList_None),
player_action_(Player_None),
url_list_action_(UrlListAction::None),
player_action_(PlayerAction::None),
set_volume_(-1),
volume_modifier_(0),
seek_to_(-1),
@@ -128,13 +128,13 @@ bool CommandlineOptions::Parse() {
{"previous", no_argument, nullptr, 'r'},
{"next", no_argument, nullptr, 'f'},
{"volume", required_argument, nullptr, 'v'},
{"volume-up", no_argument, nullptr, VolumeUp},
{"volume-down", no_argument, nullptr, VolumeDown},
{"volume-increase-by", required_argument, nullptr, VolumeIncreaseBy},
{"volume-decrease-by", required_argument, nullptr, VolumeDecreaseBy},
{"seek-to", required_argument, nullptr, SeekTo},
{"seek-by", required_argument, nullptr, SeekBy},
{"restart-or-previous", no_argument, nullptr, RestartOrPrevious},
{"volume-up", no_argument, nullptr, LongOptions::VolumeUp},
{"volume-down", no_argument, nullptr, LongOptions::VolumeDown},
{"volume-increase-by", required_argument, nullptr, LongOptions::VolumeIncreaseBy},
{"volume-decrease-by", required_argument, nullptr, LongOptions::VolumeDecreaseBy},
{"seek-to", required_argument, nullptr, LongOptions::SeekTo},
{"seek-by", required_argument, nullptr, LongOptions::SeekBy},
{"restart-or-previous", no_argument, nullptr, LongOptions::RestartOrPrevious},
{"create", required_argument, nullptr, 'c'},
{"append", no_argument, nullptr, 'a'},
{"load", no_argument, nullptr, 'l'},
@@ -144,10 +144,10 @@ bool CommandlineOptions::Parse() {
{"toggle-pretty-osd", no_argument, nullptr, 'y'},
{"language", required_argument, nullptr, 'g'},
{"resize-window", required_argument, nullptr, 'w'},
{"quiet", no_argument, nullptr, Quiet},
{"verbose", no_argument, nullptr, Verbose},
{"log-levels", required_argument, nullptr, LogLevels},
{"version", no_argument, nullptr, Version},
{"quiet", no_argument, nullptr, LongOptions::Quiet},
{"verbose", no_argument, nullptr, LongOptions::Verbose},
{"log-levels", required_argument, nullptr, LongOptions::LogLevels},
{"version", no_argument, nullptr, LongOptions::Version},
{nullptr, 0, nullptr, 0}};
// Parse the arguments
@@ -198,39 +198,39 @@ bool CommandlineOptions::Parse() {
}
case 'p':
player_action_ = Player_Play;
player_action_ = PlayerAction::Play;
break;
case 't':
player_action_ = Player_PlayPause;
player_action_ = PlayerAction::PlayPause;
break;
case 'u':
player_action_ = Player_Pause;
player_action_ = PlayerAction::Pause;
break;
case 's':
player_action_ = Player_Stop;
player_action_ = PlayerAction::Stop;
break;
case 'q':
player_action_ = Player_StopAfterCurrent;
player_action_ = PlayerAction::StopAfterCurrent;
break;
case 'r':
player_action_ = Player_Previous;
player_action_ = PlayerAction::Previous;
break;
case 'f':
player_action_ = Player_Next;
player_action_ = PlayerAction::Next;
break;
case 'i':
player_action_ = Player_PlayPlaylist;
player_action_ = PlayerAction::PlayPlaylist;
playlist_name_ = QString(optarg);
break;
case 'c':
url_list_action_ = UrlList_CreateNew;
url_list_action_ = UrlListAction::CreateNew;
playlist_name_ = QString(optarg);
break;
case 'a':
url_list_action_ = UrlList_Append;
url_list_action_ = UrlListAction::Append;
break;
case 'l':
url_list_action_ = UrlList_Load;
url_list_action_ = UrlListAction::Load;
break;
case 'o':
show_osd_ = true;
@@ -241,22 +241,22 @@ bool CommandlineOptions::Parse() {
case 'g':
language_ = QString(optarg);
break;
case VolumeUp:
case LongOptions::VolumeUp:
volume_modifier_ = +4;
break;
case VolumeDown:
case LongOptions::VolumeDown:
volume_modifier_ = -4;
break;
case Quiet:
case LongOptions::Quiet:
log_levels_ = "1";
break;
case Verbose:
case LongOptions::Verbose:
log_levels_ = "3";
break;
case LogLevels:
case LongOptions::LogLevels:
log_levels_ = QString(optarg);
break;
case Version: {
case LongOptions::Version: {
QString version_text = QString(kVersionText).arg(STRAWBERRY_VERSION_DISPLAY);
std::cout << version_text.toLocal8Bit().constData() << std::endl;
std::exit(0);
@@ -266,28 +266,28 @@ bool CommandlineOptions::Parse() {
if (!ok) set_volume_ = -1;
break;
case VolumeIncreaseBy:
case LongOptions::VolumeIncreaseBy:
volume_modifier_ = QString(optarg).toInt(&ok);
if (!ok) volume_modifier_ = 0;
break;
case VolumeDecreaseBy:
case LongOptions::VolumeDecreaseBy:
volume_modifier_ = -QString(optarg).toInt(&ok);
if (!ok) volume_modifier_ = 0;
break;
case SeekTo:
case LongOptions::SeekTo:
seek_to_ = QString(optarg).toInt(&ok);
if (!ok) seek_to_ = -1;
break;
case SeekBy:
case LongOptions::SeekBy:
seek_by_ = QString(optarg).toInt(&ok);
if (!ok) seek_by_ = 0;
break;
case RestartOrPrevious:
player_action_ = Player_RestartOrPrevious;
case LongOptions::RestartOrPrevious:
player_action_ = PlayerAction::RestartOrPrevious;
break;
case 'k':
@@ -297,7 +297,7 @@ bool CommandlineOptions::Parse() {
case 'w':
window_size_ = QString(optarg);
player_action_ = Player_ResizeWindow;
player_action_ = PlayerAction::ResizeWindow;
break;
case '?':
@@ -323,7 +323,7 @@ bool CommandlineOptions::Parse() {
}
bool CommandlineOptions::is_empty() const {
return player_action_ == Player_None &&
return player_action_ == PlayerAction::None &&
set_volume_ == -1 &&
volume_modifier_ == 0 &&
seek_to_ == -1 &&
@@ -335,7 +335,7 @@ bool CommandlineOptions::is_empty() const {
}
bool CommandlineOptions::contains_play_options() const {
return player_action_ != Player_None || play_track_at_ != -1 || !urls_.isEmpty();
return player_action_ != PlayerAction::None || play_track_at_ != -1 || !urls_.isEmpty();
}
QByteArray CommandlineOptions::Serialize() const {

View File

@@ -41,24 +41,24 @@ class CommandlineOptions {
// Don't change the values or order, these get serialised and sent to
// possibly a different version of Strawberry
enum UrlListAction {
UrlList_Append = 0,
UrlList_Load = 1,
UrlList_None = 2,
UrlList_CreateNew = 3,
enum class UrlListAction {
Append = 0,
Load = 1,
None = 2,
CreateNew = 3
};
enum PlayerAction {
Player_None = 0,
Player_Play = 1,
Player_PlayPause = 2,
Player_Pause = 3,
Player_Stop = 4,
Player_Previous = 5,
Player_Next = 6,
Player_RestartOrPrevious = 7,
Player_StopAfterCurrent = 8,
Player_PlayPlaylist = 9,
Player_ResizeWindow = 10
enum class PlayerAction {
None = 0,
Play = 1,
PlayPause = 2,
Pause = 3,
Stop = 4,
Previous = 5,
Next = 6,
RestartOrPrevious = 7,
StopAfterCurrent = 8,
PlayPlaylist = 9,
ResizeWindow = 10
};
bool Parse();

View File

@@ -293,13 +293,13 @@ MainWindow::MainWindow(Application *app, std::shared_ptr<SystemTrayIcon> tray_ic
}),
smartplaylists_view_(new SmartPlaylistsViewContainer(app, this)),
#ifdef HAVE_SUBSONIC
subsonic_view_(new InternetSongsView(app_, app->internet_services()->ServiceBySource(Song::Source_Subsonic), SubsonicSettingsPage::kSettingsGroup, SettingsDialog::Page_Subsonic, this)),
subsonic_view_(new InternetSongsView(app_, app->internet_services()->ServiceBySource(Song::Source::Subsonic), SubsonicSettingsPage::kSettingsGroup, SettingsDialog::Page::Subsonic, this)),
#endif
#ifdef HAVE_TIDAL
tidal_view_(new InternetTabsView(app_, app->internet_services()->ServiceBySource(Song::Source_Tidal), TidalSettingsPage::kSettingsGroup, SettingsDialog::Page_Tidal, this)),
tidal_view_(new InternetTabsView(app_, app->internet_services()->ServiceBySource(Song::Source::Tidal), TidalSettingsPage::kSettingsGroup, SettingsDialog::Page::Tidal, this)),
#endif
#ifdef HAVE_QOBUZ
qobuz_view_(new InternetTabsView(app_, app->internet_services()->ServiceBySource(Song::Source_Qobuz), QobuzSettingsPage::kSettingsGroup, SettingsDialog::Page_Qobuz, this)),
qobuz_view_(new InternetTabsView(app_, app->internet_services()->ServiceBySource(Song::Source::Qobuz), QobuzSettingsPage::kSettingsGroup, SettingsDialog::Page::Qobuz, this)),
#endif
radio_view_(new RadioViewContainer(this)),
lastfm_import_dialog_(new LastFMImportDialog(app_->lastfm_import(), this)),
@@ -331,10 +331,10 @@ MainWindow::MainWindow(Application *app, std::shared_ptr<SystemTrayIcon> tray_ic
track_slider_timer_(new QTimer(this)),
keep_running_(false),
playing_widget_(true),
doubleclick_addmode_(BehaviourSettingsPage::AddBehaviour_Append),
doubleclick_playmode_(BehaviourSettingsPage::PlayBehaviour_Never),
doubleclick_playlist_addmode_(BehaviourSettingsPage::PlaylistAddBehaviour_Play),
menu_playmode_(BehaviourSettingsPage::PlayBehaviour_Never),
doubleclick_addmode_(BehaviourSettingsPage::AddBehaviour::Append),
doubleclick_playmode_(BehaviourSettingsPage::PlayBehaviour::Never),
doubleclick_playlist_addmode_(BehaviourSettingsPage::PlaylistAddBehaviour::Play),
menu_playmode_(BehaviourSettingsPage::PlayBehaviour::Never),
initialized_(false),
was_maximized_(true),
was_minimized_(false),
@@ -700,7 +700,7 @@ MainWindow::MainWindow(Application *app, std::shared_ptr<SystemTrayIcon> tray_ic
QObject::connect(tidal_view_->albums_collection_view(), &InternetCollectionView::AddToPlaylistSignal, this, &MainWindow::AddToPlaylist);
QObject::connect(tidal_view_->songs_collection_view(), &InternetCollectionView::AddToPlaylistSignal, this, &MainWindow::AddToPlaylist);
QObject::connect(tidal_view_->search_view(), &InternetSearchView::AddToPlaylist, this, &MainWindow::AddToPlaylist);
if (TidalService *tidalservice = qobject_cast<TidalService*>(app_->internet_services()->ServiceBySource(Song::Source_Tidal))) {
if (TidalService *tidalservice = qobject_cast<TidalService*>(app_->internet_services()->ServiceBySource(Song::Source::Tidal))) {
QObject::connect(this, &MainWindow::AuthorizationUrlReceived, tidalservice, &TidalService::AuthorizationUrlReceived);
}
#endif
@@ -920,10 +920,9 @@ MainWindow::MainWindow(Application *app, std::shared_ptr<SystemTrayIcon> tray_ic
}
ui_->tabs->setCurrentIndex(settings_.value("current_tab", 1).toInt());
FancyTabWidget::Mode default_mode = FancyTabWidget::Mode_LargeSidebar;
int tab_mode_int = settings_.value("tab_mode", default_mode).toInt();
FancyTabWidget::Mode tab_mode = static_cast<FancyTabWidget::Mode>(tab_mode_int);
if (tab_mode == FancyTabWidget::Mode_None) tab_mode = default_mode;
FancyTabWidget::Mode default_mode = FancyTabWidget::Mode::LargeSidebar;
FancyTabWidget::Mode tab_mode = static_cast<FancyTabWidget::Mode>(settings_.value("tab_mode", static_cast<int>(default_mode)).toInt());
if (tab_mode == FancyTabWidget::Mode::None) tab_mode = default_mode;
ui_->tabs->SetMode(tab_mode);
TabSwitched();
@@ -946,26 +945,26 @@ MainWindow::MainWindow(Application *app, std::shared_ptr<SystemTrayIcon> tray_ic
#else
QSettings s;
s.beginGroup(BehaviourSettingsPage::kSettingsGroup);
BehaviourSettingsPage::StartupBehaviour behaviour = BehaviourSettingsPage::StartupBehaviour(s.value("startupbehaviour", BehaviourSettingsPage::Startup_Remember).toInt());
const BehaviourSettingsPage::StartupBehaviour startupbehaviour = static_cast<BehaviourSettingsPage::StartupBehaviour>(s.value("startupbehaviour", static_cast<int>(BehaviourSettingsPage::StartupBehaviour::Remember)).toInt());
s.endGroup();
switch (behaviour) {
case BehaviourSettingsPage::Startup_Show:
switch (startupbehaviour) {
case BehaviourSettingsPage::StartupBehaviour::Show:
show();
break;
case BehaviourSettingsPage::Startup_ShowMaximized:
case BehaviourSettingsPage::StartupBehaviour::ShowMaximized:
setWindowState(windowState() | Qt::WindowMaximized);
show();
break;
case BehaviourSettingsPage::Startup_ShowMinimized:
case BehaviourSettingsPage::StartupBehaviour::ShowMinimized:
setWindowState(windowState() | Qt::WindowMinimized);
show();
break;
case BehaviourSettingsPage::Startup_Hide:
case BehaviourSettingsPage::StartupBehaviour::Hide:
if (tray_icon_->IsSystemTrayAvailable() && tray_icon_->isVisible()) {
break;
}
[[fallthrough]];
case BehaviourSettingsPage::Startup_Remember:
case BehaviourSettingsPage::StartupBehaviour::Remember:
default: {
was_maximized_ = settings_.value("maximized", true).toBool();
@@ -1067,10 +1066,10 @@ void MainWindow::ReloadSettings() {
playing_widget_ = s.value("playing_widget", true).toBool();
bool trayicon_progress = s.value("trayicon_progress", false).toBool();
if (playing_widget_ != ui_->widget_playing->IsEnabled()) TabSwitched();
doubleclick_addmode_ = BehaviourSettingsPage::AddBehaviour(s.value("doubleclick_addmode", BehaviourSettingsPage::AddBehaviour_Append).toInt());
doubleclick_playmode_ = BehaviourSettingsPage::PlayBehaviour(s.value("doubleclick_playmode", BehaviourSettingsPage::PlayBehaviour_Never).toInt());
doubleclick_playlist_addmode_ = BehaviourSettingsPage::PlaylistAddBehaviour(s.value("doubleclick_playlist_addmode", BehaviourSettingsPage::PlayBehaviour_Never).toInt());
menu_playmode_ = BehaviourSettingsPage::PlayBehaviour(s.value("menu_playmode", BehaviourSettingsPage::PlayBehaviour_Never).toInt());
doubleclick_addmode_ = static_cast<BehaviourSettingsPage::AddBehaviour>(s.value("doubleclick_addmode", static_cast<int>(BehaviourSettingsPage::AddBehaviour::Append)).toInt());
doubleclick_playmode_ = static_cast<BehaviourSettingsPage::PlayBehaviour>(s.value("doubleclick_playmode", static_cast<int>(BehaviourSettingsPage::PlayBehaviour::Never)).toInt());
doubleclick_playlist_addmode_ = static_cast<BehaviourSettingsPage::PlaylistAddBehaviour>(s.value("doubleclick_playlist_addmode", static_cast<int>(BehaviourSettingsPage::PlayBehaviour::Never)).toInt());
menu_playmode_ = static_cast<BehaviourSettingsPage::PlayBehaviour>(s.value("menu_playmode", static_cast<int>(BehaviourSettingsPage::PlayBehaviour::Never)).toInt());
s.endGroup();
s.beginGroup(AppearanceSettingsPage::kSettingsGroup);
@@ -1224,7 +1223,7 @@ void MainWindow::Exit() {
if (app_->player()->engine()->is_fadeout_enabled()) {
// To shut down the application when fadeout will be finished
QObject::connect(app_->player()->engine(), &EngineBase::FadeoutFinishedSignal, this, &MainWindow::DoExit);
if (app_->player()->GetState() == Engine::Playing) {
if (app_->player()->GetState() == Engine::State::Playing) {
app_->player()->Stop();
ignore_close_ = true;
close();
@@ -1322,8 +1321,8 @@ void MainWindow::MediaPlaying() {
PlaylistItemPtr item(app_->player()->GetCurrentItem());
if (item) {
enable_play_pause = !(item->options() & PlaylistItem::PauseDisabled);
can_seek = !(item->options() & PlaylistItem::SeekDisabled);
enable_play_pause = !(item->options() & PlaylistItem::Option::PauseDisabled);
can_seek = !(item->options() & PlaylistItem::Option::SeekDisabled);
}
ui_->action_play_pause->setEnabled(enable_play_pause);
ui_->track_slider->SetCanSeek(can_seek);
@@ -1437,8 +1436,8 @@ void MainWindow::SavePlaybackStatus() {
QSettings s;
s.beginGroup(Player::kSettingsGroup);
s.setValue("playback_state", app_->player()->GetState());
if (app_->player()->GetState() == Engine::Playing || app_->player()->GetState() == Engine::Paused) {
s.setValue("playback_state", static_cast<int>(app_->player()->GetState()));
if (app_->player()->GetState() == Engine::State::Playing || app_->player()->GetState() == Engine::State::Paused) {
s.setValue("playback_playlist", app_->playlist_manager()->active()->id());
s.setValue("playback_position", app_->player()->engine()->position_nanosec() / kNsecPerSec);
}
@@ -1456,14 +1455,14 @@ void MainWindow::LoadPlaybackStatus() {
QSettings s;
s.beginGroup(BehaviourSettingsPage::kSettingsGroup);
bool resume_playback = s.value("resumeplayback", false).toBool();
const bool resume_playback = s.value("resumeplayback", false).toBool();
s.endGroup();
s.beginGroup(Player::kSettingsGroup);
Engine::State playback_state = static_cast<Engine::State>(s.value("playback_state", Engine::Empty).toInt());
const Engine::State playback_state = static_cast<Engine::State>(s.value("playback_state", static_cast<int>(Engine::State::Empty)).toInt());
s.endGroup();
if (resume_playback && playback_state != Engine::Empty && playback_state != Engine::Idle) {
if (resume_playback && playback_state != Engine::State::Empty && playback_state != Engine::State::Idle) {
std::shared_ptr<QMetaObject::Connection> connection = std::make_shared<QMetaObject::Connection>();
*connection = QObject::connect(app_->playlist_manager(), &PlaylistManager::AllPlaylistsLoaded, this, [this, connection]() {
QObject::disconnect(*connection);
@@ -1479,7 +1478,7 @@ void MainWindow::ResumePlayback() {
QSettings s;
s.beginGroup(Player::kSettingsGroup);
Engine::State playback_state = static_cast<Engine::State>(s.value("playback_state", Engine::Empty).toInt());
const Engine::State playback_state = static_cast<Engine::State>(s.value("playback_state", static_cast<int>(Engine::State::Empty)).toInt());
int playback_playlist = s.value("playback_playlist", -1).toInt();
int playback_position = s.value("playback_position", 0).toInt();
s.endGroup();
@@ -1487,7 +1486,7 @@ void MainWindow::ResumePlayback() {
if (playback_playlist == app_->playlist_manager()->current()->id()) {
// Set active to current to resume playback on correct playlist.
app_->playlist_manager()->SetActiveToCurrent();
if (playback_state == Engine::Paused) {
if (playback_state == Engine::State::Paused) {
std::shared_ptr<QMetaObject::Connection> connection = std::make_shared<QMetaObject::Connection>();
*connection = QObject::connect(app_->player(), &Player::Playing, app_->player(), [this, connection]() {
QObject::disconnect(*connection);
@@ -1499,7 +1498,7 @@ void MainWindow::ResumePlayback() {
// Reset saved playback status so we don't resume again from the same position.
s.beginGroup(Player::kSettingsGroup);
s.setValue("playback_state", Engine::Empty);
s.setValue("playback_state", static_cast<int>(Engine::State::Empty));
s.setValue("playback_playlist", -1);
s.setValue("playback_position", 0);
s.endGroup();
@@ -1517,7 +1516,7 @@ void MainWindow::PlayIndex(const QModelIndex &idx, Playlist::AutoScroll autoscro
}
app_->playlist_manager()->SetActiveToCurrent();
app_->player()->PlayAt(row, 0, Engine::Manual, autoscroll, true);
app_->player()->PlayAt(row, 0, Engine::TrackChangeType::Manual, autoscroll, true);
}
@@ -1532,16 +1531,16 @@ void MainWindow::PlaylistDoubleClick(const QModelIndex &idx) {
}
switch (doubleclick_playlist_addmode_) {
case BehaviourSettingsPage::PlaylistAddBehaviour_Play:
case BehaviourSettingsPage::PlaylistAddBehaviour::Play:
app_->playlist_manager()->SetActiveToCurrent();
app_->player()->PlayAt(source_idx.row(), 0, Engine::Manual, Playlist::AutoScroll_Never, true, true);
app_->player()->PlayAt(source_idx.row(), 0, Engine::TrackChangeType::Manual, Playlist::AutoScroll::Never, true, true);
break;
case BehaviourSettingsPage::PlaylistAddBehaviour_Enqueue:
case BehaviourSettingsPage::PlaylistAddBehaviour::Enqueue:
app_->playlist_manager()->current()->queue()->ToggleTracks(QModelIndexList() << source_idx);
if (app_->player()->GetState() != Engine::Playing) {
if (app_->player()->GetState() != Engine::State::Playing) {
app_->playlist_manager()->SetActiveToCurrent();
app_->player()->PlayAt(app_->playlist_manager()->current()->queue()->TakeNext(), 0, Engine::Manual, Playlist::AutoScroll_Never, true);
app_->player()->PlayAt(app_->playlist_manager()->current()->queue()->TakeNext(), 0, Engine::TrackChangeType::Manual, Playlist::AutoScroll::Never, true);
}
break;
}
@@ -1694,22 +1693,22 @@ void MainWindow::UpdateTrackSliderPosition() {
void MainWindow::ApplyAddBehaviour(const BehaviourSettingsPage::AddBehaviour b, MimeData *mimedata) {
switch (b) {
case BehaviourSettingsPage::AddBehaviour_Append:
case BehaviourSettingsPage::AddBehaviour::Append:
mimedata->clear_first_ = false;
mimedata->enqueue_now_ = false;
break;
case BehaviourSettingsPage::AddBehaviour_Enqueue:
case BehaviourSettingsPage::AddBehaviour::Enqueue:
mimedata->clear_first_ = false;
mimedata->enqueue_now_ = true;
break;
case BehaviourSettingsPage::AddBehaviour_Load:
case BehaviourSettingsPage::AddBehaviour::Load:
mimedata->clear_first_ = true;
mimedata->enqueue_now_ = false;
break;
case BehaviourSettingsPage::AddBehaviour_OpenInNew:
case BehaviourSettingsPage::AddBehaviour::OpenInNew:
mimedata->open_in_new_playlist_ = true;
break;
}
@@ -1718,16 +1717,16 @@ void MainWindow::ApplyAddBehaviour(const BehaviourSettingsPage::AddBehaviour b,
void MainWindow::ApplyPlayBehaviour(const BehaviourSettingsPage::PlayBehaviour b, MimeData *mimedata) const {
switch (b) {
case BehaviourSettingsPage::PlayBehaviour_Always:
case BehaviourSettingsPage::PlayBehaviour::Always:
mimedata->play_now_ = true;
break;
case BehaviourSettingsPage::PlayBehaviour_Never:
case BehaviourSettingsPage::PlayBehaviour::Never:
mimedata->play_now_ = false;
break;
case BehaviourSettingsPage::PlayBehaviour_IfStopped:
mimedata->play_now_ = !(app_->player()->GetState() == Engine::Playing);
case BehaviourSettingsPage::PlayBehaviour::IfStopped:
mimedata->play_now_ = !(app_->player()->GetState() == Engine::State::Playing);
break;
}
}
@@ -1762,7 +1761,7 @@ void MainWindow::AddToPlaylist(QMimeData *q_mimedata) {
void MainWindow::AddToPlaylistFromAction(QAction *action) {
const int destination = action->data().toInt();
PlaylistItemList items;
PlaylistItemPtrList items;
SongList songs;
// Get the selected playlist items
@@ -1813,7 +1812,7 @@ void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex &
playlist_menu_index_ = source_index;
// Is this song currently playing?
if (app_->playlist_manager()->current()->current_row() == source_index.row() && app_->player()->GetState() == Engine::Playing) {
if (app_->playlist_manager()->current()->current_row() == source_index.row() && app_->player()->GetState() == Engine::State::Playing) {
playlist_play_pause_->setText(tr("Pause"));
playlist_play_pause_->setIcon(IconLoader::Load("media-playback-pause"));
}
@@ -1824,7 +1823,7 @@ void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex &
// Are we allowed to pause?
if (source_index.isValid()) {
playlist_play_pause_->setEnabled(app_->playlist_manager()->current()->current_row() != source_index.row() || !(app_->playlist_manager()->current()->item_at(source_index.row())->options() & PlaylistItem::PauseDisabled));
playlist_play_pause_->setEnabled(app_->playlist_manager()->current()->current_row() != source_index.row() || !(app_->playlist_manager()->current()->item_at(source_index.row())->options() & PlaylistItem::Option::PauseDisabled));
}
else {
playlist_play_pause_->setEnabled(false);
@@ -1853,7 +1852,7 @@ void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex &
if (!item) continue;
if (item->Metadata().url().isLocalFile()) ++local_songs;
if (item->Metadata().source() == Song::Source_Collection) ++collection_songs;
if (item->Metadata().source() == Song::Source::Collection) ++collection_songs;
if (item->Metadata().has_cue()) {
cue_selected = true;
@@ -2033,10 +2032,10 @@ void MainWindow::PlaylistRightClick(const QPoint global_pos, const QModelIndex &
void MainWindow::PlaylistPlay() {
if (app_->playlist_manager()->current()->current_row() == playlist_menu_index_.row()) {
app_->player()->PlayPause(Playlist::AutoScroll_Never);
app_->player()->PlayPause(0, Playlist::AutoScroll::Never);
}
else {
PlayIndex(playlist_menu_index_, Playlist::AutoScroll_Never);
PlayIndex(playlist_menu_index_, Playlist::AutoScroll::Never);
}
}
@@ -2057,7 +2056,7 @@ void MainWindow::RescanSongs() {
if (item->IsLocalCollectionItem()) {
songs << item->Metadata();
}
else if (item->Metadata().source() == Song::Source_LocalFile) {
else if (item->Metadata().source() == Song::Source::LocalFile) {
QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index);
app_->playlist_manager()->current()->ItemReload(persistent_index, item->OriginalMetadata(), false);
}
@@ -2072,7 +2071,7 @@ void MainWindow::RescanSongs() {
void MainWindow::EditTracks() {
SongList songs;
PlaylistItemList items;
PlaylistItemPtrList items;
for (const QModelIndex &proxy_index : ui_->playlist->view()->selectionModel()->selectedRows()) {
const QModelIndex source_index = app_->playlist_manager()->current()->filter()->mapToSource(proxy_index);
@@ -2164,7 +2163,7 @@ void MainWindow::SelectionSetValue() {
QPersistentModelIndex persistent_index = QPersistentModelIndex(source_index);
QObject::connect(reply, &TagReaderReply::Finished, this, [this, reply, persistent_index]() { SongSaveComplete(reply, persistent_index); }, Qt::QueuedConnection);
}
else if (song.source() == Song::Source_Stream) {
else if (song.source() == Song::Source::Stream) {
app_->playlist_manager()->current()->setData(source_index, column_value, 0);
}
}
@@ -2199,7 +2198,7 @@ void MainWindow::AddFile() {
PlaylistParser parser(app_->collection_backend());
// Show dialog
QStringList file_names = QFileDialog::getOpenFileNames(this, tr("Add file"), directory, QString("%1 (%2);;%3;;%4").arg(tr("Music"), FileView::kFileFilter, parser.filters(PlaylistParser::Type_Load), tr(kAllFilesFilterSpec)));
QStringList file_names = QFileDialog::getOpenFileNames(this, tr("Add file"), directory, QString("%1 (%2);;%3;;%4").arg(tr("Music"), FileView::kFileFilter, parser.filters(PlaylistParser::Type::Load), tr(kAllFilesFilterSpec)));
if (file_names.isEmpty()) return;
@@ -2335,30 +2334,30 @@ void MainWindow::CommandlineOptionsReceived(const quint32 instanceId, const QByt
void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
switch (options.player_action()) {
case CommandlineOptions::Player_Play:
case CommandlineOptions::PlayerAction::Play:
if (options.urls().empty()) {
app_->player()->Play();
}
break;
case CommandlineOptions::Player_PlayPause:
app_->player()->PlayPause(Playlist::AutoScroll_Maybe);
case CommandlineOptions::PlayerAction::PlayPause:
app_->player()->PlayPause(0, Playlist::AutoScroll::Maybe);
break;
case CommandlineOptions::Player_Pause:
case CommandlineOptions::PlayerAction::Pause:
app_->player()->Pause();
break;
case CommandlineOptions::Player_Stop:
case CommandlineOptions::PlayerAction::Stop:
app_->player()->Stop();
break;
case CommandlineOptions::Player_StopAfterCurrent:
case CommandlineOptions::PlayerAction::StopAfterCurrent:
app_->player()->StopAfterCurrent();
break;
case CommandlineOptions::Player_Previous:
case CommandlineOptions::PlayerAction::Previous:
app_->player()->Previous();
break;
case CommandlineOptions::Player_Next:
case CommandlineOptions::PlayerAction::Next:
app_->player()->Next();
break;
case CommandlineOptions::Player_PlayPlaylist:
case CommandlineOptions::PlayerAction::PlayPlaylist:
if (options.playlist_name().isEmpty()) {
qLog(Error) << "ERROR: playlist name missing";
}
@@ -2366,11 +2365,11 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
app_->player()->PlayPlaylist(options.playlist_name());
}
break;
case CommandlineOptions::Player_RestartOrPrevious:
case CommandlineOptions::PlayerAction::RestartOrPrevious:
app_->player()->RestartOrPrevious();
break;
case CommandlineOptions::Player_ResizeWindow:{
case CommandlineOptions::PlayerAction::ResizeWindow:{
if (options.window_size().contains('x') && options.window_size().length() >= 4) {
QString str_w = options.window_size().left(options.window_size().indexOf('x'));
QString str_h = options.window_size().right(options.window_size().length() - options.window_size().indexOf('x') - 1);
@@ -2407,7 +2406,7 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
break;
}
case CommandlineOptions::Player_None:
case CommandlineOptions::PlayerAction::None:
break;
}
@@ -2427,22 +2426,22 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
// Behaviour depends on command line options, so set it here
mimedata->override_user_settings_ = true;
if (options.player_action() == CommandlineOptions::Player_Play) mimedata->play_now_ = true;
if (options.player_action() == CommandlineOptions::PlayerAction::Play) mimedata->play_now_ = true;
else ApplyPlayBehaviour(doubleclick_playmode_, mimedata);
switch (options.url_list_action()) {
case CommandlineOptions::UrlList_Load:
case CommandlineOptions::UrlListAction::Load:
mimedata->clear_first_ = true;
break;
case CommandlineOptions::UrlList_Append:
case CommandlineOptions::UrlListAction::Append:
// Nothing to do
break;
case CommandlineOptions::UrlList_None:
case CommandlineOptions::UrlListAction::None:
ApplyAddBehaviour(doubleclick_addmode_, mimedata);
break;
case CommandlineOptions::UrlList_CreateNew:
case CommandlineOptions::UrlListAction::CreateNew:
mimedata->name_for_new_playlist_ = options.playlist_name();
ApplyAddBehaviour(BehaviourSettingsPage::AddBehaviour_OpenInNew, mimedata);
ApplyAddBehaviour(BehaviourSettingsPage::AddBehaviour::OpenInNew, mimedata);
break;
}
@@ -2462,7 +2461,7 @@ void MainWindow::CommandlineOptionsReceived(const CommandlineOptions &options) {
app_->player()->SeekTo(app_->player()->engine()->position_nanosec() / kNsecPerSec + options.seek_by());
}
if (options.play_track_at() != -1) app_->player()->PlayAt(options.play_track_at(), 0, Engine::Manual, Playlist::AutoScroll_Maybe, true);
if (options.play_track_at() != -1) app_->player()->PlayAt(options.play_track_at(), 0, Engine::TrackChangeType::Manual, Playlist::AutoScroll::Maybe, true);
if (options.show_osd()) app_->player()->ShowOSD();
@@ -2540,7 +2539,7 @@ void MainWindow::AddFilesToTranscoder() {
}
void MainWindow::ShowCollectionConfig() {
settings_dialog_->OpenAtPage(SettingsDialog::Page_Collection);
settings_dialog_->OpenAtPage(SettingsDialog::Page::Collection);
}
void MainWindow::TaskCountChanged(const int count) {
@@ -2610,7 +2609,7 @@ void MainWindow::EditFileTags(const QList<QUrl> &urls) {
Song song;
song.set_url(url);
song.set_valid(true);
song.set_filetype(Song::FileType_MPEG);
song.set_filetype(Song::FileType::MPEG);
songs << song;
}
@@ -2755,13 +2754,13 @@ void MainWindow::PlaylistCopyToDevice() {
void MainWindow::ChangeCollectionFilterMode(QAction *action) {
if (action == collection_show_duplicates_) {
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode_Duplicates);
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode::Duplicates);
}
else if (action == collection_show_untagged_) {
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode_Untagged);
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode::Untagged);
}
else {
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode_All);
collection_view_->filter_widget()->SetFilterMode(CollectionFilterOptions::FilterMode::All);
}
}
@@ -2972,7 +2971,7 @@ void MainWindow::HandleNotificationPreview(const OSDBase::Behaviour type, const
else {
qLog(Debug) << "The current playlist is empty, showing a fake song";
// Create a fake song
Song fake(Song::Source_LocalFile);
Song fake(Song::Source::LocalFile);
fake.Init("Title", "Artist", "Album", 123);
fake.set_genre("Classical");
fake.set_composer("Anonymous");
@@ -2996,7 +2995,7 @@ void MainWindow::ShowConsole() {
void MainWindow::keyPressEvent(QKeyEvent *e) {
if (e->key() == Qt::Key_Space) {
app_->player()->PlayPause(Playlist::AutoScroll_Never);
app_->player()->PlayPause(0, Playlist::AutoScroll::Never);
e->accept();
}
else if (e->key() == Qt::Key_Left) {
@@ -3159,17 +3158,17 @@ void MainWindow::PlaylistDelete() {
if (DeleteConfirmationDialog::warning(files) != QDialogButtonBox::Yes) return;
if (app_->player()->GetState() == Engine::Playing && app_->playlist_manager()->current()->rowCount() == selected_songs.count()) {
if (app_->player()->GetState() == Engine::State::Playing && app_->playlist_manager()->current()->rowCount() == selected_songs.count()) {
app_->player()->Stop();
}
ui_->playlist->view()->RemoveSelected();
if (app_->player()->GetState() == Engine::Playing && is_current_item) {
if (app_->player()->GetState() == Engine::State::Playing && is_current_item) {
app_->player()->Next();
}
std::shared_ptr<MusicStorage> storage = std::make_shared<FilesystemMusicStorage>(Song::Source_LocalFile, "/");
std::shared_ptr<MusicStorage> storage = std::make_shared<FilesystemMusicStorage>(Song::Source::LocalFile, "/");
DeleteFiles *delete_files = new DeleteFiles(app_->task_manager(), storage, true);
//QObject::connect(delete_files, &DeleteFiles::Finished, this, &MainWindow::DeleteFinished);
delete_files->Start(selected_songs);

View File

@@ -331,7 +331,7 @@ class MainWindow : public QMainWindow, public PlatformInterface {
std::unique_ptr<TagFetcher> tag_fetcher_;
#endif
std::unique_ptr<TrackSelectionDialog> track_selection_dialog_;
PlaylistItemList autocomplete_tag_items_;
PlaylistItemPtrList autocomplete_tag_items_;
SmartPlaylistsViewContainer *smartplaylists_view_;

View File

@@ -38,7 +38,6 @@
#include <QByteArray>
#include <QUrl>
#include <QImage>
#include <QNetworkCookie>
#include <QNetworkReply>
#include <QItemSelection>
#ifdef HAVE_DBUS
@@ -78,17 +77,18 @@
# include "device/mtpconnection.h"
#endif
#include "settings/playlistsettingspage.h"
#include "smartplaylists/smartplaylistsearchterm.h"
#include "smartplaylists/smartplaylistsitem.h"
void RegisterMetaTypes() {
qRegisterMetaType<const char*>("const char*");
qRegisterMetaType<QList<int>>("QList<int>");
qRegisterMetaType<QList<QUrl>>("QList<QUrl>");
qRegisterMetaType<QVector<int>>("QVector<int>");
qRegisterMetaType<QList<QUrl>>("QList<QUrl>");
qRegisterMetaType<QFileInfo>("QFileInfo");
qRegisterMetaType<QAbstractSocket::SocketState>();
qRegisterMetaType<QAbstractSocket::SocketState>("QAbstractSocket::SocketState");
qRegisterMetaType<QNetworkCookie>("QNetworkCookie");
qRegisterMetaType<QList<QNetworkCookie>>("QList<QNetworkCookie>");
qRegisterMetaType<QNetworkReply*>("QNetworkReply*");
qRegisterMetaType<QNetworkReply**>("QNetworkReply**");
qRegisterMetaType<QItemSelection>("QItemSelection");
@@ -98,16 +98,12 @@ void RegisterMetaTypes() {
qRegisterMetaTypeStreamOperators<QMap<int, Qt::Alignment>>("ColumnAlignmentMap");
qRegisterMetaTypeStreamOperators<QMap<int, int>>("ColumnAlignmentIntMap");
#endif
qRegisterMetaType<CollectionDirectory>("Directory");
qRegisterMetaType<CollectionDirectoryList>("DirectoryList");
qRegisterMetaType<CollectionSubdirectory>("Subdirectory");
qRegisterMetaType<CollectionSubdirectoryList>("SubdirectoryList");
qRegisterMetaType<Song>("Song");
qRegisterMetaType<SongList>("SongList");
qRegisterMetaType<SongMap>("SongMap");
qRegisterMetaType<QList<Song>>("QList<Song>");
qRegisterMetaType<QMap<QString, Song>>("QMap<QString, Song>");
qRegisterMetaType<Engine::EngineType>("EngineType");
qRegisterMetaType<Song::Source>("Song::Source");
qRegisterMetaType<Song::FileType>("Song::FileType");
qRegisterMetaType<Engine::EngineType>("Engine::EngineType");
qRegisterMetaType<Engine::SimpleMetaBundle>("Engine::SimpleMetaBundle");
qRegisterMetaType<Engine::State>("Engine::State");
qRegisterMetaType<Engine::TrackChangeFlags>("Engine::TrackChangeFlags");
@@ -117,23 +113,29 @@ void RegisterMetaTypes() {
qRegisterMetaType<GstElement*>("GstElement*");
qRegisterMetaType<GstEnginePipeline*>("GstEnginePipeline*");
#endif
qRegisterMetaType<CollectionDirectory>("CollectionDirectory");
qRegisterMetaType<CollectionDirectoryList>("CollectionDirectoryList");
qRegisterMetaType<CollectionSubdirectory>("CollectionSubdirectory");
qRegisterMetaType<CollectionSubdirectoryList>("CollectionSubdirectoryList");
qRegisterMetaType<CollectionModel::Grouping>("CollectionModel::Grouping");
qRegisterMetaType<PlaylistItemPtr>("PlaylistItemPtr");
qRegisterMetaType<PlaylistItemList>("PlaylistItemList");
qRegisterMetaType<QList<PlaylistItemPtr>>("QList<PlaylistItemPtr>");
qRegisterMetaType<PlaylistItemPtrList>("PlaylistItemPtrList");
qRegisterMetaType<PlaylistSequence::RepeatMode>("PlaylistSequence::RepeatMode");
qRegisterMetaType<PlaylistSequence::ShuffleMode>("PlaylistSequence::ShuffleMode");
qRegisterMetaType<AlbumCoverLoaderResult>("AlbumCoverLoaderResult");
qRegisterMetaType<AlbumCoverLoaderResult::Type>("AlbumCoverLoaderResult::Type");
qRegisterMetaType<CoverProviderSearchResult>("CoverProviderSearchResult");
qRegisterMetaType<CoverSearchStatistics>("CoverSearchStatistics");
qRegisterMetaType<QList<CoverProviderSearchResult>>("QList<CoverProviderSearchResult>");
qRegisterMetaType<CoverProviderSearchResults>("CoverProviderSearchResults");
qRegisterMetaType<CoverSearchStatistics>("CoverSearchStatistics");
qRegisterMetaType<Equalizer::Params>("Equalizer::Params");
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
qRegisterMetaTypeStreamOperators<Equalizer::Params>("Equalizer::Params");
#endif
#ifdef HAVE_DBUS
qDBusRegisterMetaType<QList<QByteArray>>();
qDBusRegisterMetaType<QByteArrayList>();
qDBusRegisterMetaType<QImage>();
qDBusRegisterMetaType<TrackMetadata>();
qDBusRegisterMetaType<Track_Ids>();
@@ -144,15 +146,21 @@ void RegisterMetaTypes() {
qDBusRegisterMetaType<ManagedObjectList>();
#endif
qRegisterMetaType<InternetSearchView::ResultList>("InternetSearchView::ResultList");
qRegisterMetaType<InternetSearchView::Result>("InternetSearchView::Result");
qRegisterMetaType<InternetSearchView::ResultList>("InternetSearchView::ResultList");
qRegisterMetaType<PlaylistGeneratorPtr>("PlaylistGeneratorPtr");
qRegisterMetaType<RadioChannel>("RadioChannel");
qRegisterMetaType<RadioChannelList>("RadioChannelList");
#ifdef HAVE_LIBMTP
qRegisterMetaType<MtpConnection*>("MtpConnection*");
#endif
qRegisterMetaType<PlaylistSettingsPage::PathType>("PlaylistSettingsPage::PathType");
qRegisterMetaType<PlaylistGeneratorPtr>("PlaylistGeneratorPtr");
qRegisterMetaType<SmartPlaylistSearchTerm::Operator>("SmartPlaylistSearchTerm::Operator");
qRegisterMetaType<SmartPlaylistSearchTerm::OperatorList>("SmartPlaylistSearchTerm::OperatorList");
qRegisterMetaType<SmartPlaylistsItem::Type>("SmartPlaylistsItem::Type");
}

View File

@@ -164,7 +164,7 @@ void Mpris2::PlaylistManagerInitialized() {
void Mpris2::EngineStateChanged(Engine::State newState) {
if (newState != Engine::Playing && newState != Engine::Paused) {
if (newState != Engine::State::Playing && newState != Engine::State::Paused) {
last_metadata_ = QVariantMap();
EmitNotification("Metadata");
}
@@ -172,7 +172,7 @@ void Mpris2::EngineStateChanged(Engine::State newState) {
EmitNotification("CanPlay");
EmitNotification("CanPause");
EmitNotification("PlaybackStatus", PlaybackStatus(newState));
if (newState == Engine::Playing) EmitNotification("CanSeek", CanSeek(newState));
if (newState == Engine::State::Playing) EmitNotification("CanSeek", CanSeek(newState));
}
@@ -307,8 +307,8 @@ QString Mpris2::PlaybackStatus() const {
QString Mpris2::PlaybackStatus(Engine::State state) const {
switch (state) {
case Engine::Playing: return "Playing";
case Engine::Paused: return "Paused";
case Engine::State::Playing: return "Playing";
case Engine::State::Paused: return "Paused";
default: return "Stopped";
}
@@ -321,9 +321,9 @@ QString Mpris2::LoopStatus() const {
}
switch (app_->playlist_manager()->sequence()->repeat_mode()) {
case PlaylistSequence::Repeat_Album:
case PlaylistSequence::Repeat_Playlist: return "Playlist";
case PlaylistSequence::Repeat_Track: return "Track";
case PlaylistSequence::RepeatMode::Album:
case PlaylistSequence::RepeatMode::Playlist: return "Playlist";
case PlaylistSequence::RepeatMode::Track: return "Track";
default: return "None";
}
@@ -331,16 +331,16 @@ QString Mpris2::LoopStatus() const {
void Mpris2::SetLoopStatus(const QString &value) {
PlaylistSequence::RepeatMode mode = PlaylistSequence::Repeat_Off;
PlaylistSequence::RepeatMode mode = PlaylistSequence::RepeatMode::Off;
if (value == "None") {
mode = PlaylistSequence::Repeat_Off;
mode = PlaylistSequence::RepeatMode::Off;
}
else if (value == "Track") {
mode = PlaylistSequence::Repeat_Track;
mode = PlaylistSequence::RepeatMode::Track;
}
else if (value == "Playlist") {
mode = PlaylistSequence::Repeat_Playlist;
mode = PlaylistSequence::RepeatMode::Playlist;
}
app_->playlist_manager()->active()->sequence()->SetRepeatMode(mode);
@@ -359,12 +359,12 @@ void Mpris2::SetRate(double rate) {
bool Mpris2::Shuffle() const {
return app_->playlist_manager()->sequence()->shuffle_mode() != PlaylistSequence::Shuffle_Off;
return app_->playlist_manager()->sequence()->shuffle_mode() != PlaylistSequence::ShuffleMode::Off;
}
void Mpris2::SetShuffle(bool enable) {
app_->playlist_manager()->active()->sequence()->SetShuffleMode(enable ? PlaylistSequence::Shuffle_All : PlaylistSequence::Shuffle_Off);
app_->playlist_manager()->active()->sequence()->SetShuffleMode(enable ? PlaylistSequence::ShuffleMode::All : PlaylistSequence::ShuffleMode::Off);
}
QVariantMap Mpris2::Metadata() const { return last_metadata_; }
@@ -447,13 +447,13 @@ bool Mpris2::CanPlay() const {
// This one's a bit different than MPRIS 1 - we want this to be true even when the song is already paused or stopped.
bool Mpris2::CanPause() const {
return (app_->player()->GetCurrentItem() && app_->player()->GetState() == Engine::Playing && !(app_->player()->GetCurrentItem()->options() & PlaylistItem::PauseDisabled)) || PlaybackStatus() == "Paused" || PlaybackStatus() == "Stopped";
return (app_->player()->GetCurrentItem() && app_->player()->GetState() == Engine::State::Playing && !(app_->player()->GetCurrentItem()->options() & PlaylistItem::Option::PauseDisabled)) || PlaybackStatus() == "Paused" || PlaybackStatus() == "Stopped";
}
bool Mpris2::CanSeek() const { return CanSeek(app_->player()->GetState()); }
bool Mpris2::CanSeek(Engine::State state) const {
return app_->player()->GetCurrentItem() && state != Engine::Empty && !app_->player()->GetCurrentItem()->Metadata().is_stream();
return app_->player()->GetCurrentItem() && state != Engine::State::Empty && !app_->player()->GetCurrentItem()->Metadata().is_stream();
}
bool Mpris2::CanControl() const { return true; }
@@ -471,7 +471,7 @@ void Mpris2::Previous() {
}
void Mpris2::Pause() {
if (CanPause() && app_->player()->GetState() != Engine::Paused) {
if (CanPause() && app_->player()->GetState() != Engine::State::Paused) {
app_->player()->Pause();
}
}

View File

@@ -50,7 +50,7 @@ class MusicStorage {
};
// Values are saved in the database - don't change
enum TranscodeMode {
enum class TranscodeMode {
Transcode_Always = 1,
Transcode_Never = 2,
Transcode_Unsupported = 3,
@@ -83,8 +83,8 @@ class MusicStorage {
virtual QString LocalPath() const { return QString(); }
virtual std::optional<int> collection_directory_id() const { return std::optional<int>(); }
virtual TranscodeMode GetTranscodeMode() const { return Transcode_Never; }
virtual Song::FileType GetTranscodeFormat() const { return Song::FileType_Unknown; }
virtual TranscodeMode GetTranscodeMode() const { return TranscodeMode::Transcode_Never; }
virtual Song::FileType GetTranscodeFormat() const { return Song::FileType::Unknown; }
virtual bool GetSupportedFiletypes(QList<Song::FileType> *ret) { Q_UNUSED(ret); return true; }
virtual bool StartCopy(QList<Song::FileType> *supported_types) { Q_UNUSED(supported_types); return true; }

View File

@@ -35,7 +35,7 @@ NetworkProxyFactory *NetworkProxyFactory::sInstance = nullptr;
const char *NetworkProxyFactory::kSettingsGroup = "NetworkProxy";
NetworkProxyFactory::NetworkProxyFactory()
: mode_(Mode_System),
: mode_(Mode::System),
type_(QNetworkProxy::HttpProxy),
port_(8080),
use_authentication_(false) {
@@ -81,7 +81,7 @@ void NetworkProxyFactory::ReloadSettings() {
QSettings s;
s.beginGroup(kSettingsGroup);
mode_ = Mode(s.value("mode", Mode_System).toInt());
mode_ = static_cast<Mode>(s.value("mode", static_cast<int>(Mode::System)).toInt());
type_ = QNetworkProxy::ProxyType(s.value("type", QNetworkProxy::HttpProxy).toInt());
hostname_ = s.value("hostname").toString();
port_ = s.value("port", 8080).toInt();
@@ -100,7 +100,7 @@ QList<QNetworkProxy> NetworkProxyFactory::queryProxy(const QNetworkProxyQuery &q
QNetworkProxy ret;
switch (mode_) {
case Mode_System:
case Mode::System:
#ifdef Q_OS_LINUX
Q_UNUSED(query);
@@ -125,11 +125,11 @@ QList<QNetworkProxy> NetworkProxyFactory::queryProxy(const QNetworkProxyQuery &q
return systemProxyForQuery(query);
#endif
case Mode_Direct:
case Mode::Direct:
ret.setType(QNetworkProxy::NoProxy);
break;
case Mode_Manual:
case Mode::Manual:
ret.setType(type_);
ret.setHostName(hostname_);
ret.setPort(port_);

View File

@@ -34,7 +34,11 @@
class NetworkProxyFactory : public QNetworkProxyFactory {
public:
// These values are persisted
enum Mode { Mode_System = 0, Mode_Direct = 1, Mode_Manual = 2, };
enum class Mode {
System = 0,
Direct = 1,
Manual = 2
};
static NetworkProxyFactory *Instance();
static const char *kSettingsGroup;

View File

@@ -79,22 +79,22 @@ Player::Player(Application *app, QObject *parent)
#endif
analyzer_(nullptr),
equalizer_(nullptr),
stream_change_type_(Engine::First),
autoscroll_(Playlist::AutoScroll_Maybe),
last_state_(Engine::Empty),
stream_change_type_(Engine::TrackChangeType::First),
autoscroll_(Playlist::AutoScroll::Maybe),
last_state_(Engine::State::Empty),
nb_errors_received_(0),
volume_(100),
volume_before_mute_(100),
last_pressed_previous_(QDateTime::currentDateTime()),
continue_on_error_(false),
greyout_(true),
menu_previousmode_(BehaviourSettingsPage::PreviousBehaviour_DontRestart),
menu_previousmode_(BehaviourSettingsPage::PreviousBehaviour::DontRestart),
seek_step_sec_(10),
play_offset_nanosec_(0) {
QSettings s;
s.beginGroup(BackendSettingsPage::kSettingsGroup);
Engine::EngineType enginetype = Engine::EngineTypeFromName(s.value("engine", EngineName(Engine::GStreamer)).toString().toLower());
Engine::EngineType enginetype = Engine::EngineTypeFromName(s.value("engine", EngineName(Engine::EngineType::GStreamer)).toString().toLower());
s.endGroup();
CreateEngine(enginetype);
@@ -103,14 +103,14 @@ Player::Player(Application *app, QObject *parent)
Engine::EngineType Player::CreateEngine(Engine::EngineType enginetype) {
Engine::EngineType use_enginetype(Engine::None);
Engine::EngineType use_enginetype(Engine::EngineType::None);
for (int i = 0; use_enginetype == Engine::None; i++) {
for (int i = 0; use_enginetype == Engine::EngineType::None; i++) {
switch (enginetype) {
case Engine::None:
case Engine::EngineType::None:
#ifdef HAVE_GSTREAMER
case Engine::GStreamer:{
use_enginetype=Engine::GStreamer;
case Engine::EngineType::GStreamer:{
use_enginetype=Engine::EngineType::GStreamer;
std::unique_ptr<GstEngine> gst_engine(new GstEngine(app_->task_manager()));
gst_engine->SetStartup(gst_startup_);
engine_.reset(gst_engine.release());
@@ -118,8 +118,8 @@ Engine::EngineType Player::CreateEngine(Engine::EngineType enginetype) {
}
#endif
#ifdef HAVE_VLC
case Engine::VLC:
use_enginetype = Engine::VLC;
case Engine::EngineType::VLC:
use_enginetype = Engine::EngineType::VLC;
engine_ = std::make_shared<VLCEngine>(app_->task_manager());
break;
#endif
@@ -127,7 +127,7 @@ Engine::EngineType Player::CreateEngine(Engine::EngineType enginetype) {
if (i > 0) {
qFatal("No engine available!");
}
enginetype = Engine::None;
enginetype = Engine::EngineType::None;
break;
}
}
@@ -157,7 +157,7 @@ void Player::Init() {
if (!engine_) {
s.beginGroup(BackendSettingsPage::kSettingsGroup);
Engine::EngineType enginetype = Engine::EngineTypeFromName(s.value("engine", EngineName(Engine::GStreamer)).toString().toLower());
Engine::EngineType enginetype = Engine::EngineTypeFromName(s.value("engine", EngineName(Engine::EngineType::GStreamer)).toString().toLower());
s.endGroup();
CreateEngine(enginetype);
}
@@ -205,7 +205,7 @@ void Player::ReloadSettings() {
s.endGroup();
s.beginGroup(BehaviourSettingsPage::kSettingsGroup);
menu_previousmode_ = BehaviourSettingsPage::PreviousBehaviour(s.value("menu_previousmode", BehaviourSettingsPage::PreviousBehaviour_DontRestart).toInt());
menu_previousmode_ = static_cast<BehaviourSettingsPage::PreviousBehaviour>(s.value("menu_previousmode", static_cast<int>(BehaviourSettingsPage::PreviousBehaviour::DontRestart)).toInt());
seek_step_sec_ = s.value("seek_step_sec", 10).toInt();
s.endGroup();
@@ -230,7 +230,7 @@ void Player::SaveVolume() {
s.beginGroup(kSettingsGroup);
s.setValue("volume", volume_);
s.endGroup();
}
void Player::HandleLoadResult(const UrlHandler::LoadResult &result) {
@@ -265,19 +265,19 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) {
}
switch (result.type_) {
case UrlHandler::LoadResult::Error:
case UrlHandler::LoadResult::Type::Error:
if (is_current) {
InvalidSongRequested(result.original_url_);
}
emit Error(result.error_);
break;
case UrlHandler::LoadResult::NoMoreTracks:
case UrlHandler::LoadResult::Type::NoMoreTracks:
qLog(Debug) << "URL handler for" << result.original_url_ << "said no more tracks" << is_current;
if (is_current) NextItem(stream_change_type_, autoscroll_);
break;
case UrlHandler::LoadResult::TrackAvailable: {
case UrlHandler::LoadResult::Type::TrackAvailable: {
qLog(Debug) << "URL handler for" << result.original_url_ << "returned" << result.stream_url_;
@@ -300,9 +300,9 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) {
// If there was no filetype in the song's metadata, use the one provided by URL handler, if there is one.
if (
(song.filetype() == Song::FileType_Unknown && result.filetype_ != Song::FileType_Unknown)
(song.filetype() == Song::FileType::Unknown && result.filetype_ != Song::FileType::Unknown)
||
(song.filetype() == Song::FileType_Stream && result.filetype_ != Song::FileType_Stream)
(song.filetype() == Song::FileType::Stream && result.filetype_ != Song::FileType::Stream)
)
{
song.set_filetype(result.filetype_);
@@ -353,7 +353,7 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) {
break;
}
case UrlHandler::LoadResult::WillLoadAsynchronously:
case UrlHandler::LoadResult::Type::WillLoadAsynchronously:
qLog(Debug) << "URL handler for" << result.original_url_ << "is loading asynchronously";
// We'll get called again later with either NoMoreTracks or TrackAvailable
@@ -363,7 +363,7 @@ void Player::HandleLoadResult(const UrlHandler::LoadResult &result) {
}
void Player::Next() { NextInternal(Engine::Manual, Playlist::AutoScroll_Always); }
void Player::Next() { NextInternal(Engine::TrackChangeType::Manual, Playlist::AutoScroll::Always); }
void Player::NextInternal(const Engine::TrackChangeFlags change, const Playlist::AutoScroll autoscroll) {
@@ -384,10 +384,10 @@ void Player::NextItem(const Engine::TrackChangeFlags change, const Playlist::Aut
Playlist *active_playlist = app_->playlist_manager()->active();
// If we received too many errors in auto change, with repeat enabled, we stop
if (change == Engine::Auto) {
if (change == Engine::TrackChangeType::Auto) {
const PlaylistSequence::RepeatMode repeat_mode = active_playlist->sequence()->repeat_mode();
if (repeat_mode != PlaylistSequence::Repeat_Off) {
if ((repeat_mode == PlaylistSequence::Repeat_Track && nb_errors_received_ >= 3) || (nb_errors_received_ >= app_->playlist_manager()->active()->filter()->rowCount())) {
if (repeat_mode != PlaylistSequence::RepeatMode::Off) {
if ((repeat_mode == PlaylistSequence::RepeatMode::Track && nb_errors_received_ >= 3) || (nb_errors_received_ >= app_->playlist_manager()->active()->filter()->rowCount())) {
// We received too many "Error" state changes: probably looping over a playlist which contains only unavailable elements: stop now.
nb_errors_received_ = 0;
Stop();
@@ -397,7 +397,7 @@ void Player::NextItem(const Engine::TrackChangeFlags change, const Playlist::Aut
}
// Manual track changes override "Repeat track"
const bool ignore_repeat_track = change & Engine::Manual;
const bool ignore_repeat_track = change & Engine::TrackChangeType::Manual;
int i = active_playlist->next_row(ignore_repeat_track);
if (i == -1) {
@@ -413,7 +413,7 @@ void Player::NextItem(const Engine::TrackChangeFlags change, const Playlist::Aut
}
void Player::PlayPlaylist(const QString &playlist_name) {
PlayPlaylistInternal(Engine::Manual, Playlist::AutoScroll_Always, playlist_name);
PlayPlaylistInternal(Engine::TrackChangeType::Manual, Playlist::AutoScroll::Always, playlist_name);
}
void Player::PlayPlaylistInternal(const Engine::TrackChangeFlags change, const Playlist::AutoScroll autoscroll, const QString &playlist_name) {
@@ -472,22 +472,22 @@ void Player::TrackEnded() {
app_->playlist_manager()->collection_backend()->IncrementPlayCountAsync(current_item_->Metadata().id());
}
if (HandleStopAfter(Playlist::AutoScroll_Maybe)) return;
if (HandleStopAfter(Playlist::AutoScroll::Maybe)) return;
NextInternal(Engine::Auto, Playlist::AutoScroll_Maybe);
NextInternal(Engine::TrackChangeType::Auto, Playlist::AutoScroll::Maybe);
}
void Player::PlayPause(const quint64 offset_nanosec, const Playlist::AutoScroll autoscroll) {
switch (engine_->state()) {
case Engine::Paused:
case Engine::State::Paused:
UnPause();
emit Resumed();
break;
case Engine::Playing: {
if (current_item_->options() & PlaylistItem::PauseDisabled) {
case Engine::State::Playing: {
if (current_item_->options() & PlaylistItem::Option::PauseDisabled) {
Stop();
}
else {
@@ -498,9 +498,9 @@ void Player::PlayPause(const quint64 offset_nanosec, const Playlist::AutoScroll
break;
}
case Engine::Empty:
case Engine::Error:
case Engine::Idle: {
case Engine::State::Empty:
case Engine::State::Error:
case Engine::State::Idle: {
pause_time_ = QDateTime();
play_offset_nanosec_ = offset_nanosec;
app_->playlist_manager()->SetActivePlaylist(app_->playlist_manager()->current_id());
@@ -508,7 +508,7 @@ void Player::PlayPause(const quint64 offset_nanosec, const Playlist::AutoScroll
int i = app_->playlist_manager()->active()->current_row();
if (i == -1) i = app_->playlist_manager()->active()->last_played_row();
if (i == -1) i = 0;
PlayAt(i, offset_nanosec, Engine::First, autoscroll, true);
PlayAt(i, offset_nanosec, Engine::TrackChangeType::First, autoscroll, true);
break;
}
}
@@ -568,45 +568,45 @@ void Player::StopAfterCurrent() {
bool Player::PreviousWouldRestartTrack() const {
// Check if it has been over two seconds since previous button was pressed
return menu_previousmode_ == BehaviourSettingsPage::PreviousBehaviour_Restart && last_pressed_previous_.isValid() && last_pressed_previous_.secsTo(QDateTime::currentDateTime()) >= 2;
return menu_previousmode_ == BehaviourSettingsPage::PreviousBehaviour::Restart && last_pressed_previous_.isValid() && last_pressed_previous_.secsTo(QDateTime::currentDateTime()) >= 2;
}
void Player::Previous() { PreviousItem(Engine::Manual); }
void Player::Previous() { PreviousItem(Engine::TrackChangeType::Manual); }
void Player::PreviousItem(const Engine::TrackChangeFlags change) {
pause_time_ = QDateTime();
play_offset_nanosec_ = 0;
const bool ignore_repeat_track = change & Engine::Manual;
const bool ignore_repeat_track = change & Engine::TrackChangeType::Manual;
if (menu_previousmode_ == BehaviourSettingsPage::PreviousBehaviour_Restart) {
if (menu_previousmode_ == BehaviourSettingsPage::PreviousBehaviour::Restart) {
// Check if it has been over two seconds since previous button was pressed
QDateTime now = QDateTime::currentDateTime();
if (last_pressed_previous_.isValid() && last_pressed_previous_.secsTo(now) >= 2) {
last_pressed_previous_ = now;
PlayAt(app_->playlist_manager()->active()->current_row(), 0, change, Playlist::AutoScroll_Always, false, true);
PlayAt(app_->playlist_manager()->active()->current_row(), 0, change, Playlist::AutoScroll::Always, false, true);
return;
}
last_pressed_previous_ = now;
}
int i = app_->playlist_manager()->active()->previous_row(ignore_repeat_track);
app_->playlist_manager()->active()->set_current_row(i, Playlist::AutoScroll_Always, false);
app_->playlist_manager()->active()->set_current_row(i, Playlist::AutoScroll::Always, false);
if (i == -1) {
Stop();
PlayAt(i, 0, change, Playlist::AutoScroll_Always, true);
PlayAt(i, 0, change, Playlist::AutoScroll::Always, true);
return;
}
PlayAt(i, 0, change, Playlist::AutoScroll_Always, false);
PlayAt(i, 0, change, Playlist::AutoScroll::Always, false);
}
void Player::EngineStateChanged(const Engine::State state) {
if (state == Engine::Error) {
if (state == Engine::State::Error) {
nb_errors_received_++;
}
else {
@@ -614,21 +614,21 @@ void Player::EngineStateChanged(const Engine::State state) {
}
switch (state) {
case Engine::Paused:
case Engine::State::Paused:
pause_time_ = QDateTime::currentDateTime();
play_offset_nanosec_ = engine_->position_nanosec();
emit Paused();
break;
case Engine::Playing:
case Engine::State::Playing:
pause_time_ = QDateTime();
play_offset_nanosec_ = 0;
emit Playing();
break;
case Engine::Error:
case Engine::State::Error:
emit Error();
[[fallthrough]];
case Engine::Empty:
case Engine::Idle:
case Engine::State::Empty:
case Engine::State::Idle:
pause_time_ = QDateTime();
play_offset_nanosec_ = 0;
emit Stopped();
@@ -700,12 +700,12 @@ void Player::PlayAt(const int index, const quint64 offset_nanosec, Engine::Track
pause_time_ = QDateTime();
play_offset_nanosec_ = offset_nanosec;
if (current_item_ && change == Engine::Manual && engine_->position_nanosec() != engine_->length_nanosec()) {
if (current_item_ && change == Engine::TrackChangeType::Manual && engine_->position_nanosec() != engine_->length_nanosec()) {
emit TrackSkipped(current_item_);
}
if (current_item_ && app_->playlist_manager()->active()->has_item_at(index) && current_item_->Metadata().IsOnSameAlbum(app_->playlist_manager()->active()->item_at(index)->Metadata())) {
change |= Engine::SameAlbum;
change |= Engine::TrackChangeType::SameAlbum;
}
if (reshuffle) app_->playlist_manager()->active()->ReshuffleIndices();
@@ -761,7 +761,7 @@ void Player::SeekTo(const quint64 seconds) {
emit Seeked(nanosec / 1000);
if (seconds == 0) {
app_->playlist_manager()->active()->InformOfCurrentSongChange(Playlist::AutoScroll_Maybe, false);
app_->playlist_manager()->active()->InformOfCurrentSongChange(Playlist::AutoScroll::Maybe, false);
}
}
@@ -776,7 +776,7 @@ void Player::SeekBackward() {
void Player::EngineMetadataReceived(const Engine::SimpleMetaBundle &bundle) {
if (bundle.type == Engine::SimpleMetaBundle::Type_Any || bundle.type == Engine::SimpleMetaBundle::Type_Current) {
if (bundle.type == Engine::SimpleMetaBundle::Type::Any || bundle.type == Engine::SimpleMetaBundle::Type::Current) {
PlaylistItemPtr item = app_->playlist_manager()->active()->current_item();
if (item && bundle.url == item->Url()) {
Song song = item->Metadata();
@@ -786,7 +786,7 @@ void Player::EngineMetadataReceived(const Engine::SimpleMetaBundle &bundle) {
}
}
if (bundle.type == Engine::SimpleMetaBundle::Type_Any || bundle.type == Engine::SimpleMetaBundle::Type_Next) {
if (bundle.type == Engine::SimpleMetaBundle::Type::Any || bundle.type == Engine::SimpleMetaBundle::Type::Next) {
int next_row = app_->playlist_manager()->active()->next_row();
if (next_row != -1) {
PlaylistItemPtr next_item = app_->playlist_manager()->active()->item_at(next_row);
@@ -828,10 +828,10 @@ void Player::Pause() { engine_->Pause(); }
void Player::Play(const quint64 offset_nanosec) {
switch (GetState()) {
case Engine::Playing:
case Engine::State::Playing:
SeekTo(offset_nanosec);
break;
case Engine::Paused:
case Engine::State::Paused:
UnPause();
break;
default:
@@ -880,18 +880,18 @@ void Player::TrackAboutToEnd() {
// Get the actual track URL rather than the stream URL.
if (url_handlers_.contains(url.scheme())) {
if (loading_async_.contains(url)) return;
autoscroll_ = Playlist::AutoScroll_Maybe;
autoscroll_ = Playlist::AutoScroll::Maybe;
UrlHandler::LoadResult result = url_handlers_[url.scheme()]->StartLoading(url);
switch (result.type_) {
case UrlHandler::LoadResult::Error:
case UrlHandler::LoadResult::Type::Error:
emit Error(result.error_);
return;
case UrlHandler::LoadResult::NoMoreTracks:
case UrlHandler::LoadResult::Type::NoMoreTracks:
return;
case UrlHandler::LoadResult::WillLoadAsynchronously:
case UrlHandler::LoadResult::Type::WillLoadAsynchronously:
loading_async_ << url;
return;
case UrlHandler::LoadResult::TrackAvailable:
case UrlHandler::LoadResult::Type::TrackAvailable:
qLog(Debug) << "URL handler for" << result.original_url_ << "returned" << result.stream_url_;
url = result.stream_url_;
Song song = next_item->Metadata();
@@ -929,7 +929,7 @@ void Player::InvalidSongRequested(const QUrl &url) {
return;
}
NextItem(Engine::Auto, Playlist::AutoScroll_Maybe);
NextItem(Engine::TrackChangeType::Auto, Playlist::AutoScroll::Maybe);
}

View File

@@ -77,7 +77,7 @@ class PlayerInterface : public QObject {
virtual void PlayAt(const int index, const quint64 offset_nanosec, Engine::TrackChangeFlags change, const Playlist::AutoScroll autoscroll, const bool reshuffle, const bool force_inform = false) = 0;
// If there's currently a song playing, pause it, otherwise play the track that was playing last, or the first one on the playlist
virtual void PlayPause(const quint64 offset_nanosec = 0, const Playlist::AutoScroll autoscroll = Playlist::AutoScroll_Always) = 0;
virtual void PlayPause(const quint64 offset_nanosec = 0, const Playlist::AutoScroll autoscroll = Playlist::AutoScroll::Always) = 0;
virtual void PlayPauseHelper() = 0;
virtual void RestartOrPrevious() = 0;
@@ -164,7 +164,7 @@ class Player : public PlayerInterface {
void SaveVolume() override;
void PlayAt(const int index, const quint64 offset_nanosec, Engine::TrackChangeFlags change, const Playlist::AutoScroll autoscroll, const bool reshuffle, const bool force_inform = false) override;
void PlayPause(const quint64 offset_nanosec = 0, const Playlist::AutoScroll autoscroll = Playlist::AutoScroll_Always) override;
void PlayPause(const quint64 offset_nanosec = 0, const Playlist::AutoScroll autoscroll = Playlist::AutoScroll::Always) override;
void PlayPauseHelper() override { PlayPause(play_offset_nanosec_); }
void RestartOrPrevious() override;
void Next() override;

View File

@@ -158,7 +158,7 @@ const QStringList Song::kAcceptedExtensions = QStringList() << "wav" << "flac" <
struct Song::Private : public QSharedData {
explicit Private(Source source = Source_Unknown);
explicit Private(Source source = Source::Unknown);
bool valid_;
int id_;
@@ -229,7 +229,7 @@ struct Song::Private : public QSharedData {
};
Song::Private::Private(Song::Source source)
Song::Private::Private(const Source source)
: valid_(false),
id_(-1),
@@ -248,7 +248,7 @@ Song::Private::Private(Song::Source source)
source_(source),
directory_id_(-1),
filetype_(FileType_Unknown),
filetype_(FileType::Unknown),
filesize_(-1),
mtime_(-1),
ctime_(-1),
@@ -270,7 +270,7 @@ Song::Private::Private(Song::Source source)
{}
Song::Song(Song::Source source) : d(new Private(source)) {}
Song::Song(const Source source) : d(new Private(source)) {}
Song::Song(const Song &other) = default;
Song::~Song() = default;
@@ -353,16 +353,16 @@ void Song::clear_art_automatic() { d->art_automatic_.clear(); }
void Song::clear_art_manual() { d->art_manual_.clear(); }
bool Song::additional_tags_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MP4 ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MP4 ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::albumartist_supported() const {
@@ -374,15 +374,15 @@ bool Song::composer_supported() const {
}
bool Song::performer_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::grouping_supported() const {
@@ -398,17 +398,17 @@ bool Song::compilation_supported() const {
}
bool Song::rating_supported() const {
return d->filetype_ == FileType_FLAC ||
d->filetype_ == FileType_WavPack ||
d->filetype_ == FileType_OggFlac ||
d->filetype_ == FileType_OggVorbis ||
d->filetype_ == FileType_OggOpus ||
d->filetype_ == FileType_OggSpeex ||
d->filetype_ == FileType_MPEG ||
d->filetype_ == FileType_MP4 ||
d->filetype_ == FileType_ASF ||
d->filetype_ == FileType_MPC ||
d->filetype_ == FileType_APE;
return d->filetype_ == FileType::FLAC ||
d->filetype_ == FileType::WavPack ||
d->filetype_ == FileType::OggFlac ||
d->filetype_ == FileType::OggVorbis ||
d->filetype_ == FileType::OggOpus ||
d->filetype_ == FileType::OggSpeex ||
d->filetype_ == FileType::MPEG ||
d->filetype_ == FileType::MP4 ||
d->filetype_ == FileType::ASF ||
d->filetype_ == FileType::MPC ||
d->filetype_ == FileType::APE;
}
bool Song::comment_supported() const {
@@ -421,11 +421,11 @@ bool Song::lyrics_supported() const {
bool Song::save_embedded_cover_supported(const FileType filetype) {
return filetype == FileType_FLAC ||
filetype == FileType_OggVorbis ||
filetype == FileType_OggOpus ||
filetype == FileType_MPEG ||
filetype == FileType_MP4;
return filetype == FileType::FLAC ||
filetype == FileType::OggVorbis ||
filetype == FileType::OggOpus ||
filetype == FileType::MPEG ||
filetype == FileType::MP4;
}
@@ -438,14 +438,14 @@ bool Song::has_cue() const { return !d->cue_path_.isEmpty(); }
float Song::rating() const { return d->rating_; }
bool Song::is_collection_song() const { return d->source_ == Source_Collection; }
bool Song::is_collection_song() const { return d->source_ == Source::Collection; }
bool Song::is_metadata_good() const { return !d->url_.isEmpty() && !d->artist_.isEmpty() && !d->title_.isEmpty(); }
bool Song::is_stream() const { return is_radio() || d->source_ == Source_Tidal || d->source_ == Source_Subsonic || d->source_ == Source_Qobuz; }
bool Song::is_radio() const { return d->source_ == Source_Stream || d->source_ == Source_SomaFM || d->source_ == Source_RadioParadise; }
bool Song::is_cdda() const { return d->source_ == Source_CDDA; }
bool Song::is_stream() const { return is_radio() || d->source_ == Source::Tidal || d->source_ == Source::Subsonic || d->source_ == Source::Qobuz; }
bool Song::is_radio() const { return d->source_ == Source::Stream || d->source_ == Source::SomaFM || d->source_ == Source::RadioParadise; }
bool Song::is_cdda() const { return d->source_ == Source::CDDA; }
bool Song::is_compilation() const { return (d->compilation_ || d->compilation_detected_ || d->compilation_on_) && !d->compilation_off_; }
bool Song::stream_url_can_expire() const { return d->source_ == Song::Source_Tidal || d->source_ == Song::Source_Qobuz; }
bool Song::is_module_music() const { return d->filetype_ == Song::FileType_MOD || d->filetype_ == Song::FileType_S3M || d->filetype_ == Song::FileType_XM || d->filetype_ == Song::FileType_IT; }
bool Song::stream_url_can_expire() const { return d->source_ == Source::Tidal || d->source_ == Source::Qobuz; }
bool Song::is_module_music() const { return d->filetype_ == FileType::MOD || d->filetype_ == FileType::S3M || d->filetype_ == FileType::XM || d->filetype_ == FileType::IT; }
bool Song::art_automatic_is_valid() const {
return !d->art_automatic_.isEmpty() &&
@@ -551,55 +551,55 @@ QString Song::JoinSpec(const QString &table) {
Song::Source Song::SourceFromURL(const QUrl &url) {
if (url.isLocalFile()) return Source_LocalFile;
else if (url.scheme() == "cdda") return Source_CDDA;
else if (url.scheme() == "tidal") return Source_Tidal;
else if (url.scheme() == "subsonic") return Source_Subsonic;
else if (url.scheme() == "qobuz") return Source_Qobuz;
if (url.isLocalFile()) return Source::LocalFile;
else if (url.scheme() == "cdda") return Source::CDDA;
else if (url.scheme() == "tidal") return Source::Tidal;
else if (url.scheme() == "subsonic") return Source::Subsonic;
else if (url.scheme() == "qobuz") return Source::Qobuz;
else if (url.scheme() == "http" || url.scheme() == "https" || url.scheme() == "rtsp") {
if (url.host().endsWith("tidal.com", Qt::CaseInsensitive)) { return Source_Tidal; }
if (url.host().endsWith("qobuz.com", Qt::CaseInsensitive)) { return Source_Qobuz; }
if (url.host().endsWith("somafm.com", Qt::CaseInsensitive)) { return Source_SomaFM; }
if (url.host().endsWith("radioparadise.com", Qt::CaseInsensitive)) { return Source_RadioParadise; }
return Source_Stream;
if (url.host().endsWith("tidal.com", Qt::CaseInsensitive)) { return Source::Tidal; }
if (url.host().endsWith("qobuz.com", Qt::CaseInsensitive)) { return Source::Qobuz; }
if (url.host().endsWith("somafm.com", Qt::CaseInsensitive)) { return Source::SomaFM; }
if (url.host().endsWith("radioparadise.com", Qt::CaseInsensitive)) { return Source::RadioParadise; }
return Source::Stream;
}
else return Source_Unknown;
else return Source::Unknown;
}
QString Song::TextForSource(Source source) {
QString Song::TextForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return "file";
case Song::Source_Collection: return "collection";
case Song::Source_CDDA: return "cd";
case Song::Source_Device: return "device";
case Song::Source_Stream: return "stream";
case Song::Source_Tidal: return "tidal";
case Song::Source_Subsonic: return "subsonic";
case Song::Source_Qobuz: return "qobuz";
case Song::Source_SomaFM: return "somafm";
case Song::Source_RadioParadise: return "radioparadise";
case Song::Source_Unknown: return "unknown";
case Source::LocalFile: return "file";
case Source::Collection: return "collection";
case Source::CDDA: return "cd";
case Source::Device: return "device";
case Source::Stream: return "stream";
case Source::Tidal: return "tidal";
case Source::Subsonic: return "subsonic";
case Source::Qobuz: return "qobuz";
case Source::SomaFM: return "somafm";
case Source::RadioParadise: return "radioparadise";
case Source::Unknown: return "unknown";
}
return "unknown";
}
QString Song::DescriptionForSource(Source source) {
QString Song::DescriptionForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return "File";
case Song::Source_Collection: return "Collection";
case Song::Source_CDDA: return "CD";
case Song::Source_Device: return "Device";
case Song::Source_Stream: return "Stream";
case Song::Source_Tidal: return "Tidal";
case Song::Source_Subsonic: return "Subsonic";
case Song::Source_Qobuz: return "Qobuz";
case Song::Source_SomaFM: return "SomaFM";
case Song::Source_RadioParadise: return "Radio Paradise";
case Song::Source_Unknown: return "Unknown";
case Source::LocalFile: return "File";
case Source::Collection: return "Collection";
case Source::CDDA: return "CD";
case Source::Device: return "Device";
case Source::Stream: return "Stream";
case Source::Tidal: return "Tidal";
case Source::Subsonic: return "Subsonic";
case Source::Qobuz: return "Qobuz";
case Source::SomaFM: return "SomaFM";
case Source::RadioParadise: return "Radio Paradise";
case Source::Unknown: return "Unknown";
}
return "unknown";
@@ -607,132 +607,132 @@ QString Song::DescriptionForSource(Source source) {
Song::Source Song::SourceFromText(const QString &source) {
if (source.compare("file", Qt::CaseInsensitive) == 0) return Source_LocalFile;
if (source.compare("collection", Qt::CaseInsensitive) == 0) return Source_Collection;
if (source.compare("cd", Qt::CaseInsensitive) == 0) return Source_CDDA;
if (source.compare("device", Qt::CaseInsensitive) == 0) return Source_Device;
if (source.compare("stream", Qt::CaseInsensitive) == 0) return Source_Stream;
if (source.compare("tidal", Qt::CaseInsensitive) == 0) return Source_Tidal;
if (source.compare("subsonic", Qt::CaseInsensitive) == 0) return Source_Subsonic;
if (source.compare("qobuz", Qt::CaseInsensitive) == 0) return Source_Qobuz;
if (source.compare("somafm", Qt::CaseInsensitive) == 0) return Source_SomaFM;
if (source.compare("radioparadise", Qt::CaseInsensitive) == 0) return Source_RadioParadise;
if (source.compare("file", Qt::CaseInsensitive) == 0) return Source::LocalFile;
if (source.compare("collection", Qt::CaseInsensitive) == 0) return Source::Collection;
if (source.compare("cd", Qt::CaseInsensitive) == 0) return Source::CDDA;
if (source.compare("device", Qt::CaseInsensitive) == 0) return Source::Device;
if (source.compare("stream", Qt::CaseInsensitive) == 0) return Source::Stream;
if (source.compare("tidal", Qt::CaseInsensitive) == 0) return Source::Tidal;
if (source.compare("subsonic", Qt::CaseInsensitive) == 0) return Source::Subsonic;
if (source.compare("qobuz", Qt::CaseInsensitive) == 0) return Source::Qobuz;
if (source.compare("somafm", Qt::CaseInsensitive) == 0) return Source::SomaFM;
if (source.compare("radioparadise", Qt::CaseInsensitive) == 0) return Source::RadioParadise;
return Source_Unknown;
return Source::Unknown;
}
QIcon Song::IconForSource(Source source) {
QIcon Song::IconForSource(const Source source) {
switch (source) {
case Song::Source_LocalFile: return IconLoader::Load("folder-sound");
case Song::Source_Collection: return IconLoader::Load("library-music");
case Song::Source_CDDA: return IconLoader::Load("media-optical");
case Song::Source_Device: return IconLoader::Load("device");
case Song::Source_Stream: return IconLoader::Load("applications-internet");
case Song::Source_Tidal: return IconLoader::Load("tidal");
case Song::Source_Subsonic: return IconLoader::Load("subsonic");
case Song::Source_Qobuz: return IconLoader::Load("qobuz");
case Song::Source_SomaFM: return IconLoader::Load("somafm");
case Song::Source_RadioParadise: return IconLoader::Load("radioparadise");
case Song::Source_Unknown: return IconLoader::Load("edit-delete");
case Source::LocalFile: return IconLoader::Load("folder-sound");
case Source::Collection: return IconLoader::Load("library-music");
case Source::CDDA: return IconLoader::Load("media-optical");
case Source::Device: return IconLoader::Load("device");
case Source::Stream: return IconLoader::Load("applications-internet");
case Source::Tidal: return IconLoader::Load("tidal");
case Source::Subsonic: return IconLoader::Load("subsonic");
case Source::Qobuz: return IconLoader::Load("qobuz");
case Source::SomaFM: return IconLoader::Load("somafm");
case Source::RadioParadise: return IconLoader::Load("radioparadise");
case Source::Unknown: return IconLoader::Load("edit-delete");
}
return IconLoader::Load("edit-delete");
}
QString Song::TextForFiletype(FileType filetype) {
QString Song::TextForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return "Wav";
case Song::FileType_FLAC: return "FLAC";
case Song::FileType_WavPack: return "WavPack";
case Song::FileType_OggFlac: return "Ogg FLAC";
case Song::FileType_OggVorbis: return "Ogg Vorbis";
case Song::FileType_OggOpus: return "Ogg Opus";
case Song::FileType_OggSpeex: return "Ogg Speex";
case Song::FileType_MPEG: return "MP3";
case Song::FileType_MP4: return "MP4 AAC";
case Song::FileType_ASF: return "Windows Media audio";
case Song::FileType_AIFF: return "AIFF";
case Song::FileType_MPC: return "MPC";
case Song::FileType_TrueAudio: return "TrueAudio";
case Song::FileType_DSF: return "DSF";
case Song::FileType_DSDIFF: return "DSDIFF";
case Song::FileType_PCM: return "PCM";
case Song::FileType_APE: return "Monkey's Audio";
case Song::FileType_MOD: return "Module Music Format";
case Song::FileType_S3M: return "Module Music Format";
case Song::FileType_XM: return "Module Music Format";
case Song::FileType_IT: return "Module Music Format";
case Song::FileType_CDDA: return "CDDA";
case Song::FileType_SPC: return "SNES SPC700";
case Song::FileType_VGM: return "VGM";
case Song::FileType_Stream: return "Stream";
case Song::FileType_Unknown:
case FileType::WAV: return "Wav";
case FileType::FLAC: return "FLAC";
case FileType::WavPack: return "WavPack";
case FileType::OggFlac: return "Ogg FLAC";
case FileType::OggVorbis: return "Ogg Vorbis";
case FileType::OggOpus: return "Ogg Opus";
case FileType::OggSpeex: return "Ogg Speex";
case FileType::MPEG: return "MP3";
case FileType::MP4: return "MP4 AAC";
case FileType::ASF: return "Windows Media audio";
case FileType::AIFF: return "AIFF";
case FileType::MPC: return "MPC";
case FileType::TrueAudio: return "TrueAudio";
case FileType::DSF: return "DSF";
case FileType::DSDIFF: return "DSDIFF";
case FileType::PCM: return "PCM";
case FileType::APE: return "Monkey's Audio";
case FileType::MOD: return "Module Music Format";
case FileType::S3M: return "Module Music Format";
case FileType::XM: return "Module Music Format";
case FileType::IT: return "Module Music Format";
case FileType::CDDA: return "CDDA";
case FileType::SPC: return "SNES SPC700";
case FileType::VGM: return "VGM";
case FileType::Stream: return "Stream";
case FileType::Unknown:
default: return QObject::tr("Unknown");
}
}
QString Song::ExtensionForFiletype(FileType filetype) {
QString Song::ExtensionForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return "wav";
case Song::FileType_FLAC: return "flac";
case Song::FileType_WavPack: return "wv";
case Song::FileType_OggFlac: return "flac";
case Song::FileType_OggVorbis: return "ogg";
case Song::FileType_OggOpus: return "opus";
case Song::FileType_OggSpeex: return "spx";
case Song::FileType_MPEG: return "mp3";
case Song::FileType_MP4: return "mp4";
case Song::FileType_ASF: return "wma";
case Song::FileType_AIFF: return "aiff";
case Song::FileType_MPC: return "mpc";
case Song::FileType_TrueAudio: return "tta";
case Song::FileType_DSF: return "dsf";
case Song::FileType_DSDIFF: return "dsd";
case Song::FileType_APE: return "ape";
case Song::FileType_MOD: return "mod";
case Song::FileType_S3M: return "s3m";
case Song::FileType_XM: return "xm";
case Song::FileType_IT: return "it";
case Song::FileType_SPC: return "spc";
case Song::FileType_VGM: return "vgm";
case Song::FileType_Unknown:
case FileType::WAV: return "wav";
case FileType::FLAC: return "flac";
case FileType::WavPack: return "wv";
case FileType::OggFlac: return "flac";
case FileType::OggVorbis: return "ogg";
case FileType::OggOpus: return "opus";
case FileType::OggSpeex: return "spx";
case FileType::MPEG: return "mp3";
case FileType::MP4: return "mp4";
case FileType::ASF: return "wma";
case FileType::AIFF: return "aiff";
case FileType::MPC: return "mpc";
case FileType::TrueAudio: return "tta";
case FileType::DSF: return "dsf";
case FileType::DSDIFF: return "dsd";
case FileType::APE: return "ape";
case FileType::MOD: return "mod";
case FileType::S3M: return "s3m";
case FileType::XM: return "xm";
case FileType::IT: return "it";
case FileType::SPC: return "spc";
case FileType::VGM: return "vgm";
case FileType::Unknown:
default: return "dat";
}
}
QIcon Song::IconForFiletype(FileType filetype) {
QIcon Song::IconForFiletype(const FileType filetype) {
switch (filetype) {
case Song::FileType_WAV: return IconLoader::Load("wav");
case Song::FileType_FLAC: return IconLoader::Load("flac");
case Song::FileType_WavPack: return IconLoader::Load("wavpack");
case Song::FileType_OggFlac: return IconLoader::Load("flac");
case Song::FileType_OggVorbis: return IconLoader::Load("vorbis");
case Song::FileType_OggOpus: return IconLoader::Load("opus");
case Song::FileType_OggSpeex: return IconLoader::Load("speex");
case Song::FileType_MPEG: return IconLoader::Load("mp3");
case Song::FileType_MP4: return IconLoader::Load("mp4");
case Song::FileType_ASF: return IconLoader::Load("wma");
case Song::FileType_AIFF: return IconLoader::Load("aiff");
case Song::FileType_MPC: return IconLoader::Load("mpc");
case Song::FileType_TrueAudio: return IconLoader::Load("trueaudio");
case Song::FileType_DSF: return IconLoader::Load("dsf");
case Song::FileType_DSDIFF: return IconLoader::Load("dsd");
case Song::FileType_PCM: return IconLoader::Load("pcm");
case Song::FileType_APE: return IconLoader::Load("ape");
case Song::FileType_MOD: return IconLoader::Load("mod");
case Song::FileType_S3M: return IconLoader::Load("s3m");
case Song::FileType_XM: return IconLoader::Load("xm");
case Song::FileType_IT: return IconLoader::Load("it");
case Song::FileType_CDDA: return IconLoader::Load("cd");
case Song::FileType_Stream: return IconLoader::Load("applications-internet");
case Song::FileType_Unknown:
case FileType::WAV: return IconLoader::Load("wav");
case FileType::FLAC: return IconLoader::Load("flac");
case FileType::WavPack: return IconLoader::Load("wavpack");
case FileType::OggFlac: return IconLoader::Load("flac");
case FileType::OggVorbis: return IconLoader::Load("vorbis");
case FileType::OggOpus: return IconLoader::Load("opus");
case FileType::OggSpeex: return IconLoader::Load("speex");
case FileType::MPEG: return IconLoader::Load("mp3");
case FileType::MP4: return IconLoader::Load("mp4");
case FileType::ASF: return IconLoader::Load("wma");
case FileType::AIFF: return IconLoader::Load("aiff");
case FileType::MPC: return IconLoader::Load("mpc");
case FileType::TrueAudio: return IconLoader::Load("trueaudio");
case FileType::DSF: return IconLoader::Load("dsf");
case FileType::DSDIFF: return IconLoader::Load("dsd");
case FileType::PCM: return IconLoader::Load("pcm");
case FileType::APE: return IconLoader::Load("ape");
case FileType::MOD: return IconLoader::Load("mod");
case FileType::S3M: return IconLoader::Load("s3m");
case FileType::XM: return IconLoader::Load("xm");
case FileType::IT: return IconLoader::Load("it");
case FileType::CDDA: return IconLoader::Load("cd");
case FileType::Stream: return IconLoader::Load("applications-internet");
case FileType::Unknown:
default: return IconLoader::Load("edit-delete");
}
@@ -740,17 +740,17 @@ QIcon Song::IconForFiletype(FileType filetype) {
bool Song::IsFileLossless() const {
switch (filetype()) {
case Song::FileType_WAV:
case Song::FileType_FLAC:
case Song::FileType_OggFlac:
case Song::FileType_WavPack:
case Song::FileType_AIFF:
case Song::FileType_DSF:
case Song::FileType_DSDIFF:
case Song::FileType_APE:
case Song::FileType_TrueAudio:
case Song::FileType_PCM:
case Song::FileType_CDDA:
case FileType::WAV:
case FileType::FLAC:
case FileType::OggFlac:
case FileType::WavPack:
case FileType::AIFF:
case FileType::DSF:
case FileType::DSDIFF:
case FileType::APE:
case FileType::TrueAudio:
case FileType::PCM:
case FileType::CDDA:
return true;
default:
return false;
@@ -759,103 +759,103 @@ bool Song::IsFileLossless() const {
Song::FileType Song::FiletypeByMimetype(const QString &mimetype) {
if (mimetype.compare("audio/wav", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-wav", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (mimetype.compare("audio/x-flac", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (mimetype.compare("audio/x-wavpack", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (mimetype.compare("audio/x-vorbis", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (mimetype.compare("audio/x-opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (mimetype.compare("audio/x-speex", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
if (mimetype.compare("audio/wav", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-wav", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (mimetype.compare("audio/x-flac", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (mimetype.compare("audio/x-wavpack", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (mimetype.compare("audio/x-vorbis", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (mimetype.compare("audio/x-opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (mimetype.compare("audio/x-speex", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
// Gstreamer returns audio/mpeg for both MP3 and MP4/AAC.
// else if (mimetype.compare("audio/mpeg", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (mimetype.compare("audio/aac", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (mimetype.compare("audio/x-wma", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (mimetype.compare("audio/aiff", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-aiff", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (mimetype.compare("application/x-project", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (mimetype.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (mimetype.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (mimetype.compare("audio/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("application/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
else if (mimetype.compare("audio/x-mod", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (mimetype.compare("audio/x-s3m", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (mimetype.compare("audio/x-spc", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (mimetype.compare("audio/x-vgm", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
// else if (mimetype.compare("audio/mpeg", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (mimetype.compare("audio/aac", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (mimetype.compare("audio/x-wma", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (mimetype.compare("audio/aiff", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-aiff", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (mimetype.compare("application/x-project", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (mimetype.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (mimetype.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (mimetype.compare("audio/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("application/x-ape", Qt::CaseInsensitive) == 0 || mimetype.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (mimetype.compare("audio/x-mod", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (mimetype.compare("audio/x-s3m", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (mimetype.compare("audio/x-spc", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (mimetype.compare("audio/x-vgm", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return Song::FileType_Unknown;
else return FileType::Unknown;
}
Song::FileType Song::FiletypeByDescription(const QString &text) {
if (text.compare("WAV", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (text.compare("Free Lossless Audio Codec (FLAC)", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (text.compare("Wavpack", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (text.compare("Vorbis", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (text.compare("Opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (text.compare("Speex", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
else if (text.compare("MPEG-1 Layer 3 (MP3)", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (text.compare("MPEG-4 AAC", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (text.compare("WMA", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (text.compare("Audio Interchange File Format", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (text.compare("MPC", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (text.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (text.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (text.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (text.compare("SNES SPC700", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (text.compare("VGM", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
else return Song::FileType_Unknown;
if (text.compare("WAV", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (text.compare("Free Lossless Audio Codec (FLAC)", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (text.compare("Wavpack", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (text.compare("Vorbis", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (text.compare("Opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (text.compare("Speex", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
else if (text.compare("MPEG-1 Layer 3 (MP3)", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (text.compare("MPEG-4 AAC", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (text.compare("WMA", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (text.compare("Audio Interchange File Format", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (text.compare("MPC", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (text.compare("audio/x-dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (text.compare("audio/x-dsd", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (text.compare("audio/x-ffmpeg-parsed-ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (text.compare("Module Music Format (MOD)", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (text.compare("SNES SPC700", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (text.compare("VGM", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return FileType::Unknown;
}
Song::FileType Song::FiletypeByExtension(const QString &ext) {
if (ext.compare("wav", Qt::CaseInsensitive) == 0 || ext.compare("wave", Qt::CaseInsensitive) == 0) return Song::FileType_WAV;
else if (ext.compare("flac", Qt::CaseInsensitive) == 0) return Song::FileType_FLAC;
else if (ext.compare("wavpack", Qt::CaseInsensitive) == 0 || ext.compare("wv", Qt::CaseInsensitive) == 0) return Song::FileType_WavPack;
else if (ext.compare("ogg", Qt::CaseInsensitive) == 0 || ext.compare("oga", Qt::CaseInsensitive) == 0) return Song::FileType_OggVorbis;
else if (ext.compare("opus", Qt::CaseInsensitive) == 0) return Song::FileType_OggOpus;
else if (ext.compare("speex", Qt::CaseInsensitive) == 0 || ext.compare("spx", Qt::CaseInsensitive) == 0) return Song::FileType_OggSpeex;
else if (ext.compare("mp3", Qt::CaseInsensitive) == 0) return Song::FileType_MPEG;
else if (ext.compare("mp4", Qt::CaseInsensitive) == 0 || ext.compare("m4a", Qt::CaseInsensitive) == 0 || ext.compare("aac", Qt::CaseInsensitive) == 0) return Song::FileType_MP4;
else if (ext.compare("asf", Qt::CaseInsensitive) == 0 || ext.compare("wma", Qt::CaseInsensitive) == 0) return Song::FileType_ASF;
else if (ext.compare("aiff", Qt::CaseInsensitive) == 0 || ext.compare("aif", Qt::CaseInsensitive) == 0 || ext.compare("aifc", Qt::CaseInsensitive) == 0) return Song::FileType_AIFF;
else if (ext.compare("mpc", Qt::CaseInsensitive) == 0 || ext.compare("mp+", Qt::CaseInsensitive) == 0 || ext.compare("mpp", Qt::CaseInsensitive) == 0) return Song::FileType_MPC;
else if (ext.compare("dsf", Qt::CaseInsensitive) == 0) return Song::FileType_DSF;
else if (ext.compare("dsd", Qt::CaseInsensitive) == 0 || ext.compare("dff", Qt::CaseInsensitive) == 0) return Song::FileType_DSDIFF;
else if (ext.compare("ape", Qt::CaseInsensitive) == 0) return Song::FileType_APE;
if (ext.compare("wav", Qt::CaseInsensitive) == 0 || ext.compare("wave", Qt::CaseInsensitive) == 0) return FileType::WAV;
else if (ext.compare("flac", Qt::CaseInsensitive) == 0) return FileType::FLAC;
else if (ext.compare("wavpack", Qt::CaseInsensitive) == 0 || ext.compare("wv", Qt::CaseInsensitive) == 0) return FileType::WavPack;
else if (ext.compare("ogg", Qt::CaseInsensitive) == 0 || ext.compare("oga", Qt::CaseInsensitive) == 0) return FileType::OggVorbis;
else if (ext.compare("opus", Qt::CaseInsensitive) == 0) return FileType::OggOpus;
else if (ext.compare("speex", Qt::CaseInsensitive) == 0 || ext.compare("spx", Qt::CaseInsensitive) == 0) return FileType::OggSpeex;
else if (ext.compare("mp3", Qt::CaseInsensitive) == 0) return FileType::MPEG;
else if (ext.compare("mp4", Qt::CaseInsensitive) == 0 || ext.compare("m4a", Qt::CaseInsensitive) == 0 || ext.compare("aac", Qt::CaseInsensitive) == 0) return FileType::MP4;
else if (ext.compare("asf", Qt::CaseInsensitive) == 0 || ext.compare("wma", Qt::CaseInsensitive) == 0) return FileType::ASF;
else if (ext.compare("aiff", Qt::CaseInsensitive) == 0 || ext.compare("aif", Qt::CaseInsensitive) == 0 || ext.compare("aifc", Qt::CaseInsensitive) == 0) return FileType::AIFF;
else if (ext.compare("mpc", Qt::CaseInsensitive) == 0 || ext.compare("mp+", Qt::CaseInsensitive) == 0 || ext.compare("mpp", Qt::CaseInsensitive) == 0) return FileType::MPC;
else if (ext.compare("dsf", Qt::CaseInsensitive) == 0) return FileType::DSF;
else if (ext.compare("dsd", Qt::CaseInsensitive) == 0 || ext.compare("dff", Qt::CaseInsensitive) == 0) return FileType::DSDIFF;
else if (ext.compare("ape", Qt::CaseInsensitive) == 0) return FileType::APE;
else if (ext.compare("mod", Qt::CaseInsensitive) == 0 ||
ext.compare("module", Qt::CaseInsensitive) == 0 ||
ext.compare("nst", Qt::CaseInsensitive) == 0||
ext.compare("wow", Qt::CaseInsensitive) == 0) return Song::FileType_MOD;
else if (ext.compare("s3m", Qt::CaseInsensitive) == 0) return Song::FileType_S3M;
else if (ext.compare("xm", Qt::CaseInsensitive) == 0) return Song::FileType_XM;
else if (ext.compare("it", Qt::CaseInsensitive) == 0) return Song::FileType_IT;
else if (ext.compare("spc", Qt::CaseInsensitive) == 0) return Song::FileType_SPC;
else if (ext.compare("vgm", Qt::CaseInsensitive) == 0) return Song::FileType_VGM;
ext.compare("wow", Qt::CaseInsensitive) == 0) return FileType::MOD;
else if (ext.compare("s3m", Qt::CaseInsensitive) == 0) return FileType::S3M;
else if (ext.compare("xm", Qt::CaseInsensitive) == 0) return FileType::XM;
else if (ext.compare("it", Qt::CaseInsensitive) == 0) return FileType::IT;
else if (ext.compare("spc", Qt::CaseInsensitive) == 0) return FileType::SPC;
else if (ext.compare("vgm", Qt::CaseInsensitive) == 0) return FileType::VGM;
else return Song::FileType_Unknown;
else return FileType::Unknown;
}
QString Song::ImageCacheDir(const Song::Source source) {
QString Song::ImageCacheDir(const Source source) {
switch (source) {
case Song::Source_Collection:
case Source::Collection:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/collectionalbumcovers";
case Song::Source_Subsonic:
case Source::Subsonic:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/subsonicalbumcovers";
case Song::Source_Tidal:
case Source::Tidal:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/tidalalbumcovers";
case Song::Source_Qobuz:
case Source::Qobuz:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/qobuzalbumcovers";
case Song::Source_Device:
case Source::Device:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/devicealbumcovers";
case Song::Source_LocalFile:
case Song::Source_CDDA:
case Song::Source_Stream:
case Song::Source_SomaFM:
case Song::Source_RadioParadise:
case Song::Source_Unknown:
case Source::LocalFile:
case Source::CDDA:
case Source::Stream:
case Source::SomaFM:
case Source::RadioParadise:
case Source::Unknown:
return QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/albumcovers";
}
@@ -899,7 +899,7 @@ void Song::Init(const QString &title, const QString &artist, const QString &albu
void Song::InitFromProtobuf(const spb::tagreader::SongMetadata &pb) {
if (d->source_ == Source_Unknown) d->source_ = Source_LocalFile;
if (d->source_ == Source::Unknown) d->source_ = Source::LocalFile;
d->init_from_file_ = true;
d->valid_ = pb.valid();
@@ -1068,7 +1068,7 @@ void Song::InitFromFilePartial(const QString &filename, const QFileInfo &fileinf
set_url(QUrl::fromLocalFile(filename));
d->valid_ = true;
d->source_ = Source_LocalFile;
d->source_ = Source::LocalFile;
d->filetype_ = FiletypeByExtension(fileinfo.suffix());
d->basefilename_ = fileinfo.fileName();
d->title_ = fileinfo.fileName();
@@ -1091,7 +1091,7 @@ void Song::InitArtManual() {
void Song::InitArtAutomatic() {
if (d->source_ == Source_LocalFile && d->url_.isLocalFile() && d->art_automatic_.isEmpty()) {
if (d->source_ == Source::LocalFile && d->url_.isLocalFile() && d->art_automatic_.isEmpty()) {
// Pick the first image file in the album directory.
QFileInfo file(d->url_.toLocalFile());
QDir dir(file.path());
@@ -1127,7 +1127,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
d->samplerate_ = track->samplerate;
d->bitdepth_ = -1; //track->bitdepth;
d->source_ = Source_Device;
d->source_ = Source::Device;
QString filename = QString::fromLocal8Bit(track->ipod_path);
filename.replace(':', '/');
if (prefix.contains("://")) {
@@ -1138,7 +1138,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
}
d->basefilename_ = QFileInfo(filename).fileName();
d->filetype_ = track->type2 ? FileType_MPEG : FileType_MP4;
d->filetype_ = track->type2 ? FileType::MPEG : FileType::MP4;
d->filesize_ = track->size;
d->mtime_ = track->time_modified;
d->ctime_ = track->time_added;
@@ -1150,7 +1150,7 @@ void Song::InitFromItdb(Itdb_Track *track, const QString &prefix) {
if (itdb_track_has_thumbnails(track) && !d->artist_.isEmpty() && !d->title_.isEmpty()) {
GdkPixbuf *pixbuf = static_cast<GdkPixbuf*>(itdb_track_get_thumbnail(track, -1, -1));
if (pixbuf) {
QString cover_path = ImageCacheDir(Source_Device);
QString cover_path = ImageCacheDir(Source::Device);
QDir dir(cover_path);
if (!dir.exists()) dir.mkpath(cover_path);
QString cover_file = cover_path + "/" + Utilities::Sha1CoverHash(effective_albumartist(), effective_album()).toHex() + ".jpg";
@@ -1184,8 +1184,8 @@ void Song::ToItdb(Itdb_Track *track) const {
track->bitrate = d->bitrate_;
track->samplerate = d->samplerate_;
track->type1 = (d->filetype_ == FileType_MPEG ? 1 : 0);
track->type2 = (d->filetype_ == FileType_MPEG ? 1 : 0);
track->type1 = (d->filetype_ == FileType::MPEG ? 1 : 0);
track->type2 = (d->filetype_ == FileType::MPEG ? 1 : 0);
track->mediatype = 1; // Audio
track->size = static_cast<uint>(d->filesize_);
track->time_modified = d->mtime_;
@@ -1202,7 +1202,7 @@ void Song::ToItdb(Itdb_Track *track) const {
void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) {
d->valid_ = true;
d->source_ = Source_Device;
d->source_ = Source::Device;
set_title(QString::fromUtf8(track->title));
set_artist(QString::fromUtf8(track->artist));
@@ -1226,19 +1226,19 @@ void Song::InitFromMTP(const LIBMTP_track_t *track, const QString &host) {
d->playcount_ = track->usecount;
switch (track->filetype) {
case LIBMTP_FILETYPE_WAV: d->filetype_ = FileType_WAV; break;
case LIBMTP_FILETYPE_MP3: d->filetype_ = FileType_MPEG; break;
case LIBMTP_FILETYPE_WMA: d->filetype_ = FileType_ASF; break;
case LIBMTP_FILETYPE_OGG: d->filetype_ = FileType_OggVorbis; break;
case LIBMTP_FILETYPE_MP4: d->filetype_ = FileType_MP4; break;
case LIBMTP_FILETYPE_AAC: d->filetype_ = FileType_MP4; break;
case LIBMTP_FILETYPE_FLAC: d->filetype_ = FileType_OggFlac; break;
case LIBMTP_FILETYPE_MP2: d->filetype_ = FileType_MPEG; break;
case LIBMTP_FILETYPE_M4A: d->filetype_ = FileType_MP4; break;
default:
d->filetype_ = FileType_Unknown;
d->valid_ = false;
break;
case LIBMTP_FILETYPE_WAV: d->filetype_ = FileType::WAV; break;
case LIBMTP_FILETYPE_MP3: d->filetype_ = FileType::MPEG; break;
case LIBMTP_FILETYPE_WMA: d->filetype_ = FileType::ASF; break;
case LIBMTP_FILETYPE_OGG: d->filetype_ = FileType::OggVorbis; break;
case LIBMTP_FILETYPE_MP4: d->filetype_ = FileType::MP4; break;
case LIBMTP_FILETYPE_AAC: d->filetype_ = FileType::MP4; break;
case LIBMTP_FILETYPE_FLAC: d->filetype_ = FileType::OggFlac; break;
case LIBMTP_FILETYPE_MP2: d->filetype_ = FileType::MPEG; break;
case LIBMTP_FILETYPE_M4A: d->filetype_ = FileType::MP4; break;
default:
d->filetype_ = FileType::Unknown;
d->valid_ = false;
break;
}
}
@@ -1276,14 +1276,14 @@ void Song::ToMTP(LIBMTP_track_t *track) const {
track->usecount = d->playcount_;
switch (d->filetype_) {
case FileType_ASF: track->filetype = LIBMTP_FILETYPE_ASF; break;
case FileType_MP4: track->filetype = LIBMTP_FILETYPE_MP4; break;
case FileType_MPEG: track->filetype = LIBMTP_FILETYPE_MP3; break;
case FileType_FLAC:
case FileType_OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break;
case FileType_OggSpeex:
case FileType_OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break;
case FileType_WAV: track->filetype = LIBMTP_FILETYPE_WAV; break;
case FileType::ASF: track->filetype = LIBMTP_FILETYPE_ASF; break;
case FileType::MP4: track->filetype = LIBMTP_FILETYPE_MP4; break;
case FileType::MPEG: track->filetype = LIBMTP_FILETYPE_MP3; break;
case FileType::FLAC:
case FileType::OggFlac: track->filetype = LIBMTP_FILETYPE_FLAC; break;
case FileType::OggSpeex:
case FileType::OggVorbis: track->filetype = LIBMTP_FILETYPE_OGG; break;
case FileType::WAV: track->filetype = LIBMTP_FILETYPE_WAV; break;
default: track->filetype = LIBMTP_FILETYPE_UNDEF_AUDIO; break;
}
@@ -1335,7 +1335,7 @@ bool Song::MergeFromSimpleMetaBundle(const Engine::SimpleMetaBundle &bundle) {
if (bundle.length > 0) set_length_nanosec(bundle.length);
if (bundle.year > 0) d->year_ = bundle.year;
if (bundle.track > 0) d->track_ = bundle.track;
if (bundle.filetype != FileType_Unknown) d->filetype_ = bundle.filetype;
if (bundle.filetype != FileType::Unknown) d->filetype_ = bundle.filetype;
if (bundle.samplerate > 0) d->samplerate_ = bundle.samplerate;
if (bundle.bitdepth > 0) d->bitdepth_ = bundle.bitdepth;
if (bundle.bitrate > 0) d->bitrate_ = bundle.bitrate;
@@ -1375,10 +1375,10 @@ void Song::BindToQuery(SqlQuery *query) const {
query->BindIntValue(":samplerate", d->samplerate_);
query->BindIntValue(":bitdepth", d->bitdepth_);
query->BindValue(":source", d->source_);
query->BindValue(":source", static_cast<int>(d->source_));
query->BindNotNullIntValue(":directory_id", d->directory_id_);
query->BindUrlValue(":url", d->url_);
query->BindValue(":filetype", d->filetype_);
query->BindValue(":filetype", static_cast<int>(d->filetype_));
query->BindLongLongValueOrZero(":filesize", d->filesize_);
query->BindLongLongValueOrZero(":mtime", d->mtime_);
query->BindLongLongValueOrZero(":ctime", d->ctime_);
@@ -1564,7 +1564,7 @@ bool Song::IsAllMetadataEqual(const Song &other) const {
}
bool Song::IsEditable() const {
return d->valid_ && d->url_.isValid() && (d->url_.isLocalFile() || d->source_ == Source_Stream) && !has_cue();
return d->valid_ && d->url_.isValid() && (d->url_.isLocalFile() || d->source_ == Source::Stream) && !has_cue();
}
bool Song::operator==(const Song &other) const {

View File

@@ -65,53 +65,53 @@ class Song {
public:
enum Source {
Source_Unknown = 0,
Source_LocalFile = 1,
Source_Collection = 2,
Source_CDDA = 3,
Source_Device = 4,
Source_Stream = 5,
Source_Tidal = 6,
Source_Subsonic = 7,
Source_Qobuz = 8,
Source_SomaFM = 9,
Source_RadioParadise = 10
enum class Source {
Unknown = 0,
LocalFile = 1,
Collection = 2,
CDDA = 3,
Device = 4,
Stream = 5,
Tidal = 6,
Subsonic = 7,
Qobuz = 8,
SomaFM = 9,
RadioParadise = 10
};
// Don't change these values - they're stored in the database, and defined in the tag reader protobuf.
// If a new lossless file is added, also add it to IsFileLossless().
enum FileType {
FileType_Unknown = 0,
FileType_WAV = 1,
FileType_FLAC = 2,
FileType_WavPack = 3,
FileType_OggFlac = 4,
FileType_OggVorbis = 5,
FileType_OggOpus = 6,
FileType_OggSpeex = 7,
FileType_MPEG = 8,
FileType_MP4 = 9,
FileType_ASF = 10,
FileType_AIFF = 11,
FileType_MPC = 12,
FileType_TrueAudio = 13,
FileType_DSF = 14,
FileType_DSDIFF = 15,
FileType_PCM = 16,
FileType_APE = 17,
FileType_MOD = 18,
FileType_S3M = 19,
FileType_XM = 20,
FileType_IT = 21,
FileType_SPC = 22,
FileType_VGM = 23,
FileType_CDDA = 90,
FileType_Stream = 91,
enum class FileType {
Unknown = 0,
WAV = 1,
FLAC = 2,
WavPack = 3,
OggFlac = 4,
OggVorbis = 5,
OggOpus = 6,
OggSpeex = 7,
MPEG = 8,
MP4 = 9,
ASF = 10,
AIFF = 11,
MPC = 12,
TrueAudio = 13,
DSF = 14,
DSDIFF = 15,
PCM = 16,
APE = 17,
MOD = 18,
S3M = 19,
XM = 20,
IT = 21,
SPC = 22,
VGM = 23,
CDDA = 90,
Stream = 91
};
Song(Song::Source source = Song::Source_Unknown);
Song(Source source = Source::Unknown);
Song(const Song &other);
~Song();
@@ -139,13 +139,13 @@ class Song {
static QString JoinSpec(const QString &table);
static Source SourceFromURL(const QUrl &url);
static QString TextForSource(Source source);
static QString DescriptionForSource(Source source);
static Song::Source SourceFromText(const QString &source);
static QIcon IconForSource(Source source);
static QString TextForFiletype(FileType filetype);
static QString ExtensionForFiletype(FileType filetype);
static QIcon IconForFiletype(FileType filetype);
static QString TextForSource(const Source source);
static QString DescriptionForSource(const Source source);
static Source SourceFromText(const QString &source);
static QIcon IconForSource(const Source source);
static QString TextForFiletype(const FileType filetype);
static QString ExtensionForFiletype(const FileType filetype);
static QIcon IconForFiletype(const FileType filetype);
QString TextForSource() const { return TextForSource(source()); }
QString DescriptionForSource() const { return DescriptionForSource(source()); }
@@ -157,7 +157,7 @@ class Song {
static FileType FiletypeByMimetype(const QString &mimetype);
static FileType FiletypeByDescription(const QString &text);
static FileType FiletypeByExtension(const QString &ext);
static QString ImageCacheDir(const Song::Source source);
static QString ImageCacheDir(const Source source);
// Sort songs alphabetically using their pretty title
static int CompareSongsName(const Song &song1, const Song &song2);

View File

@@ -72,7 +72,7 @@ SongLoader::SongLoader(CollectionBackendInterface *collection, const Player *pla
playlist_parser_(new PlaylistParser(collection, this)),
cue_parser_(new CueParser(collection, this)),
timeout_(kDefaultTimeout),
state_(WaitingForType),
state_(State::WaitingForType),
success_(false),
parser_(nullptr),
collection_(collection),
@@ -100,7 +100,7 @@ SongLoader::~SongLoader() {
#ifdef HAVE_GSTREAMER
if (pipeline_) {
state_ = Finished;
state_ = State::Finished;
gst_element_set_state(pipeline_.get(), GST_STATE_NULL);
}
#endif
@@ -109,7 +109,7 @@ SongLoader::~SongLoader() {
SongLoader::Result SongLoader::Load(const QUrl &url) {
if (url.isEmpty()) return Error;
if (url.isEmpty()) return Result::Error;
url_ = url;
@@ -121,13 +121,13 @@ SongLoader::Result SongLoader::Load(const QUrl &url) {
// The URI scheme indicates that it can't possibly be a playlist,
// or we have a custom handler for the URL, so add it as a raw stream.
AddAsRawStream();
return Success;
return Result::Success;
}
if (player_->engine()->type() == Engine::GStreamer) {
if (player_->engine()->type() == Engine::EngineType::GStreamer) {
#ifdef HAVE_GSTREAMER
preload_func_ = std::bind(&SongLoader::LoadRemote, this);
return BlockingLoadRequired;
return Result::BlockingLoadRequired;
#else
errors_ << tr("You need GStreamer for this URL.");
return Error;
@@ -135,10 +135,10 @@ SongLoader::Result SongLoader::Load(const QUrl &url) {
}
else {
errors_ << tr("You need GStreamer for this URL.");
return Error;
return Result::Error;
}
return Success;
return Result::Success;
}
@@ -149,7 +149,7 @@ SongLoader::Result SongLoader::LoadFilenamesBlocking() {
}
else {
errors_ << tr("Preload function was not set for blocking operation.");
return Error;
return Result::Error;
}
}
@@ -162,44 +162,44 @@ SongLoader::Result SongLoader::LoadLocalPartial(const QString &filename) {
if (!fileinfo.exists()) {
errors_ << tr("File %1 does not exist.").arg(filename);
return Error;
return Result::Error;
}
// First check to see if it's a directory - if so we can load all the songs inside right away.
if (fileinfo.isDir()) {
LoadLocalDirectory(filename);
return Success;
return Result::Success;
}
// Assume it's just a normal file
if (TagReaderClient::Instance()->IsMediaFileBlocking(filename) || Song::kAcceptedExtensions.contains(fileinfo.suffix(), Qt::CaseInsensitive)) {
Song song(Song::Source_LocalFile);
Song song(Song::Source::LocalFile);
song.InitFromFilePartial(filename, fileinfo);
if (song.is_valid()) {
songs_ << song;
return Success;
return Result::Success;
}
}
errors_ << QObject::tr("File %1 is not recognized as a valid audio file.").arg(filename);
return Error;
return Result::Error;
}
SongLoader::Result SongLoader::LoadAudioCD() {
#if defined(HAVE_AUDIOCD) && defined(HAVE_GSTREAMER)
if (player_->engine()->type() == Engine::GStreamer) {
if (player_->engine()->type() == Engine::EngineType::GStreamer) {
CddaSongLoader *cdda_song_loader = new CddaSongLoader(QUrl(), this);
QObject::connect(cdda_song_loader, &CddaSongLoader::SongsDurationLoaded, this, &SongLoader::AudioCDTracksLoadFinishedSlot);
QObject::connect(cdda_song_loader, &CddaSongLoader::SongsMetadataLoaded, this, &SongLoader::AudioCDTracksTagsLoaded);
cdda_song_loader->LoadSongs();
return Success;
return Result::Success;
}
else {
#endif
errors_ << tr("CD playback is only available with the GStreamer engine.");
return Error;
return Result::Error;
#if defined(HAVE_AUDIOCD) && defined(HAVE_GSTREAMER)
}
#endif
@@ -243,7 +243,7 @@ SongLoader::Result SongLoader::LoadLocal(const QString &filename) {
if (query.Exec() && query.Next()) {
// We may have many results when the file has many sections
do {
Song song(Song::Source_Collection);
Song song(Song::Source::Collection);
song.InitFromQuery(query, true);
if (song.is_valid()) {
@@ -251,12 +251,12 @@ SongLoader::Result SongLoader::LoadLocal(const QString &filename) {
}
} while (query.Next());
return Success;
return Result::Success;
}
// It's not in the database, load it asynchronously.
preload_func_ = std::bind(&SongLoader::LoadLocalAsync, this, filename);
return BlockingLoadRequired;
return Result::BlockingLoadRequired;
}
@@ -266,20 +266,20 @@ SongLoader::Result SongLoader::LoadLocalAsync(const QString &filename) {
if (!fileinfo.exists()) {
errors_ << tr("File %1 does not exist.").arg(filename);
return Error;
return Result::Error;
}
// First check to see if it's a directory - if so we will load all the songs inside right away.
if (fileinfo.isDir()) {
LoadLocalDirectory(filename);
return Success;
return Result::Success;
}
// It's a local file, so check if it looks like a playlist. Read the first few bytes.
QFile file(filename);
if (!file.open(QIODevice::ReadOnly)) {
errors_ << tr("Could not open file %1 for reading: %2").arg(filename, file.errorString());
return Error;
return Result::Error;
}
QByteArray data(file.read(PlaylistParser::kMagicSize));
file.close();
@@ -287,13 +287,13 @@ SongLoader::Result SongLoader::LoadLocalAsync(const QString &filename) {
ParserBase *parser = playlist_parser_->ParserForMagic(data);
if (!parser) {
// Check the file extension as well, maybe the magic failed, or it was a basic M3U file which is just a plain list of filenames.
parser = playlist_parser_->ParserForExtension(PlaylistParser::Type_Load, fileinfo.suffix().toLower());
parser = playlist_parser_->ParserForExtension(PlaylistParser::Type::Load, fileinfo.suffix().toLower());
}
if (parser) { // It's a playlist!
qLog(Debug) << "Parsing using" << parser->name();
LoadPlaylist(parser, filename);
return Success;
return Result::Success;
}
// Check if it's a CUE file
@@ -307,26 +307,26 @@ SongLoader::Result SongLoader::LoadLocalAsync(const QString &filename) {
for (const Song &song : songs) {
if (song.is_valid()) songs_ << song;
}
return Success;
return Result::Success;
}
else {
errors_ << tr("Could not open CUE file %1 for reading: %2").arg(matching_cue, cue.errorString());
return Error;
return Result::Error;
}
}
// Assume it's just a normal file
if (TagReaderClient::Instance()->IsMediaFileBlocking(filename) || Song::kAcceptedExtensions.contains(fileinfo.suffix(), Qt::CaseInsensitive)) {
Song song(Song::Source_LocalFile);
Song song(Song::Source::LocalFile);
song.InitFromFilePartial(filename, fileinfo);
if (song.is_valid()) {
songs_ << song;
return Success;
return Result::Success;
}
}
errors_ << QObject::tr("File %1 is not recognized as a valid audio file.").arg(filename);
return Error;
return Result::Error;
}
@@ -342,7 +342,7 @@ void SongLoader::EffectiveSongLoad(Song *song) {
if (!song || !song->url().isLocalFile()) return;
if (song->init_from_file() && song->filetype() != Song::FileType_Unknown) {
if (song->init_from_file() && song->filetype() != Song::FileType::Unknown) {
// Maybe we loaded the metadata already, for example from a cuesheet.
return;
}
@@ -409,7 +409,7 @@ void SongLoader::AddAsRawStream() {
Song song(Song::SourceFromURL(url_));
song.set_valid(true);
song.set_filetype(Song::FileType_Stream);
song.set_filetype(Song::FileType::Stream);
song.set_url(url_);
song.set_title(url_.toString());
songs_ << song;
@@ -417,7 +417,7 @@ void SongLoader::AddAsRawStream() {
}
void SongLoader::Timeout() {
state_ = Finished;
state_ = State::Finished;
success_ = false;
StopTypefind();
}
@@ -475,7 +475,7 @@ SongLoader::Result SongLoader::LoadRemote() {
GstElement *source = gst_element_make_from_uri(GST_URI_SRC, url_.toEncoded().constData(), nullptr, nullptr);
if (!source) {
errors_ << tr("Couldn't create GStreamer source element for %1").arg(url_.toString());
return Error;
return Result::Error;
}
g_object_set(source, "ssl-strict", FALSE, nullptr);
@@ -508,7 +508,7 @@ SongLoader::Result SongLoader::LoadRemote() {
// Wait until loading is finished
loop.exec();
return Success;
return Result::Success;
}
#endif
@@ -518,14 +518,14 @@ void SongLoader::TypeFound(GstElement*, uint, GstCaps *caps, void *self) {
SongLoader *instance = static_cast<SongLoader*>(self);
if (instance->state_ != WaitingForType) return;
if (instance->state_ != State::WaitingForType) return;
// Check the mimetype
instance->mime_type_ = gst_structure_get_name(gst_caps_get_structure(caps, 0));
qLog(Debug) << "Mime type is" << instance->mime_type_;
if (instance->mime_type_ == "text/plain" || instance->mime_type_ == "text/uri-list") {
// Yeah it might be a playlist, let's get some data and have a better look
instance->state_ = WaitingForMagic;
instance->state_ = State::WaitingForMagic;
return;
}
@@ -540,7 +540,7 @@ GstPadProbeReturn SongLoader::DataReady(GstPad*, GstPadProbeInfo *info, gpointer
SongLoader *instance = reinterpret_cast<SongLoader*>(self);
if (instance->state_ == Finished) {
if (instance->state_ == State::Finished) {
return GST_PAD_PROBE_OK;
}
@@ -553,7 +553,7 @@ GstPadProbeReturn SongLoader::DataReady(GstPad*, GstPadProbeInfo *info, gpointer
qLog(Debug) << "Received total" << instance->buffer_.size() << "bytes";
gst_buffer_unmap(buffer, &map);
if (instance->state_ == WaitingForMagic && (instance->buffer_.size() >= PlaylistParser::kMagicSize || !instance->IsPipelinePlaying())) {
if (instance->state_ == State::WaitingForMagic && (instance->buffer_.size() >= PlaylistParser::kMagicSize || !instance->IsPipelinePlaying())) {
// Got enough that we can test the magic
instance->MagicReady();
}
@@ -604,7 +604,7 @@ GstBusSyncReply SongLoader::BusCallbackSync(GstBus*, GstMessage *msg, gpointer s
#ifdef HAVE_GSTREAMER
void SongLoader::ErrorMessageReceived(GstMessage *msg) {
if (state_ == Finished) return;
if (state_ == State::Finished) return;
GError *error = nullptr;
gchar *debugs = nullptr;
@@ -618,9 +618,9 @@ void SongLoader::ErrorMessageReceived(GstMessage *msg) {
g_error_free(error);
g_free(debugs);
if (state_ == WaitingForType && message_str == gst_error_get_message(GST_STREAM_ERROR, GST_STREAM_ERROR_TYPE_NOT_FOUND)) {
if (state_ == State::WaitingForType && message_str == gst_error_get_message(GST_STREAM_ERROR, GST_STREAM_ERROR_TYPE_NOT_FOUND)) {
// Don't give up - assume it's a playlist and see if one of our parsers can read it.
state_ = WaitingForMagic;
state_ = State::WaitingForMagic;
return;
}
@@ -632,24 +632,24 @@ void SongLoader::ErrorMessageReceived(GstMessage *msg) {
#ifdef HAVE_GSTREAMER
void SongLoader::EndOfStreamReached() {
qLog(Debug) << Q_FUNC_INFO << state_;
qLog(Debug) << Q_FUNC_INFO << static_cast<int>(state_);
switch (state_) {
case Finished:
case State::Finished:
break;
case WaitingForMagic:
case State::WaitingForMagic:
// Do the magic on the data we have already
MagicReady();
if (state_ == Finished) break;
if (state_ == State::Finished) break;
// It looks like a playlist, so parse it
[[fallthrough]];
case WaitingForData:
case State::WaitingForData:
// It's a playlist and we've got all the data - finish and parse it
StopTypefindAsync(true);
break;
case WaitingForType:
case State::WaitingForType:
StopTypefindAsync(false);
break;
}
@@ -680,7 +680,7 @@ void SongLoader::MagicReady() {
StopTypefindAsync(true);
}
state_ = WaitingForData;
state_ = State::WaitingForData;
if (!IsPipelinePlaying()) {
EndOfStreamReached();
@@ -708,7 +708,7 @@ bool SongLoader::IsPipelinePlaying() {
#ifdef HAVE_GSTREAMER
void SongLoader::StopTypefindAsync(bool success) {
state_ = Finished;
state_ = State::Finished;
success_ = success;
QMetaObject::invokeMethod(this, "StopTypefind", Qt::QueuedConnection);

View File

@@ -60,10 +60,10 @@ class SongLoader : public QObject {
explicit SongLoader(CollectionBackendInterface *collection, const Player *player, QObject *parent = nullptr);
~SongLoader() override;
enum Result {
enum class Result {
Success,
Error,
BlockingLoadRequired,
BlockingLoadRequired
};
static const int kDefaultTimeout;
@@ -101,7 +101,12 @@ class SongLoader : public QObject {
#endif // HAVE_AUDIOCD && HAVE_GSTREAMER
private:
enum State { WaitingForType, WaitingForMagic, WaitingForData, Finished };
enum class State {
WaitingForType,
WaitingForMagic,
WaitingForData,
Finished
};
Result LoadLocal(const QString &filename);
SongLoader::Result LoadLocalAsync(const QString &filename);

View File

@@ -25,7 +25,7 @@
void Thread::run() {
#ifndef Q_OS_WIN32
if (io_priority_ != Utilities::IOPRIO_CLASS_NONE) {
if (io_priority_ != Utilities::IoPriority::IOPRIO_CLASS_NONE) {
Utilities::SetThreadIOPriority(io_priority_);
}
#endif

View File

@@ -31,7 +31,7 @@ class Thread : public QThread {
Q_OBJECT
public:
explicit Thread(QObject *parent = nullptr) : QThread(parent), io_priority_(Utilities::IOPRIO_CLASS_NONE) {}
explicit Thread(QObject *parent = nullptr) : QThread(parent), io_priority_(Utilities::IoPriority::IOPRIO_CLASS_NONE) {}
void SetIoPriority(Utilities::IoPriority priority) {
io_priority_ = priority;

View File

@@ -44,7 +44,7 @@ UrlHandler::LoadResult::LoadResult(const QUrl &original_url, const Type type, co
UrlHandler::LoadResult::LoadResult(const QUrl &original_url, const Type type, const QString &error) :
original_url_(original_url),
type_(type),
filetype_(Song::FileType_Stream),
filetype_(Song::FileType::Stream),
samplerate_(-1),
bit_depth_(-1),
length_nanosec_(-1),

View File

@@ -42,7 +42,7 @@ class UrlHandler : public QObject {
// Returned by StartLoading() and LoadNext(), indicates what the player should do when it wants to load a URL.
struct LoadResult {
enum Type {
enum class Type {
// There wasn't a track available, and the player should move on to the next playlist item.
NoMoreTracks,
@@ -57,7 +57,7 @@ class UrlHandler : public QObject {
Error,
};
explicit LoadResult(const QUrl &original_url = QUrl(), const Type type = NoMoreTracks, const QUrl &stream_url = QUrl(), const Song::FileType filetype = Song::FileType_Stream, const int samplerate = -1, const int bit_depth = -1, const qint64 length_nanosec = -1, const QString &error = QString());
explicit LoadResult(const QUrl &original_url = QUrl(), const Type type = Type::NoMoreTracks, const QUrl &stream_url = QUrl(), const Song::FileType filetype = Song::FileType::Stream, const int samplerate = -1, const int bit_depth = -1, const qint64 length_nanosec = -1, const QString &error = QString());
explicit LoadResult(const QUrl &original_url, const Type type, const QString &error);