TTKMusicPlayer  3.7.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 
6 #include <qmath.h>
7 #include <qmmp/soundcore.h>
8 
9 MusicPlayer::MusicPlayer(QObject *parent)
10  : QObject(parent),
11  m_playlist(nullptr),
12  m_state(TTK::PlayState::Stopped),
13  m_enhance(Enhance::Off),
14  m_duration(0),
15  m_durationTimes(0),
16  m_volumeMusic3D(0),
17  m_posOnCircle(0)
18 {
19  m_core = new SoundCore(this);
20  setEnabledEffect(false);
21 
22  m_timer.setInterval(TTK_DN_S2MS);
23  connect(&m_timer, SIGNAL(timeout()), SLOT(update()));
24 
25  G_CONNECTION_PTR->setValue(className(), this);
26 }
27 
29 {
30  m_core->stop();
31  m_timer.stop();
32  delete m_core;
33 }
34 
36 {
38 }
39 
41 {
42  return m_state;
43 }
44 
46 {
47  m_playlist = playlist;
48 }
49 
50 qint64 MusicPlayer::duration() const
51 {
52  return m_core->duration();
53 }
54 
55 qint64 MusicPlayer::position() const
56 {
57  return m_core->elapsed();
58 }
59 
60 void MusicPlayer::setPosition(qint64 position)
61 {
62  m_core->seek(position);
63 }
64 
66 {
67  return isMuted() ? 0 : m_core->volume();
68 }
69 
70 void MusicPlayer::setVolume(int volume)
71 {
73  m_core->setVolume(volume);
74 }
75 
77 {
78  return m_core->isMuted();
79 }
80 
81 void MusicPlayer::setMuted(bool muted)
82 {
83  m_volumeMusic3D = muted ? 0 : m_core->volume();
84  m_core->setMuted(muted);
85 }
86 
88 {
89  m_enhance = type;
90 
91  if(m_enhance == Enhance::M3D)
92  {
94  }
95  else
96  {
97  m_core->setBalance(0);
99 
100  switch(m_enhance)
101  {
102  case Enhance::Off: setEqualizerEffect({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); break;
103  case Enhance::Vocal: setEqualizerEffect({0, 0, 4, 1, -5, -1, 2, -2, -4, -4, 0}); break;
104  case Enhance::NICAM: setEqualizerEffect({6, -12, -12, -9, -6, -3, -12, -9, -6, -3, -12}); break;
105  case Enhance::Subwoofer: setEqualizerEffect({6, 6, -10, -10, 0, 0, -3, -5, -7, -9, -11}); break;
106  default: break;
107  }
108  }
109 }
110 
112 {
113  return m_enhance;
114 }
115 
117 {
118  if(m_playlist->isEmpty())
119  {
121  return;
122  }
123 
125  const Qmmp::State state = m_core->state();
126 
127  const QString &mediaPath = m_playlist->currentMediaPath();
128  if(m_currentMedia == mediaPath && state == Qmmp::Paused)
129  {
130  m_core->pause();
131  update();
132  return;
133  }
134 
135  m_currentMedia = mediaPath;
137  if(!m_core->play(m_currentMedia))
138  {
140  return;
141  }
142 
143  m_timer.start();
144  m_durationTimes = 0;
146  Q_EMIT positionChanged(0);
147 }
148 
150 {
152  {
153  m_core->pause();
155  }
156 }
157 
159 {
161  {
162  m_core->stop();
163  m_timer.stop();
165  }
166 }
167 
169 {
170  if(hz.count() != 11)
171  {
172  return;
173  }
174 
175  EqSettings eq = m_core->eqSettings();
176  eq.setPreamp(15 + hz[0]);
177  eq.setEnabled(true);
178 
179  for(int i = 0; i < EqSettings::EQ_BANDS_10; ++i)
180  {
181  eq.setGain(i, hz[i + 1]);
182  }
183  m_core->setEqSettings(eq);
184 }
185 
187 {
188  if(!enabled)
189  {
190  setEqualizerEffect({0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0});
191  }
192 }
193 
195 {
198  {
199  setEnabledEffect(true);
200  const QStringList &eqValue = G_SETTING_PTR->value(MusicSettingManager::EqualizerValue).toString().split(",");
201  if(eqValue.count() == 11)
202  {
203  setEqualizerEffect({eqValue[0].toInt(), eqValue[1].toInt(), eqValue[2].toInt(), eqValue[3].toInt(),
204  eqValue[4].toInt(), eqValue[5].toInt(), eqValue[6].toInt(), eqValue[7].toInt(),
205  eqValue[8].toInt(), eqValue[9].toInt(), eqValue[10].toInt()});
206  }
207  }
208  else
209  {
210  setEnabledEffect(false);
211  }
212 }
213 
215 {
216  Q_EMIT positionChanged(position());
217 
218  if(m_enhance == Enhance::M3D && !isMuted())
219  {
221  setEnabledEffect(false);
222  m_posOnCircle += 0.5f;
223  m_core->setVolume(fabs(TTK_RN_MAX * cosf(m_posOnCircle)), fabs(TTK_RN_MAX * sinf(m_posOnCircle * 0.5f)));
224  }
225 
226  const Qmmp::State state = m_core->state();
227  if(state == Qmmp::NormalError || state == Qmmp::FatalError)
228  {
229  m_timer.stop();
230  setStopState();
231  }
232  else if(state == Qmmp::Stopped)
233  {
234  m_timer.stop();
236  {
237  setStopState();
238  return;
239  }
240 
243  {
244  setStopState();
245  return;
246  }
247 
248  play();
249  }
250 }
251 
253 {
254  const qint64 d = duration();
255  if((d == 0 || m_duration == d) && m_durationTimes++ < 10)
256  {
258  }
259  else
260  {
261  Q_EMIT durationChanged(m_duration = d);
262  Q_EMIT positionChanged(position());
263  }
264 }
265 
267 {
268  m_core->stop();
269  Q_EMIT positionChanged(0);
271 }
272 
274 {
275  m_state = state;
276  Q_EMIT stateChanged(m_state);
277 }
qint64 elapsed() const
void setEqualizerConfig()
void seek(qint64 time)
PlayState
Definition: musicobject.h:164
Enhance m_enhance
Definition: musicplayer.h:172
float m_posOnCircle
Definition: musicplayer.h:177
void setCurrentPlayState(TTK::PlayState state)
#define TTK_LOW_LEVEL
Definition: ttkglobal.h:253
int m_durationTimes
Definition: musicplayer.h:175
void setPreamp(double preamp)
void setEnhanced(Enhance type)
Definition: musicplayer.cpp:87
qint64 duration() const
void generateDuration()
void setPosition(qint64 position)
Definition: musicplayer.cpp:60
void setEqualizerEffect(const TTKIntList &hz)
MusicPlaylist * m_playlist
Definition: musicplayer.h:167
#define G_CONNECTION_PTR
EqSettings eqSettings() const
#define TTK_RN_MAX
Definition: ttkglobal.h:359
bool isMuted() const
qint64 duration() const
Definition: musicplayer.cpp:50
TTK::PlayMode playbackMode() const
qint64 position() const
Definition: musicplayer.cpp:55
Enhance enhanced() const
int volume() const
void setVolume(int volume)
Definition: musicplayer.cpp:70
MusicPlayer(QObject *parent=nullptr)
Definition: musicplayer.cpp:9
TTK::PlayState state() const
Definition: musicplayer.cpp:40
QList< int > TTKIntList
Definition: ttkqtglobal.h:188
bool isEmpty() const
void durationChanged(qint64 duration)
SoundCore * m_core
Definition: musicplayer.h:169
qint64 m_duration
Definition: musicplayer.h:173
The namespace of the process utils.
Definition: ttkcompat.h:24
#define TTK_SIGNLE_SHOT(...)
Definition: ttkqtglobal.h:177
QString currentMediaPath() const
int currentIndex() const
bool isMuted() const
Definition: musicplayer.cpp:76
QTimer m_timer
Definition: musicplayer.h:170
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:76
#define TTK_SLOT
Definition: ttkqtglobal.h:165
void stateChanged(TTK::PlayState state)
void pause()
void setCurrentIndex(int index)
void stop()
int m_volumeMusic3D
Definition: musicplayer.h:176
void positionChanged(qint64 position)
void setEnabledEffect(bool enabled)
#define TTK_DN_S2MS
Definition: ttkglobal.h:276
TTK::PlayState m_state
Definition: musicplayer.h:168
void setGain(int band, double gain)
void setVolume(int left, int right)
void setEnabled(bool enabled=true)
void setMuted(bool mute)
QString m_currentMedia
Definition: musicplayer.h:171
int volume() const
Definition: musicplayer.cpp:65
void setPlaylist(MusicPlaylist *playlist)
Definition: musicplayer.cpp:45
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 setMuted(bool muted)
Definition: musicplayer.cpp:81
bool isPlaying() const
Definition: musicplayer.cpp:35
state
Definition: http_parser.c:279
Qmmp::State state() const
#define G_SETTING_PTR