From 86e866c996913042d60d1e6834f3a4537e447cb0 Mon Sep 17 00:00:00 2001 From: snt Date: Fri, 21 Jun 2024 18:56:02 +0200 Subject: [PATCH 1/7] iconos de botones en fichero de recursos --- libremediaserver-audio.pro | 3 ++ lms-resources.qrc | 12 ++++++ resources/copy_button.png | Bin 0 -> 871 bytes resources/cut_button.png | Bin 0 -> 1460 bytes resources/delete_button.png | Bin 0 -> 1463 bytes resources/edit_button.png | Bin 0 -> 2083 bytes resources/load_button.png | Bin 0 -> 2537 bytes resources/new_button.png | Bin 0 -> 2130 bytes resources/paste_button.png | Bin 0 -> 1047 bytes resources/save_button.png | Bin 0 -> 1780 bytes src/showplayer.ui | 81 ++++++++++++++++++++++++------------ 11 files changed, 70 insertions(+), 26 deletions(-) create mode 100644 lms-resources.qrc create mode 100644 resources/copy_button.png create mode 100644 resources/cut_button.png create mode 100644 resources/delete_button.png create mode 100644 resources/edit_button.png create mode 100644 resources/load_button.png create mode 100644 resources/new_button.png create mode 100644 resources/paste_button.png create mode 100644 resources/save_button.png diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index db78795..77f5c0b 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -58,3 +58,6 @@ OTHER_FILES += \ docs/changelog.txt \ docs/lms-audio.xlm \ docs/roadmap.txt + +RESOURCES += \ + lms-resources.qrc diff --git a/lms-resources.qrc b/lms-resources.qrc new file mode 100644 index 0000000..b4ba770 --- /dev/null +++ b/lms-resources.qrc @@ -0,0 +1,12 @@ + + + resources/copy_button.png + resources/cut_button.png + resources/delete_button.png + resources/edit_button.png + resources/load_button.png + resources/new_button.png + resources/paste_button.png + resources/save_button.png + + diff --git a/resources/copy_button.png b/resources/copy_button.png new file mode 100644 index 0000000000000000000000000000000000000000..27fdef5fbf5522f44e2310f293518a077554afe5 GIT binary patch literal 871 zcmV-t1DO1YP)tS65fBIp-V5sGFOcKlOV37XXp<*@$j$Z+}Pybvhl( z20O;YHO{-iApMLJ)*1pIiaYNB_Zr>$)h1D$wZyolf=FW_?B3h(Ggg4>MU)C!HUM|*qc1$m9(`6`FwL~o&#AjKJzT8RK-U!Xr2VeF0~A?)7U*+ZyefyOAR zW(kfHUG1u=))S@*f*=_n2!h870Fw~L?d#p!@I>?_i)0xk4nF9->+fS(A(?BL+wRin|^iEPhI(?6Xw5df177D*WAT+FgYRdXva@1bP@#FYwQFc>^( xp{g1VhZ3Pymc~vBz{2EHYZ>wZ+~J?qe*vRU25~-}J>mcW002ovPDHLkV1jZqgFXNN literal 0 HcmV?d00001 diff --git a/resources/cut_button.png b/resources/cut_button.png new file mode 100644 index 0000000000000000000000000000000000000000..4977b235eec33c207581b98b3d6def8dd2271015 GIT binary patch literal 1460 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 D)#p*6 literal 0 HcmV?d00001 diff --git a/resources/edit_button.png b/resources/edit_button.png new file mode 100644 index 0000000000000000000000000000000000000000..37c3a3417dbd72a76870989e4031c15fd14678b8 GIT binary patch literal 2083 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 G@_zt#QAfN0 literal 0 HcmV?d00001 diff --git a/resources/new_button.png b/resources/new_button.png new file mode 100644 index 0000000000000000000000000000000000000000..3ac34f96f28ec8aeea1af84a27ccddcd9dff2466 GIT binary patch literal 2130 zcmZ{kc{J4f8^^yUCR)-*di~_ItQ& zQr)Hs0Kg_X&5;3S_0m`gOgk(A z^S{?a!9*o(9{?!*Mt5}ZVzyRi4W;-T{Gpu^cwI7^=T?+n7>iG<(f!Ti=+TZ1x_h1% zUn(~|$=H58pE9Mkprn<~fOyIwG(rLo=N>elrmgnznWE7*;QSR6s5PP6=m4wq!)0<_ z=&bGJ%+k_G?%Byu?(E*~FO9XemI1dLd;8yq_sZrtrBUwf*PG#|2!_*%Fl(QF(`lkh z2~tdW-xHHBfiR!oa?BaOFc>;rXfc(lZ!VrqmUz8 zPhO7xG0=QVMrz(kAQQ zF)z4LDgU`mA;@|Gne5-Eqd1gBn6Tfm%lmQeph0y1uV_7c*^{Wj#%nseV6<&IHokps z$B(+a(kPT{&K) zHmj744lev?m48y!h+ULVE_#1Bo$7=8B_m(k!ZIpF+3#{g_RQA?#)h}c{AY+(-q}Y5 zo%)_T)r)(K$^)ggXDx*f)jb-{CifN@s?=0P_?^$mL6gh#4cxYTj=eGFdpp)^YgBYI znhI`Hmj;VLK6HL{O8h(&Hh4cT<%m{FM;AXPraB2>l3=DflUTUrW_g?MUA-q6s7j}A zEhm;kKC<(>^D_#oh4TgQ8pY^0%}@n%r#MEZ8DxcGkKD@4v#2W(X@?ViXB4kYjk+FQ z`+n#A>l~lR?gkbSI3h&;){#oeR3Ecsak~FO2#Y={B{JwO*5fK zVV2fHykPY9-U}3cbG=>Fc|oAF!prf4)AG*lCEJ|(-XV_)ZVZ7QMpPJk>XyF7U%npU z;I;jcskBJA_xy+udMx$RijKHTaP*$sUuK%~%GUonyGygHN%GFBb6kfOcQLFBk{X-; zo<%xlJ_eQS%Y)q7k1)omsRtksrn-dT>84yx_~`9oyUV4o{_xpOESD|9fS*>z^dhaT z95kt@qr0?3{DFgUdn?IJ?nifjll}>4Nk0S$}`;HDY zkXJD6n6)3dnM=w%F8h}KHRQ|sQqBM>;rOATodtDd!BZ-A7c#?Z8Ii5gBkeZMidhLq zAyNyB`MqUbnMwzrEmTl8h?E}ew%>c9+(aPWbE9RCcf!r1ziW)Wgp*WqEq#%JsYjTR zvGQ%sS0%Mi>Pz>#7TX?2MiE9{6a+}jQ!a6)z>r%KF8j&#$nXil)Hnvv|vvp2ZG2mZ} z$%zw=`mLH=fkJV1=54Rn=CU0#3-S>LQ#OxlU)*<{)o4wfF3!sJ&{S@cKmK|(LpgFY zN$HNsQ|5r~w$m+9t|u$G>CPoiJoQKc2A_9#b#q;o`i^}E7C#Q}s$RY~HWe}KFl^fV zuC%3&n@BLd-Y@jNqpd0{BukFXzQNB3hH1@)^&QYC%FGJ+V*E#Q>d+Ll+tvJ)#gW0Q z>_phF<9jr{{ad7V?SpHbL&Vc?CMnt>U})Dt+E=Z+lvSkDWkofas_n#-IpbXA$US}h zJ^ZC$)z7g>k2y6Fxza3Z9?-e#%g)@x5X1u*<&WBcK4G2VRKKIN&4|s92!@vRObq9%vE0wW=IRIV23gEc20{H%ca3aPMLqc1@ zK}#YUM?~X^a8EFJQmL4X#mZzd41b*l1Eevc;DCuHLJg>>yRPWP3laE{$&Mob5CKOh zC6o7qs06?l$?LIyWB&3alX)C|08a{7;LVz!?e_#3o$qx1$9VJEQr^j=L8~0eAw5NFWl-a2C?EGbcer>pPtT{4nsE2^hQ^ zl^RvNI8Ct-S^3W1~fDkN-BoeeZC`59CgvXPJ7;yFIP4=OnF+g|n Ka4e(xUicI9@`>pH literal 0 HcmV?d00001 diff --git a/resources/paste_button.png b/resources/paste_button.png new file mode 100644 index 0000000000000000000000000000000000000000..ef34fac1df235f640a85c261d387aea993aa8d24 GIT binary patch literal 1047 zcmV+y1nB#TP)C>ol5dx`_B0oq15ge+WROv#Rb7x%Th%iQy zb>7w8-pos}JA1Rg?A`MR!_DsP%=_MZ-+MC-mT&+t>lw$#$7}oh`=4{p9h6`^9*<5= zPW}c!xxZA|_hoPZ;L&GWy$?QoIA%-_?X7Mij``qYFvbcCIp_HIpP#XHCjx;0A^;lU z4WE4R)o<_p`Q-V3bqKfsuqNd|NHJ9NOUoI;Y^LzXw-+ku@-Tu9tF)L~S01w}tefdqt?@pCc7>~z~4h{}}2cTb1AT>_ejZ@EoZvP$z zcOSgTDFAq2_SoFqeE;n1?9-#8qhHHNSoKAT*T%RN_7!pq0FL9p_kFpuv-ACEH2MTd z*;f*vq?R+r$r>w=@H`LweqZkG?fp0!jUMJnqy#8$5VqJ1vF30b2SkMR_4U^7?(Pq# zr>7s;B(g0oHK=nW%yV-HArJ%sE-o$*hGBbqd;1rgge5}T2$jrNO9AH`zVE~L{dhN` zPOsPd8o+%3ud;oB>@a6_K#4#N7D{8WsD0+Z{2-9-DbK4Kbu}Aw}_wXbLL=l(bcp=RX&L;AW1iS2wi{ z`E7}AN4}1LwlrY1<%$S&S^}Mxs7;^>Hf;snN zgtG`&)8bXF3cXvcQq5!|piNH8OOR-pf|hX6>UV1sh_@?t(o7kqDX7wcr2(a>StoQE zIIGaWv**(n?*?q5qT3r<+bpw@Sm@>bPbt-?6Sf^MC1Aron|%Nslw2ANCX>nOU@+LN zZM6dD=jW5*aCjfUrQJ)X$*6?qd65ZUIE(NynAJAg>qxYvS9ssJnP)`U@GLNE%lkkL zXsx03YB!@QG$LS^;oD&42n0a@$Enn4ZCqbp14)TB-R&0QYI$2|0G9xw{{cJ|D_fe@ RO5Xqg002ovPDHLkV1j<#-lPBk literal 0 HcmV?d00001 diff --git a/resources/save_button.png b/resources/save_button.png new file mode 100644 index 0000000000000000000000000000000000000000..78d8ae0bde86c00e3de19e3dff0e5200af5ed0c6 GIT binary patch literal 1780 zcmVD9SRKTQ=ernA-?389`0dDasoSW+uKM`ob9XjfRcA5D`XLLfD%*Lo}Hh zU65=zS0ZCT`QJiYO7CrNd;dKDjxX-*U!asOp5&MOemCcN&gXug^PF=OWqa|+nNKIQ z`gw2vwS{f-tN88a)y&m)9X-jhivu(*SeOY!-a4HgJ^1hMtg*NAjgGx2k%Q5QUMIoh z{DkkO*WO{oH~==UYGudz6?X;j-s7Al8Q0{jdak{pYDfE00>D^{F$QA{-nm&R;G8S@`#=bu5d6d572kg9z=xGH00e>rj5F9tfvhzcTg2ER z-uqbsSd1-}g9mE*udwW+V;u{$ys_o*;mBm)@gtBBkf5-};M`;d4Az*^#(tIxc!xCx z?>))%0FS@26G;!S?143#PHfn=8`ypu1xmEm*(m_d8cg}|VRj05=P=fw#nbVp*GTtW zW7JxF=W)Kcch`51KJwU)Zc!jeAcTO3AR^Z=563C3V<-rQJ~Ountg7H-;mJYAWH)}6g@hJ4YW6;vkT z_Y@o;XDmtr`@hspTjCsM^a7^318Lbo_CgQuz5FsGXU-5)ikMP=o{|H`IhHgwl)eSB z1#{1j55i0BY3{GMg3b33Y#MqGAs;?ZqG6avUw@sJZQC#+!^XMoQ;wiu0*wugEMCw! zB@gb!+A7j~z5WC)*Nrzf5CRems(6jct3M^3c$~#w+seErH~ebdvl}l?NGT8PXMsCu8$|GKfvU=kzj}< z7Gd+3P%1_&*^IL{5ntfO%?moTgL;B z72$CJ9|CF)08h-n&gzPjm|QnHR!20k2%Ecv(lKHc_uz0`bZ=f*VDAp5o#cd4B10Tpk?d(24Wq zD=xPO_{o=7($Y{hYXycsK29)gBx`mO^5+TuJh5aGpplSAS1qOGp`Enq7yw=UL;UMv zA0epe03M|jmGRO~gP9Qqhwfez=Gi{VJ$yhwe8i);&WuEX0oFCzgnm8{c#V zB%nkwR)Cut8)z!`g*(}`o~!KNdyLJS)>E5|qatyL#L=;OQY(K(O>!a4(-M2E?cZL3 z5+eXzmwP#XrFTYvk56^-i#>njl>>ia&#!+-N5?~)>+#$eH7L~!l-5_K573omSD`}Xa$w6>JiRov<~xyJ+%e0lzy0#K@ijGX`-_gt4i_AV-EupN$79M0dX)X2_Ib6!h_3NW(1gvm5#u}^hzjF zY6Zjp*+VQD?zq7xHFL8XNQ{3^9J1mPubYTv$n3Flm@wzjsyTANZzRXFD=L?o%T9s`MKt)n4? zsEBB#loFAs)*2CUT5EC6Ni-U@Aq1zCvLa$a2t}n-0Vs$_UTd98Boa9wzh%po!v6pf WT+tdOSJXNH0000 + + Load Cue List + - ... + Load CueList - - ../resources/load_button.png../resources/load_button.png + + :/buttons/resources/load_button.png:/buttons/resources/load_button.png @@ -161,12 +164,15 @@ + + Save Cue List + - ... + Save CueList. - - ../resources/save_button.png../resources/save_button.png + + :/buttons/resources/save_button.png:/buttons/resources/save_button.png @@ -184,12 +190,21 @@ + + + 32 + 32 + + + + Copy Cue + - ... + Copy Cue - - ../resources/copy_button.png../resources/copy_button.png + + :/buttons/resources/copy_button.png:/buttons/resources/copy_button.png @@ -202,17 +217,17 @@ - Load Cue List + Cut Cue Load Cue List - ... + Cut Cue - - ../resources/cut_button.png../resources/cut_button.png + + :/buttons/resources/cut_button.png:/buttons/resources/cut_button.png @@ -224,12 +239,15 @@ + + Paste Cue + - ... + Paste Cue - - ../resources/paste_button.png../resources/paste_button.png + + :/buttons/resources/paste_button.png:/buttons/resources/paste_button.png @@ -244,12 +262,15 @@ Qt::NoFocus + + New Cue + - ... + New Cue - - ../resources/new_button.png../resources/new_button.png + + :/buttons/resources/new_button.png:/buttons/resources/new_button.png @@ -264,12 +285,15 @@ Qt::NoFocus + + Edit Cue + - ... + Edit Cue - - ../resources/edit_button.png../resources/edit_button.png + + :/buttons/resources/edit_button.png:/buttons/resources/edit_button.png @@ -284,12 +308,15 @@ Qt::NoFocus + + Remove Cue + - ... + Delete Cue - - ../resources/remove_button.png../resources/remove_button.png + + :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png @@ -339,6 +366,8 @@ EditCue RemoveCue - + + + From 0795157d5ff1b86821b8ca9ba1f835eb1fe7fc49 Mon Sep 17 00:00:00 2001 From: snt Date: Fri, 21 Jun 2024 20:39:07 +0200 Subject: [PATCH 2/7] wip en active, hacer lista con las cues activas? --- src/cuetracklistwidget.cpp | 51 ++++++++++++++++++++++++---------- src/cuetracklistwidget.h | 5 ++-- src/defines.h | 2 +- src/libremediaserver-audio.cpp | 9 +++--- src/showplayer.cpp | 17 ++++++++++++ src/showplayer.h | 6 ++-- src/showplayer.ui | 2 +- 7 files changed, 67 insertions(+), 25 deletions(-) diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index 4397239..22ecbbd 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -145,15 +145,20 @@ void CueTrackListWidget::createNewCueTrack() CueTrack *t = new CueTrack; cueTrackLoadDefaults(t); EditCueTrackWidget dialog(t, this); - if (dialog.exec() == QDialog::Accepted) + if (dialog.exec() == QDialog::Accepted) { + t->active = false; addCueTrack(t); - if (m_size == 1) - { - updateSelectedCueTrack(true); - emit changeSelectedIndex(0); + if (m_size == 1) + { + updateSelectedCueTrack(true); + emit changeSelectedIndex(0); + } else + redrawCueTrackList(); + if (lastUserCueNumber < t->userNumber) + lastUserCueNumber = t->userNumber + 10; } else - redrawCueTrackList(); - } + delete (t); +} void CueTrackListWidget::editCueTrack() { @@ -164,6 +169,8 @@ void CueTrackListWidget::editCueTrack() redrawCueTrackList(); emit changeSelectedIndex(selectedIndex); } + if (lastUserCueNumber < current->userNumber) + lastUserCueNumber = current->userNumber + 10; } void CueTrackListWidget::deleteCueTrack() @@ -223,7 +230,7 @@ void CueTrackListWidget::redrawCueTrackList() int selected = cueTracks.at(selectedIndex)->userNumber; clearTableWidget(); tableWidget->setColumnCount(7); - QStringList headers = {"Active", "Number","Audio Channel", "Name", "Volume", "Status", "File"}; + QStringList headers = {"Active", "Number","Channel", "Name", "Volume", "Status", "File"}; tableWidget->setHorizontalHeaderLabels(headers); sortCueTrackList(); selectedIndex = 0; @@ -309,7 +316,12 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) t->waitOut = xmlReader.text().toInt(); } else if (elementName == "stopAtEnd") { - t->stopAtEnd = xmlReader.text().toString().toLower() == "true"; + QString tmp = xmlReader.text().toString().toLower(); + if (tmp.compare("true")) + t->stopAtEnd = true; + else { + t->stopAtEnd = false; + } } else if (elementName == "name") { t->name = xmlReader.text().toString().toStdString(); @@ -329,9 +341,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) else if (elementName == "audioLayer") { t->audioLayer = xmlReader.text().toInt(); } - else if (elementName == "active") { - t->active = xmlReader.text().toString().toLower() == "true"; - } + t->active = false; } } xmlReader.readNext(); @@ -393,9 +403,6 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack) xml += " " + std::to_string(cueTrack.entryPoint) + "\n"; xml += " " + std::to_string(cueTrack.exitPoint) + "\n"; xml += " " + std::to_string(cueTrack.audioLayer) + "\n"; - xml += " "; - xml += (cueTrack.active ? "true" : "false"); - xml += "\n"; xml += " \n"; return xml; } @@ -528,3 +535,17 @@ void CueTrackListWidget::clearTableWidget() tableWidget->clear(); tableWidget->setRowCount(0); } + +void CueTrackListWidget::cueTrackAtEnd(int layer) +{ + for (int i = 0; i < m_size; i++) + { + CueTrack * cur = cueTracks.at(i); + if (cur->audioLayer == layer) + { + cur->active = false; + } + layer--; + } + redrawCueTrackList(); +} diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index fa7b685..b8e2527 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -31,6 +31,8 @@ public slots: void clearCueTrackList(); void setLastUserCueNumber(size_t n) { lastUserCueNumber = n; } size_t getLastUserCueNumber() { return lastUserCueNumber; } + void cueTrackAtEnd(int layer); + void redrawCueTrackList(); private: std::vector cueTracks; @@ -39,7 +41,7 @@ private: int m_size = 0; int size() { return m_size; } int selectedIndex = 0; - size_t lastUserCueNumber = 0; + int lastUserCueNumber = 0; private slots: void addCueTrack(CueTrack* cue); @@ -52,7 +54,6 @@ private slots: void cueTrackLoadDefaults(CueTrack * t); void copyCueTrack(CueTrack *src, CueTrack *dst); void sortCueTrackList(); - void redrawCueTrackList(); void clearTableWidget(); std::string cueTrackToXml(const CueTrack& cueTrack); diff --git a/src/defines.h b/src/defines.h index 59375fc..9317a59 100644 --- a/src/defines.h +++ b/src/defines.h @@ -65,7 +65,7 @@ constexpr const char* statusToString(Status e) noexcept #include static Status stringToStatus(QString *statusStr) { - if (!statusStr->compare("Stopped")) return Stopped; + if (!statusStr->compare("Stop")) return Stopped; else if (!statusStr->compare("Paused") ) return Paused; else if (!statusStr->compare("Play 1")) return PlayingOnce; else if (!statusStr->compare("Play Loop")) return PlayingLoop; diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index 1a1b6eb..f86495d 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -139,8 +139,6 @@ void libreMediaServerAudio::dmxInput(int layer, int channel, int value) #ifndef NOGUI if (m_ui) { m_lmsUi->m_aw->filterParamChanged(layer, channel, value); - m_played.clear(); - m_played.append(m_ola->getValue(layer, DMX_FILE)); } #endif } @@ -175,11 +173,13 @@ void libreMediaServerAudio::refreshUi() { if (m_currentStatus[i] == Status::PlayingOnce) { m_currentStatus[i] = Status::Stopped; m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); } if (m_currentStatus[i] == Status::PlayingFolder) { - uint last = m_played.last(); + uint last = 0; + if (!m_played.isEmpty()) + last = m_played.last() + 1; int folder = m_ola->getValue(i, DMX_FOLDER); - last++; if (last < m_mediaLibrary->getMediaFolderCount(folder)) { this->loadMedia(i, folder, last); m_mae.playbackChanged(i, Status::PlayingFolder); @@ -187,6 +187,7 @@ void libreMediaServerAudio::refreshUi() { else { m_currentStatus[i] = Status::Stopped; m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); + m_lmsUi->m_showPlayer->cueTrackAtEnd(i); } } else if (m_currentStatus[i] == Status::PlayingFolderLoop) { diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 3b877df..5b8d11c 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -44,6 +44,18 @@ void ShowPlayer::go() emit uiLoadMedia(current->audioLayer, current->filePath.data()); updateTrackStateInEngine(current); emit uiPlaybackChanged(current->audioLayer, current->status); + switch (current->status) { + case Status::PlayingOnce: + case Status::PlayingLoop: + case Status::PlayingFolder: + case Status::PlayingFolderLoop: + case Status::PlayingFolderRandom: + current->active = true; + break; + default: + current->active = false; + } + ui->cueListWidget->redrawCueTrackList(); filesLoaded++; } @@ -78,3 +90,8 @@ void ShowPlayer::saveCueTrackList() return; ui->cueListWidget->saveCueTrackList(fileName.toStdString()); } + +void ShowPlayer::cueTrackAtEnd(int layer) +{ + ui->cueListWidget->cueTrackAtEnd(layer); +} diff --git a/src/showplayer.h b/src/showplayer.h index 7abec4c..43c3788 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -24,6 +24,9 @@ public: explicit ShowPlayer(QWidget *parent = nullptr); ~ShowPlayer(); +public slots: + void cueTrackAtEnd(int layer); + private: Ui::ShowPlayer *ui; Status currentStatus = Status::Iddle; @@ -31,9 +34,8 @@ private: int layersUsed[MAX_LAYERS]; int lastIndex = 0; - void updateTrackStateInEngine(CueTrack *track); - private slots: + void updateTrackStateInEngine(CueTrack *track); void onAddTrack(); void go(); void changeSelectedIndex(int i); diff --git a/src/showplayer.ui b/src/showplayer.ui index b862342..6b07d30 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -134,7 +134,7 @@ 0 - QLayout::SetMinimumSize + QLayout::SetDefaultConstraint 100 From 605677885641a48af373df0cba4f507b23c00e62 Mon Sep 17 00:00:00 2001 From: snt Date: Sat, 22 Jun 2024 00:57:19 +0200 Subject: [PATCH 3/7] active indicator working --- src/cuetracklistwidget.cpp | 9 +++------ src/showplayer.cpp | 8 ++------ 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index 22ecbbd..f714278 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -248,6 +248,7 @@ void CueTrackListWidget::redrawCueTrackList() tableWidget->resizeRowsToContents(); tableWidget->scrollToItem(tableWidget->item(selectedIndex, 0)); tableWidget->blockSignals(false); + emit changeSelectedIndex(selectedIndex); } #include @@ -451,7 +452,6 @@ void saveCueTrackToXml(const CueTrack& cueTrack, const QString& filename) { xmlWriter.writeTextElement("entryPoint", QString::number(cueTrack.entryPoint)); xmlWriter.writeTextElement("exitPoint", QString::number(cueTrack.exitPoint)); xmlWriter.writeTextElement("audioLayer", QString::number(cueTrack.audioLayer)); - xmlWriter.writeTextElement("active", cueTrack.active ? "true" : "false"); xmlWriter.writeEndElement(); xmlWriter.writeEndDocument(); @@ -514,9 +514,7 @@ CueTrack loadCueTrackFromXml(const QString& filename) { cueTrack.exitPoint = xmlReader.readElementText().toInt(); } else if (elementName == "audioLayer") { cueTrack.audioLayer = xmlReader.readElementText().toInt(); - } else if (elementName == "active") { - cueTrack.active = xmlReader.readElementText() == "true"; - } + } } } if (xmlReader.hasError()) { @@ -545,7 +543,6 @@ void CueTrackListWidget::cueTrackAtEnd(int layer) { cur->active = false; } - layer--; - } + } redrawCueTrackList(); } diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 5b8d11c..db3d553 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -34,16 +34,11 @@ void ShowPlayer::go() if (current->audioLayer < 0) return; ui->activeCueLabel->setText(current->name.data()); - for (int i = 0; i < MAX_LAYERS; i++) { - if (layersUsed[i] == -1) { - layersUsed[i] = current->userNumber; - break; - } - } if (!current->filePath.empty()) emit uiLoadMedia(current->audioLayer, current->filePath.data()); updateTrackStateInEngine(current); emit uiPlaybackChanged(current->audioLayer, current->status); + ui->cueListWidget->cueTrackAtEnd(current->audioLayer); switch (current->status) { case Status::PlayingOnce: case Status::PlayingLoop: @@ -51,6 +46,7 @@ void ShowPlayer::go() case Status::PlayingFolderLoop: case Status::PlayingFolderRandom: current->active = true; + layersUsed[current->audioLayer] = current->userNumber; break; default: current->active = false; From e39d885f6f91cb32acc268695084454f25d242b0 Mon Sep 17 00:00:00 2001 From: snt Date: Wed, 26 Jun 2024 20:14:51 +0200 Subject: [PATCH 4/7] fade in time --- src/defines.h | 1 + src/libremediaserver-audio.cpp | 17 ++++++++++++++--- src/libremediaserver-audio.h | 1 + src/miniaudioengine.cpp | 12 ++++++++++-- src/miniaudioengine.h | 1 + src/showplayer.cpp | 2 +- src/showplayer.h | 1 + 7 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/defines.h b/src/defines.h index 9317a59..e59f28f 100644 --- a/src/defines.h +++ b/src/defines.h @@ -91,6 +91,7 @@ struct layerData { int bus1Vol; int bus2Vol; float level; + int fade; }; struct CueTrack { diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index f86495d..b28219f 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -228,7 +228,8 @@ 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(uiPlaybackChanged(int, Status)), this, SLOT(uiPlaybackChanged(int, Status))); + connect(m_lmsUi->m_showPlayer, SIGNAL(uiSliderChangedFaded(int, Slider, int, int)), this, SLOT(uiSliderChangedFaded(int, Slider, 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); connect(m_refreshUi, SIGNAL(timeout()), this, SLOT(refreshUi())); @@ -245,8 +246,8 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) { switch (s){ case Slider::Volume: - m_mae.volChanged(layer, value); - m_updateUi[layer][0] = value; + //m_mae.volChanged(layer, value); + //m_updateUi[layer][0] = value; break; case Slider::Pan: m_mae.panChanged(layer, value); @@ -299,4 +300,14 @@ void libreMediaServerAudio::uiLoadMedia(int layer, QString mediaFile) qWarning() << "ui load media error" << result << "file" << mediaFile << "layer" << layer; } } + +void libreMediaServerAudio::uiSliderChangedFaded(int layer, Slider s, int value, int ms) +{ + switch (s){ + case Slider::Volume: + m_mae.volChanged(layer, value, ms); + m_updateUi[layer][0] = value; + break; + } +} #endif diff --git a/src/libremediaserver-audio.h b/src/libremediaserver-audio.h index 8db0c7e..65b5d11 100644 --- a/src/libremediaserver-audio.h +++ b/src/libremediaserver-audio.h @@ -66,6 +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 uiPlaybackChanged(int layer, Status s); void uiLoadMedia(int layer, QString s); diff --git a/src/miniaudioengine.cpp b/src/miniaudioengine.cpp index 0e54927..9ab9f63 100644 --- a/src/miniaudioengine.cpp +++ b/src/miniaudioengine.cpp @@ -434,8 +434,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); +} + +// Expects between 0 and 65535 vol value and fade time in milliseconds +void MiniAudioEngine::volChanged(int layer, int vol, int ms) { m_mae.currentStatus[layer].vol = vol; + m_mae.currentStatus[layer].fade = ms; if (m_mae.mediaLoaded[layer] != MA_TRUE) return; if (m_mae.mediaLoaded[layer] == MA_FALSE && m_mae.currentStatus[layer].updated) @@ -445,9 +452,10 @@ void MiniAudioEngine::volChanged(int layer, int vol) db = 0; } else db = ma_volume_db_to_linear(db); - ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, FADE_TIME); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], -1, db, ms); } + void MiniAudioEngine::panChanged(int layer, float value) { float result; @@ -507,7 +515,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, FADE_TIME * 2); + ma_sound_set_fade_in_milliseconds(&m_mae.sounds[layer], 0, db, m_mae.currentStatus[layer].fade); default: break; } diff --git a/src/miniaudioengine.h b/src/miniaudioengine.h index 5fde13e..0a1bca8 100644 --- a/src/miniaudioengine.h +++ b/src/miniaudioengine.h @@ -64,6 +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 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 db3d553..4d3998e 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -56,7 +56,7 @@ void ShowPlayer::go() } void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { - emit uiSliderChanged(track->audioLayer, Slider::Volume, track->volume * 655.35); + emit uiSliderChangedFaded(track->audioLayer, Slider::Volume, track->volume * 655.35, track->fadeIn * 1000); emit uiSliderChanged(track->audioLayer, Slider::Pan, (track->pan + 1) * 128); emit uiSliderChanged(track->audioLayer, Slider::Pitch, track->pitch * 128); emit uiSliderChanged(track->audioLayer, Slider::Bus1, track->bus1 * 255 * 2.55); diff --git a/src/showplayer.h b/src/showplayer.h index 43c3788..0dd4f08 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -45,6 +45,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 uiLoadMedia(int layer, QString s); }; From 307d9c4d430ed2ccc4fc8759cbd0950ab6b76a83 Mon Sep 17 00:00:00 2001 From: snt Date: Thu, 27 Jun 2024 15:25:07 +0200 Subject: [PATCH 5/7] wip cuetrackwidget --- libremediaserver-audio.pro | 5 ++ src/cuetrackwidget.cpp | 14 ++++ src/cuetrackwidget.h | 23 ++++++ src/cuetrackwidget.ui | 157 +++++++++++++++++++++++++++++++++++++ src/dialgroup.cpp | 94 ++++++++++++++++++++++ src/dialgroup.h | 34 ++++++++ src/slidergroup.cpp | 12 +-- 7 files changed, 333 insertions(+), 6 deletions(-) create mode 100644 src/cuetrackwidget.cpp create mode 100644 src/cuetrackwidget.h create mode 100644 src/cuetrackwidget.ui create mode 100644 src/dialgroup.cpp create mode 100644 src/dialgroup.h diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index 77f5c0b..011aa46 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -2,6 +2,8 @@ TEMPLATE = app TARGET = libremediaserver-audio QT += webkitwidgets widgets HEADERS += src/libremediaserver-audio.h \ + cuetrackwidget.h \ + src/dialgroup.h \ src/editcuetrackwidget.h \ src/cuetracklistwidget.h \ src/showplayer.h \ @@ -25,6 +27,8 @@ HEADERS += src/libremediaserver-audio.h \ src/settings.h \ src/slidergroup.h SOURCES += src/main.cpp \ + cuetrackwidget.cpp \ + src/dialgroup.cpp \ src/editcuetrackwidget.cpp \ src/cuetracklistwidget.cpp \ src/showplayer.cpp \ @@ -45,6 +49,7 @@ SOURCES += src/main.cpp \ src/settings.cpp \ src/slidergroup.cpp FORMS += \ + cuetrackwidget.ui \ src/showplayer.ui \ src/libremediaserver-audio-ui.ui CCFLAG += -msse2 -mavx2 diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp new file mode 100644 index 0000000..659a7fe --- /dev/null +++ b/src/cuetrackwidget.cpp @@ -0,0 +1,14 @@ +#include "cuetrackwidget.h" +#include "ui_cuetrackwidget.h" + +CuetrackWidget::CuetrackWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::CuetrackWidget) +{ + ui->setupUi(this); +} + +CuetrackWidget::~CuetrackWidget() +{ + delete ui; +} diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h new file mode 100644 index 0000000..d28f076 --- /dev/null +++ b/src/cuetrackwidget.h @@ -0,0 +1,23 @@ +#ifndef CUETRACKWIDGET_H +#define CUETRACKWIDGET_H + +#include +#include + +namespace Ui { +class CuetrackWidget; +} + +class CuetrackWidget : public QWidget +{ + Q_OBJECT + +public: + explicit CuetrackWidget(QWidget *parent = nullptr); + ~CuetrackWidget(); + +private: + Ui::CuetrackWidget *ui; +}; + +#endif // CUETRACKWIDGET_H diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui new file mode 100644 index 0000000..8915532 --- /dev/null +++ b/src/cuetrackwidget.ui @@ -0,0 +1,157 @@ + + + CuetrackWidget + + + + 0 + 0 + 640 + 193 + + + + Form + + + + + 10 + 40 + 238 + 85 + + + + + + + + + + Fade time in seconds + + + Fade In + + + Fade In Time in seconds + + + true + + + QAbstractSpinBox::PlusMinus + + + + + + false + + + + + + + + + 99990000.000000000000000 + + + QAbstractSpinBox::AdaptiveDecimalStepType + + + + + + + CheckBox + + + + + + + + + + + + + + + 260 + 40 + 341 + 121 + + + + + + + + + + + + + + + + + + + + + + + + 0 + 10 + 631 + 25 + + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 100 + 0 + + + + 24 + + + + + + 100 + 0 + + + + + + + 400 + 0 + + + + + + + + diff --git a/src/dialgroup.cpp b/src/dialgroup.cpp new file mode 100644 index 0000000..b5bf768 --- /dev/null +++ b/src/dialgroup.cpp @@ -0,0 +1,94 @@ +#include "dialgroup.h" +#include +#include +#include + +DialGroup::DialGroup(QString name, + int min, + int max, + int decimals, + QWidget *parent) + : QWidget(parent) +{ + layout = new QVBoxLayout; + layout->setAlignment(Qt::AlignHCenter); + layout->setContentsMargins(0, 0, 0, 0); + slider.setFocusPolicy(Qt::StrongFocus); + slider.setTickPosition(QSlider::TicksBothSides); + slider.setTickInterval((max - min) / 11); + slider.setMinimumHeight(0); + slider.setSingleStep(1); + slider.setRange(min, max); + slider.setValue(0); + slider.setMinimumWidth(50); + slider.setToolTip(name); + slider.setStyleSheet("QDial {" + "border: 1px solid #aa8895;" + "background: #20182d;" + "margin: 0px;}" + "QSlider::groove:vertical {" + "border: 1px solid #999999;" + "width: 25px;}" + "QDial::tickmarks:vertical {" + "background-color: black;" + "background: red;" + "color: white;}" + slider.setContentsMargins(0, 0, 0, 0); + valueBox.setFocusPolicy(Qt::NoFocus); + valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons); + valueBox.setMinimumWidth(50); + if (decimals) { + valueBox.setRange(-84.0f, 0.0f); + valueBox.setSpecialValueText("-inf"); + } else + valueBox.setRange(min, max); + valueBox.setValue(0); + valueBox.setDecimals(decimals); + valueBox.setObjectName(name); + valueBox.setToolTip(name); + valueBox.setAlignment(Qt::AlignHCenter); + valueBox.setContentsMargins(0, 0, 0, 0); + connect(&slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); + layout->addWidget(&slider); + layout->addWidget(&valueBox); + this->setStyleSheet("border: 1px solid #aa8895;" + "background-color: black;" + "margin: 1px;" + ); + layout->setSpacing(0); + layout->setContentsMargins(0, 0, 0, 0); + this->setLayout(layout); +} + +void SliderGroup::sliderValueChanged(int value) +{ + valueBox.blockSignals(true); + if (valueBox.decimals()) { + float db = ((float)value / 771.0f) - 85.0f; + if (db <= -84.5f) { + valueBox.setSpecialValueText("-inf"); + } else + valueBox.setValue(db); + } else { + valueBox.setValue(value); + } + valueBox.blockSignals(false); + emit valueChanged(value); +}; + +void SliderGroup::setValue(float value) +{ + float db; + + slider.blockSignals(true); + valueBox.blockSignals(true); + if (int(value) != slider.value()) + slider.setValue(value); + if (valueBox.decimals()) { + db = (float)(value / 771.0f) - 85.0f; + valueBox.setValue(db); + } else + valueBox.setValue(value); + slider.blockSignals(false); + valueBox.blockSignals(false); +} diff --git a/src/dialgroup.h b/src/dialgroup.h new file mode 100644 index 0000000..3866c1c --- /dev/null +++ b/src/dialgroup.h @@ -0,0 +1,34 @@ +#ifndef SLIDERGROUP_H +#define SLIDERGROUP_H + +#include +#include +#include +#include + +#include "clickabledoublespinbox.h" + +class DialGroup : public QWidget +{ + Q_OBJECT +public: + DialGroup(QString name, + int min, + int max, + int decimals, + QWidget *parent = nullptr); + +signals: + void valueChanged(int value); + +public slots: + void setValue(float value); + void sliderValueChanged(int value); + +private: + QDial slider; + ClickableDoubleSpinBox valueBox; + +}; + +#endif diff --git a/src/slidergroup.cpp b/src/slidergroup.cpp index 481d554..8e9a3b6 100644 --- a/src/slidergroup.cpp +++ b/src/slidergroup.cpp @@ -38,16 +38,16 @@ SliderGroup::SliderGroup(QString name, "margin: 0px;}" "QSlider::groove:vertical {" "border: 1px solid #999999;" - "width: 25px;" - "margin: -4px;}" + "width: 25px;}" "QSlider::handle:vertical {" "background: white;" - "border: 1px solid #5c5c5c;" + "border: 2px solid #5c5c5c;" "width: 29px;" - "height: 7px;" - "margin: -2px;" + "height: 10px;" "border-radius: 2px;}" - "Qslider::tickmarks:vertical {background: white;" + "Qslider::tickmarks:vertical {" + "background-color: black;" + "background: red;" "color: white;}" "QSlider::add-page:vertical {background: blue;}" "QSlider::sub-page:vertical {background: #20182d;}"); From 14a51c88e94309976cc44107269895ba7c098bc9 Mon Sep 17 00:00:00 2001 From: snt Date: Mon, 1 Jul 2024 18:31:47 +0200 Subject: [PATCH 6/7] =?UTF-8?q?multi-cue,=20nuevo=20campo=20en=20cuetrack?= =?UTF-8?q?=20para=20lanzar=20la=20siguiente=20cue=20de=20forma=20inmediat?= =?UTF-8?q?a,=20sin=20esperar=20a=20los=20tiempos=20de=20la=20cue=20actual?= =?UTF-8?q?.=20Cambiado=20el=20visor=20de=20cue=20a=20QWidgetList,=20ahora?= =?UTF-8?q?=20muestra=20la=20=C3=BAltima=20cue=20reproducida=20en=20cada?= =?UTF-8?q?=20capa.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libremediaserver-audio.pro | 15 +- lms-resources.qrc | 3 + src/cuetracklistwidget.cpp | 87 ++- src/cuetracklistwidget.h | 8 +- src/cuetrackwidget.cpp | 99 +++- src/cuetrackwidget.h | 33 +- src/cuetrackwidget.ui | 942 +++++++++++++++++++++++++----- src/defines.h | 4 +- src/dialgroup.cpp | 59 +- src/dialgroup.h | 10 +- src/editcuetrackwidget.cpp | 4 + src/editcuetrackwidget.h | 1 + src/libremediaserver-audio-ui.cpp | 2 +- src/libremediaserver-audio-ui.ui | 14 +- src/libremediaserver-audio.cpp | 6 +- src/showplayer.cpp | 95 ++- src/showplayer.h | 12 +- src/showplayer.ui | 240 ++++---- 18 files changed, 1244 insertions(+), 390 deletions(-) diff --git a/libremediaserver-audio.pro b/libremediaserver-audio.pro index 011aa46..48f0af8 100644 --- a/libremediaserver-audio.pro +++ b/libremediaserver-audio.pro @@ -2,8 +2,7 @@ TEMPLATE = app TARGET = libremediaserver-audio QT += webkitwidgets widgets HEADERS += src/libremediaserver-audio.h \ - cuetrackwidget.h \ - src/dialgroup.h \ + src/cuetrackwidget.h \ src/editcuetrackwidget.h \ src/cuetracklistwidget.h \ src/showplayer.h \ @@ -25,10 +24,10 @@ HEADERS += src/libremediaserver-audio.h \ src/audiowidget.h \ src/defines.h \ src/settings.h \ - src/slidergroup.h + src/slidergroup.h \ + src/dialgroup.h SOURCES += src/main.cpp \ - cuetrackwidget.cpp \ - src/dialgroup.cpp \ + src/cuetrackwidget.cpp \ src/editcuetrackwidget.cpp \ src/cuetracklistwidget.cpp \ src/showplayer.cpp \ @@ -47,9 +46,10 @@ SOURCES += src/main.cpp \ src/audiolayerwidget.cpp \ src/audiowidget.cpp \ src/settings.cpp \ - src/slidergroup.cpp + src/slidergroup.cpp \ + src/dialgroup.cpp FORMS += \ - cuetrackwidget.ui \ + src/cuetrackwidget.ui \ src/showplayer.ui \ src/libremediaserver-audio-ui.ui CCFLAG += -msse2 -mavx2 @@ -63,6 +63,5 @@ OTHER_FILES += \ docs/changelog.txt \ docs/lms-audio.xlm \ docs/roadmap.txt - RESOURCES += \ lms-resources.qrc diff --git a/lms-resources.qrc b/lms-resources.qrc index b4ba770..21a0629 100644 --- a/lms-resources.qrc +++ b/lms-resources.qrc @@ -8,5 +8,8 @@ resources/new_button.png resources/paste_button.png resources/save_button.png + resources/icon.png + resources/panic_button.jpg + resources/go_button.jpeg diff --git a/src/cuetracklistwidget.cpp b/src/cuetracklistwidget.cpp index f714278..22f9062 100644 --- a/src/cuetracklistwidget.cpp +++ b/src/cuetracklistwidget.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include #include @@ -7,6 +10,8 @@ #include #include #include +#include +#include #include "cuetracklistwidget.h" CueTrackListWidget::CueTrackListWidget(QWidget *parent) @@ -42,9 +47,10 @@ CueTrack* CueTrackListWidget::getTrackAtIndex(int index) { return nullptr; } -CueTrack* CueTrackListWidget::getSelectedTrack() { +CueTrack* CueTrackListWidget::getSelectedTrack(bool advance) { CueTrack* track = getTrackAtIndex(selectedIndex); - key_down(); + if (advance) + key_down(); return track; } @@ -121,23 +127,25 @@ void CueTrackListWidget::updateSelectedCueTrack(bool highlightRow) { void CueTrackListWidget::cueTrackLoadDefaults(CueTrack * t) { t->active = false; - t->audioLayer = -1; - t->bus1 = 80; - t->bus2 = 80; + t->audioLayer = 0; + t->bus1 = 100; + t->bus2 = 100; t->entryPoint = 0; t->exitPoint = 255; - t->fadeIn = 3; - t->fadeOut = 3; + t->fadeIn = 2; + t->fadeOut = 2; t->waitIn = 0; t->waitOut = 0; t->pan = 0; t->pitch = 1; t->status = Status::PlayingOnce; + lastUserCueNumber += 10; t->userNumber = lastUserCueNumber; - lastUserCueNumber++; t->volume = 80; t->stopAtEnd = true; t->filePath = ""; + t->duration = 0; + t->multi = false; } void CueTrackListWidget::createNewCueTrack() @@ -155,7 +163,7 @@ void CueTrackListWidget::createNewCueTrack() } else redrawCueTrackList(); if (lastUserCueNumber < t->userNumber) - lastUserCueNumber = t->userNumber + 10; + lastUserCueNumber = t->userNumber; } else delete (t); } @@ -170,7 +178,7 @@ void CueTrackListWidget::editCueTrack() emit changeSelectedIndex(selectedIndex); } if (lastUserCueNumber < current->userNumber) - lastUserCueNumber = current->userNumber + 10; + lastUserCueNumber = current->userNumber; } void CueTrackListWidget::deleteCueTrack() @@ -205,6 +213,8 @@ void CueTrackListWidget::copyCueTrack(CueTrack *src, CueTrack *dst) dst->name = src->name; dst->description = src->description; dst->filePath = src->filePath; + dst->duration = src->duration; + dst->multi = src->multi; } QString *CueTrackListWidget::getFileName(std::string s) @@ -251,11 +261,6 @@ void CueTrackListWidget::redrawCueTrackList() emit changeSelectedIndex(selectedIndex); } -#include -#include -#include -#include - void CueTrackListWidget::loadCueTrackList(std::string filename) { QFile file(QString::fromStdString(filename)); @@ -266,6 +271,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) } QXmlStreamReader xmlReader(&file); clearCueTrackList(); + lastUserCueNumber = 0; while (!xmlReader.atEnd() && !xmlReader.hasError()) { QXmlStreamReader::TokenType token = xmlReader.readNext(); @@ -318,7 +324,7 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) } else if (elementName == "stopAtEnd") { QString tmp = xmlReader.text().toString().toLower(); - if (tmp.compare("true")) + if (tmp.compare("false")) t->stopAtEnd = true; else { t->stopAtEnd = false; @@ -332,6 +338,10 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) } else if (elementName == "userNumber") { t->userNumber = xmlReader.text().toInt(); + if (t->userNumber > lastUserCueNumber) + { + lastUserCueNumber = t->userNumber; + } } else if (elementName == "entryPoint") { t->entryPoint = xmlReader.text().toInt(); @@ -342,6 +352,17 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) else if (elementName == "audioLayer") { t->audioLayer = xmlReader.text().toInt(); } + else if (elementName == "duration") { + t->duration = xmlReader.text().toInt(); + } + else if (elementName == "multi") { + QString tmp = xmlReader.text().toString().toLower(); + if (tmp.compare("false")) + t->multi = true; + else { + t->multi = false; + } + } t->active = false; } } @@ -359,9 +380,6 @@ void CueTrackListWidget::loadCueTrackList(std::string filename) redrawCueTrackList(); } -#include -#include - void CueTrackListWidget::saveCueTrackList(std::string filename) { std::ofstream file(filename); @@ -404,7 +422,11 @@ std::string CueTrackListWidget::cueTrackToXml(const CueTrack& cueTrack) xml += " " + std::to_string(cueTrack.entryPoint) + "\n"; xml += " " + std::to_string(cueTrack.exitPoint) + "\n"; xml += " " + std::to_string(cueTrack.audioLayer) + "\n"; - xml += " \n"; + xml += " " + std::to_string(cueTrack.duration) + "\n"; + xml += " "; + xml += (cueTrack.multi ? "true" : "false"); + xml += "\n"; + xml += " \n"; return xml; } @@ -514,6 +536,8 @@ CueTrack loadCueTrackFromXml(const QString& filename) { cueTrack.exitPoint = xmlReader.readElementText().toInt(); } else if (elementName == "audioLayer") { cueTrack.audioLayer = xmlReader.readElementText().toInt(); + } else if (elementName == "duration") { + cueTrack.duration = xmlReader.readElementText().toInt(); } } } @@ -546,3 +570,26 @@ void CueTrackListWidget::cueTrackAtEnd(int layer) } redrawCueTrackList(); } + +void CueTrackListWidget::copyCueTrack() { + if (selectedIndex >= 0 && selectedIndex < m_size) { + delete copiedCue; + copiedCue = new CueTrack(*cueTracks.at(selectedIndex)); + } +} + +void CueTrackListWidget::cutCueTrack() { + if (selectedIndex >= 0 && selectedIndex < m_size) { + delete copiedCue; + copiedCue = new CueTrack(*cueTracks.at(selectedIndex)); + removeCueTrack(selectedIndex); + } +} + +void CueTrackListWidget::pasteCueTrack() { + if (copiedCue != nullptr) { + CueTrack* newCue = new CueTrack(*copiedCue); + addCueTrack(newCue); + } +} + diff --git a/src/cuetracklistwidget.h b/src/cuetracklistwidget.h index b8e2527..518b4ef 100644 --- a/src/cuetracklistwidget.h +++ b/src/cuetracklistwidget.h @@ -19,7 +19,7 @@ public: explicit CueTrackListWidget(QWidget *parent = nullptr); public slots: - CueTrack* getSelectedTrack(); + CueTrack* getSelectedTrack(bool advance); void createNewCueTrack(); void editCueTrack(); void deleteCueTrack(); @@ -42,6 +42,7 @@ private: int size() { return m_size; } int selectedIndex = 0; int lastUserCueNumber = 0; + CueTrack* copiedCue = nullptr; private slots: void addCueTrack(CueTrack* cue); @@ -56,9 +57,12 @@ private slots: void sortCueTrackList(); void clearTableWidget(); std::string cueTrackToXml(const CueTrack& cueTrack); - + void copyCueTrack(); + void pasteCueTrack(); + void cutCueTrack(); signals: void changeSelectedIndex(int index); + void goAction(int channel); }; #endif diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp index 659a7fe..f747a36 100644 --- a/src/cuetrackwidget.cpp +++ b/src/cuetrackwidget.cpp @@ -1,14 +1,107 @@ +#include + #include "cuetrackwidget.h" #include "ui_cuetrackwidget.h" -CuetrackWidget::CuetrackWidget(QWidget *parent) : +CueTrackWidget::CueTrackWidget(QWidget *parent) : QWidget(parent), - ui(new Ui::CuetrackWidget) + ui(new Ui::CueTrackWidget) { ui->setupUi(this); + tlFade.setFrameRange(0, 100); + tlWaitIn.setFrameRange(0, 100); + tlWaitOut.setFrameRange(0, 100); + connect(&tlFade, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlWaitIn, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlWaitOut, &QTimeLine::frameChanged, ui->cueProgressBar, &QProgressBar::setValue); + connect(&tlFade, SIGNAL(finished()), this, SLOT(fadeSlot())); + connect(&tlWaitIn, SIGNAL(finished()), this, SLOT(waitInSlot())); + connect(&tlWaitOut, SIGNAL(finished()), this, SLOT(waitOutSlot())); } -CuetrackWidget::~CuetrackWidget() + +CueTrackWidget::~CueTrackWidget() { delete ui; } + +void CueTrackWidget::loadCueTrack(CueTrack* track) +{ + ui->cueName->setText(track->name.data()); + ui->cueNumber->display(track->userNumber); + ui->vol->display(track->volume); + ui->pan->display(track->pan); + ui->pitch->display(track->pitch); + ui->bus1->display(track->bus1); + ui->bus2->display(track->bus2); + ui->fade->setValue(track->fadeOut); + ui->waitIn->setValue(track->waitIn); + ui->waitOut->setValue(track->waitOut); + ui->halt->setChecked(track->stopAtEnd); + QFileInfo fileInfo(track->filePath.data()); + fileInfo.fileName().truncate(64); + ui->mediaFileName->setText(fileInfo.fileName()); + ui->mediaEndTimeEdit->setTime(QTime::fromMSecsSinceStartOfDay(track->duration)); + ui->status->setText(statusToString(track->status)); + ui->audioLayer->display(track->audioLayer); + ui->multi->setChecked(track->multi); +} + +void CueTrackWidget::go() +{ + tlFade.stop(); + tlWaitIn.stop(); + tlWaitOut.stop(); + ui->cueProgressBar->setValue(0); + if (ui->waitIn->value() > 0) + { + tlWaitIn.setDuration(ui->waitIn->value() * 1000); + tlWaitIn.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }"); + } else { + waitInSlot(); + } +} + +void CueTrackWidget::waitInSlot() +{ + emit goAction(ui->audioLayer->intValue()); + tlFade.setDuration(ui->fade->value() * 1000); + tlFade.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #00FF00; }"); +} + +void CueTrackWidget::fadeSlot() +{ + if (ui->waitOut->value() > 0) { + tlWaitOut.setDuration(ui->waitOut->value() * 1000); + tlWaitOut.start(); + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #FF0000; }"); + } else { + waitOutSlot(); + } +} + +void CueTrackWidget::waitOutSlot() +{ + ui->cueProgressBar->setStyleSheet("QProgressBar::chunk { background-color: #0000FF; }"); + emit cueFinished(ui->audioLayer->intValue()); +} + +void CueTrackWidget::refreshCurrentTime(int time) +{ + QTime t; + t.fromMSecsSinceStartOfDay(time); + ui->mediaCurrentTimeEdit->setTime(t); + ui->mediaProgressBar->setValue(time); +} + +void CueTrackWidget::setNextCue() +{ + ui->cueProgressBar->setDisabled(true); + ui->cueProgressBar->hide(); + ui->mediaProgressBar->setDisabled(true); + ui->mediaProgressBar->hide(); + ui->mediaCurrentTimeEdit->setDisabled(true); + ui->mediaCurrentTimeEdit->hide(); +} diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h index d28f076..453c0b8 100644 --- a/src/cuetrackwidget.h +++ b/src/cuetrackwidget.h @@ -2,22 +2,43 @@ #define CUETRACKWIDGET_H #include -#include +#include + +#include "defines.h" +#include "dialgroup.h" namespace Ui { -class CuetrackWidget; +class CueTrackWidget; } -class CuetrackWidget : public QWidget +class CueTrackWidget : public QWidget { Q_OBJECT public: - explicit CuetrackWidget(QWidget *parent = nullptr); - ~CuetrackWidget(); + explicit CueTrackWidget(QWidget *parent = nullptr); + ~CueTrackWidget(); private: - Ui::CuetrackWidget *ui; + Ui::CueTrackWidget *ui; + QTimeLine tlFade; + QTimeLine tlWaitIn; + QTimeLine tlWaitOut; + +public slots: + void loadCueTrack(CueTrack* track); + void go(); + void setNextCue(); + +private slots: + void refreshCurrentTime(int time); + void fadeSlot(); + void waitInSlot(); + void waitOutSlot(); + +signals: + void cueFinished(int layer); + void goAction(int layer); }; #endif // CUETRACKWIDGET_H diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui index 8915532..001d56e 100644 --- a/src/cuetrackwidget.ui +++ b/src/cuetrackwidget.ui @@ -1,157 +1,825 @@ - CuetrackWidget - + CueTrackWidget + 0 0 - 640 - 193 + 502 + 329 - - Form + + + 0 + 0 + - - - - 10 - 40 - 238 - 85 - + + + 0 + 0 + + + + Qt::ClickFocus + + + Cue Track + + + + :/buttons/resources/icon.png:/buttons/resources/icon.png + + + + 0 - - + + 0 - - - - - Fade time in seconds + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + QFrame::StyledPanel + + + Qt::Vertical + + + false + + + 8 + + + + + 0 + 0 + - - Fade In + + + 0 + 0 + - - Fade In Time in seconds - - - true - - - QAbstractSpinBox::PlusMinus - - - - - - false - - - - - - - - - 99990000.000000000000000 - - - QAbstractSpinBox::AdaptiveDecimalStepType + + Qt::Horizontal + + + + 0 + 0 + + + + + 0 + 0 + + + + Cue Progress + + + Cue Progress + + + 24 + + + + + + 1 + 0 + + + + + 48 + 48 + + + + + 14 + 75 + true + + + + Cue Number + + + Cue Number + + + QFrame::StyledPanel + + + QFrame::Plain + + + 1 + + + false + + + 4 + + + QLCDNumber::Flat + + + + + + 2 + 0 + + + + + 0 + 0 + + + + + 13 + 75 + true + + + + Cue Name + + + QFrame::StyledPanel + + + QFrame::Plain + + + Cue Name + + + Qt::PlainText + + + true + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + 3 + + - - - - - CheckBox + + + + 0 + 0 + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 100 + 0 + + + + Cue Progress + + + Media Progress + + + 24 + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Media current time + + + true + + + QAbstractSpinBox::NoButtons + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Media Edn Time + + + true + + + QAbstractSpinBox::NoButtons + + + + + + 7 + 0 + + + + Media FIle Name + + + QFrame::StyledPanel + + + Media file name + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + true + + + 3 + + - - - - - - - - - - - - - 260 - 40 - 341 - 121 - - - - - - - - - - - - - - - - - - - - - - - - 0 - 10 - 631 - 25 - - - - Qt::Horizontal - - - - - 0 - 0 - - - - - 100 - 0 - - - - 24 - - - - - - 100 - 0 - - - - - - - 400 - 0 - - - - + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Qt::Horizontal + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + + + + + QLayout::SetDefaultConstraint + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Wait in time in seconds + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Wait out time in secods + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Fade time in seconds + + + Fade In + + + Fade In Time in seconds + + + true + + + true + + + QAbstractSpinBox::NoButtons + + + + + + false + + + + + + + + + 99990000.000000000000000 + + + QAbstractSpinBox::AdaptiveDecimalStepType + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Exit Point + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + + 13 + + + + Playback Status + + + QFrame::StyledPanel + + + Playback Status + + + Qt::PlainText + + + true + + + Qt::AlignCenter + + + true + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + Entry Point + + + QAbstractSpinBox::NoButtons + + + + + + + + 0 + 0 + + + + + 0 + 24 + + + + Audio Channel + + + false + + + 1 + + + QLCDNumber::Flat + + + + + + + + 0 + 0 + + + + + 24 + 0 + + + + + 13 + 75 + true + + + + Qt::NoFocus + + + Do not play next cue if checked + + + If checked, do not play next cue. If checked, Go next cue when this cue has finished. + + + Halt + + + true + + + Halt + + + + :/buttons/resources/delete_button.png:/buttons/resources/delete_button.png + + + + 32 + 32 + + + + true + + + + + + + + + QLayout::SetDefaultConstraint + + + 0 + + + + + 3 + + + + + + + + 0 + 0 + + + + + 10 + + + + Bus 1 + + + Qt::AlignCenter + + + + + + + 3 + + + QLCDNumber::Flat + + + + + + + + 10 + + + + Volume + + + Qt::AlignCenter + + + + + + + + 10 + + + + Bus 2 + + + Qt::AlignCenter + + + + + + + <html><head/><body><p>Volume</p></body></html> + + + 3 + + + + + + + <html><head/><body><p>Bus 2 Volume</p></body></html> + + + 3 + + + + + + + <html><head/><body><p>Bus 1 Volume</p></body></html> + + + 3 + + + + + + + + 0 + 0 + + + + + 10 + + + + Pan + + + Qt::AlignCenter + + + + + + + + 10 + + + + Pitch + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + 50 + false + true + + + + <html><head/><body><p>PLay next cue at same time this cue, do not wait to finish the cue.</p></body></html> + + + Qt::RightToLeft + + + + + + + :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + + + 32 + 32 + + + + + + + + + 10 + + + + MultiCue + + + Qt::AlignCenter + + + + + + + + + - + + mediaCurrentTimeEdit + waitOut + waitIn + entryPoint + exitPoint + fade + mediaEndTimeEdit + + + + diff --git a/src/defines.h b/src/defines.h index e59f28f..f6a083c 100644 --- a/src/defines.h +++ b/src/defines.h @@ -113,7 +113,9 @@ struct CueTrack { int entryPoint; // 0 - 255 int exitPoint; // 0 - 255 int audioLayer; // internal audio layer used when cue is loaded - bool active; + bool active; // the cue is playing + int duration; // media duration in milliseconds + bool multi; // launch next cue at same time, not waiting for this to finish. }; #endif // __cplusplus diff --git a/src/dialgroup.cpp b/src/dialgroup.cpp index b5bf768..ef29b88 100644 --- a/src/dialgroup.cpp +++ b/src/dialgroup.cpp @@ -1,7 +1,7 @@ -#include "dialgroup.h" #include #include #include +#include "dialgroup.h" DialGroup::DialGroup(QString name, int min, @@ -10,18 +10,18 @@ DialGroup::DialGroup(QString name, QWidget *parent) : QWidget(parent) { - layout = new QVBoxLayout; + QVBoxLayout *layout = new QVBoxLayout; layout->setAlignment(Qt::AlignHCenter); layout->setContentsMargins(0, 0, 0, 0); - slider.setFocusPolicy(Qt::StrongFocus); - slider.setTickPosition(QSlider::TicksBothSides); - slider.setTickInterval((max - min) / 11); + slider.setFocusPolicy(Qt::NoFocus); + slider.setRange(min, max); + slider.setValue(min + max / 2); + slider.setToolTip(name); + slider.setContentsMargins(0, 0, 0, 0); +/* slider.setMinimumHeight(0); slider.setSingleStep(1); - slider.setRange(min, max); - slider.setValue(0); slider.setMinimumWidth(50); - slider.setToolTip(name); slider.setStyleSheet("QDial {" "border: 1px solid #aa8895;" "background: #20182d;" @@ -33,62 +33,35 @@ DialGroup::DialGroup(QString name, "background-color: black;" "background: red;" "color: white;}" - slider.setContentsMargins(0, 0, 0, 0); +*/ valueBox.setFocusPolicy(Qt::NoFocus); valueBox.setButtonSymbols(QAbstractSpinBox::NoButtons); valueBox.setMinimumWidth(50); - if (decimals) { - valueBox.setRange(-84.0f, 0.0f); - valueBox.setSpecialValueText("-inf"); - } else - valueBox.setRange(min, max); + valueBox.setRange(min, max); valueBox.setValue(0); valueBox.setDecimals(decimals); valueBox.setObjectName(name); valueBox.setToolTip(name); valueBox.setAlignment(Qt::AlignHCenter); valueBox.setContentsMargins(0, 0, 0, 0); - connect(&slider, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); layout->addWidget(&slider); layout->addWidget(&valueBox); - this->setStyleSheet("border: 1px solid #aa8895;" +/* this->setStyleSheet("border: 1px solid #998090;" "background-color: black;" "margin: 1px;" - ); + );*/ layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); this->setLayout(layout); + slider.setObjectName(name); } -void SliderGroup::sliderValueChanged(int value) +void DialGroup::setValue(float value) { - valueBox.blockSignals(true); - if (valueBox.decimals()) { - float db = ((float)value / 771.0f) - 85.0f; - if (db <= -84.5f) { - valueBox.setSpecialValueText("-inf"); - } else - valueBox.setValue(db); - } else { - valueBox.setValue(value); - } - valueBox.blockSignals(false); - emit valueChanged(value); -}; - -void SliderGroup::setValue(float value) -{ - float db; - slider.blockSignals(true); valueBox.blockSignals(true); - if (int(value) != slider.value()) - slider.setValue(value); - if (valueBox.decimals()) { - db = (float)(value / 771.0f) - 85.0f; - valueBox.setValue(db); - } else - valueBox.setValue(value); + slider.setValue(value); + valueBox.setValue(value); slider.blockSignals(false); valueBox.blockSignals(false); } diff --git a/src/dialgroup.h b/src/dialgroup.h index 3866c1c..d795821 100644 --- a/src/dialgroup.h +++ b/src/dialgroup.h @@ -1,5 +1,5 @@ -#ifndef SLIDERGROUP_H -#define SLIDERGROUP_H +#ifndef DIALGROUP_H +#define DIALGROUP_H #include #include @@ -12,18 +12,14 @@ class DialGroup : public QWidget { Q_OBJECT public: - DialGroup(QString name, + explicit DialGroup(QString name, int min, int max, int decimals, QWidget *parent = nullptr); -signals: - void valueChanged(int value); - public slots: void setValue(float value); - void sliderValueChanged(int value); private: QDial slider; diff --git a/src/editcuetrackwidget.cpp b/src/editcuetrackwidget.cpp index f0f6046..cb38701 100644 --- a/src/editcuetrackwidget.cpp +++ b/src/editcuetrackwidget.cpp @@ -58,6 +58,8 @@ void EditCueTrackWidget::setupUi() { layout->addRow("Entry Point", entryPointSpin); exitPointSpin = new QSpinBox(this); layout->addRow("Exit Point", exitPointSpin); + multiCheck = new QCheckBox(this); + layout->addRow("Multi Cue", multiCheck); statusCombo->addItem(statusToString(Status::Stopped)); statusCombo->addItem(statusToString(Status::Paused)); statusCombo->addItem(statusToString(Status::PlayingOnce)); @@ -92,6 +94,7 @@ void EditCueTrackWidget::loadCueTrack(CueTrack cueTrack) { audioLayerSpin->setValue(cueTrack.audioLayer); QString tmp = statusToString(cueTrack.status); statusCombo->setCurrentIndex(statusCombo->findText(tmp)); + multiCheck->setChecked(cueTrack.multi); } CueTrack EditCueTrackWidget::saveCueTrack() { @@ -114,6 +117,7 @@ CueTrack EditCueTrackWidget::saveCueTrack() { cueTrack.pan = panSpin->value(); cueTrack.pitch = pitchSpin->value(); cueTrack.description.append(descriptionEdit->text().toUtf8().constData()); + cueTrack.multi = multiCheck->isChecked(); return cueTrack; } diff --git a/src/editcuetrackwidget.h b/src/editcuetrackwidget.h index 080561e..8afb0d1 100644 --- a/src/editcuetrackwidget.h +++ b/src/editcuetrackwidget.h @@ -46,6 +46,7 @@ private: QSpinBox *exitPointSpin; QComboBox *statusCombo; QSpinBox *audioLayerSpin; + QCheckBox *multiCheck; QPushButton *browseButton; QPushButton *saveButton; QPushButton *cancelButton; diff --git a/src/libremediaserver-audio-ui.cpp b/src/libremediaserver-audio-ui.cpp index 0227f16..e1f8533 100644 --- a/src/libremediaserver-audio-ui.cpp +++ b/src/libremediaserver-audio-ui.cpp @@ -60,6 +60,6 @@ void libreMediaServerAudioUi::olasetup() void libreMediaServerAudioUi::launchShowPlayerWindow() { - qDebug() << "launch show player"; + //m_showPlayer->showMaximized(); m_showPlayer->show(); } diff --git a/src/libremediaserver-audio-ui.ui b/src/libremediaserver-audio-ui.ui index 2f1feae..7de7324 100644 --- a/src/libremediaserver-audio-ui.ui +++ b/src/libremediaserver-audio-ui.ui @@ -7,8 +7,8 @@ 0 0 - 400 - 400 + 640 + 800 @@ -23,8 +23,8 @@ LibreMediaServer - - ../../../../criptomart/artwork/logo_v2_criptomart.net.png../../../../criptomart/artwork/logo_v2_criptomart.net.png + + :/buttons/resources/icon.png:/buttons/resources/icon.png @@ -32,7 +32,7 @@ 0 0 - 400 + 640 21 @@ -56,6 +56,8 @@ - + + + diff --git a/src/libremediaserver-audio.cpp b/src/libremediaserver-audio.cpp index b28219f..a440561 100644 --- a/src/libremediaserver-audio.cpp +++ b/src/libremediaserver-audio.cpp @@ -170,7 +170,7 @@ void libreMediaServerAudio::refreshUi() { } m_lmsUi->m_aw->levelChanged(i, m_mae.getLevel(i)); if (m_mae.getAtEnd(i)) { - if (m_currentStatus[i] == Status::PlayingOnce) { + if (m_currentStatus[i] == Status::PlayingOnce || m_currentStatus[i] == Status::Stopped) { m_currentStatus[i] = Status::Stopped; m_lmsUi->m_aw->playbackChanged(i, Status::Stopped); m_lmsUi->m_showPlayer->cueTrackAtEnd(i); @@ -246,8 +246,8 @@ void libreMediaServerAudio::uiSliderChanged(int layer, Slider s, int value) { switch (s){ case Slider::Volume: - //m_mae.volChanged(layer, value); - //m_updateUi[layer][0] = value; + m_mae.volChanged(layer, value); + m_updateUi[layer][0] = value; break; case Slider::Pan: m_mae.panChanged(layer, value); diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 4d3998e..3b1edd6 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -12,11 +12,11 @@ ShowPlayer::ShowPlayer(QWidget *parent) : connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList())); connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList())); connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go())); - filesLoaded = 0; currentStatus = Status::Iddle; - for(int i = 0; i < MAX_LAYERS; i++) + for(int i = 0; i < MAX_LAYERS; i++) { layersUsed[i] = -1; - connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(changeSelectedIndex(int))); + cueTrackWidgetPlaying[i] = nullptr; + } } ShowPlayer::~ShowPlayer() {} @@ -27,32 +27,36 @@ void ShowPlayer::onAddTrack() { void ShowPlayer::go() { - ui->activeCueNumber->display(lastIndex); - CueTrack* current = ui->cueListWidget->getSelectedTrack(); - if (!current) + CueTrack *goCue = ui->cueListWidget->getSelectedTrack(true); + if (!goCue) return; - if (current->audioLayer < 0) - return; - ui->activeCueLabel->setText(current->name.data()); - if (!current->filePath.empty()) - emit uiLoadMedia(current->audioLayer, current->filePath.data()); - updateTrackStateInEngine(current); - emit uiPlaybackChanged(current->audioLayer, current->status); - ui->cueListWidget->cueTrackAtEnd(current->audioLayer); - switch (current->status) { + current[goCue->audioLayer] = goCue; + playCueTrack(goCue); + if (goCue->multi) + go(); +} + +void ShowPlayer::goAction(int c) +{ + if (!current[c]->filePath.empty()) { + emit uiLoadMedia(current[c]->audioLayer, current[c]->filePath.data()); + ui->cueListWidget->cueTrackAtEnd(c); + } + updateTrackStateInEngine(current[c]); + emit uiPlaybackChanged(current[c]->audioLayer, current[c]->status); + switch (current[c]->status) { case Status::PlayingOnce: case Status::PlayingLoop: case Status::PlayingFolder: case Status::PlayingFolderLoop: case Status::PlayingFolderRandom: - current->active = true; - layersUsed[current->audioLayer] = current->userNumber; + current[c]->active = true; + layersUsed[current[c]->audioLayer] = current[c]->userNumber; break; default: - current->active = false; + current[c]->active = false; } ui->cueListWidget->redrawCueTrackList(); - filesLoaded++; } void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { @@ -63,20 +67,12 @@ void ShowPlayer::updateTrackStateInEngine(CueTrack *track) { emit uiSliderChanged(track->audioLayer, Slider::Bus2, track->bus2 * 255 * 2.55); } -void ShowPlayer::changeSelectedIndex(int i) -{ - CueTrack *t = ui->cueListWidget->getTrackAtIndex(i); - ui->nextCueNumber->display(t->userNumber); - ui->nextCueLabel->setText(t->name.data()); - lastIndex = t->userNumber; -} - void ShowPlayer::loadCueTrackList() { QString fileName = QFileDialog::getOpenFileName(this, tr("Open File"), "", tr("XML Files (*.xml)")); if (fileName.isEmpty()) return; - ui->cueListWidget->loadCueTrackList(fileName.toStdString()); + ui->cueListWidget->loadCueTrackList(fileName.toStdString()); } void ShowPlayer::saveCueTrackList() @@ -89,5 +85,48 @@ void ShowPlayer::saveCueTrackList() void ShowPlayer::cueTrackAtEnd(int layer) { + current[layer]->active = false; ui->cueListWidget->cueTrackAtEnd(layer); + removeCueTrackWidget(layer); +} + +void ShowPlayer::cueFinished(int c) +{ + if (current[c] && !current[c]->stopAtEnd) + this->go(); +} + +CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { + QListWidgetItem* item = new QListWidgetItem(ui->activeCueList); + CueTrackWidget* widget = new CueTrackWidget(); + widget->loadCueTrack(track); + connect(widget, SIGNAL(goAction(int)), this, SLOT(goAction(int))); + connect(widget, SIGNAL(cueFinished(int)), this, SLOT(cueFinished(int))); + cueTrackWidgetPlaying[track->audioLayer] = widget; + item->setSizeHint(widget->sizeHint()); + ui->activeCueList->setItemWidget(item, widget); + return (widget); +} + +void ShowPlayer::playCueTrack(CueTrack* track) { + removeCueTrackWidget(track->audioLayer); + CueTrackWidget *widget = addCueTrackWidget(track); + widget->go(); +} + +void ShowPlayer::removeCueTrackWidget(int audioLayer) { + CueTrackWidget* widgetToRemove = cueTrackWidgetPlaying[audioLayer]; + if (widgetToRemove != NULL && ui->activeCueList->count() > 0) { + for (int i = 0; i < ui->activeCueList->count(); ++i) { + QListWidgetItem* item = ui->activeCueList->item(i); + QWidget* widget = ui->activeCueList->itemWidget(item); + if (widget == widgetToRemove) { + ui->activeCueList->removeItemWidget(item); + delete item; + delete widgetToRemove; + break; + } + } + cueTrackWidgetPlaying[audioLayer] = nullptr; + } } diff --git a/src/showplayer.h b/src/showplayer.h index 0dd4f08..07a05fa 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -9,6 +9,8 @@ #include "defines.h" #include "cuetracklistwidget.h" +#include "cuetrackwidget.h" +#include "dialgroup.h" #include "settings.h" #include "ui_showplayer.h" @@ -30,17 +32,21 @@ public slots: private: Ui::ShowPlayer *ui; Status currentStatus = Status::Iddle; - size_t filesLoaded = 0; int layersUsed[MAX_LAYERS]; - int lastIndex = 0; + CueTrack *current[MAX_LAYERS]; + CueTrackWidget *cueTrackWidgetPlaying[MAX_LAYERS]; + CueTrackWidget *addCueTrackWidget(CueTrack *track); private slots: void updateTrackStateInEngine(CueTrack *track); void onAddTrack(); void go(); - void changeSelectedIndex(int i); void loadCueTrackList(); void saveCueTrackList(); + void cueFinished(int channel); + void removeCueTrackWidget(int index); + void playCueTrack(CueTrack *track); + void goAction(int channel); signals: void uiPlaybackChanged(int layer, Status s); diff --git a/src/showplayer.ui b/src/showplayer.ui index 6b07d30..b246be4 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -6,8 +6,8 @@ 0 0 - 743 - 671 + 800 + 802 @@ -19,117 +19,30 @@ Show Player + + + :/buttons/resources/icon.png:/buttons/resources/icon.png + + + true + + + false + + + false + - - - - 0 - 0 - - - - - 400 - 400 - - + - QFrame::StyledPanel - - - QFrame::Sunken + QFrame::Box Qt::Vertical - - 8 - - - - QFrame::Box - - - QFrame::Raised - - - Qt::Horizontal - - - 8 - - - - - 0 - 0 - - - - Qt::ClickFocus - - - GO - - - Space - - - - - - QLayout::SetMinimumSize - - - 0 - - - - - - - - Active Cue - - - - - - - true - - - - - - - Next Cue - - - - - - - - - 0 - 0 - - - - Qt::ClickFocus - - - ... - - - P - - - - + 0 @@ -137,10 +50,10 @@ QLayout::SetDefaultConstraint - 100 + 0 - 100 + 0 @@ -328,25 +241,109 @@ - - - true + + + QFrame::StyledPanel - - - 0 - 0 - + + QFrame::Plain - - Qt::StrongFocus + + Qt::Horizontal - - true + + 8 - - Qt::ImhPreferLowercase + + + + 0 + 0 + + + + Qt::ClickFocus + + + + + + + :/buttons/resources/go_button.jpeg:/buttons/resources/go_button.jpeg + + + + 120 + 120 + + + + Space + + + true + + + false + + + + + + 0 + 0 + + + + Qt::ClickFocus + + + ... + + + + :/buttons/resources/panic_button.jpg:/buttons/resources/panic_button.jpg + + + + 96 + 120 + + + + P + + + + + + Qt::Horizontal + + + <html><head/><body><p>Cue List</p></body></html> + + + + + + 0 + 0 + + + + <html><head/><body><p>Cues active</p></body></html> + + + QFrame::Plain + + + QListView::Adjust + + + QListView::SinglePass + + @@ -361,7 +358,6 @@ - cueListWidget NewCue EditCue RemoveCue From d35b166ce51320c115b07084afc49b49f3aacdcf Mon Sep 17 00:00:00 2001 From: snt Date: Tue, 2 Jul 2024 00:30:03 +0200 Subject: [PATCH 7/7] =?UTF-8?q?quita=20de=20la=20lista=20las=20cues=20en?= =?UTF-8?q?=20stop=20o=20paused=20cuando=20acaben=20su=20ejeuci=C3=B3n.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cuetrackwidget.cpp | 15 +------- src/cuetrackwidget.h | 1 - src/cuetrackwidget.ui | 85 ++++++++++-------------------------------- src/showplayer.cpp | 20 ++++++++-- src/showplayer.h | 1 + src/showplayer.ui | 23 +++++------- 6 files changed, 48 insertions(+), 97 deletions(-) diff --git a/src/cuetrackwidget.cpp b/src/cuetrackwidget.cpp index f747a36..609cf4d 100644 --- a/src/cuetrackwidget.cpp +++ b/src/cuetrackwidget.cpp @@ -34,14 +34,13 @@ void CueTrackWidget::loadCueTrack(CueTrack* track) ui->pitch->display(track->pitch); ui->bus1->display(track->bus1); ui->bus2->display(track->bus2); - ui->fade->setValue(track->fadeOut); + ui->fade->setValue(track->fadeIn); ui->waitIn->setValue(track->waitIn); ui->waitOut->setValue(track->waitOut); ui->halt->setChecked(track->stopAtEnd); QFileInfo fileInfo(track->filePath.data()); fileInfo.fileName().truncate(64); ui->mediaFileName->setText(fileInfo.fileName()); - ui->mediaEndTimeEdit->setTime(QTime::fromMSecsSinceStartOfDay(track->duration)); ui->status->setText(statusToString(track->status)); ui->audioLayer->display(track->audioLayer); ui->multi->setChecked(track->multi); @@ -88,20 +87,8 @@ void CueTrackWidget::waitOutSlot() emit cueFinished(ui->audioLayer->intValue()); } -void CueTrackWidget::refreshCurrentTime(int time) -{ - QTime t; - t.fromMSecsSinceStartOfDay(time); - ui->mediaCurrentTimeEdit->setTime(t); - ui->mediaProgressBar->setValue(time); -} - void CueTrackWidget::setNextCue() { ui->cueProgressBar->setDisabled(true); ui->cueProgressBar->hide(); - ui->mediaProgressBar->setDisabled(true); - ui->mediaProgressBar->hide(); - ui->mediaCurrentTimeEdit->setDisabled(true); - ui->mediaCurrentTimeEdit->hide(); } diff --git a/src/cuetrackwidget.h b/src/cuetrackwidget.h index 453c0b8..6e7bd8b 100644 --- a/src/cuetrackwidget.h +++ b/src/cuetrackwidget.h @@ -31,7 +31,6 @@ public slots: void setNextCue(); private slots: - void refreshCurrentTime(int time); void fadeSlot(); void waitInSlot(); void waitOutSlot(); diff --git a/src/cuetrackwidget.ui b/src/cuetrackwidget.ui index 001d56e..314782b 100644 --- a/src/cuetrackwidget.ui +++ b/src/cuetrackwidget.ui @@ -217,75 +217,29 @@ Qt::Horizontal - + - + 0 0 - 100 - 0 + 0 + 24 - - Cue Progress + + + 16777215 + 24 + - - Media Progress - - - 24 - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Media current time - - - true - - - QAbstractSpinBox::NoButtons - - - - - - 0 - 0 - - - - Qt::NoFocus - - - Media Edn Time - - - true - - - QAbstractSpinBox::NoButtons - - - - - - 7 - 0 - + + + 10 + Media FIle Name @@ -365,7 +319,7 @@ 0 - + 0 @@ -403,7 +357,7 @@ - + 0 @@ -422,6 +376,9 @@ Fade In Time in seconds + + true + true @@ -810,13 +767,11 @@ - mediaCurrentTimeEdit waitOut - waitIn + fade entryPoint exitPoint - fade - mediaEndTimeEdit + waitIn diff --git a/src/showplayer.cpp b/src/showplayer.cpp index 3b1edd6..f3cbedc 100644 --- a/src/showplayer.cpp +++ b/src/showplayer.cpp @@ -12,6 +12,7 @@ ShowPlayer::ShowPlayer(QWidget *parent) : connect(ui->SaveCueList, SIGNAL(clicked()), this, SLOT(saveCueTrackList())); connect(ui->LoadCueList, SIGNAL(clicked()), this, SLOT(loadCueTrackList())); connect(ui->goButton, SIGNAL(clicked()), this, SLOT(go())); + connect(ui->cueListWidget, SIGNAL(changeSelectedIndex(int)), this, SLOT(updateIndex(int))); currentStatus = Status::Iddle; for(int i = 0; i < MAX_LAYERS; i++) { layersUsed[i] = -1; @@ -92,8 +93,12 @@ void ShowPlayer::cueTrackAtEnd(int layer) void ShowPlayer::cueFinished(int c) { - if (current[c] && !current[c]->stopAtEnd) + if (!current[c]) + return; + if (!current[c]->stopAtEnd) this->go(); + if (current[c]->status == Status::Stopped || current[c]->status == Status::Paused) + cueTrackAtEnd(c); } CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { @@ -110,8 +115,8 @@ CueTrackWidget *ShowPlayer::addCueTrackWidget(CueTrack* track) { void ShowPlayer::playCueTrack(CueTrack* track) { removeCueTrackWidget(track->audioLayer); - CueTrackWidget *widget = addCueTrackWidget(track); - widget->go(); + CueTrackWidget *widget = addCueTrackWidget(track); + widget->go(); } void ShowPlayer::removeCueTrackWidget(int audioLayer) { @@ -130,3 +135,12 @@ void ShowPlayer::removeCueTrackWidget(int audioLayer) { cueTrackWidgetPlaying[audioLayer] = nullptr; } } + +void ShowPlayer::updateIndex(int index) { + if (index < 0) + return; + CueTrack *track = ui->cueListWidget->getSelectedTrack(false); + if (track) { + ui->nextCue->loadCueTrack(track); + } +} diff --git a/src/showplayer.h b/src/showplayer.h index 07a05fa..cda63bc 100644 --- a/src/showplayer.h +++ b/src/showplayer.h @@ -47,6 +47,7 @@ private slots: void removeCueTrackWidget(int index); void playCueTrack(CueTrack *track); void goAction(int channel); + void updateIndex(int index); signals: void uiPlaybackChanged(int layer, Status s); diff --git a/src/showplayer.ui b/src/showplayer.ui index b246be4..42c4603 100644 --- a/src/showplayer.ui +++ b/src/showplayer.ui @@ -34,10 +34,7 @@ - - - QFrame::Box - + Qt::Vertical @@ -241,19 +238,10 @@ - - - QFrame::StyledPanel - - - QFrame::Plain - + Qt::Horizontal - - 8 - @@ -287,6 +275,7 @@ false + @@ -356,6 +345,12 @@
src/cuetracklistwidget.h
1 + + CueTrackWidget + QWidget +
src/cuetrackwidget.h
+ 1 +
NewCue