Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于播放条、播放控制按钮在拖动后、音乐播放结束后的修复 #12

Merged
merged 7 commits into from
Apr 24, 2019
42 changes: 37 additions & 5 deletions BottomWidgets/BottomWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ void BottomWidget::initConnection()
connect(musicPlayer, SIGNAL(durationChanged(qint64)),this,SLOT(durationChanged(qint64)));
connect(musicPlayer, SIGNAL(errorOccur(int,QString)),this,SLOT(onErrorOccurs(int,QString)));

connect(musicPlayer, SIGNAL(audioFinish(bool)),this,SLOT(onAudioFinished(bool)));
connect(musicPlayer, SIGNAL(audioPlay()),this,SLOT(onAudioPlay()));
connect(musicPlayer, SIGNAL(audioPause()),this,SLOT(onAudioPause()));

sliderSound->setValue(SettingManager::GetInstance().data().volume);
nVolumeBeforeMute = sliderSound->value();
bSliderSoundPress = false;
Expand All @@ -149,24 +153,30 @@ void BottomWidget::initConnection()

void BottomWidget::reloadMusic(QString musicPath)
{
qDebug()<<"void BottomWidget::reloadMusic(QString="<<musicPath<<")+musicPlayer->state()="<<musicPlayer->state();

if(musicPlayer->state() != MusicPlayer::StoppedState )
musicPlayer->stop();

musicPlayer->setMusicPath(musicPath);

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\");}");
// 不要在这里设置播放控制按钮的状态,而是用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 BottomWidget::play()
{
qDebug()<<"void BottomWidget::play() musicPlayer->getMusicPath()="<<musicPlayer->getMusicPath();

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

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

Expand Down Expand Up @@ -242,6 +252,7 @@ void BottomWidget::exitMakingMode()

}

//btnPlayAndPause->clicked(bool) emitted
void BottomWidget::onPlayOrPause()
{
if(musicPlayer->state() == MusicPlayer::PlayingState)
Expand All @@ -266,6 +277,8 @@ void BottomWidget::durationChanged(qint64 duration)

void BottomWidget::positionChanged(int position)
{
qDebug()<<"void BottomWidget::positionChanged(int position="<<position<<")";

if(!AdjustingPos)
{
int pecentOfThousand = musicPlayer->duration() == 0? 0: int(1.0 * position / musicPlayer->duration() * 1000);
Expand Down Expand Up @@ -395,4 +408,23 @@ void BottomWidget::onErrorOccurs(int code, QString strErr)
tr("播放音频时发生错误,请尝试使用别的音频文件")+ "\n\n" + tr("出错细节:")+ strErr);
}

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

void BottomWidget::onAudioPlay()
{
qDebug()<<"void BottomWidget::onAudioPlay()";

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

void BottomWidget::onAudioPause()
{
qDebug()<<"void BottomWidget::onAudioPause()";

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


5 changes: 5 additions & 0 deletions BottomWidgets/BottomWidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ private slots:

void onErrorOccurs(int code,QString strErr);

//
void onAudioFinished(bool isEndWithForce);
void onAudioPlay();
void onAudioPause();

private:
bool bInMakingMode; //标记是否在制作模式中

Expand Down
23 changes: 19 additions & 4 deletions Entities/MusicPlayer/musicPlayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,10 @@ void PlayThread::generateAudioDataLoop()
AVRational aVRational = {1, 1000};
int64_t res = av_rescale_q(millisecondToSeek ,aVRational,pFormatCtx->streams[audioStream]->time_base);

SDL_PauseAudio(1);
// 不要直接调SDL_PauseAudio(),避免相应的信号发不出去
// SDL_PauseAudio(1);
pauseDevice();

//block here
if (av_seek_frame(m_MS.fct, audioStream, res, AVSEEK_FLAG_ANY) < 0)
{
Expand All @@ -618,7 +621,9 @@ void PlayThread::generateAudioDataLoop()
packet_queue_flush(&m_MS.audioq); //清除队列
}
}
SDL_PauseAudio(0);
// 不要直接调SDL_PauseAudio(),避免相应的信号发不出去
// SDL_PauseAudio(0);
playDevice();

AGStatus = AGS_PLAYING;
}
Expand Down Expand Up @@ -774,8 +779,8 @@ MusicPlayer::MusicPlayer(QObject* parent):QObject(parent),m_volume(128)
Qt::BlockingQueuedConnection);


m_interval = 50;
m_positionUpdateTimer.setInterval(m_interval);
// m_interval = 50;
// m_positionUpdateTimer.setInterval(m_interval);
connect(&m_positionUpdateTimer,SIGNAL(timeout()),this, SLOT(sendPosChangedSignal() ));

m_position = 0;
Expand Down Expand Up @@ -891,6 +896,11 @@ void MusicPlayer::stop()
//跳到时间点播放(单位 毫秒)
void MusicPlayer::seek(quint64 pos)
{
if(m_positionUpdateTimer.isActive())
{
m_positionUpdateTimer.stop();
}

//先获得总长
quint64 total = duration();
if(pos > total)
Expand All @@ -899,6 +909,11 @@ void MusicPlayer::seek(quint64 pos)
}

playThread->seekToPos(pos);

if(!m_positionUpdateTimer.isActive())
{
m_positionUpdateTimer.start();
}
}

//往后跳(单位 毫秒)
Expand Down