WaveOut und hohe CPU last



  • Hi, ich weiß nicht ob das jetzt in den WinAPI teil gehört oder hier hin, daher schonmal sry wenn es in der falschen sektion steht.

    Also folgendes: Ich möchte gerne Töne modulieren und ausgeben, dafür habe ich mir im ersten Teil eine Klasse gebaut die die Sound ausgabe erledigt. Das Problem ist jetzt das diese Klasse scheinbar viel Rechenleistung braucht(25% eines 4*3GHz CPU's). Dagegen braucht VLC welches ähnlich funktionieren sollte fast garnichts.

    Ich finde bis jetzt keinerlei Lösung für das Problem, daher Poste ich einmal den Mainloop, welcher Sounds einfügt und einmal die Callback welche nach dem Abspielen aufgerufen wird.
    Der Mainloop läuft in einem eigenen Thread.
    m_wout ist einfach ein Element einer (static)Klasse die Daten thread-sicher verwaltet (über Mutex).

    Main loop (Thread):

    while(m_wout.getStatus()==1)
    	{
    		for(int i=0;i<2;i++)
    		{			
    			m_wout.queue_getItem(t_waveData);
    			m_wout.queue_pop();			
    			waveOutPrepareHeader(t_waveOut, t_waveData.waveHdr, sizeof(WAVEHDR));
    			waveOutWrite(t_waveOut,t_waveData.waveHdr,sizeof(WAVEHDR));
    
    		}		
    		WaitForSingleObject(m_event,INFINITE);		
    	}
    

    Callback (von Windows nach dem Abspielen aufgerufen):

    if(uMsg == WOM_DONE)
    	{
    		int temp = m_wout.getID();		
    		if(temp == 1)	
    		{
    			SetEvent(m_event);
    			m_wout.setID(0);
    			temp = 0;
    		}
    
    		m_wout.setID(temp+1);
    

    WaveFormat mit dem ich den WaveOutHandle initialisiert habe (keine ahnung ob dies an der CPU last schuld sein kann).

    t_waveformat.wFormatTag = WAVE_FORMAT_PCM;
    	t_waveformat.nChannels = p_channel;
    	t_waveformat.nSamplesPerSec = p_sampleFrequenz;
    	t_waveformat.nBlockAlign = p_channel* (p_sampleSize/8);
    	t_waveformat.nAvgBytesPerSec = p_sampleFrequenz* t_waveformat.nBlockAlign;
    	t_waveformat.wBitsPerSample = p_sampleSize;
    	t_waveformat.cbSize = 0;
    

    Ich habe schon verschiedenste Möglichkeiten getestet, unteranderem auch ohne Threads, dafür aber mit WaveOutWrite() in der Callback.

    Naja hoffe jemand kann helfen

    Mfg. Matyr



  • Omg ein Problem gefunden,
    ich habe im API Window bei der Message auswertung
    an einigen Stellen return 0; anstelle von break; was scheinbar irgendwie mehr arbeit verursacht hat (wahrscheinlich message flut oder so).

    Ganz perfekt läufts aber immernoch nicht.

    Mfg. Matyr



  • Wenn Du einen Workerthread hast und nicht willst dass dieser einen ganzen Kern voll auslastet, dann darf dieser Thread auch nicht permanent "busy" sein.

    Falls du es dir also leisten kannst dann füg doch am Ende mal einen kleinen "Sleep" ein. Ist zwar nicht ganz sauber aber mal einen Versuch wert.



  • Dafür ist ja eig. das WaitForSingleObject(); gedacht.


Log in to reply