Как переопределить функцию публичного члена голоса juce?

Привет, я кодирую синтезатор в рамках Juce.

Когда мой adsr работает, мне нужно переопределить isVoiceActive() и установить для него значение true внутри голоса. Это общедоступная функция-член класса SynthesiserVoice.

virtual bool SynthesiserVoice::isVoiceActive  (       )   const   

Возвращает true, если этот голос в настоящее время занят воспроизведением звука.

По умолчанию это просто проверяет значение getCurrentlyPlayingNote(), но его можно переопределить для более сложной проверки.

Итак, в голосе у меня есть еще одна функция-член virtual void renderNextBlock(), и внутри нее я хочу переопределить isVoiceActive.

class SynthVoice : public SynthesiserVoice
{
public:
  void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
    {
  for (int sample = startSample; sample < (startSample + numSamples); ++sample)
        {
            float env_value = adsr.getNextSample();
            if(env_value > 0)
               isVoiceActive = true; //???????
               ...

person DedicatedDreamer    schedule 10.10.2020    source источник


Ответы (1)


вы не можете этого сделать, потому что isVoiceActive не является атрибутом, это функция, вы можете использовать свой isVoiceActive как член данных, а не как член функции, чтобы вы могли назначить ему значение true или false. или если вы хотите работать с функцией, вам нужно добавить «&», чтобы вы могли присвоить этой функции значение (если вы не используете «&», вы не можете делать то, что хотите. у вас есть 2 варианта:

1/ чтобы использовать isVoiceActivat в качестве члена данных, и вы можете сделать это следующим образом:

class SynthesiserVoice
{
public:
    bool isVoiceActive;
};
class SynthVoice :public SynthesiserVoice
{
public:
    oid renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
    {
  for (int sample = startSample; sample < (startSample + numSamples); ++sample)
        {
            float env_value = adsr.getNextSample();
            if(env_value > 0)
               isVoiceActive = true;
            }
     }
};

2/ сделать следующее:

class SynthesiserVoice
{
public:
    bool i = false;
    virtual bool& isVoiceActive() { return i; } // or virtual bool& isVoiceActive()=0;
};
class SynthVoice :public SynthesiserVoice
{
public:
    bool& isVoiceActive()override { return i; }
    void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
    {
  for (int sample = startSample; sample < (startSample + numSamples); ++sample)
        {
            float env_value = adsr.getNextSample();
            if(env_value > 0)
               isVoiceActive ()= true;
             }
     }  
};

Теперь вам нужно реализовать это в соответствии с вашими функциями и данными.

Надеюсь понятно и полезно

person CppProgrammer23    schedule 10.10.2020