void QMediaPlayerPrivate::setPlaylistMedia() { // This function loads current playlist media into backend. // If current media is a playlist, the function recursively // loads media from the playlist. // It also makes sure the correct playlist signals are connected. Q_Q(QMediaPlayer); if (playlist) { connectPlaylist(); if (playlist->currentMedia().playlist()) { if (nestedPlaylists < MAX_NESTED_PLAYLISTS) { emit q->currentMediaChanged(playlist->currentMedia()); // rewind nested playlist to start playlist->currentMedia().playlist()->setCurrentIndex(0); nestedPlaylists++; setPlaylist(playlist->currentMedia().playlist()); } else { playlist->next(); } return; } else if (control != 0) { // If we've just switched to a new playlist, // then last emited currentMediaChanged was a playlist. // Make sure we emit currentMediaChanged if new playlist has // the same media as the previous one: // sample.m3u // test.wav -- processed by backend // nested.m3u -- processed by frontend // test.wav -- processed by backend, // media is not changed, // frontend needs to emit currentMediaChanged bool isSameMedia = (control->media() == playlist->currentMedia()); control->setMedia(playlist->currentMedia(), 0); if (isSameMedia) { emit q->currentMediaChanged(control->media()); } } } else { q->setMedia(QMediaContent(), 0); } }
void QMediaPlayerPrivate::_q_updateMedia(const QMediaContent &media) { Q_Q(QMediaPlayer); if (!control) return; // check if the current playlist is a top-level playlist Q_ASSERT(playlist); if (media.isNull() && playlist != rootMedia.playlist()) { // switch back to parent playlist QMediaPlaylist *pls = parentPlaylist(playlist); Q_ASSERT(pls); disconnectPlaylist(); playlist = pls; connectPlaylist(); Q_ASSERT(!pendingPlaylist.playlist()); nestedPlaylists--; Q_ASSERT(nestedPlaylists >= 0); playlist->next(); return; } if (media.playlist()) { if (nestedPlaylists < MAX_NESTED_PLAYLISTS) { nestedPlaylists++; Q_ASSERT(!pendingPlaylist.playlist()); // disconnect current playlist disconnectPlaylist(); // new playlist signals are connected // in the call to setPlaylist() in _q_handlePlaylistLoaded() playlist = media.playlist(); emit q->currentMediaChanged(media); _q_handlePlaylistLoaded(); return; } else if (playlist) { playlist->next(); } return; } const QMediaPlayer::State currentState = state; setMedia(media, 0); if (!media.isNull()) { switch (currentState) { case QMediaPlayer::PlayingState: control->play(); break; case QMediaPlayer::PausedState: control->pause(); break; default: break; } } _q_stateChanged(control->state()); }