// license:BSD-3-Clause // copyright-holders:Aaron Giles /*************************************************************************** disound.h Device sound interfaces. ***************************************************************************/ #pragma once #ifndef __EMU_H__ #error Dont include this file directly; include emu.h instead. #endif #ifndef __DISOUND_H__ #define __DISOUND_H__ //************************************************************************** // CONSTANTS //************************************************************************** const int ALL_OUTPUTS = 65535; // special value indicating all outputs for the current chip const int AUTO_ALLOC_INPUT = 65535; //************************************************************************** // INTERFACE CONFIGURATION MACROS //************************************************************************** #define MCFG_SOUND_ADD(_tag, _type, _clock) \ MCFG_DEVICE_ADD(_tag, _type, _clock) #define MCFG_SOUND_MODIFY(_tag) \ MCFG_DEVICE_MODIFY(_tag) #define MCFG_SOUND_CLOCK(_clock) \ MCFG_DEVICE_CLOCK(_clock) #define MCFG_SOUND_REPLACE(_tag, _type, _clock) \ MCFG_DEVICE_REPLACE(_tag, _type, _clock) #define MCFG_SOUND_ROUTE(_output, _target, _gain) \ device_sound_interface::static_add_route(*device, _output, _target, _gain); #define MCFG_SOUND_ROUTE_EX(_output, _target, _gain, _input) \ device_sound_interface::static_add_route(*device, _output, _target, _gain, _input); #define MCFG_SOUND_ROUTES_RESET() \ device_sound_interface::static_reset_routes(*device); #define MCFG_MIXER_ROUTE(_output, _target, _gain, _mixoutput) \ device_sound_interface::static_add_route(*device, _output, _target, _gain, AUTO_ALLOC_INPUT, _mixoutput); //************************************************************************** // TYPE DEFINITIONS //************************************************************************** class sound_stream; // ======================> device_sound_interface class device_sound_interface : public device_interface { public: class sound_route { public: sound_route(int output, int input, float gain, const char *target, UINT32 mixoutput); UINT32 m_output; // output index, or ALL_OUTPUTS UINT32 m_input; // target input index UINT32 m_mixoutput; // target mixer output float m_gain; // gain std::string m_target; // target tag }; // construction/destruction device_sound_interface(const machine_config &mconfig, device_t &device); virtual ~device_sound_interface(); // configuration access const std::vector> &routes() const { return m_route_list; } // static inline configuration helpers static void static_add_route(device_t &device, UINT32 output, const char *target, double gain, UINT32 input = AUTO_ALLOC_INPUT, UINT32 mixoutput = 0); static void static_reset_routes(device_t &device); // sound stream update overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) = 0; // stream creation sound_stream *stream_alloc(int inputs, int outputs, int sample_rate); // helpers int inputs() const; int outputs() const; sound_stream *input_to_stream_input(int inputnum, int &stream_inputnum); sound_stream *output_to_stream_output(int outputnum, int &stream_outputnum); void set_input_gain(int inputnum, float gain); void set_output_gain(int outputnum, float gain); int inputnum_from_device(device_t &device, int outputnum = 0) const; protected: // optional operation overrides virtual void interface_validity_check(validity_checker &valid) const override; virtual void interface_pre_start() override; virtual void interface_post_start() override; virtual void interface_pre_reset() override; // internal state std::vector> m_route_list; // list of sound routes int m_outputs; // number of outputs from this instance int m_auto_allocated_inputs; // number of auto-allocated inputs targeting us }; // iterator typedef device_interface_iterator sound_interface_iterator; // ======================> device_mixer_interface class device_mixer_interface : public device_sound_interface { public: // construction/destruction device_mixer_interface(const machine_config &mconfig, device_t &device, int outputs = 1); virtual ~device_mixer_interface(); protected: // optional operation overrides virtual void interface_pre_start() override; virtual void interface_post_load() override; // sound interface overrides virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override; // internal state UINT8 m_outputs; // number of outputs std::vector m_outputmap; // map of inputs to outputs sound_stream * m_mixer_stream; // mixing stream }; // iterator typedef device_interface_iterator mixer_interface_iterator; #endif /* __DISOUND_H__ */