Toon posts:

[C++/BCB]Vraagje over static members...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

ik ben bezig een mp3-mixer te bouwen in BCB 6.0 ...hij is al bijna af, maar ik ben nu bezig met het bouwen van een fatsoenlijke dsp-functie voor het realtime recorden van de audio-data. Ik maak gebruik van de FMod (http://www.fmod.org) library..

Mijn class DSP ziet er als volgt uit:

---------------------------------------------------CDsp.h----------------------------------------------

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef CDspH
#define CDspH

#include <Classes.hpp>

#include "Fmod.h"
#include "Fmod_errors.h"

class CDsp{

        TMemoryStream *pDataBuf;

    public:
        FSOUND_DSPUNIT *DspUnit;

        CDsp();
        ~CDsp();

        static void *DspCallBack (void *OriginalBuffer, void *NewBuffer, 
                                                int Length,  int   Param);
        void             Activate();
        void             Deactivate();
};

#endif


-----------------------------------------------CDsp.cpp----------------------------------------------

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma hdrstop

#include "CDsp.h"

void *CDsp::DspCallBack(void *OriginalBuffer, void *NewBuffer, int Length, int Param)
{
    pDataBuf->WriteBuffer(NewBuffer, Length);
    return NewBuffer;
}

void CDsp::Activate()
{
    FSOUND_DSP_SetActive(DspUnit, true);
}

void CDsp::Deactivate()
{
    FSOUND_DSP_SetActive(DspUnit, false);
}

CDsp::CDsp()                                  // Constructor
{
    pDataBuf=new TMemoryStream;
    DspUnit=FSOUND_DSP_Create(&DspCallBack,  FSOUND_DSP_DEFAULTPRIORITY_USER+1, 0);
}

CDsp::~CDsp()                               // Destructor
{
    delete pDataBuf;
    FSOUND_DSP_SetActive(DspUnit, false);
    FSOUND_DSP_Free(DspUnit);
}


Mijn probleem is dat ik de volgende melding krijg:

[C++ Error] CDsp.cpp(10): E2231 Member CDsp::pDataBuf cannot be used without an object

Regel 10 is de regel

code:
1
pDataBuf->WriteBuffer(NewBuffer, Length);


...binnen de functie DspCallBack...ik begrijp dat dat op de een of andere manier te maken heeft met het feit dat het een static member betreft en hoewel ik dit eigenlijk gewoon zou moeten weten, weet ik het dus niet...wie kan mij vertellen wat het probleem is en, belangrijker, wat ik er aan kan doen. De bedoeling is gewoon dat ik binnen de callback functie steeds de audio-data aan een buffer toevoeg, zodat ik deze uiteindelijk kan gebruiken voor het maken van een wave-file...

Who's gonna help me out?

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Is writebuffer een static function?

Dan moet je ipv pDataBuf->WriteBuffer

code:
1
Classname::WriteBuffer (functieparameters)

schrijven.

Een static function werkt nl. niet specifiek op één object, en heeft dus ook geen object nodig om aangeroepen te worden.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Uuh, nee...

In mijn class CDsp heb ik een member genaamd pDataBuf. Deze is van het type TMemoryStream. 1 van de methods van een TMemoryStream-object is

code:
1
WriteBuffer(const void *Buffer, int Size);


Op het moment dat ik deze functie binnen de static function

code:
1
void *CDsp::DspCallBack(void *OriginalBuf, void *NewBuf, int Length, int Param)


aanroep, krijg ik de foutmelding. Ik krijg dezelfde foutmelding overigens ook als ik binnen de DspCallBack-functie een andere (niet static) functie van de class CDsp aanroep...de reden dat ik deze functie heb gedefineerd als een static void * is omdat ik in de functie FSOUND_DSP_Create een pointer naar de Callback functie moet meegeven. Als ik het kopieren naar de TMemoryStream (pDataBuf) achterwege laat, werkt het allemaal wel. Maar ja, ik zal toch de data naar een of andere buffer moeten sturen anders kan ik die niet gebruiken voor een wavefile mee te maken.

Ik heb trouwens ook geprobeerd om te schrijven:

code:
1
2
3
4
5
void *CDsp::DspCallBack(void *OriginalBuf, void *NewBuf, int Length, int Param)
{
    CDsp::pDataBuf->WriteBuffer(NewBuf, Length);
    return NewBuf;
}


maar dat resulteert in dezelfde foutmelding. En dit blijkt ook niet te werken...:

code:
1
2
3
4
5
void *CDsp::DspCallBack(void *OriginalBuf, void *NewBuf, int Length, int Param)
{
    this->pDataBuf->WriteBuffer(NewBuf, Length);
    return NewBuf;
}

Verwijderd

Topicstarter
*Bump*

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Als je die functie niet aanroept vanuit een static function, krijg je die foutmelding dan ook?

Kun je eigenlijk wel gebruik maken van non-static data-members van die class in een static function in die class?

https://fgheysels.github.io/


Verwijderd

whoami schreef op 01 september 2002 @ 22:33:
Kun je eigenlijk wel gebruik maken van non-static data-members van die class in een static function in die class?
Nee dat kan inderdaad niet. Binnen een static function van een class heb je geen "this" pointer, en kan je dus niet zomaar bij non-static data-members van een instantie van die class.

Vaak heb je bij callback functies de mogelijkheid om "user data" (meestal als void*) mee te geven, waarmee je een nette oplossing zou kunnen verzinnen. Ik zie hier alleen een "int Param", dus dat wordt lastig.

Indien je maar een instantie van CDsp nodig denkt te hebben zou je pDataBuf ook static kunnen maken, alhoewel heel die class dan eigenlijk nog nauwelijks bestaansrecht heeft.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
De standaard workarounds voor "user data" parameters van types ongelijk aan void* zijn een std::vector<class*> als je array indices in "user data" kwijt kunt, of een std::map< User_data_type, class* > als dat niet kan.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1