TTKMusicPlayer  4.3.0.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
musicplayer.cpp
Go to the documentation of this file.
1 #include "musicplayer.h"
2 #include "musicplaylist.h"
3 #include "musicsettingmanager.h"
4 #include "musicconnectionpool.h"
5 #include "musicsonghelper.h"
6 
7 #include <cmath>
8 #include <qmmp/soundcore.h>
9 
10 MusicPlayer::MusicPlayer(QObject *parent)
11  : QObject(parent),
12  m_playlist(nullptr),
13  m_state(TTK::PlayState::Stopped),
14  m_duration(0),
15  m_durationTimes(0),
16  m_enhance()
17 {
18  m_core = new SoundCore(this);
19  setEnabledEffect(false);
20 
21  m_timer.setInterval(TTK_DN_S2MS);
22  connect(&m_timer, SIGNAL(timeout()), SLOT(update()));
23 
25 }
26 
28 {
29  m_core->stop();
30  m_timer.stop();
31  delete m_core;
32 }
33 
35 {
37 }
38 
40 {
41  return m_state;
42 }
43 
44 void MusicPlayer::setPlaylist(MusicPlaylist *playlist) noexcept
45 {
46  m_playlist = playlist;
47 }
48 
49 qint64 MusicPlayer::duration() const
50 {
51  return m_core->duration();
52 }
53 
54 qint64 MusicPlayer::position() const
55 {
56  return m_core->elapsed();
57 }
58 
59 void MusicPlayer::setPosition(qint64 position)
60 {
61  m_core->seek(position);
62 }
63 
65 {
66  return isMuted() ? 0 : m_core->volume();
67 }
68 
69 void MusicPlayer::setVolume(int volume)
70 {
72  m_core->setVolume(volume);
73 }
74 
75 bool MusicPlayer::isMuted() const noexcept
76 {
77  return m_core->isMuted();
78 }
79 
80 void MusicPlayer::setMuted(bool muted)
81 {
82  m_enhance.m_volume3D = muted ? 0 : m_core->volume();
83  m_core->setMuted(muted);
84 }
85 
87 {
88  m_enhance.m_type = type;
89 
91  {
93  }
94  else
95  {
96  m_core->setBalance(0);
98 
99  switch(m_enhance.m_type)
100  {
101  case TTK::Enhance::Off: setEqualizerEffect({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); break;
102  case TTK::Enhance::Vocal: setEqualizerEffect({0, 0, 4, 1, -5, -1, 2, -2, -4, -4, 0}); break;
103  case TTK::Enhance::NICAM: setEqualizerEffect({6, -12, -12, -9, -6, -3, -12, -9, -6, -3, -12}); break;
104  case TTK::Enhance::Subwoofer: setEqualizerEffect({6, 6, -10, -10, 0, 0, -3, -5, -7, -9, -11}); break;
105  default: break;
106  }
107  }
108 }
109 
111 {
112  return m_enhance.m_type;
113 }
114 
116 {
117  if(m_playlist->isEmpty())
118  {
120  return;
121  }
122 
125  const Qmmp::State state = m_core->state();
126  const MusicPlayItem &item = m_playlist->currentItem();
127 
128  if((item.m_playlistRow != MUSIC_NETWORK_LIST) ?
129  (item.m_path == m_currentMedia) :
131  {
132  if(state == Qmmp::Paused)
133  {
135  m_core->pause();
136  update();
137  return;
138  }
139  else if(state == Qmmp::Stopped)
140  {
141  return;
142  }
143  }
144 
147  if(!m_core->play(m_currentMedia))
148  {
150  return;
151  }
152 
153  m_timer.start();
154  m_durationTimes = 0;
155 
157  Q_EMIT positionChanged(0);
158 }
159 
161 {
163  {
164  m_core->pause();
166  }
167 }
168 
170 {
172  {
173  m_core->stop();
174  m_timer.stop();
175  m_currentMedia.clear();
177  }
178 }
179 
181 {
182  if(hz.count() != 11)
183  {
184  return;
185  }
186 
187  EqSettings eq = m_core->eqSettings();
188  eq.setPreamp(15 + hz[0]);
189  eq.setEnabled(true);
190 
191  for(int i = 0; i < EqSettings::EQ_BANDS_10; ++i)
192  {
193  eq.setGain(i, hz[i + 1]);
194  }
195  m_core->setEqSettings(eq);
196 }
197 
199 {
200  if(!enabled)
201  {
202  setEqualizerEffect({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
203  }
204 }
205 
207 {
210  {
211  setEnabledEffect(true);
212  const QStringList &eqValue = G_SETTING_PTR->value(MusicSettingManager::EqualizerValue).toString().split(",");
213  if(eqValue.count() == 11)
214  {
215  setEqualizerEffect({eqValue[0].toInt(), eqValue[1].toInt(), eqValue[2].toInt(), eqValue[3].toInt(),
216  eqValue[4].toInt(), eqValue[5].toInt(), eqValue[6].toInt(), eqValue[7].toInt(),
217  eqValue[8].toInt(), eqValue[9].toInt(), eqValue[10].toInt()});
218  }
219  }
220  else
221  {
222  setEnabledEffect(false);
223  }
224 }
225 
227 {
228  Q_EMIT positionChanged(position());
229 
231  {
233  setEnabledEffect(false);
234  m_enhance.m_circlePos += 0.5f;
235  m_core->setVolumePerChannel(std::fabs(TTK_RN_MAX * std::cos(m_enhance.m_circlePos)), std::fabs(TTK_RN_MAX * std::sin(m_enhance.m_circlePos * 0.5f)));
236  }
237 
238  const Qmmp::State state = m_core->state();
239  if(state == Qmmp::NormalError || state == Qmmp::FatalError)
240  {
241  m_timer.stop();
242  setStopState();
243  }
244  else if(state == Qmmp::Stopped)
245  {
247  {
248  return;
249  }
250 
251  m_timer.stop();
252  m_currentMedia.clear();
253 
255  {
256  setStopState();
257  return;
258  }
259 
262  {
263  setStopState();
264  return;
265  }
266 
267  play();
268  }
269 }
270 
272 {
273  const qint64 d = duration();
274  if((d == 0 || m_duration == d) && m_durationTimes++ < 10)
275  {
277  }
278  else
279  {
280  m_duration = d;
281 
282  if(m_durationTimes >= 10)
283  {
284  const MusicPlayItem &item = m_playlist->currentItem();
286  {
287  m_duration = TTK::generateNetworkSongTime(item.m_path, false).toLongLong();
288  }
289  }
290 
291  Q_EMIT durationChanged(m_duration);
292  Q_EMIT positionChanged(position());
293  }
294 }
295 
297 {
298  m_core->stop();
299  Q_EMIT positionChanged(0);
301 }
302 
304 {
305  m_state = state;
306  Q_EMIT stateChanged(m_state);
307 }
void setVolumePerChannel(int left, int right)
The class of the music play item.
Definition: musicplaylist.h:27
qint64 elapsed() const
void setEqualizerConfig()
void seek(qint64 time)
PlayState
Definition: musicobject.h:183
TTK::Enhance m_type
Definition: musicplayer.h:183
#define TTK_LOW_LEVEL
Definition: ttkglobal.h:332
int m_durationTimes
Definition: musicplayer.h:179
MusicPlayItem currentItem() const noexcept
void setPreamp(double preamp)
TTK_MODULE_EXPORT QString generateNetworkSongTime(const QString &path, bool format)
QString m_path
Definition: musicplaylist.h:30
bool isEmpty() const noexcept
TTK::PlayMode playbackMode() const noexcept
void setPlaylist(MusicPlaylist *playlist) noexcept
Definition: musicplayer.cpp:44
qint64 duration() const
void generateDuration()
void setPosition(qint64 position)
Definition: musicplayer.cpp:59
void setEqualizerEffect(const TTKIntList &hz)
MusicPlaylist * m_playlist
Definition: musicplayer.h:173
EqSettings eqSettings() const
#define TTK_RN_MAX
Definition: ttkglobal.h:439
bool isMuted() const
qint64 duration() const
Definition: musicplayer.cpp:49
qint64 position() const
Definition: musicplayer.cpp:54
int volume() const
void setVolume(int volume)
Definition: musicplayer.cpp:69
bool isMuted() const noexcept
Definition: musicplayer.cpp:75
MusicPlayer(QObject *parent=nullptr)
Definition: musicplayer.cpp:10
TTK_MODULE_EXPORT QString generateNetworkSongPath(const QString &path)
QList< int > TTKIntList
Definition: ttkqtglobal.h:200
void durationChanged(qint64 duration)
SoundCore * m_core
Definition: musicplayer.h:175
qint64 m_duration
Definition: musicplayer.h:178
The namespace of the application object.
Definition: ttkcompat.h:24
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:189
QTimer m_timer
Definition: musicplayer.h:176
void setStopState()
bool play(const QString &source, bool queue=false, qint64 offset=-1)
The EqSettings class helps to work with equalizer settings.
Definition: eqsettings.h:29
State
Definition: qmmp.h:95
bool isPlaying() const noexcept
Definition: musicplayer.cpp:34
void setVolume(int volume)
#define TTK_SLOT
Definition: ttkqtglobal.h:177
void pause()
void setCurrentIndex(int index)
void setCurrentPlayState(TTK::PlayState state) noexcept
void stop()
void positionChanged(qint64 position)
void setEnabledEffect(bool enabled)
#define TTK_DN_S2MS
Definition: ttkglobal.h:355
TTK::PlayState m_state
Definition: musicplayer.h:174
void setGain(int band, double gain)
Enhance
Definition: musicplayer.h:33
#define MUSIC_NETWORK_LIST
int currentIndex() const noexcept
void setEnabled(bool enabled=true)
TTK::PlayState state() const noexcept
Definition: musicplayer.cpp:39
void setMuted(bool mute)
QString m_currentMedia
Definition: musicplayer.h:177
int volume() const
Definition: musicplayer.cpp:64
#define const
Definition: zconf.h:233
The class of the music play list.
Definition: musicplaylist.h:63
void setEqSettings(const EqSettings &settings)
void setBalance(int balance)
The SoundCore class provides a simple interface for audio playback.
Definition: soundcore.h:40
void setEnhance(TTK::Enhance type)
Definition: musicplayer.cpp:86
struct MusicPlayer::Data m_enhance
void setMuted(bool muted)
Definition: musicplayer.cpp:80
TTK::Enhance enhance() const noexcept
state
Definition: http_parser.c:279
Qmmp::State state() const
#define TTK_CONNECTIONPOOL_REGISTER(object)
#define G_SETTING_PTR