summaryrefslogblamecommitdiffstatshomepage
path: root/src/emu/disound.h
blob: f981113317eddae71d722ad4a6636febf753e1d5 (plain) (tree)
1
2
3
4
5
6
7
8

                                





                                                                            















                                                                            

                                                                                                    






                                                                            
                                             
                                            

                                 
 

                                  
 

                                                 
 
                                                   
                                                                                   
                                                              
                                                                                           
                                   
                                                             
 
                                                               
                                                                                                                 
 







                                                                            
                                                 
 
                                                      

       


                         
                                                                                                     
 



                                                                                       
                                                                     

          
                                   
                                                                                

                                          
                               
                                                                                                

                                              
                                                                                                                                                              
                                                          
 
                                        

                                                                                                                                     


                                                                             




                                                                                    
                                                      
                                                        
                                                                            
 

                                       



                                                                                      
 
                         
                                                                                            

                                                                                                   

  

                                                                                   
 












                                                                                                 

                                                    

                                    
                                                                                                                                          

                         
                                                                        
                                                                                    
                                                                    

  


                                                                                   
 
                           
// 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<std::unique_ptr<sound_route>> &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<std::unique_ptr<sound_route>> 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<device_sound_interface> 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<UINT8>       m_outputmap;            // map of inputs to outputs
	sound_stream *      m_mixer_stream;         // mixing stream
};

// iterator
typedef device_interface_iterator<device_mixer_interface> mixer_interface_iterator;


#endif  /* __DISOUND_H__ */