<?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[Puffergröße]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich lese ein 24 bit Audio-File ein, verschiebe es (upper 3 byte) in ein 32 bit File. Das funktioniert auch grundsätzlich einwandfrei.</p>
<p>Ich hatte zuerst die folgende Methode gewählt. Weil ich komplette Dateien in den RAM lade, ergeben sich hier wegen buf24 und buffer für kurze Zeit 2 Puffer, die in der Summe sehr groß werden können:</p>
<pre><code class="language-cpp">fseek (infile , 0 , SEEK_END);
size24 = (ftell (infile)); // number of bytes
size32 = ((size24 - fileoffset) *4/3);
position = fseek (infile , fileoffset , SEEK_SET); 

unsigned char *buf24 = new unsigned char[size24]; // volle Größe
unsigned int *buffer = new unsigned int[size32/4 + fileoffset];
count = fread(buf24, 3, size24/3, infile); // 3 bytes je Sample -&gt; 24 Bits

for (i=0; i &lt; size24/3; i++)
{
	buffer[i] = buf24[k+2] &lt;&lt; 24 | buf24[k+1] &lt;&lt; 16 | buf24[k] &lt;&lt; 8; // LSB(0)
	k += 3;
}
delete[] buf24;
</code></pre>
<p>Jetzt habe auf folgende Weise einen nur noch 3 byte großen buf24, Problem gelöst, jedoch dauert es doppelt so lange:</p>
<pre><code class="language-cpp">fseek (infile , 0 , SEEK_END);
size24 = (ftell (infile)); // number of bytes
size32 = ((size24 - fileoffset) *4/3);
position = fseek (infile , fileoffset , SEEK_SET); 

unsigned char *buf24 = new unsigned char[3]; // nur noch 3 bytes werden belegt
unsigned int *buffer = new unsigned int[size32/4 + fileoffset];

for (i=0; i &lt; size24/3; i++)
{
count = fread(buf24, 3, 1, infile); // 3 bytes je Sample -&gt; 24 Bits
buffer[i] = buf24[2] &lt;&lt; 24 | buf24[1] &lt;&lt; 16 | buf24[0] &lt;&lt; 8; // LSB(0)
}
delete[] buf24;
</code></pre>
<p>Vielleicht bin ich ja auch grundsätzlich auf dem Holzweg. Für einen Hinweis bzgl. einer guten Lösung i.S. Puffergröße/Schneligkeit wäre ich dankbar.</p>
<p>Gruß<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/288819/puffergröße</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 16:16:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/288819.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 23 Jun 2011 14:12:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 14:12:16 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich lese ein 24 bit Audio-File ein, verschiebe es (upper 3 byte) in ein 32 bit File. Das funktioniert auch grundsätzlich einwandfrei.</p>
<p>Ich hatte zuerst die folgende Methode gewählt. Weil ich komplette Dateien in den RAM lade, ergeben sich hier wegen buf24 und buffer für kurze Zeit 2 Puffer, die in der Summe sehr groß werden können:</p>
<pre><code class="language-cpp">fseek (infile , 0 , SEEK_END);
size24 = (ftell (infile)); // number of bytes
size32 = ((size24 - fileoffset) *4/3);
position = fseek (infile , fileoffset , SEEK_SET); 

unsigned char *buf24 = new unsigned char[size24]; // volle Größe
unsigned int *buffer = new unsigned int[size32/4 + fileoffset];
count = fread(buf24, 3, size24/3, infile); // 3 bytes je Sample -&gt; 24 Bits

for (i=0; i &lt; size24/3; i++)
{
	buffer[i] = buf24[k+2] &lt;&lt; 24 | buf24[k+1] &lt;&lt; 16 | buf24[k] &lt;&lt; 8; // LSB(0)
	k += 3;
}
delete[] buf24;
</code></pre>
<p>Jetzt habe auf folgende Weise einen nur noch 3 byte großen buf24, Problem gelöst, jedoch dauert es doppelt so lange:</p>
<pre><code class="language-cpp">fseek (infile , 0 , SEEK_END);
size24 = (ftell (infile)); // number of bytes
size32 = ((size24 - fileoffset) *4/3);
position = fseek (infile , fileoffset , SEEK_SET); 

unsigned char *buf24 = new unsigned char[3]; // nur noch 3 bytes werden belegt
unsigned int *buffer = new unsigned int[size32/4 + fileoffset];

for (i=0; i &lt; size24/3; i++)
{
count = fread(buf24, 3, 1, infile); // 3 bytes je Sample -&gt; 24 Bits
buffer[i] = buf24[2] &lt;&lt; 24 | buf24[1] &lt;&lt; 16 | buf24[0] &lt;&lt; 8; // LSB(0)
}
delete[] buf24;
</code></pre>
<p>Vielleicht bin ich ja auch grundsätzlich auf dem Holzweg. Für einen Hinweis bzgl. einer guten Lösung i.S. Puffergröße/Schneligkeit wäre ich dankbar.</p>
<p>Gruß<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082652</guid><dc:creator><![CDATA[TJF]]></dc:creator><pubDate>Thu, 23 Jun 2011 14:12:16 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 14:30:46 GMT]]></title><description><![CDATA[<p>Bis auf new und delete sieht das irgendwie nach C aus.<br />
Was spricht gegen</p>
<pre><code class="language-cpp">char buf24[3072];
int buf[1024];
</code></pre>
<p>auf dem Stack? Kaum Speicherverbrauch und das Einlesen sollte auch schnell gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082660</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 23 Jun 2011 14:30:46 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 14:33:09 GMT]]></title><description><![CDATA[<p>Ein fread() gegen size24/3 fread()s.</p>
<p>Wundert mich nicht, daß das langsamer ist. Je nachdem wie groß die Dateien sind finde ich die doppelte Laufzeit sogar eher schnell. Ich habe schlimmeres gesehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082661</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Thu, 23 Jun 2011 14:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 14:35:25 GMT]]></title><description><![CDATA[<p>Ungetestet, aber grob so:</p>
<pre><code class="language-cpp">const unsigned int max24 = 3000;
const unsigned int max32 = max24 / 3;
unsigned char buf24[max24]; 
unsigned int  buf32[max32];

ifstream(&quot;input.dat&quot;) in;
ofstream(&quot;output.dat&quot;) out;

in.seekg(fileoffset);

while (in.read(buf24, max24))
{
 streamsize read = in.gcount();
 for (i=0; i &lt; read-2; i+=3)
 {
  buf32[i/3] = buf24[i+2] &lt;&lt; 24 | buf24[i+1] &lt;&lt; 16 | buf24[i] &lt;&lt; 8; 
 }
 out.write(buf32, read/3);
}
</code></pre>
<p>In der Art sollte das abgehen wie nix.</p>
<p>Ich glaube ich könnte die Grenzen falsch haben, kann sein dass bei der Umwandlung einzelne Bytes verloren gehen. Musst du mal sauber durchdenken. Es ging mir gerade nur darum, dir auf die Schnelle zu zeigen, wie man so etwas effizient machen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082664</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 23 Jun 2011 14:35:25 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 14:36:16 GMT]]></title><description><![CDATA[<p>Du könntest z.B. nur buffer32 reservieren, ab Position fileoffset die gesamte 24er-Datei ablegen, und dann von hinten nach vorne die 24-Bit-Werte als 32er an ihre endgültige Position verschieben/konvertieren. Damit kannst Du dir den zusätzlichen Puffer ganz sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082666</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Thu, 23 Jun 2011 14:36:16 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Thu, 23 Jun 2011 15:03:14 GMT]]></title><description><![CDATA[<p>Vielen Dank! Ich werde die beiden Wege mal durchexerzieren ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2082681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2082681</guid><dc:creator><![CDATA[TJF]]></dc:creator><pubDate>Thu, 23 Jun 2011 15:03:14 GMT</pubDate></item><item><title><![CDATA[Reply to Puffergröße on Fri, 24 Jun 2011 12:15:17 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Du könntest z.B. nur buffer32 reservieren, ab Position fileoffset die gesamte 24er-Datei ablegen, und dann von hinten nach vorne die 24-Bit-Werte als 32er an ihre endgültige Position verschieben/konvertieren. Damit kannst Du dir den zusätzlichen Puffer ganz sparen.</p>
</blockquote>
<p>Habe das jetzt mit einer memmove/memset - Schleife gemacht. Funktioniert hervorragend schnell!</p>
<p>Dank und Gruß<br />
Thomas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2083165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2083165</guid><dc:creator><![CDATA[TJF]]></dc:creator><pubDate>Fri, 24 Jun 2011 12:15:17 GMT</pubDate></item></channel></rss>