Sophie

Sophie

distrib > Mandriva > 2010.0 > i586 > media > contrib-release > by-pkgid > b908fbf6412c51882b2aebf8342c549f > files > 75

libecasound-devel-2.5.2-2mdv2009.1.i586.rpm

#ifndef INCLUDED_CHAIN_H
#define INCLUDED_CHAIN_H

#include <string>
#include <vector>

#include "eca-chainop.h"
#include "eca-audio-position.h"

class GENERIC_CONTROLLER;
class OPERATOR;
class SAMPLE_BUFFER;

/**
 * Class representing an abstract audio signal chain.
 */
class CHAIN : public ECA_AUDIO_POSITION {
 
 public:

  CHAIN (void);
  virtual ~CHAIN (void);

  bool is_initialized(void) const { return initialized_rep; }

  /**
   * Is chain muted? If muted, audio buffers are zeroed during
   * processing.
   */ 
  bool is_muted(void) const { return muted_rep; }

  /**
   * Is processing enabled? If disabled, all chain operators
   * will be skipped during processing. 
   */
  bool is_processing(void) const { return sfx_rep; }

  void toggle_muting(bool v) { muted_rep = v; }
  void toggle_processing(bool v) { sfx_rep = v; }

  std::string name(void) const { return chainname_rep; }
  void name(const std::string& c) { chainname_rep = c; }

  bool is_valid(void) const;

  void connect_input(int input);
  void disconnect_input(void);
  void connect_output(int output);
  void disconnect_output(void);
  void disconnect_buffer(void);

  /**
   * Returns an id number to input connected to this chain. If no input
   * is connected, -1 is returned.
   */
  int connected_input(void) const { return input_id_rep; }

  /**
   * Returns an id number to output connected to this chain. If no input
   * is connected, -1 is returned.
   */
  int connected_output(void) const { return output_id_rep; }

  void clear(void);
  void add_chain_operator(CHAIN_OPERATOR* chainop);
  void remove_chain_operator(void);
  void select_chain_operator(int index);
  void select_chain_operator_parameter(int index);
  void set_parameter(CHAIN_OPERATOR::parameter_t value);

  /**
   * Index of selected chain operator
   */
  int selected_chain_operator(void) const { return selected_chainop_number_rep; }
  int selected_chain_operator_parameter(void) const { return selected_chainop_parameter_rep; }
  int number_of_chain_operators(void) const { return chainops_rep.size(); }
  int number_of_chain_operator_parameters(void) const;
  CHAIN_OPERATOR::parameter_t get_parameter(void) const;
  std::string chain_operator_name(void) const;
  std::string chain_operator_parameter_name(void) const;
  const CHAIN_OPERATOR* get_chain_operator(int index) const { return chainops_rep[index]; }
  const CHAIN_OPERATOR* get_selected_chain_operator(void) const { return selected_chainop_repp; }

  void add_controller(GENERIC_CONTROLLER* gcontroller);
  void remove_controller(void);
  void select_controller(int index);
  void select_controller_parameter(int index);
  void set_controller_parameter(CHAIN_OPERATOR::parameter_t value);
  const GENERIC_CONTROLLER* get_controller(int index) const { return gcontrollers_rep[index]; }
  const GENERIC_CONTROLLER* get_selected_controller(void) const { return selected_controller_repp; }
  int number_of_controller_parameters(void) const;
  std::string controller_parameter_name(void) const;
  CHAIN_OPERATOR::parameter_t get_controller_parameter(void) const;

  /**
   * Index of selected controller
   */
  int selected_controller(void) const { return selected_controller_number_rep; }
  int selected_controller_parameter(void) const { return selected_controller_parameter_rep; }
  int number_of_controllers(void) const { return gcontrollers_rep.size(); }
  std::string controller_name(void) const;

  void selected_chain_operator_as_target(void);

  void selected_controller_as_target(void);

  /**
   * Returns the object that is the current target for 
   * parameter control, or 0 if none selected.
   */
  OPERATOR* selected_target(void) const { return selected_dynobj_repp; }

  void init(SAMPLE_BUFFER* sbuf = 0, int in_channels = 0, int out_channels = 0);
  void release(void);
  void process(void);
  void controller_update(void);
  void refresh_parameters(void);

  std::string to_string(void) const;

  /** @name Functions implemented from ECA_SAMPLERATE_AWARE */
  /*@{*/

  virtual void set_samples_per_second(SAMPLE_SPECS::sample_rate_t v);

  /*@}*/

  /** @name Functions implemented from ECA_AUDIO_POSITION */
  /*@{*/

  virtual SAMPLE_SPECS::sample_pos_t seek_position(SAMPLE_SPECS::sample_pos_t pos);
  virtual bool supports_seeking(void) const { return true; }
  virtual bool supports_seeking_sample_accurate(void) const { return true; }

  /*@}*/

 private:

  bool initialized_rep;
  std::string chainname_rep;
  bool muted_rep;
  bool sfx_rep;
  int in_channels_rep;
  int out_channels_rep;

  std::vector<CHAIN_OPERATOR*> chainops_rep;
  std::vector<GENERIC_CONTROLLER*> gcontrollers_rep;

  CHAIN_OPERATOR* selected_chainop_repp;
  GENERIC_CONTROLLER* selected_controller_repp;
  OPERATOR* selected_dynobj_repp;

  int selected_chainop_number_rep;
  int selected_chainop_parameter_rep;
  int selected_controller_number_rep;
  int selected_controller_parameter_rep;

  int input_id_rep;
  int output_id_rep;

  SAMPLE_BUFFER* audioslot_repp;

};

#endif