2 Copyright (C) 2017-2020 Carl Hetherington <cth@carlh.net>
4 This file is part of DCP-o-matic.
6 DCP-o-matic is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 DCP-o-matic is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
23 #include "player_stress_tester.h"
24 #include <dcp/raw_convert.h>
26 #include <dcp/warnings.h>
27 LIBDCP_DISABLE_WARNINGS
29 LIBDCP_ENABLE_WARNINGS
30 #include <boost/algorithm/string.hpp>
31 #include <boost/bind/bind.hpp>
40 using dcp::raw_convert;
41 using boost::optional;
44 /* Interval to check for things to do with the stress script (in milliseconds) */
45 #define CHECK_INTERVAL 20
48 Command::Command (string line)
53 boost::split (bits, line, boost::is_any_of(" "));
55 if (bits.size() != 2) {
59 string_param = bits[1];
60 } else if (bits[0] == "P") {
62 } else if (bits[0] == "W") {
63 if (bits.size() != 2) {
67 int_param = raw_convert<int>(bits[1]);
68 } else if (bits[0] == "S") {
70 } else if (bits[0] == "K") {
71 if (bits.size() != 2) {
75 int_param = raw_convert<int>(bits[1]);
76 } else if (bits[0] == "E") {
81 PlayerStressTester::PlayerStressTester ()
91 PlayerStressTester::setup (wxWindow* parent, Controls* controls)
99 PlayerStressTester::load_script (boost::filesystem::path file)
101 DCPOMATIC_ASSERT (_parent);
103 _timer.Bind (wxEVT_TIMER, boost::bind(&PlayerStressTester::check_commands, this));
104 _timer.Start (CHECK_INTERVAL);
105 vector<string> lines;
106 string const script = dcp::file_to_string(file);
107 boost::split (lines, script, boost::is_any_of("\n"));
108 for (auto i: lines) {
109 _commands.push_back (Command(i));
111 _current_command = _commands.begin();
115 PlayerStressTester::check_commands ()
117 DCPOMATIC_ASSERT (_controls);
123 if (_current_command == _commands.end()) {
125 cout << "ST: finished.\n";
129 switch (_current_command->type) {
131 LoadDCP(_current_command->string_param);
135 cout << "ST: play\n";
140 /* int_param here is the number of milliseconds to wait */
141 if (_wait_remaining) {
142 _wait_remaining = *_wait_remaining - CHECK_INTERVAL;
143 if (_wait_remaining < 0) {
144 cout << "ST: wait done.\n";
145 _wait_remaining = optional<int>();
149 _wait_remaining = _current_command->int_param;
150 cout << "ST: waiting for " << *_wait_remaining << ".\n";
154 cout << "ST: stop\n";
162 /* int_param here is a number between 0 and 4095, corresponding to the possible slider positions */
163 cout << "ST: seek to " << _current_command->int_param << "\n";
164 _controls->seek (_current_command->int_param);
168 wxTheApp->GetTopWindow()->Destroy();