/*
- Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ 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.
- This program is distributed in the hope that it will be useful,
+ 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 this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
#include "cross.h"
#include "compose.hpp"
#include "log.h"
+#include "config.h"
#include "exceptions.h"
+extern "C" {
+#include <libavformat/avio.h>
+}
#include <boost/algorithm/string.hpp>
#ifdef DCPOMATIC_LINUX
#include <unistd.h>
#include <windows.h>
#undef DATADIR
#include <shlwapi.h>
+#include <shellapi.h>
+#include <fcntl.h>
#endif
#ifdef DCPOMATIC_OSX
#include <sys/sysctl.h>
}
void
-start_batch_converter (boost::filesystem::path dcpomatic)
+start_tool (boost::filesystem::path dcpomatic, string executable,
+#ifdef DCPOMATIC_OSX
+ string app
+#else
+ string
+#endif
+ )
{
#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_WINDOWS)
- boost::filesystem::path batch = dcpomatic.parent_path() / "dcpomatic2_batch";
+ boost::filesystem::path batch = dcpomatic.parent_path() / executable;
#endif
#ifdef DCPOMATIC_OSX
batch = batch.parent_path (); // Contents
batch = batch.parent_path (); // DCP-o-matic.app
batch = batch.parent_path (); // Applications
- batch /= "DCP-o-matic 2 Batch Converter.app";
+ batch /= app;
batch /= "Contents";
batch /= "MacOS";
- batch /= "dcpomatic2_batch";
+ batch /= executable;
#endif
#if defined(DCPOMATIC_LINUX) || defined(DCPOMATIC_OSX)
CreateProcess (0, cmd, 0, 0, FALSE, 0, 0, 0, &startup_info, &process_info);
#endif
}
+
+void
+start_batch_converter (boost::filesystem::path dcpomatic)
+{
+ start_tool (dcpomatic, "dcpomatic2_batch", "DCP-o-matic\\ 2\\ Batch\\ Converter.app");
+}
+
+void
+start_player (boost::filesystem::path dcpomatic)
+{
+ start_tool (dcpomatic, "dcpomatic2_player", "DCP-o-matic\\ 2\\ Player.app");
+}
+
+uint64_t
+thread_id ()
+{
+#ifdef DCPOMATIC_WINDOWS
+ return (uint64_t) GetCurrentThreadId ();
+#else
+ return (uint64_t) pthread_self ();
+#endif
+}
+
+int
+avio_open_boost (AVIOContext** s, boost::filesystem::path file, int flags)
+{
+#ifdef DCPOMATIC_WINDOWS
+ int const length = (file.string().length() + 1) * 2;
+ char* utf8 = new char[length];
+ WideCharToMultiByte (CP_UTF8, 0, file.c_str(), -1, utf8, length, 0, 0);
+ int const r = avio_open (s, utf8, flags);
+ delete[] utf8;
+ return r;
+#else
+ return avio_open (s, file.c_str(), flags);
+#endif
+}
+
+#ifdef DCPOMATIC_WINDOWS
+void
+maybe_open_console ()
+{
+ if (Config::instance()->win32_console ()) {
+ AllocConsole();
+
+ HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
+ int hCrt = _open_osfhandle((intptr_t) handle_out, _O_TEXT);
+ FILE* hf_out = _fdopen(hCrt, "w");
+ setvbuf(hf_out, NULL, _IONBF, 1);
+ *stdout = *hf_out;
+
+ HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
+ hCrt = _open_osfhandle((intptr_t) handle_in, _O_TEXT);
+ FILE* hf_in = _fdopen(hCrt, "r");
+ setvbuf(hf_in, NULL, _IONBF, 128);
+ *stdin = *hf_in;
+ }
+}
+#endif