From b4988a130752b0b454558696e6797958e527e570 Mon Sep 17 00:00:00 2001 From: snt Date: Sun, 7 Jul 2024 18:05:37 +0200 Subject: [PATCH] fade out when stop or pause --- src/cuetrackwidget.h | 1 + src/defines.h | 3 ++- src/libremediaserver-audio.cpp | 10 +++++----- src/libremediaserver-audio.h | 2 +- src/miniaudioengine.cpp | 24 +++++++++++++++--------- src/miniaudioengine.h | 2 +- src/showplayer.cpp | 3 ++- src/showplayer.h | 2 +- 8 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h index 6e7bd8b..87cd221 100644 --- a/src/cuetrackwidget.h +++ b/src/cuetrackwidget.h @@ -38,6 +38,7 @@ private slots: signals: void cueFinished(int layer); void goAction(int layer); + void NewFunction(CueTrack *track); }; #endif // CUETRACKWIDGET_H diff --git a/src/defines.h b/src/defines.h index f6a083c..1844856 100644 --- a/src/defines.h +++ b/src/defines.h @@ -91,7 +91,8 @@ struct layerData { int bus1Vol; int bus2Vol; float level; - int fade; + int fadeIn; + int fadeOut; }; struct CueTrack { diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index a440561..d6a5b71 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -73,8 +73,8 @@ void libreMediaServerAudio::loadMedia(int layer, int folder, int file) m_mae.loadMedia(layer, mediaFile.toLatin1().data()); m_currentMedia[layer] = mediaFile; #ifndef NOGUI - if (m_ui) - m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); + if (m_ui) + m_lmsUi->m_aw->mediaLoaded(layer, mediaFile, m_mae.getDuration(layer)); #endif m_mae.printFormatInfo(layer); } @@ -228,7 +228,7 @@ void libreMediaServerAudio::setUi(libreMediaServerAudioUi *lmsUi) connect(m_lmsUi->m_aw, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_aw, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChanged(int, Slider, int)), this, SLOT(uiSliderChanged(int, Slider, int))); - connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int))); + connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, int, int, int))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); connect(m_lmsUi->m_showPlayer, SIGNAL(uiLoadMedia(int, QString)), this, SLOT(uiLoadMedia(int, QString))); m_refreshUi = new QTimer(this); @@ -301,11 +301,11 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) } } -void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms) +void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut) { switch (s){ case Slider::Volume: - m_mae.volChanged(layer, value, ms); + m_mae.volChanged(layer, value, fadeIn, fadeOut); m_updateUi[layer][0] = value; break; } diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 65b5d11..d2f2ec6 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -66,7 +66,7 @@ private: private slots: void refreshUi(); void uiSliderChanged(int layer, Slider s, int value); - void uiSliderChangedFaded(int layer, Slider s, int value, int ms); + void uiSliderChangedFaded(int layer, Slider s, int value, int fadeIn, int fadeOut); void uiPlaybackChanged(int layer, Status s); void uiLoadMedia(int layer, QString s); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 9ab9f63..d81b309 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -59,6 +59,8 @@ bool MiniAudioEngine::startEngine(uint layers, uint* audioDevicesId, uint audioD m_mae.currentStatus[i].vol = 0.0f; m_mae.currentStatus[i].cursor = 0; m_mae.currentStatus[i].updated = MA_FALSE; + m_mae.currentStatus[i].fadeIn = FADE_TIME; + m_mae.currentStatus[i].fadeOut = FADE_TIME; } result = this->startContext(); if (result != MA_SUCCESS) return false; @@ -435,14 +437,15 @@ ma_result MiniAudioEngine::printFormatInfo(int layer) // Expects between 0 and 65535 vol value void MiniAudioEngine::volChanged(int layer, int vol) { - volChanged(layer, vol, FADE_TIME); + volChanged(layer, vol, FADE_TIME, FADE_TIME); } // Expects between 0 and 65535 vol value and fade time in milliseconds -void MiniAudioEngine::volChanged(int layer, int vol, int ms) +void MiniAudioEngine::volChanged(int layer, int vol, int fadeIn, int fadeOut) { m_mae.currentStatus[layer].vol = vol; - m_mae.currentStatus[layer].fade = ms; + m_mae.currentStatus[layer].fadeIn = fadeIn; + m_mae.currentStatus[layer].fadeOut = fadeOut; if (m_mae.mediaLoaded[layer] != MA_TRUE) return; if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated) @@ -452,10 +455,9 @@ void MiniAudioEngine::volChanged(int layer, int vol, int ms) db = 0; } else db = ma_volume_db_to_linear(db); - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, fadeIn); } - void MiniAudioEngine::panChanged(int layer, float value) { float result; @@ -483,18 +485,20 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) ma_result result = MA_SUCCESS; float db = 0; bool loop = false; + bool playAtBegin = false; + if (status == Status::Stopped) + playAtBegin = true; m_mae.currentStatus[layer].status = status; if (m_mae.mediaLoaded[layer] != MA_TRUE) return MA_DOES_NOT_EXIST; m_mae.currentStatus[layer].updated = false; switch (status) { case Status::Paused: - result = ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], FADE_TIME); + result = ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut); break; case Status::Stopped: - ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], 0.0f); - result = this->seekToCursor(layer, m_mae.currentStatus[layer].cursor); + ma_sound_stop_with_fade_in_milliseconds(&m_mae.sounds[layer], m_mae.currentStatus[layer].fadeOut); break; case Status::PlayingLoop: loop = true; @@ -505,6 +509,8 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) case Status::PlayingFolder: case Status::PlayingFolderLoop: case Status::PlayingFolderRandom: + if (playAtBegin) + this->seekToCursor(layer, 0); ma_sound_set_looping(&m_mae.sounds[layer], loop); if (ma_sound_is_playing(&m_mae.sounds[layer])) break; ma_sound_set_stop_time_in_milliseconds(&m_mae.sounds[layer], ~(ma_uint64)0); @@ -515,7 +521,7 @@ ma_result MiniAudioEngine::playbackChanged(int layer, Status status) ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0.000001f, 0.000000f, FADE_TIME); if (m_mae.currentStatus[layer].cursor > 0) usleep(FADE_TIME * 1500); // avoid glitch when seeking - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fadeIn); default: break; } diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 0a1bca8..c94587a 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -64,7 +64,7 @@ public: bool startEngine(uint layersQty, uint* audioDevicesID, uint audioDevicesQty); ma_result loadMedia(int layer, char *media); void volChanged(int layer, int vol); - void volChanged(int layer, int vol, int ms); + void volChanged(int layer, int vol, int fadeIn, int fadeOut); void panChanged(int layer, float pan); void pitchChanged(int layer, float pitch); ma_result playbackChanged(int layer, Status status); diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 2815dfb..4e95da2 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -20,6 +20,7 @@ ShowPlayer::ShowPlayer(QWidget *parent) : current[i] = nullptr; prevCue[i] = nullptr; } + ui->nextCue->setNextCue(); } ShowPlayer::~ShowPlayer() {} @@ -72,7 +73,7 @@ void ShowPlayer::fade(Slider s, int start, CueTrack *track) { } void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { - emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000); + emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000, track->fadeOut * 1000); if (prevCue[track->audioLayer] != nullptr) { if (prevCue[track->audioLayer]->pan != track->pan) fade(Slider::Pan, prevCue[track->audioLayer]->pan, track); diff --git a/src/showplayer.h b/src/showplayer.h index fcba462..724d96b 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -55,7 +55,7 @@ private slots: signals: void uiPlaybackChanged(int layer, Status s); void uiSliderChanged(int layer, Slider s, int vol); - void uiSliderChangedFaded(int layer, Slider s, int vol, int ms); + void uiSliderChangedFaded(int layer, Slider s, int vol, int fadeIn, int fadeOut); void uiLoadMedia(int layer, QString s); };