MythTV  master
musicdata.cpp
Go to the documentation of this file.
1 // C/C++
2 #include <unistd.h> // for usleep()
3 
4 // qt
5 #include <QApplication>
6 
7 // MythTV
17 
18 // mythmusic
19 #include "musicdata.h"
20 #include "musicplayer.h"
21 
22 // this is the global MusicData object shared thoughout MythMusic
23 MusicData *gMusicData = nullptr;
24 
26 {
28 }
29 
31 {
32  if (m_all_playlists)
33  {
34  delete m_all_playlists;
35  m_all_playlists = nullptr;
36  }
37 
38  if (m_all_music)
39  {
40  delete m_all_music;
41  m_all_music = nullptr;
42  }
43 
44  if (m_all_streams)
45  {
46  delete m_all_streams;
47  m_all_streams = nullptr;
48  }
49 }
50 
52 {
53  QStringList strList("SCAN_MUSIC");
54  auto *thread = new SendStringListThread(strList);
55  MThreadPool::globalInstance()->start(thread, "Send SCAN_MUSIC");
56 
57  LOG(VB_GENERAL, LOG_INFO, "Requested a music file scan");
58 }
59 
61 void MusicData::reloadMusic(void) const
62 {
64  return;
65 
66  MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
67  QString message = tr("Rebuilding music tree");
68 
69  auto *busy = new MythUIBusyDialog(message, popupStack, "musicscanbusydialog");
70 
71  if (busy->Create())
72  popupStack->AddScreen(busy, false);
73  else
74  busy = nullptr;
75 
76  // TODO make it so the player isn't interupted
77  // for the moment stop playing and try to resume after reloading
78  bool wasPlaying = false;
79  if (gPlayer->isPlaying())
80  {
82  gPlayer->stop(true);
83  wasPlaying = true;
84  }
85 
87  while (!m_all_music->doneLoading())
88  {
89  QCoreApplication::processEvents();
90  usleep(50000);
91  }
92 
94 
95  if (busy)
96  busy->Close();
97 
98  if (wasPlaying)
100 }
101 
102 void MusicData::loadMusic(void) const
103 {
104  // only do this once
105  if (m_initialized)
106  return;
107 
108  MythScreenStack *popupStack = GetMythMainWindow()->GetStack("popup stack");
109  QString message = QCoreApplication::translate("(MythMusicMain)",
110  "Loading Music. Please wait ...");
111 
112  auto *busy = new MythUIBusyDialog(message, popupStack, "musicscanbusydialog");
113  if (busy->Create())
114  popupStack->AddScreen(busy, false);
115  else
116  busy = nullptr;
117 
118  // Set the various track formatting modes
120 
121  auto *all_music = new AllMusic();
122 
123  // Load all playlists into RAM (once!)
124  auto *all_playlists = new PlaylistContainer(all_music);
125 
126  gMusicData->m_all_music = all_music;
128  gMusicData->m_all_playlists = all_playlists;
129 
130  gMusicData->m_initialized = true;
131 
134  {
135  QCoreApplication::processEvents();
136  usleep(50000);
137  }
138 
141 
142  if (busy)
143  busy->Close();
144 }
gPlayer
MusicPlayer * gPlayer
Definition: musicplayer.cpp:38
MythCoreContext::SendReceiveStringList
bool SendReceiveStringList(QStringList &strlist, bool quickTimeout=false, bool block=true)
Send a message to the backend and wait for a response.
Definition: mythcorecontext.cpp:1381
AllMusic
Definition: musicmetadata.h:417
MusicPlayer::loadPlaylist
void loadPlaylist(void)
Definition: musicplayer.cpp:984
MusicPlayer::loadStreamPlaylist
void loadStreamPlaylist(void)
Definition: musicplayer.cpp:1024
mythscreenstack.h
MusicData::~MusicData
~MusicData() override
Definition: musicdata.cpp:30
MusicMetadata::setArtistAndTrackFormats
static void setArtistAndTrackFormats()
Definition: musicmetadata.cpp:815
AllMusic::startLoading
bool startLoading(void)
Start loading metadata.
Definition: musicmetadata.cpp:1485
MythScreenStack
Definition: mythscreenstack.h:16
MusicData::m_initialized
bool m_initialized
Definition: musicdata.h:54
MusicPlayer::isPlaying
bool isPlaying(void) const
Definition: musicplayer.h:109
LOG
#define LOG(_MASK_, _LEVEL_, _QSTRING_)
Definition: mythlogging.h:39
musicutils.h
mythprogressdialog.h
musicfilescanner.h
mythlogging.h
AllMusic::doneLoading
bool doneLoading() const
Definition: musicmetadata.h:443
MusicData::reloadMusic
void reloadMusic(void) const
reload music after a scan, rip or import
Definition: musicdata.cpp:61
MusicData::m_all_streams
AllStream * m_all_streams
Definition: musicdata.h:53
AllStream
Definition: musicmetadata.h:475
SendStringListThread
send a message to the master BE without blocking the UI thread
Definition: musicdata.h:21
MythUIBusyDialog
Definition: mythprogressdialog.h:36
MusicPlayer::savePosition
void savePosition(void)
Definition: musicplayer.cpp:1079
MusicData
Definition: musicdata.h:35
PlaylistContainer::resync
void resync(void)
Definition: playlistcontainer.cpp:117
gCoreContext
MythCoreContext * gCoreContext
This global variable contains the MythCoreContext instance for the app.
Definition: mythcorecontext.cpp:57
MusicData::m_all_playlists
PlaylistContainer * m_all_playlists
Definition: musicdata.h:51
musicdata.h
gMusicData
MusicData * gMusicData
Definition: musicdata.cpp:23
SendStringListThread::m_strList
QStringList m_strList
Definition: musicdata.h:30
mthreadpool.h
MusicData::loadMusic
void loadMusic(void) const
Definition: musicdata.cpp:102
mythcorecontext.h
GetMythMainWindow
MythMainWindow * GetMythMainWindow(void)
Definition: mythmainwindow.cpp:104
MusicPlayer::restorePosition
void restorePosition(void)
Definition: musicplayer.cpp:1096
MythMainWindow::GetStack
MythScreenStack * GetStack(const QString &Stackname)
Definition: mythmainwindow.cpp:322
MusicData::m_all_music
AllMusic * m_all_music
Definition: musicdata.h:52
MusicPlayer::stop
void stop(bool stopAll=false)
Definition: musicplayer.cpp:250
PlaylistContainer::doneLoading
bool doneLoading() const
Definition: playlistcontainer.h:67
MThreadPool::globalInstance
static MThreadPool * globalInstance(void)
Definition: mthreadpool.cpp:307
mythmainwindow.h
MythScreenStack::AddScreen
virtual void AddScreen(MythScreenType *screen, bool allowFade=true)
Definition: mythscreenstack.cpp:52
MusicData::scanMusic
static void scanMusic(void)
Definition: musicdata.cpp:51
PlaylistContainer
Definition: playlistcontainer.h:33
musicmetadata.h
MThreadPool::start
void start(QRunnable *runnable, const QString &debugName, int priority=0)
Definition: mthreadpool.cpp:342
SendStringListThread::run
void run() override
Definition: musicdata.cpp:25
musicplayer.h