diff --git a/CMakeLists.txt b/CMakeLists.txt index 153fe6550109361eea4077ec6805e426e7b33fdf..24bd7b0c507e136840dab234c5684df1d5b86718 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ find_package(Groove REQUIRED) find_package(TagLib REQUIRED) add_executable(arbitrateor src/main.cpp src/WebInterface.cpp src/GroovePlayer.cpp src/ui/LoginInterface.cpp src/ui/PlayerInterface.cpp src/ui/TrackDetails.cpp src/ui/RequestInterface.cpp src/ui/UploadInterface.cpp src/ui/AdminInterface.cpp) -target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY} ${GROOVE_FINGERPRINT_LIBRARY} ${GROOVE_PLAYER_LIBRARY} ${TAGLIB_LIBRARY} pthread boost_system stdc++fs) #TODO get threading links based on platform. Remove gcc experimental fs when official c++17 exists. +target_link_libraries(arbitrateor ${Wt_LIBRARIES} ${GROOVE_LIBRARY} ${GROOVE_FINGERPRINT_LIBRARY} ${GROOVE_PLAYER_LIBRARY} ${GROOVE_LOUDNESS_LIBRARY} ${TAGLIB_LIBRARY} pthread boost_system stdc++fs) #TODO get threading links based on platform. Remove gcc experimental fs when official c++17 exists. install(TARGETS arbitrateor RUNTIME DESTINATION .) install(FILES ${CMAKE_SOURCE_DIR}/wt_config.xml DESTINATION .) diff --git a/README.md b/README.md index e8802c97adb241e98a21dfcd1634b3e86c70f0b1..002ada6bf5dcfb244b0cc34f3f04551b7046a1ce 100644 --- a/README.md +++ b/README.md @@ -3,5 +3,5 @@ Arbitrateor - Audio Jukebox These packages are required to build on Ubuntu 16.04: ``` -witty-dev libgroove-dev libgroovefingerprinter-dev libgrooveplayer-dev libtag1-dev g++ cmake +witty-dev libgroove-dev libgroovefingerprinter-dev libgrooveplayer-dev libgrooveloundness-dev libtag1-dev g++ cmake ``` diff --git a/cmake/FindGroove.cmake b/cmake/FindGroove.cmake index 9161560a583e69e75b604d4c0cff3e76944bcea3..d37c744a912da3ca03a7acf3e76813e647bda5c4 100644 --- a/cmake/FindGroove.cmake +++ b/cmake/FindGroove.cmake @@ -7,14 +7,16 @@ # GROOVE_LIBRARY # GROOVE_FINGERPRINT_LIBRARY # GROOVE_PLAYER_LIBRARY +# GROOVE_LOUDNESS_LIBRARY find_path(GROOVE_INCLUDE_DIR NAMES groove/groove.h) find_library(GROOVE_LIBRARY NAMES groove) find_library(GROOVE_FINGERPRINT_LIBRARY NAMES groovefingerprinter) find_library(GROOVE_PLAYER_LIBRARY NAMES grooveplayer) +find_library(GROOVE_LOUDNESS_LIBRARY NAMES grooveloudness) include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(GROOVE DEFAULT_MSG GROOVE_LIBRARY GROOVE_FINGERPRINT_LIBRARY GROOVE_PLAYER_LIBRARY GROOVE_INCLUDE_DIR) +find_package_handle_standard_args(GROOVE DEFAULT_MSG GROOVE_LIBRARY GROOVE_FINGERPRINT_LIBRARY GROOVE_PLAYER_LIBRARY GROOVE_LOUDNESS_LIBRARY GROOVE_INCLUDE_DIR) -mark_as_advanced(GROOVE_INCLUDE_DIR GROOVE_LIBRARY GROOVE_FINGERPRINT_LIBRARY GROOVE_PLAYER_LIBRARY) +mark_as_advanced(GROOVE_INCLUDE_DIR GROOVE_LIBRARY GROOVE_FINGERPRINT_LIBRARY GROOVE_PLAYER_LIBRARY GROOVE_LOUDNESS_LIBRARY) diff --git a/src/GroovePlayer.cpp b/src/GroovePlayer.cpp index bc6be2b3a506c69df9329435aed876992c92e1c4..aaf1e70d80f53f204f1763d745981b1d940e2293 100644 --- a/src/GroovePlayer.cpp +++ b/src/GroovePlayer.cpp @@ -227,6 +227,8 @@ void GroovePlayerMgr::grooveEventLoop() struct GroovePlayer* player = groove_player_create(); if(!player) {return;} currentPlayer = player; + currentRPG = groove_loudness_detector_create(); + groove_loudness_detector_attach(currentRPG,playlist); groove_playlist_insert(playlist, groove_file_open(selectedTrack.trackPath.c_str()),1.0,1.0,nullptr); @@ -245,6 +247,13 @@ void GroovePlayerMgr::grooveEventLoop() } else if(event.eventType == GROOVE_NOWPLAYING) { + //Clean up playlist if more than 4 + if(groove_playlist_count(playlist) > 4) + { + groove_file_close(currentPlaylist->head->file); + groove_playlist_remove(currentPlaylist,currentPlaylist->head); + } + //clean up state currentSkipRequester.clear(); currentTrack = getCurrentTrackDB(&sqlSession); getPictureFromTrack(¤tTrack); @@ -266,6 +275,14 @@ void GroovePlayerMgr::grooveEventLoop() } ); Wt::log("info") << "Track playing changed to: " << currentTrack.trackName; + //Make sure gain is suggested + struct GrooveLoudnessDetectorInfo info; + groove_loudness_detector_info_get(currentRPG,&info,1); + struct GroovePlaylistItem* item; + groove_player_position(currentPlayer,&item,nullptr); + groove_playlist_set_item_gain(currentPlaylist, item, clamp_rg(-18.0 - info.loudness)); + groove_playlist_set_item_peak(currentPlaylist, item, info.peak); + Wt::log("info") << "Gain being set to:" << clamp_rg(-18.0 - info.loudness) << " and peak to:" << info.peak; } else if(event.eventType == VOTING_ENDED) { @@ -519,6 +536,8 @@ void GroovePlayerMgr::grooveEventLoop() currentPlayer = nullptr; groove_player_detach(player); groove_player_destroy(player); + groove_loudness_detector_detach(currentRPG); + groove_loudness_detector_destroy(currentRPG); groove_playlist_destroy(playlist); } diff --git a/src/GroovePlayer.h b/src/GroovePlayer.h index abf98dca3aeb9e6d7d4616a2c9e448e4123776b8..3b610e0d736e1196669e7feebf7585a31605dbcd 100644 --- a/src/GroovePlayer.h +++ b/src/GroovePlayer.h @@ -29,6 +29,8 @@ #include "db/User.h" #include "db/AudioTrack.h" #include +#include +#include #include //TODO:Change to non-gcc way when officially using c++17 namespace std { namespace filesystem = experimental::filesystem; @@ -48,6 +50,7 @@ public: struct GroovePlaylist* currentPlaylist; struct GroovePlayer* currentPlayer; + struct GrooveLoudnessDetector* currentRPG; AudioTrack currentTrack; std::list currentVoteBatch; std::list> currentVoteStatus; @@ -87,6 +90,11 @@ private: void removeOrphanedTracks(Wt::Dbo::Session* session); AudioTrack getCurrentTrackDB(Wt::Dbo::Session* session); + static double clamp_rg(double x) { + if (x < -51.0) return -51.0; + else if (x > 51.0) return 51.0; + else return x; + }; }; diff --git a/src/main.cpp b/src/main.cpp index e3a2296c79ca46b63fead8c69b6b2a8dd7570b36..39ad172dd0b08f25e901badc3459d34584545104 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,7 @@ #include #include #include "GroovePlayer.h" +#include //TODO:Change to non-gcc way when officially using c++17 Wt::WApplication* createApplication(const Wt::WEnvironment& env) { @@ -13,6 +14,7 @@ int main ( int argc, char** argv ) { try { Wt::WServer server(argv[0]); + server.logger().setFile(std::filesystem::current_path()/"arb-log.txt"); server.setServerConfiguration(argc, argv, WTHTTP_CONFIGURATION); server.addEntryPoint(Wt::Application, createApplication); if(server.start()) diff --git a/src/ui/AdminInterface.cpp b/src/ui/AdminInterface.cpp index 4c22d8f919993ca5ba9906dac745ab432e2e3f37..b1a1034d121fa2c3b52545d6551e12e41cd6209a 100644 --- a/src/ui/AdminInterface.cpp +++ b/src/ui/AdminInterface.cpp @@ -52,10 +52,6 @@ AdminInterface::AdminInterface(WebInterface* app) AdminInterface::~AdminInterface() { - delete addBtn; - delete passwordField; - delete usernameField; - delete userLayout; } void AdminInterface::addClicked() diff --git a/src/ui/PlayerInterface.cpp b/src/ui/PlayerInterface.cpp index c2ee05e4f37fa6ba59cfecdf664b3ba88abc86d5..4fd0690862c16a6eb687989abeb7161504c2a927 100644 --- a/src/ui/PlayerInterface.cpp +++ b/src/ui/PlayerInterface.cpp @@ -143,36 +143,6 @@ PlayerInterface::PlayerInterface(WebInterface* app) PlayerInterface::~PlayerInterface() { -// Keep these out until I have a good reason to use. -// delete mainDisplay; -// delete requestPane; -// delete uploadPane; -// delete adminPane; -// delete track3vote; -// delete track2vote; -// delete track1vote; -// delete track3votecount; -// delete track2votecount; -// delete track1votecount; -// delete track3details; -// delete track2details; -// delete track1details; -// delete voteTracksLayout; -// delete voteTracksContainer; -// delete votePanel; -// delete voteControlContainer; -// delete voteMetaLayout; -// delete voteMetaContainer; -// delete skipRequest; -// delete skipDeny; -// delete playpause; -// delete currentTrackDetails; -// delete trackProgress; -// delete currentTrackProgress; -// delete skipControls; -// delete playControlLayout; -// delete playControlWidget; -// delete interfaceLayout; } void PlayerInterface::playpauseClicked()