<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[WaveOut und hohe CPU last]]></title><description><![CDATA[<p>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.</p>
<p>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.</p>
<p>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.<br />
Der Mainloop läuft in einem eigenen Thread.<br />
m_wout ist einfach ein Element einer (static)Klasse die Daten thread-sicher verwaltet (über Mutex).</p>
<p>Main loop (Thread):</p>
<pre><code class="language-cpp">while(m_wout.getStatus()==1)
	{
		for(int i=0;i&lt;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);		
	}
</code></pre>
<p>Callback (von Windows nach dem Abspielen aufgerufen):</p>
<pre><code class="language-cpp">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);
</code></pre>
<p>WaveFormat mit dem ich den WaveOutHandle initialisiert habe (keine ahnung ob dies an der CPU last schuld sein kann).</p>
<pre><code class="language-cpp">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;
</code></pre>
<p>Ich habe schon verschiedenste Möglichkeiten getestet, unteranderem auch ohne Threads, dafür aber mit WaveOutWrite() in der Callback.</p>
<p>Naja hoffe jemand kann helfen</p>
<p>Mfg. Matyr</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268685/waveout-und-hohe-cpu-last</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 14:17:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268685.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 Jun 2010 19:24:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WaveOut und hohe CPU last on Sat, 12 Jun 2010 19:24:46 GMT]]></title><description><![CDATA[<p>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.</p>
<p>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.</p>
<p>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.<br />
Der Mainloop läuft in einem eigenen Thread.<br />
m_wout ist einfach ein Element einer (static)Klasse die Daten thread-sicher verwaltet (über Mutex).</p>
<p>Main loop (Thread):</p>
<pre><code class="language-cpp">while(m_wout.getStatus()==1)
	{
		for(int i=0;i&lt;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);		
	}
</code></pre>
<p>Callback (von Windows nach dem Abspielen aufgerufen):</p>
<pre><code class="language-cpp">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);
</code></pre>
<p>WaveFormat mit dem ich den WaveOutHandle initialisiert habe (keine ahnung ob dies an der CPU last schuld sein kann).</p>
<pre><code class="language-cpp">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;
</code></pre>
<p>Ich habe schon verschiedenste Möglichkeiten getestet, unteranderem auch ohne Threads, dafür aber mit WaveOutWrite() in der Callback.</p>
<p>Naja hoffe jemand kann helfen</p>
<p>Mfg. Matyr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1911419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1911419</guid><dc:creator><![CDATA[Matyr]]></dc:creator><pubDate>Sat, 12 Jun 2010 19:24:46 GMT</pubDate></item><item><title><![CDATA[Reply to WaveOut und hohe CPU last on Mon, 14 Jun 2010 16:20:13 GMT]]></title><description><![CDATA[<p>Omg ein Problem gefunden,<br />
ich habe im API Window bei der Message auswertung<br />
an einigen Stellen return 0; anstelle von break; was scheinbar irgendwie mehr arbeit verursacht hat (wahrscheinlich message flut oder so).</p>
<p>Ganz perfekt läufts aber immernoch nicht.</p>
<p>Mfg. Matyr</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912277</guid><dc:creator><![CDATA[Matyr]]></dc:creator><pubDate>Mon, 14 Jun 2010 16:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to WaveOut und hohe CPU last on Tue, 15 Jun 2010 06:27:02 GMT]]></title><description><![CDATA[<p>Wenn Du einen Workerthread hast und nicht willst dass dieser einen ganzen Kern voll auslastet, dann darf dieser Thread auch nicht permanent &quot;busy&quot; sein.</p>
<p>Falls du es dir also leisten kannst dann füg doch am Ende mal einen kleinen &quot;Sleep&quot; ein. Ist zwar nicht ganz sauber aber mal einen Versuch wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912561</guid><dc:creator><![CDATA[bergvagabund]]></dc:creator><pubDate>Tue, 15 Jun 2010 06:27:02 GMT</pubDate></item><item><title><![CDATA[Reply to WaveOut und hohe CPU last on Tue, 15 Jun 2010 12:46:44 GMT]]></title><description><![CDATA[<p>Dafür ist ja eig. das WaitForSingleObject(); gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1912732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1912732</guid><dc:creator><![CDATA[Matyr]]></dc:creator><pubDate>Tue, 15 Jun 2010 12:46:44 GMT</pubDate></item></channel></rss>