Index  Referenz Richtlinien Bemerkungen 

FAQ

Hier sollen Unklarheiten beseitigt werden.

Abtastwerte in WAV-Dateien

Sind die Amplituden im WAV-Format "signed" oder "unsigened"?

Peter

Cast-sicheres Einlesen der Abtatswerte

Zur Zeit können nur 1 Byte große Samples problemlos und sicher eingelesen werden. Von den Formaten mit mehr als einem Byte pro Sample kann nur "linear 16 bit" gelesen werden. Zu diesem Zweck wird eine explitite Typkonversion vorgenommen. Keine besonders gute Loesung.

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


Last modified: $Id: faq.htm,v 1.1 1998/02/09 12:59:55 tomczyk Exp $