(nw) add doxygen comments for a bunch of core stuff, and convert a bunch of comments to doxygen format

This commit is contained in:
Vas Crabb 2019-10-16 18:31:48 +11:00
parent 151f5fca25
commit 063e81d756
14 changed files with 562 additions and 318 deletions

View File

@ -140,12 +140,12 @@ public:
// construction/destruction // construction/destruction
virtual ~device_a2bus_card_interface(); virtual ~device_a2bus_card_interface();
virtual uint8_t read_c0nx(uint8_t offset) { m_device.logerror("a2bus: unhandled read at C0n%x\n", offset); return 0; } // C0nX - /DEVSEL virtual uint8_t read_c0nx(uint8_t offset) { device().logerror("a2bus: unhandled read at C0n%x\n", offset); return 0; } // C0nX - /DEVSEL
virtual void write_c0nx(uint8_t offset, uint8_t data) { m_device.logerror("a2bus: unhandled write %02x to C0n%x\n", data, offset); } virtual void write_c0nx(uint8_t offset, uint8_t data) { device().logerror("a2bus: unhandled write %02x to C0n%x\n", data, offset); }
virtual uint8_t read_cnxx(uint8_t offset) { return 0; } // CnXX - /IOSEL virtual uint8_t read_cnxx(uint8_t offset) { return 0; } // CnXX - /IOSEL
virtual void write_cnxx(uint8_t offset, uint8_t data) { m_device.logerror("a2bus: unhandled write %02x to Cn%02x\n", data, offset); } virtual void write_cnxx(uint8_t offset, uint8_t data) { device().logerror("a2bus: unhandled write %02x to Cn%02x\n", data, offset); }
virtual uint8_t read_c800(uint16_t offset) { return 0; } // C800 - /IOSTB virtual uint8_t read_c800(uint16_t offset) { return 0; } // C800 - /IOSTB
virtual void write_c800(uint16_t offset, uint8_t data) {m_device.logerror("a2bus: unhandled write %02x to %04x\n", data, offset + 0xc800); } virtual void write_c800(uint16_t offset, uint8_t data) {device().logerror("a2bus: unhandled write %02x to %04x\n", data, offset + 0xc800); }
virtual bool take_c800() { return true; } // override and return false if your card doesn't take over the c800 space virtual bool take_c800() { return true; } // override and return false if your card doesn't take over the c800 space
virtual uint8_t read_inh_rom(uint16_t offset) { return 0; } virtual uint8_t read_inh_rom(uint16_t offset) { return 0; }
virtual void write_inh_rom(uint16_t offset, uint8_t data) { } virtual void write_inh_rom(uint16_t offset, uint8_t data) { }

View File

@ -117,7 +117,7 @@ public:
// reading and writing // reading and writing
virtual uint8_t read(offs_t offset) { return 0xff; } virtual uint8_t read(offs_t offset) { return 0xff; }
virtual void write(offs_t offset, uint8_t data) { m_device.logerror("unhandled ROM write to %04X = %02X\n", offset | 0x8000, data); } virtual void write(offs_t offset, uint8_t data) { device().logerror("unhandled ROM write to %04X = %02X\n", offset | 0x8000, data); }
void rom_alloc(uint32_t size, const char *tag); void rom_alloc(uint32_t size, const char *tag);
void ram_alloc(uint32_t size); void ram_alloc(uint32_t size);

View File

@ -106,8 +106,8 @@ public:
virtual int read_test() { return 0; } // used by Virtua Racing test virtual int read_test() { return 0; } // used by Virtua Racing test
/* this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly */ // this probably should do more, like make Genesis V2 'die' if the SEGA string is not written promptly
virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { m_device.logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); }; virtual DECLARE_WRITE16_MEMBER(write_tmss_bank) { device().logerror("Write to TMSS bank: offset %x data %x\n", 0xa14000 + (offset << 1), data); };
virtual void rom_alloc(size_t size, const char *tag); virtual void rom_alloc(size_t size, const char *tag);
virtual void nvram_alloc(size_t size); virtual void nvram_alloc(size_t size);

View File

@ -1,13 +1,9 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Aaron Giles, Vas Crabb // copyright-holders:Aaron Giles, Vas Crabb
/** /// \file
* \file devfind.h /// \brief Object auto-discovery helpers
* Object auto-discovery helpers /// \defgroup devfind Object auto-discovery helpers
* \defgroup devfind /// \{
* \{
* Object auto-discovery helpers
*/
#ifndef __EMU_H__ #ifndef __EMU_H__
#error Dont include this file directly; include emu.h instead. #error Dont include this file directly; include emu.h instead.
#endif #endif
@ -1212,4 +1208,4 @@ extern template class shared_ptr_finder<s64, false>;
extern template class shared_ptr_finder<s64, true>; extern template class shared_ptr_finder<s64, true>;
#endif // MAME_EMU_DEVFIND_H #endif // MAME_EMU_DEVFIND_H
/** \} */ /// \}

View File

@ -489,7 +489,34 @@ public:
// device flags // device flags
using feature = emu::detail::device_feature; using feature = emu::detail::device_feature;
using feature_type = emu::detail::device_feature::type; using feature_type = emu::detail::device_feature::type;
/// \brief Report unemulated features
///
/// Implement this member in a derived class to declare features
/// that are not emulated. This will propagate to all other devices
/// and systems that use the device. Unemulated features are shown
/// in the system selection UI, and cause a red warning to be
/// displayed on starting a system.
/// \return Bitwise or of the feature constants for unemulated
/// features of the device.
/// \sa imperfect_features
static constexpr feature_type unemulated_features() { return feature::NONE; } static constexpr feature_type unemulated_features() { return feature::NONE; }
/// \brief Report imperfectly emulated features
///
/// Implement this member in a derived class to declare features
/// that are imperfectly emulated. This will propagate to all other
/// devices and systems that use the device. Imperfectly emulated
/// features are shown in the system selection UI, and cause a
/// yellow warning to be displayed on starting a system (provided
/// there are no unemulated features, which take precedence and
/// cause the warning to be red).
///
/// An exception is imperfectly emulated protection, which results
/// in a red warning being displayed when starting a system.
/// \return Bitwise or of the feature constants for imperfectly
/// emulated features of the device.
/// \sa unemulated_features
static constexpr feature_type imperfect_features() { return feature::NONE; } static constexpr feature_type imperfect_features() { return feature::NONE; }
virtual ~device_t(); virtual ~device_t();
@ -616,15 +643,132 @@ protected:
virtual const tiny_rom_entry *device_rom_region() const; virtual const tiny_rom_entry *device_rom_region() const;
virtual void device_add_mconfig(machine_config &config); virtual void device_add_mconfig(machine_config &config);
virtual ioport_constructor device_input_ports() const; virtual ioport_constructor device_input_ports() const;
/// \brief Finalise device configuration
///
/// Perform any final configuration tasks after all devices in the
/// system have added machine configuration. This is called after
/// any #device_interface mix-in interface_config_complete members
/// have completed.
///
/// Note that automatic object finders will not have been resolved
/// at the time this member is called.
virtual void device_config_complete(); virtual void device_config_complete();
/// \brief Additional device validity checks
///
/// Implement this member to provide additional validity checks.
/// Report errors using #osd_printf_error and report warnings using
/// #osd_printf_warning. The system being validated, device type
/// and device tag are collected automatically. Do not throw
/// exceptions to report errors.
///
/// This provides an opportunity to check that the device has been
/// configured correctly. Systems are validated on start, and also
/// when the user manually runs a validity check. Validity checks
/// are only run for devices configured in runnable systems, not
/// when checking that a device can be instantiated in isolation.
/// \param [in] valid Reference to the validity checker object
/// performing validation (provides some helper member functions).
/// \sa device_interface::interface_validity_check
virtual void device_validity_check(validity_checker &valid) const ATTR_COLD; virtual void device_validity_check(validity_checker &valid) const ATTR_COLD;
/// \brief Resolve objects that may be needed while starting
///
/// Implement this member to complete object resolution before any
/// devices are started. For example it may be necessary to resolve
/// callbacks before any devices start so initial input conditions
/// can be set. This is called after all registerd automatic object
/// finders are resolved.
virtual void device_resolve_objects() ATTR_COLD; virtual void device_resolve_objects() ATTR_COLD;
/// \brief Device start handler
///
/// Implement this member to set up the initial state of the device
/// on start. This will be called after all #device_interface
// /mix-in interface_pre_start members have completed successfully.
/// If the device can't start until another device has completed
/// starting, throw a #device_missing_dependencies exception.
/// Starting will be postponed until additional devices have been
/// started.
///
/// If a device's base class is not device_t, it's good practice to
/// check start order dependencies (and throw
/// #device_missing_dependencies if necessary) before calling the
/// base implementation. This will ensure that the base
/// implementation won't be called twice if starting needs to be
/// postponed.
///
/// This is the correct place to register for save states.
/// \sa device_reset device_stop
/// device_interface::interface_pre_start
/// device_interface::interface_post_start
virtual void device_start() ATTR_COLD = 0; virtual void device_start() ATTR_COLD = 0;
/// \brief Device stop handler
///
/// Implement this member to perform additional tasks on ending an
/// emulation session. You may deallocate memory here. This is
/// called after interface_pre_stop is called for all
/// #device_interface mix-ins, and before interface_post_stop is
/// called for any #device_interface mix-ins.
/// \sa device_interface::interface_pre_stop
/// device_interface::interface_post_stop
virtual void device_stop() ATTR_COLD; virtual void device_stop() ATTR_COLD;
/// \brief Device reset handler
///
/// Implement this member to provide reset behaviour. This is
/// called after all #device_interface mix-in interface_pre_reset
/// members have completed, and before any child devices are reset.
/// All devices are reset at the beginning of an emulation session
/// (after all devices have been started), and also when the user
/// requests a soft reset (by pressing F3 by default, and also
/// available from the debugger).
///
/// Note that child devices are reset automatically when a device is
/// reset. You should not reset child devices manually from this
/// member. If you need to provide additional behaviour after child
/// devices are reset, implement #device_reset_after_children.
///
/// Only implement warm reset behaviour in this member. Initial
/// cold reset conditions should be set up in #device_start.
/// \sa device_reset_after_children device_start
/// device_interface::interface_pre_reset
/// device_interface::interface_post_reset
virtual void device_reset() ATTR_COLD; virtual void device_reset() ATTR_COLD;
/// \brief Additional reset behaviour after child device reset
///
/// Implement this member to provide additional reset behaviour
/// after child devices are reset. This is called when resetting a
/// device after #device_reset has been called and all child devices
/// have been reset, and before any #device_interface mix-in
/// interface_post_reset members are called.
/// \sa device_reset device_interface::interface_pre_reset
/// device_interface::interface_post_reset
virtual void device_reset_after_children() ATTR_COLD; virtual void device_reset_after_children() ATTR_COLD;
/// \brief Prepare for a save state to be written
///
/// Implement this member to perform any tasks necessary before any
/// registered save state items are recorded. For example it may be
/// necessary to flush caches, serialise self-referencing members or
/// pointers into data structures. This is called after all
/// #device_interface mix-in interface_pre_save members are called.
/// \sa device_post_load device_interface::interface_pre_save
virtual void device_pre_save() ATTR_COLD; virtual void device_pre_save() ATTR_COLD;
/// \brief Complete save state loading
///
/// Implement this member to perform any tasks necessary after
/// registered save state items are loaded. For example it may be
/// necessary to update or invalidate caches, or de-serialise
/// pointers into data structures. This is called after all
/// #device_interface mix-in interface_post_load members are called.
/// \sa device_pre_save device_interface::interface_post_load
virtual void device_post_load() ATTR_COLD; virtual void device_post_load() ATTR_COLD;
virtual void device_clock_changed(); virtual void device_clock_changed();
virtual void device_debug_setup(); virtual void device_debug_setup();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
@ -677,9 +821,12 @@ private:
}; };
// ======================> device_interface /// \brief Device mix-in base
///
// device_interface represents runtime information for a particular device interface /// Provides a base for #device_t mix-ins that integrate with the device
/// lifecycle. Derived classes are used to implement a number of
/// standard concepts and interfaces, and integrate with the scheduler,
/// debugger and user interface.
class device_interface class device_interface
{ {
DISABLE_COPYING(device_interface); DISABLE_COPYING(device_interface);
@ -701,24 +848,138 @@ public:
device_interface *interface_next() const { return m_interface_next; } device_interface *interface_next() const { return m_interface_next; }
// optional operation overrides // optional operation overrides
//
// WARNING: interface_pre_start must be callable multiple times in /// \brief Finalise mix-in configuration
// case another interface throws a missing dependency. In ///
// particular, state saving registrations should be done in post. /// Perform any final configuration tasks after all devices in the
/// system have added machine configuration. This is called before
/// device_config_complete is called for the device.
///
/// Note that automatic object finders will not have been resolved
/// at this time.
/// \sa device_t::device_config_complete
virtual void interface_config_complete(); virtual void interface_config_complete();
virtual void interface_validity_check(validity_checker &valid) const;
virtual void interface_pre_start(); /// \brief Additional mix-in validity checks
virtual void interface_post_start(); ///
virtual void interface_pre_reset(); /// Implement this member to provide additional validity checks.
virtual void interface_post_reset(); /// Report errors using #osd_printf_error and report warnings using
virtual void interface_pre_stop(); /// #osd_printf_warning. The system being validated, device type
virtual void interface_post_stop(); /// and device tag are collected automatically. Do not throw
virtual void interface_pre_save(); /// exceptions to report errors.
virtual void interface_post_load(); ///
/// This provides an opportunity to check that the mix-in has been
/// configured correctly. Systems are validated on start, and also
/// when the user manually runs a validity check. Validity checks
/// are only run for devices configured in runnable systems, not
/// when checking that a device can be instantiated in isolation.
/// \param [in] valid Reference to the validity checker object
/// performing validation (provides some helper member functions).
/// \sa device_t::device_validity_check
virtual void interface_validity_check(validity_checker &valid) const ATTR_COLD;
/// \brief Mix-in start handler
///
/// Implement this member to set up the initial state of the mix-in
/// on start. This is called before the device_start member is
/// called for the device. If the mix-in can't be started until
/// another device has started, throw a #device_missing_dependencies
/// exception. Starting will be postponed until additional devices
/// have been started.
///
/// Note that this member may be called multiple times if another
/// device_interface mix-in throws a #device_missing_dependencies
/// exception from its interface_pre_start member, or if the device
/// throws a #device_missing_dependencies exception from its
/// device_start member. You must check to ensure that operations
/// like resource allocation are not performed multiple times, or
/// postpone them until #interface_post_start is called.
///
/// It's simpler to register for save states when
/// #interface_post_start is called.
/// \sa interface_post_start device_t::device_start
virtual void interface_pre_start() ATTR_COLD;
/// \brief Mix-in start completion handler
///
/// Implement this member to complete mix-in start-up. This is
/// called after #interface_pre_start is called for all
/// device_interface mix-ins, and after device_start is called for
/// the device. This member will only be called once, it will not
/// be called multiple times if device starting is postponed.
///
/// This member must not throw #device_missing_dependencies (start
/// order dependencies should be checked in #interface_pre_start).
/// This is the appropriate place to allocate resources like
/// timers and register for save states.
/// \sa interface_pre_start device_t::device_start
virtual void interface_post_start() ATTR_COLD;
/// \brief Mix-in reset handler
///
/// Implement this member to provide reset behaviour. This is
/// called before device_reset is called for the device, and before
/// any child devices are reset. Only implement warm reset
/// behaviour in this member. Initial cold reset conditions should
/// be set up in #interface_pre_start and/or #interface_post_start.
/// If you need to provide additional behaviour after child devices
/// are reset, implement #interface_post_reset.
/// \sa interface_post_reset device_t::device_reset
virtual void interface_pre_reset() ATTR_COLD;
/// \brief Mix-in reset completion handler
///
/// Implement this member to provide additional reset behaviour
/// after child devices are reset. This is called after
/// device_reset_after_children has been called for the device.
/// \sa interface_pre_reset device_t::device_reset
/// device_t::device_reset_after_children
virtual void interface_post_reset() ATTR_COLD;
/// \brief Mix-in stop handler
///
/// Implement this member to perform additional tasks on ending an
/// emulation session. Do not deallocate anything that may need to
/// be referenced from another device_interface mix-in's
/// interface_pre_stop member or from the device's device_stop
/// member. This is called before device_stop is called for the
/// device.
/// \sa interface_post_stop device_t::device_stop
virtual void interface_pre_stop() ATTR_COLD;
/// \brief Mix-in stop completion handler
///
/// Implement this member to perform additional tasks on ending an
/// emulation session after the device is stopped. You can
/// deallocate memory here. This is called after device_stop is
/// called for the device.
/// \sa interface_pre_stop device_t::device_stop
virtual void interface_post_stop() ATTR_COLD;
/// \brief Prepare for a save state to be written
///
/// Implement this member to perform any tasks necessary before any
/// registered save state items are recorded. For example it may be
/// necessary to flush caches, serialise self-referencing members or
/// pointers into data structures. This is called before
/// device_pre_save is called for the device.
/// \sa interface_post_load device_t::device_pre_save
virtual void interface_pre_save() ATTR_COLD;
/// \brief Complete save state loading
///
/// Implement this member to perform any tasks necessary after
/// registered save state items are loaded. For example it may be
/// necessary to update or invalidate caches, or de-serialise
/// pointers into data structures. This is called before
/// device_post_load is called for the device.
/// \sa interface_pre_save device_t::device_post_load
virtual void interface_post_load() ATTR_COLD;
virtual void interface_clock_changed(); virtual void interface_clock_changed();
virtual void interface_debug_setup(); virtual void interface_debug_setup();
protected: private:
// internal state // internal state
device_interface * m_interface_next; device_interface * m_interface_next;
device_t & m_device; device_t & m_device;

View File

@ -85,8 +85,8 @@ int device_sound_interface::inputs() const
{ {
// scan the list counting streams we own and summing their inputs // scan the list counting streams we own and summing their inputs
int inputs = 0; int inputs = 0;
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &m_device) if (&stream->device() == &device())
inputs += stream->input_count(); inputs += stream->input_count();
return inputs; return inputs;
} }
@ -101,8 +101,8 @@ int device_sound_interface::outputs() const
{ {
// scan the list counting streams we own and summing their outputs // scan the list counting streams we own and summing their outputs
int outputs = 0; int outputs = 0;
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &m_device) if (&stream->device() == &device())
outputs += stream->output_count(); outputs += stream->output_count();
return outputs; return outputs;
} }
@ -119,8 +119,8 @@ sound_stream *device_sound_interface::input_to_stream_input(int inputnum, int &s
assert(inputnum >= 0); assert(inputnum >= 0);
// scan the list looking for streams owned by this device // scan the list looking for streams owned by this device
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &m_device) if (&stream->device() == &device())
{ {
if (inputnum < stream->input_count()) if (inputnum < stream->input_count())
{ {
@ -146,7 +146,7 @@ sound_stream *device_sound_interface::output_to_stream_output(int outputnum, int
assert(outputnum >= 0); assert(outputnum >= 0);
// scan the list looking for streams owned by this device // scan the list looking for streams owned by this device
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &device()) if (&stream->device() == &device())
{ {
if (outputnum < stream->output_count()) if (outputnum < stream->output_count())
@ -212,7 +212,7 @@ void device_sound_interface::set_output_gain(int outputnum, float gain)
// handle ALL_OUTPUTS as a special case // handle ALL_OUTPUTS as a special case
if (outputnum == ALL_OUTPUTS) if (outputnum == ALL_OUTPUTS)
{ {
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &device()) if (&stream->device() == &device())
for (int num = 0; num < stream->output_count(); num++) for (int num = 0; num < stream->output_count(); num++)
stream->set_output_gain(num, gain); stream->set_output_gain(num, gain);
@ -237,7 +237,7 @@ void device_sound_interface::set_output_gain(int outputnum, float gain)
int device_sound_interface::inputnum_from_device(device_t &source_device, int outputnum) const int device_sound_interface::inputnum_from_device(device_t &source_device, int outputnum) const
{ {
int overall = 0; int overall = 0;
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &device()) if (&stream->device() == &device())
for (int inputnum = 0; inputnum < stream->input_count(); inputnum++, overall++) for (int inputnum = 0; inputnum < stream->input_count(); inputnum++, overall++)
if (stream->input_source_device(inputnum) == &source_device && stream->input_source_outputnum(inputnum) == outputnum) if (stream->input_source_device(inputnum) == &source_device && stream->input_source_outputnum(inputnum) == outputnum)
@ -278,7 +278,7 @@ void device_sound_interface::interface_validity_check(validity_checker &valid) c
void device_sound_interface::interface_pre_start() void device_sound_interface::interface_pre_start()
{ {
// scan all the sound devices // scan all the sound devices
sound_interface_iterator iter(m_device.machine().root_device()); sound_interface_iterator iter(device().machine().root_device());
for (device_sound_interface const &sound : iter) for (device_sound_interface const &sound : iter)
{ {
// scan each route on the device // scan each route on the device
@ -286,7 +286,7 @@ void device_sound_interface::interface_pre_start()
{ {
// see if we are the target of this route; if we are, make sure the source device is started // see if we are the target of this route; if we are, make sure the source device is started
device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str()); device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str());
if ((target_device == &m_device) && !sound.device().started()) if ((target_device == &device()) && !sound.device().started())
throw device_missing_dependencies(); throw device_missing_dependencies();
} }
} }
@ -300,7 +300,7 @@ void device_sound_interface::interface_pre_start()
{ {
// see if we are the target of this route // see if we are the target of this route
device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str()); device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str());
if ((target_device == &m_device) && (route.m_input == AUTO_ALLOC_INPUT)) if ((target_device == &device()) && (route.m_input == AUTO_ALLOC_INPUT))
{ {
route.m_input = m_auto_allocated_inputs; route.m_input = m_auto_allocated_inputs;
m_auto_allocated_inputs += (route.m_output == ALL_OUTPUTS) ? sound.outputs() : 1; m_auto_allocated_inputs += (route.m_output == ALL_OUTPUTS) ? sound.outputs() : 1;
@ -318,14 +318,14 @@ void device_sound_interface::interface_pre_start()
void device_sound_interface::interface_post_start() void device_sound_interface::interface_post_start()
{ {
// iterate over all the sound devices // iterate over all the sound devices
for (device_sound_interface &sound : sound_interface_iterator(m_device.machine().root_device())) for (device_sound_interface &sound : sound_interface_iterator(device().machine().root_device()))
{ {
// scan each route on the device // scan each route on the device
for (sound_route const &route : sound.routes()) for (sound_route const &route : sound.routes())
{ {
// if we are the target of this route, hook it up // if we are the target of this route, hook it up
device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str()); device_t *const target_device = route.m_base.get().subdevice(route.m_target.c_str());
if (target_device == &m_device) if (target_device == &device())
{ {
// iterate over all outputs, matching any that apply // iterate over all outputs, matching any that apply
int inputnum = route.m_input; int inputnum = route.m_input;
@ -343,7 +343,7 @@ void device_sound_interface::interface_post_start()
int streaminputnum; int streaminputnum;
sound_stream *const inputstream = input_to_stream_input(inputnum++, streaminputnum); sound_stream *const inputstream = input_to_stream_input(inputnum++, streaminputnum);
if (!inputstream) if (!inputstream)
fatalerror("Sound device '%s' targeted output #%d to nonexistent device '%s' input %d\n", sound.device().tag(), outputnum, m_device.tag(), inputnum - 1); fatalerror("Sound device '%s' targeted output #%d to nonexistent device '%s' input %d\n", sound.device().tag(), outputnum, device().tag(), inputnum - 1);
// set the input // set the input
inputstream->set_input(streaminputnum, outputstream, streamoutputnum, route.m_gain); inputstream->set_input(streaminputnum, outputstream, streamoutputnum, route.m_gain);
@ -362,7 +362,7 @@ void device_sound_interface::interface_post_start()
void device_sound_interface::interface_pre_reset() void device_sound_interface::interface_pre_reset()
{ {
// update all streams on this device prior to reset // update all streams on this device prior to reset
for (auto &stream : m_device.machine().sound().streams()) for (auto &stream : device().machine().sound().streams())
if (&stream->device() == &device()) if (&stream->device() == &device())
stream->update(); stream->update();
} }
@ -415,7 +415,7 @@ void device_mixer_interface::interface_pre_start()
m_outputmap.resize(m_auto_allocated_inputs); m_outputmap.resize(m_auto_allocated_inputs);
// iterate through all routes that point to us and note their mixer output // iterate through all routes that point to us and note their mixer output
for (device_sound_interface const &sound : sound_interface_iterator(m_device.machine().root_device())) for (device_sound_interface const &sound : sound_interface_iterator(device().machine().root_device()))
{ {
for (sound_route const &route : sound.routes()) for (sound_route const &route : sound.routes())
{ {

View File

@ -624,7 +624,7 @@ void device_state_interface::interface_post_start()
{ {
// make sure we got something during startup // make sure we got something during startup
if (m_state_list.size() == 0) if (m_state_list.size() == 0)
throw emu_fatalerror("No state registered for device '%s' that supports it!", m_device.tag()); throw emu_fatalerror("No state registered for device '%s' that supports it!", device().tag());
} }

View File

@ -373,4 +373,4 @@ inline u64 d2u(double d)
return u.vv; return u.vv;
} }
#endif /* MAME_EMU_EMUCORE_H */ #endif // MAME_EMU_EMUCORE_H

View File

@ -940,7 +940,7 @@ static DISCRETE_SOUND_START(boothill_discrete)
/************************************************ /************************************************
* Shot sounds * Shot sounds
************************************************/ ************************************************/
/* Noise clock was breadboarded and measured at 7700Hz */ // Noise clock was breadboarded and measured at 7700Hz
DISCRETE_LFSR_NOISE(BOOTHILL_NOISE, 1, 1, 7700, 12.0, 0, 12.0/2, &midway_lfsr) DISCRETE_LFSR_NOISE(BOOTHILL_NOISE, 1, 1, 7700, 12.0, 0, 12.0/2, &midway_lfsr)
DISCRETE_OP_AMP_TRIG_VCA(NODE_30, BOOTHILL_LEFT_SHOT_EN, 0, 0, BOOTHILL_NOISE, 0, &boothill_shot_tvca_info) DISCRETE_OP_AMP_TRIG_VCA(NODE_30, BOOTHILL_LEFT_SHOT_EN, 0, 0, BOOTHILL_NOISE, 0, &boothill_shot_tvca_info)
@ -977,8 +977,8 @@ static DISCRETE_SOUND_START(boothill_discrete)
DISCRETE_MIXER2(NODE_91, BOOTHILL_GAME_ON_EN, BOOTHILL_L_SHOT_SND, BOOTHILL_L_HIT_SND, &boothill_l_mixer) DISCRETE_MIXER2(NODE_91, BOOTHILL_GAME_ON_EN, BOOTHILL_L_SHOT_SND, BOOTHILL_L_HIT_SND, &boothill_l_mixer)
/* Music is only added to the right channel per schematics */ // Music is only added to the right channel per schematics
/* This should be verified on the real game */ // This should be verified on the real game
DISCRETE_MIXER3(NODE_92, BOOTHILL_GAME_ON_EN, BOOTHILL_R_SHOT_SND, BOOTHILL_R_HIT_SND, MIDWAY_TONE_SND, &boothill_r_mixer) DISCRETE_MIXER3(NODE_92, BOOTHILL_GAME_ON_EN, BOOTHILL_R_SHOT_SND, BOOTHILL_R_HIT_SND, MIDWAY_TONE_SND, &boothill_r_mixer)
DISCRETE_OUTPUT(NODE_91, 1) DISCRETE_OUTPUT(NODE_91, 1)

View File

@ -1407,8 +1407,7 @@ void a7800_state::a7800_ntsc(machine_config &config)
A78_CART_SLOT(config, "cartslot", a7800_cart, nullptr); A78_CART_SLOT(config, "cartslot", a7800_cart, nullptr);
/* software lists */ /* software lists */
SOFTWARE_LIST(config, "cart_list").set_original("a7800"); SOFTWARE_LIST(config, "cart_list").set_original("a7800").set_filter("NTSC");
subdevice<software_list_device>("cart_list")->set_filter("NTSC");
} }
void a7800_pal_state::a7800_pal(machine_config &config) void a7800_pal_state::a7800_pal(machine_config &config)

View File

@ -109,6 +109,9 @@ bool posix_check_ptty_path(std::string const &path)
osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name) osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, std::uint64_t &filesize, std::string &name)
{ {
#if defined(__ANDROID__)
return osd_file::error::FAILURE;
#else // defined(__ANDROID__)
#if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__)) #if (defined(sun) || defined(__sun)) && (defined(__SVR4) || defined(__svr4__))
int access = O_NOCTTY; int access = O_NOCTTY;
if (openflags & OPEN_FLAG_WRITE) if (openflags & OPEN_FLAG_WRITE)
@ -145,9 +148,6 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
::close(masterfd); ::close(masterfd);
return errno_to_file_error(err); return errno_to_file_error(err);
} }
#elif defined(__ANDROID__)
int masterfd = -1, slavefd = -1;
char slavepath[PATH_MAX];
#else #else
struct termios tios; struct termios tios;
std::memset(&tios, 0, sizeof(tios)); std::memset(&tios, 0, sizeof(tios));
@ -188,4 +188,5 @@ osd_file::error posix_open_ptty(std::uint32_t openflags, osd_file::ptr &file, st
::close(masterfd); ::close(masterfd);
return osd_file::error::OUT_OF_MEMORY; return osd_file::error::OUT_OF_MEMORY;
} }
#endif // defined(__ANDROID__)
} }

View File

@ -1,18 +1,11 @@
// license:BSD-3-Clause // license:BSD-3-Clause
// copyright-holders:Aaron Giles // copyright-holders:Aaron Giles
/*************************************************************************** /// \file
/// \brief Core OS-dependent code interface
osdcore.h ///
/// The prototypes in this file describe the interfaces that the MAME
Core OS-dependent code interface. /// core and various tools rely on to interact with the outside world.
/// They are broken out into several categories.
****************************************************************************
The prototypes in this file describe the interfaces that the MAME core
and various tools rely upon to interact with the outside world. They are
broken out into several categories.
***************************************************************************/
#ifndef MAME_OSD_OSDCORE_H #ifndef MAME_OSD_OSDCORE_H
#define MAME_OSD_OSDCORE_H #define MAME_OSD_OSDCORE_H
@ -46,216 +39,188 @@
#endif #endif
#endif #endif
/* flags controlling file access */ /// \defgroup openflags File open flags
#define OPEN_FLAG_READ 0x0001 /* open for read */ /// \{
#define OPEN_FLAG_WRITE 0x0002 /* open for write */
#define OPEN_FLAG_CREATE 0x0004 /* create & truncate file */
#define OPEN_FLAG_CREATE_PATHS 0x0008 /* create paths as necessary */
#define OPEN_FLAG_NO_PRELOAD 0x0010 /* do not decompress on open */
// osd_file is an interface which represents an open file/PTY/socket /// Open file for reading.
#define OPEN_FLAG_READ 0x0001
/// Open file for writing.
#define OPEN_FLAG_WRITE 0x0002
/// Create the file, or truncate it if it exists.
#define OPEN_FLAG_CREATE 0x0004
/// Create non-existent directories in the path.
#define OPEN_FLAG_CREATE_PATHS 0x0008
/// Do not decompress into memory on open.
#define OPEN_FLAG_NO_PRELOAD 0x0010
/// \}
/// \brief Interface to file-like resources
///
/// This interface is used to access file-like and stream-like
/// resources. Examples include plain files, TCP socket, named pipes,
/// pseudo-terminals, and compressed archive members.
class osd_file class osd_file
{ {
public: public:
// error codes returned by routines below /// \brief Result of a file operation
///
/// Returned by most members of osd_file, and also used by other
/// classes that access files or other file-like resources.
enum class error enum class error
{ {
/// Operation completed successfully.
NONE, NONE,
/// Operation failed, but there is no more specific code to
/// describe the failure.
FAILURE, FAILURE,
/// Operation failed due to an error allocating memory.
OUT_OF_MEMORY, OUT_OF_MEMORY,
/// The requested file, path or resource was not found.
NOT_FOUND, NOT_FOUND,
/// Current permissions do not allow the requested access.
ACCESS_DENIED, ACCESS_DENIED,
/// Requested access is not permitted because the file or
/// resource is currently open for exclusive access.
ALREADY_OPEN, ALREADY_OPEN,
/// Request cannot be completed due to resource exhaustion
/// (maximum number of open files or other objects has been
/// reached).
TOO_MANY_FILES, TOO_MANY_FILES,
/// The request cannot be completed because invalid data was
/// encountered (for example an inconsistent filesystem, or a
/// corrupt archive file).
INVALID_DATA, INVALID_DATA,
/// The requested access mode is invalid, or not appropriate for
/// the file or resource.
INVALID_ACCESS INVALID_ACCESS
}; };
/// \brief Smart pointer to a file handle
typedef std::unique_ptr<osd_file> ptr; typedef std::unique_ptr<osd_file> ptr;
/// \brief Open a new file handle
/*----------------------------------------------------------------------------- ///
osd_file::open: open a new file. /// This function is called by core_fopen and several other places
/// in the core to access files. These functions will construct
Parameters: /// paths by concatenating various search paths held in the
/// options.c options database with partial paths specified by the
path - path to the file to open /// core. The core assumes that the path separator is the first
/// character of the string PATH_SEPARATOR, but does not interpret
openflags - some combination of: /// any path separators in the search paths, so if you use a
/// different path separator in a search path, you may get a mixture
OPEN_FLAG_READ - open the file for read access /// of PATH_SEPARATORs (from the core) and alternate path separators
OPEN_FLAG_WRITE - open the file for write access /// (specified by users and placed into the options database).
OPEN_FLAG_CREATE - create/truncate the file when opening /// \param [in] path Path to the file to open.
OPEN_FLAG_CREATE_PATHS - specifies that non-existant paths /// \param [in] openflags Combination of #OPEN_FLAG_READ,
should be created if necessary /// #OPEN_FLAG_WRITE, #OPEN_FLAG_CREATE and
/// #OPEN_FLAG_CREATE_PATHS specifying the requested access mode
file - reference to an osd_file::ptr to receive the newly-opened file /// and open behaviour.
handle; this is only valid if the function returns FILERR_NONE /// \param [out] file Receives the file handle if the operation
/// succeeds. Not valid if the operation fails.
filesize - reference to a uint64_t to receive the size of the opened /// \param [out] filesize Receives the size of the opened file if
file; this is only valid if the function returns FILERR_NONE /// the operation succeeded. Not valid if the operation failed.
/// Will be zero for stream-like objects (e.g. TCP sockets or
Return value: /// named pipes).
/// \return Result of the operation.
a file_error describing any error that occurred while opening
the file, or FILERR_NONE if no error occurred
Notes:
This function is called by core_fopen and several other places in
the core to access files. These functions will construct paths by
concatenating various search paths held in the options.c options
database with partial paths specified by the core. The core assumes
that the path separator is the first character of the string
PATH_SEPARATOR, but does not interpret any path separators in the
search paths, so if you use a different path separator in a search
path, you may get a mixture of PATH_SEPARATORs (from the core) and
alternate path separators (specified by users and placed into the
options database).
-----------------------------------------------------------------------------*/
static error open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize); static error open(std::string const &path, std::uint32_t openflags, ptr &file, std::uint64_t &filesize);
/// \brief Create a new pseudo-terminal (PTY) pair
/*----------------------------------------------------------------------------- ///
osd_file::openpty: create a new PTY pair /// \param [out] file Receives the handle of the master side of the
/// pseudo-terminal if the operation succeeds. Not valid if the
Parameters: /// operation fails.
/// \param [out] name Receives the name of the slave side of the
file - reference to an osd_file::ptr to receive the handle of the master /// pseudo-terminal if the operation succeeds. Not valid if the
side of the newly-created PTY; this is only valid if the function /// operation fails.
returns FILERR_NONE /// \return Result of the operation.
name - reference to string where slave filename will be stored
Return value:
a file_error describing any error that occurred while creating the
PTY, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
static error openpty(ptr &file, std::string &name); static error openpty(ptr &file, std::string &name);
/// \brief Close an open file
/*-----------------------------------------------------------------------------
osd_file::~osd_file: close an open file
-----------------------------------------------------------------------------*/
virtual ~osd_file() { } virtual ~osd_file() { }
/// \brief Read from an open file
/*----------------------------------------------------------------------------- ///
osd_file::read: read from an open file /// Read data from an open file at specified offset. Note that the
/// seek and read are not guaranteed to be atomic, which may cause
Parameters: /// issues in multi-threaded applications.
/// \param [out] buffer Pointer to memory that will receive the data
buffer - pointer to memory that will receive the data read /// read.
/// \param [in] offset Byte offset within the file to read at,
offset - offset within the file to read from /// relative to the start of the file. Ignored for stream-like
/// objects (e.g. TCP sockets or named pipes).
length - number of bytes to read from the file /// \param [in] length Number of bytes to read. Fewer bytes may be
/// read if the end of file is reached, or if no data is
actual - reference to a uint32_t to receive the number of bytes actually /// available.
read during the operation; valid only if the function returns /// \param [out] actual Receives the number of bytes read if the
FILERR_NONE /// operation succeeds. Not valid if the operation fails.
/// \return Result of the operation.
Return value:
a file_error describing any error that occurred while reading
from the file, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0; virtual error read(void *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0;
/// \brief Write to an open file
/*----------------------------------------------------------------------------- ///
osd_file::write: write to an open file /// Write data to an open file at specified offset. Note that the
/// seek and write are not guaranteed to be atomic, which may cause
Parameters: /// issues in multi-threaded applications.
/// \param [in] buffer Pointer to memory containing data to write.
buffer - pointer to memory that contains the data to write /// \param [in] offset Byte offset within the file to write at,
/// relative to the start of the file. Ignored for stream-like
offset - offset within the file to write to /// objects (e.g. TCP sockets or named pipes).
/// \param [in] length Number of bytes to write.
length - number of bytes to write to the file /// \param [out] actual Receives the number of bytes written if the
/// operation succeeds. Not valid if the operation fails.
actual - reference to a uint32_t to receive the number of bytes actually /// \return Result of the operation.
written during the operation; valid only if the function returns
FILERR_NONE
Return value:
a file_error describing any error that occurred while writing to
the file, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0; virtual error write(void const *buffer, std::uint64_t offset, std::uint32_t length, std::uint32_t &actual) = 0;
/// \brief Change the size of an open file
/*----------------------------------------------------------------------------- ///
osd_file::truncate: change the size of an open file /// \param [in] offset Desired size of the file.
/// \return Result of the operation.
Parameters:
. offset - future size of the file
Return value:
a file_error describing any error that occurred while writing to
the file, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
virtual error truncate(std::uint64_t offset) = 0; virtual error truncate(std::uint64_t offset) = 0;
/// \brief Flush file buffers
/*----------------------------------------------------------------------------- ///
osd_file::flush: flush file buffers /// This flushes any data cached by the application, but does not
/// guarantee that all prior writes have reached persistent storage.
Parameters: /// \return Result of the operation.
file - handle to a file previously opened via osd_open
Return value:
a file_error describing any error that occurred while flushing file
buffers, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
virtual error flush() = 0; virtual error flush() = 0;
/// \brief Delete a file
/*----------------------------------------------------------------------------- ///
osd_file::remove: deletes a file /// \param [in] filename Path to the file to delete.
/// \return Result of the operation.
Parameters:
filename - path to file to delete
Return value:
a file_error describing any error that occurred while deleting
the file, or FILERR_NONE if no error occurred
-----------------------------------------------------------------------------*/
static error remove(std::string const &filename); static error remove(std::string const &filename);
}; };
/// \brief Get environment variable value
/*----------------------------------------------------------------------------- ///
osd_getenv: return pointer to environment variable /// \param [in] name Name of the environment variable as a
/// NUL-terminated string.
Parameters: /// \return Pointer to environment variable value as a NUL-terminated
/// string if found, or nullptr if not found.
name - name of environment variable
Return value:
pointer to value
-----------------------------------------------------------------------------*/
const char *osd_getenv(const char *name); const char *osd_getenv(const char *name);
/*-----------------------------------------------------------------------------
osd_getpid: gets process id
Return value: /// \brief Get current process ID
///
process id /// \return The process ID of the current process.
-----------------------------------------------------------------------------*/
int osd_getpid(); int osd_getpid();
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
osd_get_physical_drive_geometry: if the given path points to a physical osd_get_physical_drive_geometry: if the given path points to a physical
drive, return the geometry of that drive drive, return the geometry of that drive
@ -442,7 +407,7 @@ typedef uint64_t osd_ticks_t;
accurate. It is ok if this call is not ultra-fast, since it is accurate. It is ok if this call is not ultra-fast, since it is
primarily used for once/frame synchronization. primarily used for once/frame synchronization.
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
osd_ticks_t osd_ticks(void); osd_ticks_t osd_ticks();
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
@ -457,7 +422,7 @@ osd_ticks_t osd_ticks(void);
an osd_ticks_t value which represents the number of ticks per an osd_ticks_t value which represents the number of ticks per
second second
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
osd_ticks_t osd_ticks_per_second(void); osd_ticks_t osd_ticks_per_second();
/*----------------------------------------------------------------------------- /*-----------------------------------------------------------------------------
@ -697,67 +662,42 @@ void osd_work_item_release(osd_work_item *item);
MISCELLANEOUS INTERFACES MISCELLANEOUS INTERFACES
***************************************************************************/ ***************************************************************************/
/*----------------------------------------------------------------------------- /// \brief Allocate memory that can contain executable code
osd_alloc_executable: allocate memory that can contain executable code ///
/// Allocated memory must be both writable and executable. Allocated
Parameters: /// memory must be freed by calling #osd_free_executable passing the
/// same size.
size - the number of bytes to allocate /// \param [in] size Number of bytes to allocate.
/// \return Pointer to allocated memory, or nullptr if allocation
Return value: /// failed.
/// \sa osd_free_executable
a pointer to the allocated memory
Notes:
On many systems, this call may acceptably map to malloc(). On systems
where pages are tagged with "no execute" privileges, it may be
necessary to perform some kind of special allocation to ensure that
code placed into this buffer can be executed.
-----------------------------------------------------------------------------*/
void *osd_alloc_executable(size_t size); void *osd_alloc_executable(size_t size);
/*----------------------------------------------------------------------------- /// \brief Free memory allocated by osd_alloc_executable
osd_free_executable: free memory allocated by osd_alloc_executable ///
/// \param [in] ptr Pointer returned by #osd_alloc_executable.
Parameters: /// \param [in] size Number of bytes originally requested. Must match
/// the value passed to #osd_alloc_executable.
ptr - the pointer returned from osd_alloc_executable /// \sa osd_alloc_executable
size - the number of bytes originally requested
Return value:
None
-----------------------------------------------------------------------------*/
void osd_free_executable(void *ptr, size_t size); void osd_free_executable(void *ptr, size_t size);
/*----------------------------------------------------------------------------- /// \brief Break into host debugger if attached
osd_break_into_debugger: break into the hosting system's debugger if one ///
is attached /// This function is called when a fatal error occurs. If a debugger is
/// attached, it should break and display the specified message.
Parameters: /// \param [in] message Message to output to the debugger as a
/// NUL-terminated string.
message - pointer to string to output to the debugger
Return value:
None.
Notes:
This function is called when an assertion or other important error
occurs. If a debugger is attached to the current process, it should
break into the debugger and display the given message.
-----------------------------------------------------------------------------*/
void osd_break_into_debugger(const char *message); void osd_break_into_debugger(const char *message);
/*-----------------------------------------------------------------------------
osd_get_clipboard_text: retrieves text from the clipboard /// \brief Get clipboard text
-----------------------------------------------------------------------------*/ ///
std::string osd_get_clipboard_text(void); /// Gets current clipboard content as UTF-8 text. Returns an empty
/// string if the clipboard contents cannot be converted to plain text.
/// \return Clipboard contents or an empty string.
std::string osd_get_clipboard_text();
/*************************************************************************** /***************************************************************************
@ -818,7 +758,8 @@ public:
}; };
//FIXME: really needed here? //FIXME: really needed here?
void osd_list_network_adapters(void); void osd_list_network_adapters();
/*************************************************************************** /***************************************************************************
UNCATEGORIZED INTERFACES UNCATEGORIZED INTERFACES
@ -849,20 +790,6 @@ const char *osd_get_volume_name(int idx);
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
void osd_subst_env(std::string &dst, std::string const &src); void osd_subst_env(std::string &dst, std::string const &src);
/* ----- output management ----- */
// output channels
enum osd_output_channel
{
OSD_OUTPUT_CHANNEL_ERROR,
OSD_OUTPUT_CHANNEL_WARNING,
OSD_OUTPUT_CHANNEL_INFO,
OSD_OUTPUT_CHANNEL_DEBUG,
OSD_OUTPUT_CHANNEL_VERBOSE,
OSD_OUTPUT_CHANNEL_LOG,
OSD_OUTPUT_CHANNEL_COUNT
};
class osd_gpu class osd_gpu
{ {
public: public:
@ -1014,6 +941,22 @@ public:
virtual void unbind_buffer(vertex_buffer_interface *vb) = 0; virtual void unbind_buffer(vertex_buffer_interface *vb) = 0;
}; };
/// \defgroup osd_printf Diagnostic output functions
/// \{
// output channels
enum osd_output_channel
{
OSD_OUTPUT_CHANNEL_ERROR,
OSD_OUTPUT_CHANNEL_WARNING,
OSD_OUTPUT_CHANNEL_INFO,
OSD_OUTPUT_CHANNEL_DEBUG,
OSD_OUTPUT_CHANNEL_VERBOSE,
OSD_OUTPUT_CHANNEL_LOG,
OSD_OUTPUT_CHANNEL_COUNT
};
class osd_output class osd_output
{ {
public: public:
@ -1037,35 +980,79 @@ private:
osd_output *m_chain = nullptr; osd_output *m_chain = nullptr;
}; };
// diagnostic output
void osd_vprintf_error(util::format_argument_pack<std::ostream> const &args); void osd_vprintf_error(util::format_argument_pack<std::ostream> const &args);
void osd_vprintf_warning(util::format_argument_pack<std::ostream> const &args); void osd_vprintf_warning(util::format_argument_pack<std::ostream> const &args);
void osd_vprintf_info(util::format_argument_pack<std::ostream> const &args); void osd_vprintf_info(util::format_argument_pack<std::ostream> const &args);
void osd_vprintf_verbose(util::format_argument_pack<std::ostream> const &args); void osd_vprintf_verbose(util::format_argument_pack<std::ostream> const &args);
void osd_vprintf_debug(util::format_argument_pack<std::ostream> const &args); void osd_vprintf_debug(util::format_argument_pack<std::ostream> const &args);
/// \brief Print error message
///
/// By default, error messages are sent to standard error. The relaxed
/// format rules used by util::string_format apply.
/// \param [in] fmt Message format string.
/// \param [in] args Optional message format arguments.
/// \sa util::string_format
template <typename Format, typename... Params> void osd_printf_error(Format &&fmt, Params &&...args) template <typename Format, typename... Params> void osd_printf_error(Format &&fmt, Params &&...args)
{ {
return osd_vprintf_error(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...)); return osd_vprintf_error(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
} }
/// \brief Print warning message
///
/// By default, warning messages are sent to standard error. The
/// relaxed format rules used by util::string_format apply.
/// \param [in] fmt Message format string.
/// \param [in] args Optional message format arguments.
/// \sa util::string_format
template <typename Format, typename... Params> void osd_printf_warning(Format &&fmt, Params &&...args) template <typename Format, typename... Params> void osd_printf_warning(Format &&fmt, Params &&...args)
{ {
return osd_vprintf_warning(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...)); return osd_vprintf_warning(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
} }
/// \brief Print informational message
///
/// By default, informational messages are sent to standard output.
/// The relaxed format rules used by util::string_format apply.
/// \param [in] fmt Message format string.
/// \param [in] args Optional message format arguments.
/// \sa util::string_format
template <typename Format, typename... Params> void osd_printf_info(Format &&fmt, Params &&...args) template <typename Format, typename... Params> void osd_printf_info(Format &&fmt, Params &&...args)
{ {
return osd_vprintf_info(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...)); return osd_vprintf_info(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
} }
/// \brief Print verbose diagnostic message
///
/// Verbose diagnostic messages are disabled by default. If enabled,
/// they are sent to standard output by default. The relaxed format
/// rules used by util::string_format apply. Note that the format
/// string and arguments will always be evaluated, even if verbose
/// diagnostic messages are disabled.
/// \param [in] fmt Message format string.
/// \param [in] args Optional message format arguments.
/// \sa util::string_format
template <typename Format, typename... Params> void osd_printf_verbose(Format &&fmt, Params &&...args) template <typename Format, typename... Params> void osd_printf_verbose(Format &&fmt, Params &&...args)
{ {
return osd_vprintf_verbose(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...)); return osd_vprintf_verbose(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
} }
/// \brief Print debug message
///
/// By default, debug messages are sent to standard output for debug
/// builds only. The relaxed format rules used by util::string_format
/// apply. Note that the format string and arguments will always be
/// evaluated, even if debug messages are disabled.
/// \param [in] fmt Message format string.
/// \param [in] args Optional message format arguments.
/// \sa util::string_format
template <typename Format, typename... Params> void osd_printf_debug(Format &&fmt, Params &&...args) template <typename Format, typename... Params> void osd_printf_debug(Format &&fmt, Params &&...args)
{ {
return osd_vprintf_debug(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...)); return osd_vprintf_debug(util::make_format_argument_pack(std::forward<Format>(fmt), std::forward<Params>(args)...));
} }
/// \}
// returns command line arguments as an std::vector<std::string> in UTF-8 // returns command line arguments as an std::vector<std::string> in UTF-8
std::vector<std::string> osd_get_command_line(int argc, char *argv[]); std::vector<std::string> osd_get_command_line(int argc, char *argv[]);