diff options
Diffstat (limited to 'src/osd/modules/output')
-rw-r--r-- | src/osd/modules/output/console.cpp | 18 | ||||
-rw-r--r-- | src/osd/modules/output/network.cpp | 308 | ||||
-rw-r--r-- | src/osd/modules/output/none.cpp | 16 | ||||
-rw-r--r-- | src/osd/modules/output/output_module.h | 24 | ||||
-rw-r--r-- | src/osd/modules/output/win32_output.cpp | 48 | ||||
-rw-r--r-- | src/osd/modules/output/win32_output.h | 12 |
6 files changed, 235 insertions, 191 deletions
diff --git a/src/osd/modules/output/console.cpp b/src/osd/modules/output/console.cpp index c9983736fb0..14e0f0fdebf 100644 --- a/src/osd/modules/output/console.cpp +++ b/src/osd/modules/output/console.cpp @@ -9,18 +9,23 @@ *******************************************************************c********/ #include "output_module.h" + #include "modules/osdmodule.h" +#include "osdcore.h" + +namespace osd { + +namespace { class output_console : public osd_module, public output_module { public: - output_console() - : osd_module(OSD_OUTPUT_PROVIDER, "console"), output_module() + output_console() : osd_module(OSD_OUTPUT_PROVIDER, "console") { } virtual ~output_console() { } - virtual int init(const osd_options &options) override { return 0; } + virtual int init(osd_interface &osd, const osd_options &options) override { return 0; } virtual void exit() override { } // output_module @@ -29,4 +34,9 @@ public: }; -MODULE_DEFINITION(OUTPUT_CONSOLE, output_console) +} // anonymous namespace + +} // namespace osd + + +MODULE_DEFINITION(OUTPUT_CONSOLE, osd::output_console) diff --git a/src/osd/modules/output/network.cpp b/src/osd/modules/output/network.cpp index 4fc4b382da6..26ce3619a4c 100644 --- a/src/osd/modules/output/network.cpp +++ b/src/osd/modules/output/network.cpp @@ -9,8 +9,9 @@ ***************************************************************************/ #include "output_module.h" -#include "modules/osdmodule.h" + #include "modules/lib/osdobj_common.h" +#include "modules/osdmodule.h" #include "emu.h" @@ -19,181 +20,182 @@ #define ASIO_HAS_EPOLL #endif -#include <thread> -#include <set> #include "asio.h" +#include <memory> +#include <set> +#include <thread> + + +namespace osd { + +namespace { + class output_client { public: - virtual ~output_client() {} - virtual void deliver(std::string &msg) = 0; + virtual ~output_client() { } + virtual void deliver(std::string &msg) = 0; }; using output_client_ptr = std::shared_ptr<output_client>; using client_set = std::set<output_client_ptr>; -class output_session : public output_client, - public std::enable_shared_from_this<output_session> +class output_session : public output_client, public std::enable_shared_from_this<output_session> { public: - output_session(asio::ip::tcp::socket socket, client_set *clients) : - m_socket(std::move(socket)), - m_clients(clients) - { - } - - void start(running_machine &machine) - { - m_machine = &machine; - m_clients->insert(shared_from_this()); - // now send "mame_start = rom" to the newly connected client - std::snprintf(m_data, max_length, "mame_start = %s\r", machine.system().name); - do_write(std::strlen(m_data)); - do_read(); - } - -private: - void deliver(std::string &msg) - { - std::strncpy(m_data, msg.c_str(), max_length); - do_write(msg.size()); - } + output_session(asio::ip::tcp::socket socket, client_set *clients) : + m_socket(std::move(socket)), + m_clients(clients) + { + } - void handle_message(char *msg) - { - const char *equals_delimiter = " = "; - char *msg_name = strtok(msg, equals_delimiter); - char *msg_value = strtok(NULL, equals_delimiter); + void start(running_machine &machine) + { + m_machine = &machine; + m_clients->insert(shared_from_this()); + // now send "mame_start = rom" to the newly connected client + std::snprintf(m_data, max_length, "mame_start = %s\r", machine.system().name); + do_write(std::strlen(m_data)); + do_read(); + } - //printf("handle_message: msg_name [%s] msg_value [%s]\n", msg_name, msg_value); +private: + void deliver(std::string &msg) + { + std::strncpy(m_data, msg.c_str(), max_length); + do_write(msg.size()); + } - if (std::strcmp(msg_name, "mame_message") == 0) + void handle_message(char *msg) { - const char *comma_delimiter = ","; - msg_name = strtok(msg_value, comma_delimiter); - msg_value = strtok(NULL, comma_delimiter); - int id = atoi(msg_name); - int value = atoi(msg_value); + const char *equals_delimiter = " = "; + char *msg_name = strtok(msg, equals_delimiter); + char *msg_value = strtok(NULL, equals_delimiter); - switch(id) + //printf("handle_message: msg_name [%s] msg_value [%s]\n", msg_name, msg_value); + + if (std::strcmp(msg_name, "mame_message") == 0) { - case IM_MAME_PAUSE: - if (value == 1 && !machine().paused()) - { - machine().pause(); - } - else if (value == 0 && machine().paused()) - { - machine().resume(); - } - break; - case IM_MAME_SAVESTATE: - if (value == 0) - { - machine().schedule_load("auto"); - } - else if (value == 1) + const char *comma_delimiter = ","; + msg_name = strtok(msg_value, comma_delimiter); + msg_value = strtok(NULL, comma_delimiter); + int id = atoi(msg_name); + int value = atoi(msg_value); + + switch(id) { - machine().schedule_save("auto"); + case output_module::IM_MAME_PAUSE: + if (value == 1 && !machine().paused()) + machine().pause(); + else if (value == 0 && machine().paused()) + machine().resume(); + break; + case output_module::IM_MAME_SAVESTATE: + if (value == 0) + machine().schedule_load("auto"); + else if (value == 1) + machine().schedule_save("auto"); + break; } - break; } - } -} - - void do_read() - { - auto self(shared_from_this()); - m_socket.async_read_some(asio::buffer(m_input_m_data, max_length), - [this, self](std::error_code ec, std::size_t length) - { - if (!ec) - { - if (length > 0) + } + + void do_read() + { + auto self(shared_from_this()); + m_socket.async_read_some( + asio::buffer(m_input_m_data, max_length), + [this, self] (std::error_code ec, std::size_t length) { - m_input_m_data[length] = '\0'; - handle_message(m_input_m_data); - } - do_read(); - } - else - { - m_clients->erase(shared_from_this()); - } - }); - } - - void do_write(std::size_t length) - { - auto self(shared_from_this()); - asio::async_write(m_socket, asio::buffer(m_data, length), - [this, self](std::error_code ec, std::size_t /*length*/) - { - if (ec) - { - m_clients->erase(shared_from_this()); - } - }); - } - - running_machine &machine() const { return *m_machine; } - - asio::ip::tcp::socket m_socket; - enum { max_length = 1024 }; - char m_data[max_length]; - char m_input_m_data[max_length]; - client_set *m_clients; - running_machine *m_machine; + if (!ec) + { + if (length > 0) + { + m_input_m_data[length] = '\0'; + handle_message(m_input_m_data); + } + do_read(); + } + else + { + m_clients->erase(shared_from_this()); + } + }); + } + + void do_write(std::size_t length) + { + auto self(shared_from_this()); + asio::async_write( + m_socket, + asio::buffer(m_data, length), + [this, self] (std::error_code ec, std::size_t /*length*/) + { + if (ec) + { + m_clients->erase(shared_from_this()); + } + }); + } + + running_machine &machine() const { return *m_machine; } + + asio::ip::tcp::socket m_socket; + enum { max_length = 1024 }; + char m_data[max_length]; + char m_input_m_data[max_length]; + client_set *m_clients; + running_machine *m_machine; }; class output_network_server { public: - output_network_server(asio::io_context& io_context, short port, running_machine &machine) : - m_acceptor(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) - { - m_machine = &machine; - do_accept(); - } - - void deliver_to_all(std::string msg) - { - for (const auto &client: m_clients) - client->deliver(msg); - } + output_network_server(asio::io_context& io_context, short port, running_machine &machine) : + m_acceptor(io_context, asio::ip::tcp::endpoint(asio::ip::tcp::v4(), port)) + { + m_machine = &machine; + do_accept(); + } + + void deliver_to_all(std::string msg) + { + for (const auto &client: m_clients) + client->deliver(msg); + } private: - void do_accept() - { - m_acceptor.async_accept( - [this](std::error_code ec, asio::ip::tcp::socket socket) - { - if (!ec) - { - std::make_shared<output_session>(std::move(socket),&m_clients)->start(machine()); - } + void do_accept() + { + m_acceptor.async_accept( + [this] (std::error_code ec, asio::ip::tcp::socket socket) + { + if (!ec) + { + std::make_shared<output_session>(std::move(socket),&m_clients)->start(machine()); + } - do_accept(); - }); - } + do_accept(); + }); + } - running_machine &machine() const { return *m_machine; } + running_machine &machine() const { return *m_machine; } - asio::ip::tcp::acceptor m_acceptor; - client_set m_clients; - running_machine *m_machine; + asio::ip::tcp::acceptor m_acceptor; + client_set m_clients; + running_machine *m_machine; }; class output_network : public osd_module, public output_module { public: - output_network() - : osd_module(OSD_OUTPUT_PROVIDER, "network"), - output_module(), - m_io_context(nullptr), m_server(nullptr) + output_network() : + osd_module(OSD_OUTPUT_PROVIDER, "network"), + output_module(), + m_machine(nullptr) { } @@ -201,9 +203,10 @@ public: { } - virtual int init(const osd_options &options) override + virtual int init(osd_interface &osd, const osd_options &options) override { - m_working_thread = std::thread([](output_network* self) { self->process_output(); }, this); + m_machine = &downcast<osd_common_t &>(osd).machine(); + m_working_thread = std::thread([] (output_network* self) { self->process_output(); }, this); return 0; } @@ -213,31 +216,38 @@ public: notify("mame_stop", 1); m_io_context->stop(); m_working_thread.join(); - delete m_server; - delete m_io_context; + m_server.reset(); + m_io_context.reset(); + m_machine = nullptr; } // output_module virtual void notify(const char *outname, int32_t value) override { - static char buf[256]; - sprintf(buf, "%s = %d\r", ((outname==nullptr) ? "none" : outname), value); - m_server->deliver_to_all(buf); + auto msg = util::string_format("%s = %d\r", ((outname==nullptr) ? "none" : outname), value); + m_server->deliver_to_all(msg); } // implementation void process_output() { - m_io_context = new asio::io_context(); - m_server = new output_network_server(*m_io_context, 8000, machine()); + m_io_context.reset(new asio::io_context); + m_server.reset(new output_network_server(*m_io_context, 8000, machine())); m_io_context->run(); } private: + running_machine &machine() { return *m_machine; } + std::thread m_working_thread; - asio::io_context *m_io_context; - output_network_server *m_server; + std::unique_ptr<asio::io_context> m_io_context; + std::unique_ptr<output_network_server> m_server; + running_machine *m_machine; }; -MODULE_DEFINITION(OUTPUT_NETWORK, output_network) +} // anonymous namespace + +} // namespace osd + +MODULE_DEFINITION(OUTPUT_NETWORK, osd::output_network) diff --git a/src/osd/modules/output/none.cpp b/src/osd/modules/output/none.cpp index a4a613ef29f..3e06921827d 100644 --- a/src/osd/modules/output/none.cpp +++ b/src/osd/modules/output/none.cpp @@ -9,18 +9,22 @@ *******************************************************************c********/ #include "output_module.h" + #include "modules/osdmodule.h" +namespace osd { + +namespace { + class output_none : public osd_module, public output_module { public: - output_none() - : osd_module(OSD_OUTPUT_PROVIDER, "none"), output_module() + output_none() : osd_module(OSD_OUTPUT_PROVIDER, "none") { } virtual ~output_none() { } - virtual int init(const osd_options &options) override { return 0; } + virtual int init(osd_interface &osd, const osd_options &options) override { return 0; } virtual void exit() override { } // output_module @@ -29,4 +33,8 @@ public: }; -MODULE_DEFINITION(OUTPUT_NONE, output_none) +} // anonymous namespace + +} // namespace osd + +MODULE_DEFINITION(OUTPUT_NONE, osd::output_none) diff --git a/src/osd/modules/output/output_module.h b/src/osd/modules/output/output_module.h index 9046fda3252..ae86cfe9084 100644 --- a/src/osd/modules/output/output_module.h +++ b/src/osd/modules/output/output_module.h @@ -4,12 +4,15 @@ * outpout_module.h * */ +#ifndef MAME_OSD_OUTPUT_OUTPUT_MODULE_H +#define MAME_OSD_OUTPUT_OUTPUT_MODULE_H -#ifndef OUTPUT_MODULE_H_ -#define OUTPUT_MODULE_H_ +#pragma once #include "osdepend.h" -#include "modules/osdmodule.h" + +#include <cstdint> + //============================================================ // CONSTANTS @@ -17,22 +20,15 @@ #define OSD_OUTPUT_PROVIDER "output" -#define IM_MAME_PAUSE 0 -#define IM_MAME_SAVESTATE 1 - class output_module { public: - output_module(): m_machine(nullptr) { } + static inline constexpr unsigned IM_MAME_PAUSE = 0; + static inline constexpr unsigned IM_MAME_SAVESTATE = 1; - virtual ~output_module() { } + virtual ~output_module() = default; virtual void notify(const char *outname, int32_t value) = 0; - - void set_machine(running_machine *machine) { m_machine = machine; }; - running_machine &machine() const { return *m_machine; } -private: - running_machine *m_machine; }; -#endif /* OUTPUT_MODULE_H_ */ +#endif // MAME_OSD_OUTPUT_OUTPUT_MODULE_H diff --git a/src/osd/modules/output/win32_output.cpp b/src/osd/modules/output/win32_output.cpp index a7a36861989..0d2d355b577 100644 --- a/src/osd/modules/output/win32_output.cpp +++ b/src/osd/modules/output/win32_output.cpp @@ -7,21 +7,26 @@ //============================================================ #include "output_module.h" + #include "modules/osdmodule.h" -#include "modules/lib/osdobj_common.h" #if defined(OSD_WINDOWS) -// standard windows headers -#include <windows.h> +#include "win32_output.h" + +#include "winmain.h" +#include "winutil.h" // MAME headers #include "emu.h" -#include "winmain.h" -#include "winutil.h" -#include "win32_output.h" +// standard windows headers +#include <windows.h> + + +namespace osd { +namespace { //============================================================ // CONSTANTS @@ -66,30 +71,36 @@ class output_win32 : public osd_module, public output_module { public: output_win32() - : osd_module(OSD_OUTPUT_PROVIDER, "windows"), output_module(), m_output_hwnd(nullptr), m_clientlist(nullptr) + : osd_module(OSD_OUTPUT_PROVIDER, "windows") + , output_module() + , m_output_hwnd(nullptr) + , m_clientlist(nullptr) + , m_machine(nullptr) { } virtual ~output_win32() { } - virtual int init(const osd_options &options) override; + virtual int init(osd_interface &osd, const osd_options &options) override; virtual void exit() override; // output_module - virtual void notify(const char *outname, int32_t value) override; - int create_window_class(); + running_machine &machine() { return *m_machine; } + LRESULT register_client(HWND hwnd, LPARAM id); LRESULT unregister_client(HWND hwnd, LPARAM id); LRESULT send_id_string(HWND hwnd, LPARAM id); private: + int create_window_class(); // our HWND HWND m_output_hwnd; // client list registered_client * m_clientlist; + running_machine * m_machine; }; @@ -97,8 +108,10 @@ private: // output_init //============================================================ -int output_win32::init(const osd_options &options) +int output_win32::init(osd_interface &osd, const osd_options &options) { + m_machine = &downcast<osd_common_t &>(osd).machine(); + int result; // reset globals @@ -226,13 +239,13 @@ static LRESULT CALLBACK output_window_proc(HWND wnd, UINT message, WPARAM wparam { switch(wparam) { - case IM_MAME_PAUSE: + case output_module::IM_MAME_PAUSE: if (lparam == 1 && !output.machine().paused()) output.machine().pause(); else if (lparam == 0 && output.machine().paused()) output.machine().resume(); break; - case IM_MAME_SAVESTATE: + case output_module::IM_MAME_SAVESTATE: if (lparam == 0) output.machine().schedule_load("auto"); else if (lparam == 1) @@ -352,10 +365,15 @@ void output_win32::notify(const char *outname, int32_t value) PostMessage(client->hwnd, om_mame_update_state, client->machine->output().name_to_id(outname), value); } +} // anonymous namespace + +} // namespace osd #else - MODULE_NOT_SUPPORTED(output_win32, OSD_OUTPUT_PROVIDER, "windows") + +namespace osd { namespace { MODULE_NOT_SUPPORTED(output_win32, OSD_OUTPUT_PROVIDER, "windows") } } + #endif -MODULE_DEFINITION(OUTPUT_WIN32, output_win32) +MODULE_DEFINITION(OUTPUT_WIN32, osd::output_win32) diff --git a/src/osd/modules/output/win32_output.h b/src/osd/modules/output/win32_output.h index f0996b52082..bff3219b21f 100644 --- a/src/osd/modules/output/win32_output.h +++ b/src/osd/modules/output/win32_output.h @@ -2,12 +2,14 @@ // copyright-holders:Aaron Giles //============================================================ // -// output.h - Win32 implementation of MAME output routines +// win32_output.h - Win32 implementation of MAME output routines // //============================================================ -#ifndef __WINDOWS_OUTPUT_H__ -#define __WINDOWS_OUTPUT_H__ +#ifndef MAME_OSD_OUTPUT_WIN32_OUTPUT_H +#define MAME_OSD_OUTPUT_WIN32_OUTPUT_H + +#pragma once //============================================================ @@ -83,8 +85,8 @@ struct copydata_id_string { - uint32_t id; // ID that was requested + uint32_t id; // ID that was requested char string[1]; // string array containing the data }; -#endif /* __WINDOWS_OUTPUT_H__ */ +#endif // MAME_OSD_OUTPUT_WIN32_OUTPUT_H |