Peter
Ich schlage deshalb folgende Loesung vor, die allerdings noch nicht ganz fertig ist:
/**
* Die Methode Konvertiert ein in buf abgespeichertes Sample
* in einen Wert vom Typ Sample. buf muss die Groesse
* vBytesInSample haben.
*
* Die Methode ist eine Modifikation von AudioFile::calcSampAmp(Byte[])
*/
Sample AudioFile::calcSampAmp(Byte[] buf) {
Sample s;
uint32 i = vBytesInSample - 1;
uint32 v = static_cast<uint32>buf[i--]; // sicher, da
Byte unsigned
// und 8 bit groß ist
while (i >= 0)
v = 256 * v + static_cast<int32>buf[i--];
// jetzt ist das Sample als ein 32 bit unsigned integer in
v
// abgespeichert; der Typ Sample ist aber ein signed Typ!
// D.h. wir brauchen noch eine Konversion uint32 -> Sample.
// Wie soll sie aussehen?
s = ...
return s;
}
Natürlich muß noch sicher gestellt werden, daß die Größe der Samples in Bytes die Größe von uint32 nicht übersteigt. Eine Möglichkeit wäre:
AudioFile::open(string filename) _throw_exception_ {
...
if (vBytesInSample > sizeof (uint32))
throw Exception("AudioFile::open() - Samples
sind zu gross fuer die verwendeten Typen.");
...
}
Falls Sample zu klein für die Werte vom Typ uint32 ist, muß die Konversionsmethode eine Art "Kompression" vornehmen.
Peter