summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/output
diff options
context:
space:
mode:
Diffstat (limited to 'src/osd/modules/output')
-rw-r--r--src/osd/modules/output/console.cpp18
-rw-r--r--src/osd/modules/output/network.cpp308
-rw-r--r--src/osd/modules/output/none.cpp16
-rw-r--r--src/osd/modules/output/output_module.h24
-rw-r--r--src/osd/modules/output/win32_output.cpp48
-rw-r--r--src/osd/modules/output/win32_output.h12
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