Skip to content

Commit

Permalink
修复在 #13 中提到的问题,除了m_positionUpdateTimer在播放结束不停止工作
Browse files Browse the repository at this point in the history
  • Loading branch information
pzhlkj6612 committed Apr 29, 2019
1 parent 0ef011e commit 02b6fbb
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 39 deletions.
89 changes: 54 additions & 35 deletions BottomWidgets/BottomWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ void BottomWidget::initConnection()
setCurrentPlayMode(SettingManager::GetInstance().data().playMode);
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onReloadMusic(QString)) emitted
//void MainWidget::OnPlayNewMusicAndLyric(QString music, QString lrc) invoked
void BottomWidget::reloadMusic(QString musicPath)
{
qDebug()<<"void BottomWidget::reloadMusic(QString="<<musicPath<<")+musicPlayer->state()="<<musicPlayer->state();
Expand All @@ -159,37 +161,28 @@ void BottomWidget::reloadMusic(QString musicPath)
musicPlayer->stop();

musicPlayer->setMusicPath(musicPath);

// 不要在这里设置播放控制按钮的状态,而是用MusicPlayer的信号
// if(musicPlayer->state() == MusicPlayer::PlayingState)
// setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_pause.png\");}");
// else
// setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_play.png\");}");
}

//void MainWidget::OnPlayNewMusicAndLyric(QString music, QString lrc) invoked
//void MainWidget::onLoadLrcLyricAndSwitchToPreview(QString lycLyricPath) invoked
//void MainWidget::onAudioFinished(bool isEndWithForce) invoked
void BottomWidget::play()
{
qDebug()<<"void BottomWidget::play() musicPlayer->getMusicPath()="<<musicPlayer->getMusicPath();

if(musicPlayer->getMusicPath().size() != 0)
{
musicPlayer->play();

// 不要在这里设置播放控制按钮的状态,而是用MusicPlayer的信号
// setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_pause.png\");}");
}
}

//uncalled
void BottomWidget::pause()
{
musicPlayer->pause();

if(musicPlayer->state() == MusicPlayer::PlayingState)
setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_pause.png\");}");
else
setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_play.png\");}");
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onStartMaking()) emitted
//从开头开始播放
void BottomWidget::playFromBegin()
{
Expand All @@ -198,53 +191,57 @@ void BottomWidget::playFromBegin()
musicPlayer->play();

musicPlayer->seek(0);

setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_pause.png\");}");
// 当前,seek后一定会开始播放,这里可能需要改。
}
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onPlayOrPauseMusic()) emitted
//自动判断播放还是暂停
void BottomWidget::autoPlayOrPause()
{
if(musicPlayer->state() == MusicPlayer::PlayingState)
pause();
else
play();
musicPlayer->playAndPause();
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onStopMusic()) emitted
void BottomWidget::stop()
{
qDebug()<<"void BottomWidget::stop()";

if(musicPlayer->state() != MusicPlayer::StoppedState )
{
musicPlayer->stop();
setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_play.png\");}");
}
}

//uncalled
void BottomWidget::seek(quint64 pos)
{
if(musicPlayer->state() != MusicPlayer::StoppedState )
musicPlayer->seek(pos);
}

//uncalled
void BottomWidget::seekForward(quint64 step)
{
if(musicPlayer->state() != MusicPlayer::StoppedState )
musicPlayer->forwordSeek(step);
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onSeekBackward(quint64)) emitted
void BottomWidget::seekBackward(quint64 step)
{
if(musicPlayer->state() != MusicPlayer::StoppedState )
musicPlayer->backwardSeek(step);
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onEnterMakingMode()) emitted
//进入制作模式
void BottomWidget::enterMakingMode()
{
bInMakingMode = true;
}

//middleWidget->pageMain->subPageMaking,SIGNAL(onExitMakingMode()) emitted
//退出制作模式
void BottomWidget::exitMakingMode()
{
Expand All @@ -255,12 +252,10 @@ void BottomWidget::exitMakingMode()
//btnPlayAndPause->clicked(bool) emitted
void BottomWidget::onPlayOrPause()
{
if(musicPlayer->state() == MusicPlayer::PlayingState)
pause();
else
play();
musicPlayer->playAndPause();
}

//musicPlayer, SIGNAL(durationChanged(qint64)) emitted
void BottomWidget::durationChanged(qint64 duration)
{
int ms = duration % 1000;
Expand All @@ -275,9 +270,10 @@ void BottomWidget::durationChanged(qint64 duration)

}

//void MainWidget::musicPositionChanged(int pos) invoked
void BottomWidget::positionChanged(int position)
{
qDebug()<<"void BottomWidget::positionChanged(int position="<<position<<")";
qDebug()<<"void BottomWidget::positionChanged(int position="<<position<<") sliderSong->value()="<<sliderSong->value();

if(!AdjustingPos)
{
Expand Down Expand Up @@ -314,27 +310,48 @@ void BottomWidget::setCurrentPlayMode(int mode)

void BottomWidget::onSliderSongMoved(int position)
{
if(bInMakingMode)
return;
qDebug()<<"void BottomWidget::onSliderSongMoved(int position="<<position<<")";

if(AdjustingPos){
posAdjust = musicPlayer->duration() * position / 1000;
// 如果不需要拖动sliderSong时CurrentTimeLabel也改变,可以把posAdjust的计算放到onSliderSongReleased()中,position改为sliderSong->value()

posAdjust = musicPlayer->duration() * position / 1000;
// positionChanged(posAdjust);
// 想要拖动sliderSong时CurrentTimeLabel也改变
// 暂时没有实现
}
else{
sliderSong->setValue(sliderSongOriginalPos);//sliderSong回到原来的位置
// 制作时,按住或拖动sliderSong会使其不移动,这需要改
}
}

void BottomWidget::onSliderSongPressed()
{
if(bInMakingMode)
return ;
qDebug()<<"void BottomWidget::onSliderSongPressed() sliderSong->value()="<<sliderSong->value()<<" musicPlayer->state()="<<musicPlayer->state();

sliderSongOriginalPos = sliderSong->value();//记录当前值,准备与最终值比较

if(bInMakingMode || musicPlayer->state() == MusicPlayer::StoppedState){
return ; //制作模式或停止状态时不允许sliderSong被成功拖动,但并没有阻止信号被接收
}

AdjustingPos = true;
}

void BottomWidget::onSliderSongReleased()
{
if(bInMakingMode)
return ;
qDebug()<<"void BottomWidget::onSliderSongReleased() sliderSong->value()="<<sliderSong->value()<<" posAdjust="<<posAdjust;

AdjustingPos = false;
musicPlayer->seek(posAdjust);
if(AdjustingPos){
if(sliderSong->value() != sliderSongOriginalPos){
//sliderSong.value精度不够,让一段时间均落在同一个value值中。
//低精度并不影响定位,但如果最终并没有改变位置,那就可能由于onSliderSongMoved()计算的posAdjust精度不够而发生偏移;

musicPlayer->seek(posAdjust);
}
AdjustingPos = false;
}
}

void BottomWidget::onSoundToggle(bool mute)
Expand Down Expand Up @@ -410,6 +427,8 @@ void BottomWidget::onErrorOccurs(int code, QString strErr)

void BottomWidget::onAudioFinished(bool isEndWithForce)
{
qDebug()<<"void BottomWidget::onAudioFinished(bool isEndWithForce="<<isEndWithForce<<")";

setStyleSheet("QPushButton#btnPlayAndPause{border-image:url(\":/resource/image/btn_play.png\");}");
}

Expand Down
2 changes: 2 additions & 0 deletions BottomWidgets/BottomWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ private slots:

bool AdjustingPos;
quint64 posAdjust;

int sliderSongOriginalPos; //sliderSong被按下时的位置
};

#endif // BOTTOMWIDGET_H
43 changes: 39 additions & 4 deletions Entities/MusicPlayer/musicPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -748,13 +748,25 @@ MusicPlayer::MusicPlayer(QObject* parent):QObject(parent),m_volume(128)
{
playThread = new PlayThread(this);

connect(playThread, &PlayThread::audioPlay,[=](){emit audioPlay();});
connect(playThread, &PlayThread::audioPause,[=](){emit audioPause();});
connect(playThread, &PlayThread::audioPlay,[=](){
qDebug()<<"&PlayThread::audioPlay bIsLock="<<bIsLock;

emit audioPlay();
});
connect(playThread, &PlayThread::audioPause,[=](){
qDebug()<<"&PlayThread::audioPause bIsLock="<<bIsLock;

emit audioPause();
});
connect(playThread, &PlayThread::audioFinish,[=](bool isEndByForce){
qDebug()<<"&PlayThread::audioFinish bIsLock="<<bIsLock;

bIsLock = true;
audioFinishedToThreadExitMutex.lock();
emit audioFinish(isEndByForce);});
connect(playThread, &PlayThread::finished,[=](){
qDebug()<<"&PlayThread::finished bIsLock="<<bIsLock;

if(bIsLock)
{
audioFinishedToThreadExitMutex.unlock();
Expand Down Expand Up @@ -845,9 +857,25 @@ void MusicPlayer::reload()
}


void MusicPlayer::playAndPause(){
qDebug()<<"void MusicPlayer::playAndPause() bIsLock="<<bIsLock;

if(getMusicPath().size() != 0){
if(state()==PlayingState){
pause();
}else{
play();
}
// StoppedState
}
}


//播放控制
void MusicPlayer::play()
{
qDebug()<<"void MusicPlayer::play() bIsLock="<<bIsLock;

playThread->setVolume(m_volume); //初始化声音值

audioFinishedToThreadExitMutex.lock();
Expand All @@ -866,13 +894,20 @@ void MusicPlayer::play()

void MusicPlayer::pause()
{
if(state() == PlayingState)
qDebug()<<"void MusicPlayer::pause() bIsLock="<<bIsLock;

if(state() == PlayingState){
playThread->pauseDevice();

if(m_positionUpdateTimer.isActive())
m_positionUpdateTimer.stop();
}
}

void MusicPlayer::stop()
{
qDebug()<<"void MusicPlayer::stop() bIsLock="<<bIsLock;

playThread->setAGStatus( AGS_FINISH );

if(m_positionUpdateTimer.isActive())
Expand Down Expand Up @@ -910,7 +945,7 @@ void MusicPlayer::seek(quint64 pos)

playThread->seekToPos(pos);

if(!m_positionUpdateTimer.isActive())
if(!m_positionUpdateTimer.isActive())//之后是否需要添加:暂停时seek后继续暂停
{
m_positionUpdateTimer.start();
}
Expand Down
1 change: 1 addition & 0 deletions Entities/MusicPlayer/musicPlayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ class MusicPlayer :public QObject
public slots:
//播放控制
void reload(); //stop() 并 play();
void playAndPause();
void play();
void pause();
void stop();
Expand Down

0 comments on commit 02b6fbb

Please sign in to comment.