diff options
Diffstat (limited to 'src/emu/disound.h')
-rw-r--r-- | src/emu/disound.h | 72 |
1 files changed, 39 insertions, 33 deletions
diff --git a/src/emu/disound.h b/src/emu/disound.h index e48ba290bc6..eefe1197784 100644 --- a/src/emu/disound.h +++ b/src/emu/disound.h @@ -26,7 +26,6 @@ //************************************************************************** constexpr int ALL_OUTPUTS = 65535; // special value indicating all outputs for the current chip -constexpr int AUTO_ALLOC_INPUT = 65535; @@ -34,8 +33,6 @@ constexpr int AUTO_ALLOC_INPUT = 65535; // TYPE DEFINITIONS //************************************************************************** -class read_stream_view; -class write_stream_view; enum sound_stream_flags : u32; @@ -43,73 +40,89 @@ enum sound_stream_flags : u32; class device_sound_interface : public device_interface { + friend class sound_manager; + public: class sound_route { public: u32 m_output; // output index, or ALL_OUTPUTS u32 m_input; // target input index - u32 m_mixoutput; // target mixer output float m_gain; // gain std::reference_wrapper<device_t> m_base; // target search base std::string m_target; // target tag + device_sound_interface *m_interface; // target device interface }; // construction/destruction device_sound_interface(const machine_config &mconfig, device_t &device); virtual ~device_sound_interface(); - virtual bool issound() { return true; } /// HACK: allow devices to hide from the ui - // configuration access std::vector<sound_route> const &routes() const { return m_route_list; } // configuration helpers template <typename T, bool R> - device_sound_interface &add_route(u32 output, const device_finder<T, R> &target, double gain, u32 input = AUTO_ALLOC_INPUT, u32 mixoutput = 0) + device_sound_interface &add_route(u32 output, const device_finder<T, R> &target, double gain, u32 channel = 0) { const std::pair<device_t &, const char *> ft(target.finder_target()); - return add_route(output, ft.first, ft.second, gain, input, mixoutput); + return add_route(output, ft.first, ft.second, gain, channel); } - device_sound_interface &add_route(u32 output, const char *target, double gain, u32 input = AUTO_ALLOC_INPUT, u32 mixoutput = 0); - device_sound_interface &add_route(u32 output, device_sound_interface &target, double gain, u32 input = AUTO_ALLOC_INPUT, u32 mixoutput = 0); - device_sound_interface &add_route(u32 output, speaker_device &target, double gain, u32 input = AUTO_ALLOC_INPUT, u32 mixoutput = 0); + device_sound_interface &add_route(u32 output, const char *target, double gain, u32 channel = 0); + device_sound_interface &add_route(u32 output, device_sound_interface &target, double gain, u32 channel = 0); device_sound_interface &reset_routes() { m_route_list.clear(); return *this; } // sound stream update overrides - virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs); + virtual void sound_stream_update(sound_stream &stream) = 0; // stream creation - sound_stream *stream_alloc(int inputs, int outputs, int sample_rate); - sound_stream *stream_alloc(int inputs, int outputs, int sample_rate, sound_stream_flags flags); + sound_stream *stream_alloc(int inputs, int outputs, int sample_rate, sound_stream_flags flags = sound_stream_flags(0)); // helpers int inputs() const; int outputs() const; - sound_stream *input_to_stream_input(int inputnum, int &stream_inputnum) const; - sound_stream *output_to_stream_output(int outputnum, int &stream_outputnum) const; + std::pair<sound_stream *, int> input_to_stream_input(int inputnum) const; + std::pair<sound_stream *, int> output_to_stream_output(int outputnum) const; float input_gain(int inputnum) const; float output_gain(int outputnum) const; + float user_output_gain() const; + float user_output_gain(int outputnum) const; 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; + void set_user_output_gain(float gain); + void set_user_output_gain(int outputnum, float gain); + void set_route_gain(int source_channel, device_sound_interface *target, int target_channel, float gain); + void set_sound_hook(bool enable) { m_sound_hook = enable; } + bool get_sound_hook() const { return m_sound_hook; } + protected: // configuration access std::vector<sound_route> &routes() { return m_route_list; } - device_sound_interface &add_route(u32 output, device_t &base, const char *tag, double gain, u32 input, u32 mixoutput); + device_sound_interface &add_route(u32 output, device_t &base, const char *tag, double gain, u32 channel); // 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; + + u32 get_sound_requested_inputs() const { return m_sound_requested_inputs; } + u32 get_sound_requested_outputs() const { return m_sound_requested_outputs; } + u64 get_sound_requested_inputs_mask() const { return m_sound_requested_inputs_mask; } + u64 get_sound_requested_outputs_mask() const { return m_sound_requested_outputs_mask; } + +private: + void sound_request_input(u32 input); // internal state std::vector<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 - u32 m_specified_inputs_mask; // mask of inputs explicitly specified (not counting auto-allocated) + std::vector<sound_stream *> m_sound_streams; + u64 m_sound_requested_inputs_mask; + u64 m_sound_requested_outputs_mask; + u32 m_sound_requested_inputs; + u32 m_sound_requested_outputs; + bool m_sound_hook; + + void sound_before_devices_init(); + void sound_after_devices_init(); }; // iterator @@ -123,22 +136,15 @@ class device_mixer_interface : public device_sound_interface { public: // construction/destruction - device_mixer_interface(const machine_config &mconfig, device_t &device, int outputs = 1); + device_mixer_interface(const machine_config &mconfig, device_t &device); 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, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override; - - // internal state - u8 m_outputs; // number of outputs - std::vector<u8> m_outputmap; // map of inputs to outputs - std::vector<bool> m_output_clear; // flag for tracking cleared buffers - sound_stream *m_mixer_stream; // mixing stream + virtual void sound_stream_update(sound_stream &stream) override; }; // iterator |