MediaPlayer::MediaPlayer(QObject *parent) : QObject(parent) , _playlist(nullptr) , _state(QMediaPlayer::StoppedState) , _localPlayer(new QtAV::AVPlayer(this)) , _remotePlayer(nullptr) , _stopAfterCurrent(false) { connect(_localPlayer, &QtAV::AVPlayer::stopped, this, [=]() { this->setState(QMediaPlayer::StoppedState); }); connect(_localPlayer, &QtAV::AVPlayer::loaded, this, [=]() { _localPlayer->audio()->setVolume(Settings::instance()->volume()); emit currentMediaChanged(_localPlayer->file()); this->setState(QMediaPlayer::PlayingState); }); connect(_localPlayer, &QtAV::AVPlayer::paused, this, [=](bool) { this->setState(QMediaPlayer::PausedState); }); connect(_localPlayer, &QtAV::AVPlayer::positionChanged, this, [=](qint64 pos) { if (_state == QMediaPlayer::PlayingState) { emit positionChanged(pos, _localPlayer->duration()); } }); _localPlayer->audio()->setVolume(Settings::instance()->volume()); connect(this, &MediaPlayer::currentMediaChanged, this, [=] (const QString &uri) { QWindow *w = QGuiApplication::topLevelWindows().first(); TrackDAO t = SqlDatabase().selectTrackByURI(uri); if (t.artist().isEmpty()) { w->setTitle(t.title() + " - Miam Player"); } else { w->setTitle(t.title() + " (" + t.artist() + ") - Miam Player"); } }); // Link core multimedia actions connect(this, &MediaPlayer::mediaStatusChanged, this, [=] (QMediaPlayer::MediaStatus status) { if (_state != QMediaPlayer::StoppedState && status == QMediaPlayer::EndOfMedia) { if (_stopAfterCurrent) { stop(); _stopAfterCurrent = false; } else { skipForward(); } } }); }
void PlaylistDialog::populatePreviewFromSaved(const QItemSelection &, const QItemSelection &) { static const int MAX_TRACKS_PREVIEW_AREA = 30; QModelIndexList indexes = savedPlaylists->selectionModel()->selectedIndexes(); bool empty = indexes.isEmpty(); this->clearPreview(!empty); if (indexes.size() == 1) { uint playlistId = _savedPlaylistModel->itemFromIndex(indexes.first())->data(PlaylistID).toUInt(); QList<TrackDAO> tracks = SqlDatabase::instance()->selectPlaylistTracks(playlistId); for (int i = 0; i < tracks.size(); i++) { TrackDAO track = tracks.at(i); QTreeWidgetItem *item = new QTreeWidgetItem; item->setText(0, QString("%1 (%2 - %3)").arg(track.title(), track.artist(), track.album())); previewPlaylist->addTopLevelItem(item); if (i + 1 == MAX_TRACKS_PREVIEW_AREA) { QTreeWidgetItem *item = new QTreeWidgetItem; item->setText(0, tr("And more tracks...")); previewPlaylist->addTopLevelItem(item); break; } } } loadPlaylists->setDisabled(empty); deletePlaylists->setDisabled(empty); exportPlaylists->setEnabled(indexes.size() == 1); // Some work for the Save button if (empty) { savePlaylists->setEnabled(false); } else { bool allPlaylistsAreModified = true; QMap<uint, Playlist*> map; for (int i = 0; i < _playlists.count(); i++) { Playlist *p = _playlists.at(i); map.insert(p->id(), p); } for (QModelIndex idx : indexes) { uint playlistId = idx.data(PlaylistID).toUInt(); if (map.contains(playlistId)) { Playlist *p = map.value(playlistId); allPlaylistsAreModified = allPlaylistsAreModified && p->isModified(); } } savePlaylists->setEnabled(allPlaylistsAreModified); } }
void RemoteControl::sendTrackInfos(const QString &track) { if (!_webSocket) { return; } QStringList args; args << QString::number(CMD_Track); SqlDatabase db; TrackDAO dao = db.selectTrackByURI(track); args << dao.uri(); args << dao.artistAlbum(); args << dao.album(); args << dao.title(); args << dao.trackNumber(); args << QString::number(dao.rating()); _webSocket->sendTextMessage(args.join(QChar::Null)); // Send cover if any if (Cover *cover = db.selectCoverFromURI(track)) { _webSocket->sendBinaryMessage(cover->byteArray()); } }