diff options
| author | Carl Hetherington <cth@carlh.net> | 2024-06-15 18:02:27 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2024-06-23 19:51:28 +0200 |
| commit | 6b1ebeac38cf60142c542bbad30cea5597d7e1e7 (patch) | |
| tree | 11a5130a58f6ec2086204b9e7462ef43e81593bb | |
| parent | 321380eeb8a9ba4853a982558c9076d26aafdf82 (diff) | |
Extract internal player server to separate file and tidy up a bit.
| -rw-r--r-- | src/lib/internal_player_server.cc | 48 | ||||
| -rw-r--r-- | src/lib/internal_player_server.h | 46 | ||||
| -rw-r--r-- | src/lib/wscript | 1 | ||||
| -rw-r--r-- | src/tools/dcpomatic_player.cc | 55 |
4 files changed, 112 insertions, 38 deletions
diff --git a/src/lib/internal_player_server.cc b/src/lib/internal_player_server.cc new file mode 100644 index 000000000..676cfa412 --- /dev/null +++ b/src/lib/internal_player_server.cc @@ -0,0 +1,48 @@ +/* + Copyright (C) 2024 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "dcpomatic_socket.h" +#include "internal_player_server.h" + + +using std::shared_ptr; +using std::string; +using std::vector; + + +void +InternalPlayerServer::handle(shared_ptr<Socket> socket) +{ + try { + uint32_t const length = socket->read_uint32(); + if (length > 65536) { + return; + } + vector<uint8_t> buffer(length); + socket->read(buffer.data(), buffer.size()); + string s(reinterpret_cast<char*>(buffer.data())); + emit(boost::bind(boost::ref(LoadDCP), s)); + socket->write(reinterpret_cast<uint8_t const *>("OK"), 3); + } catch (...) { + + } +} + diff --git a/src/lib/internal_player_server.h b/src/lib/internal_player_server.h new file mode 100644 index 000000000..0648c9657 --- /dev/null +++ b/src/lib/internal_player_server.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2024 Carl Hetherington <cth@carlh.net> + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>. + +*/ + + +#include "config.h" +#include "server.h" +#include "signaller.h" +#include "types.h" +#include <boost/filesystem.hpp> +#include <boost/signals2.hpp> + + +/** A server which is always started, that listens for requests from the main + * DCP-o-matic to play a DCP. + */ + +class InternalPlayerServer : public Server, public Signaller +{ +public: + InternalPlayerServer() + : Server(PLAYER_PLAY_PORT) + {} + + boost::signals2::signal<void (boost::filesystem::path)> LoadDCP; + +private: + void handle(std::shared_ptr<Socket> socket) override; +}; + diff --git a/src/lib/wscript b/src/lib/wscript index 33e68a108..1c53538a1 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -138,6 +138,7 @@ sources = """ image_png.cc image_proxy.cc image_store.cc + internal_player_server.cc j2k_image_proxy.cc job.cc job_manager.cc diff --git a/src/tools/dcpomatic_player.cc b/src/tools/dcpomatic_player.cc index d462c7271..f6e052b41 100644 --- a/src/tools/dcpomatic_player.cc +++ b/src/tools/dcpomatic_player.cc @@ -54,6 +54,7 @@ #include "lib/image.h" #include "lib/image_jpeg.h" #include "lib/image_png.h" +#include "lib/internal_player_server.h" #include "lib/internet.h" #include "lib/job.h" #include "lib/job_manager.h" @@ -310,6 +311,8 @@ public: _stress.LoadDCP.connect (boost::bind(&DOMFrame::load_dcp, this, _1)); + setup_internal_player_server(); + SetDropTarget(new DCPDropTarget(this)); } @@ -1039,6 +1042,20 @@ private: update_from_config (prop); } + void setup_internal_player_server() + { + try { + auto server = new InternalPlayerServer(); + server->LoadDCP.connect(boost::bind(&DOMFrame::load_dcp, this, _1)); + new thread(boost::bind(&InternalPlayerServer::run, server)); + } catch (std::exception& e) { + /* This is not the end of the world; probably a failure to bind the server socket + * because there's already another player running. + */ + LOG_DEBUG_PLAYER("Failed to start internal player server (%1)", e.what()); + } + } + void update_from_config (Config::Property prop) { for (int i = 0; i < _history_items; ++i) { @@ -1164,34 +1181,6 @@ static const wxCmdLineEntryDesc command_line_description[] = { { wxCMD_LINE_NONE, "", "", "", wxCmdLineParamType (0), 0 } }; -class PlayServer : public Server -{ -public: - explicit PlayServer (DOMFrame* frame) - : Server (PLAYER_PLAY_PORT) - , _frame (frame) - {} - - void handle (shared_ptr<Socket> socket) override - { - try { - uint32_t const length = socket->read_uint32 (); - if (length > 65536) { - return; - } - scoped_array<char> buffer (new char[length]); - socket->read (reinterpret_cast<uint8_t*> (buffer.get()), length); - string s (buffer.get()); - signal_manager->when_idle (bind (&DOMFrame::load_dcp, _frame, s)); - socket->write (reinterpret_cast<uint8_t const *> ("OK"), 3); - } catch (...) { - - } - } - -private: - DOMFrame* _frame; -}; /** @class App * @brief The magic App class for wxWidgets. @@ -1265,16 +1254,6 @@ private: } _frame->Show (); - try { - auto server = new PlayServer (_frame); - new thread (boost::bind (&PlayServer::run, server)); - } catch (std::exception& e) { - /* This is not the end of the world; probably a failure to bind the server socket - * because there's already another player running. - */ - LOG_DEBUG_PLAYER ("Failed to start play server (%1)", e.what()); - } - if (!_dcp_to_load.empty() && dcp::filesystem::is_directory(_dcp_to_load)) { try { _frame->load_dcp (_dcp_to_load); |
