Use C++11 enum class
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
@@ -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_);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user