WaveOut Callback problem



  • non-static member functions can't be called without an object, so they
    can't possibly be called as a C function



  • Ok, aber wieso kann ich dann bei CreateWindow der Windowclass eine non-static funktion übergeben?



  • zeig mal den code...sollte nicht gehen....



  • LRESULT CALLBACK WndProc	 (HWND, UINT, WPARAM, LPARAM);						
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,				
    					PSTR szCmdLine, int iCmdShow)
    {
    	HWND         hWnd ;
    	MSG          msg ;
    	WNDCLASS     wc ;
    
    	wc.style          = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc    = WndProc;
    	wc.cbClsExtra     = 0;
    	wc.cbWndExtra     = 0;
    	wc.hInstance      = hInstance;
    	wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    	wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
    	wc.hbrBackground  = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wc.lpszMenuName   = NULL;		
    
    ...
    


  • da ist WndProc ja gar kein Teil einer Klasse. ist ja klar das es dann geht



  • mir ja nicht deswegen frag ich ja

    also gibt es eine logische Begründung dafür?



  • @Matyr:
    Eine sog. "freie Funktion" und eine "statische Memberfunktion", haben gemeinsam, dass sie beide keinen "this" Zeiger haben, und daher auch beide kein verstecktes "this" Argument haben.

    Bei einer freien Funktion ist klar dass es kein "this" geben kann, da sie ja nicht zu einer Klasse gehört. Und was statische Memberfunktionen angeht: genau das, nämlich das fehlen des "this" Zeigers, ist der Unterschied zwischen statischen und nicht-statischen Memberfunktionen.

    Da der "verhindernde" Faktor genau das versteckte "this" Argument ist, sollte jetzt klar sein, warum man sowohl freie Funktionen als auch (meistens) statische Memberfunktionen für Callbacks verwenden kann.

    Meistens deswegen, weil für Memberfunktionen (auch statische) keine bestimmte Calling Convention vorgeschrieben ist. Aber das führt wieder etwas zu weit. Im Normalfall funktioniert es, mehr muss man erstmal nicht wissen.



  • Ok, Danke habs verstanden.

    Auch wenn ich mich frage wieso statische Memberfunktionen keinen this Zeiger haben.



  • Matyr schrieb:

    Auch wenn ich mich frage wieso statische Memberfunktionen keinen this Zeiger haben.

    Fragst du dich auch wieso ein Armloser keine Arme hat?

    Dass statische Memberfunktionen keinen "this" Zeiger haben, macht sie ja gerade "statisch". Das ist Definitionssache. Man könnte die Dinger genauso "this-Pointer-lose" Memberfunktionen nennen.



  • Ok ich grabe einfach mal meinen alten Threat wieder aus,
    also:

    Ich kann inzwischen Ton ohne Probleme aufnehmen, abspielen etc.
    Das einzigste was mir dabei überhauptnicht gefällt ist die CPU auslastung die dabei entsteht. Im Durchschnitt liegt die Auslastung bei etwa
    26% (4 mal 3GHz CPU) wenn das Prog läuft. Im vergleich VLC hat nur 1-2%.

    Daher meine Frage wie kann ich die Callback optimieren das meine CPU last drastisch runtergeht?

    Eine etwas Ältere zwischen Rev. meines Projectes welche aber grundsätzlich gleich aufgebaut ist:

    ---m_sound ist eine queue und behinhaltet die Ton daten
    
    void CALLBACK WavePlay::callback(HWAVEOUT hWo, UINT uMsg, DWORD dwInstance, DWORD lParam, DWORD wParam)		//Aufruf bestimmter waveFunktionen führt zu crash
    {		
    	if(m_isInit)
    	{		
    		WavePlay* t_wave = (WavePlay*)dwInstance;	
    		//std::cout<<"ID: "<<t_wave->m_activeThreadID<<std::endl;
    
    		switch(uMsg)
    		{			
    		case MM_WOM_OPEN:		// diese Nachricht folgt auf den Aufruf waveOutOpen 
    			{				
    				break;
    			}		
    		case MM_WOM_DONE:		//Buffer abgespielt
    			{				
    				unprepare((PWAVEHDR)lParam); 
    				PWAVEHDR t_header = (PWAVEHDR)lParam;
    
    				if(t_wave->m_sound.empty())	//Leere Soundeinheit einsetzen fals der Buffer leer ist
    				{
    					WavePlayData t_buffer = t_wave->m_emptyWave[t_wave->m_activeThreadID];				//->> ERROR Header Adresse wird kopiert und somit später gelöscht
    					t_wave->m_sound.push( t_buffer );					
    				}
    
    								//Danach Buffer Abspielen							
    				waveOutPrepareHeader(hWo,t_wave->m_sound.front().waveHdr,sizeof(WAVEHDR));
    				if(waveOutWrite(hWo,t_wave->m_sound.front().waveHdr,sizeof(WAVEHDR)))
    				{
    					t_wave->m_lastError = 5;
    				}						
    				t_wave->m_sound.pop();						
    
    				if(t_wave->m_activeThreadID == 7)
    				{
    					t_wave->m_activeThreadID = 0;
    				}
    				else
    				{
    					t_wave->m_activeThreadID++;
    				}
    				break;
    			}
    
    		case MM_WOM_CLOSE:
    			{							
    				break;
    			}			
    		}
    	}
    }
    
    void WavePlay::unprepare(PWAVEHDR p_del)
    {
    	delete[] p_del->lpData;
    	delete p_del;
    }
    

Anmelden zum Antworten