Fișierele AIFF și IFF sunt identice, iar orice fișier IFF începe cu patru caractere FORM. Apoi urmează lungimea și tipul de cod de 4 octeți. În acest caz, suntem interesați numai de tipurile AIFF și AIFFC.
Listing 18.1. Identificarea unui fișier AIFF
bool IsAiffFile (istream fișier)
file.seekg (0); // Găsiți începutul fișierului. formular lung nesemnat = ReadIntMsb (fișier, 4);
dacă (forma! = ChunkName ('F', 'O', 'R', 'M'))
return false; // Fișier IFF.
SkipBytes (fișier, 4); // Săriți lungimea blocului.
tipul nesemnificativ lung = ReadIntMsb (fișier, 4);
dacă (tip == ChunkName ("A", "I", "F", "F"))
dacă (tip == ChunkName ("A", "I", "F", "C"))
return false; // fișier IFF, dar nu AIFF sau AIFF-C.
Pentru a lucra cu fișierele AIFF și AIFF-C, definim o clasă AiffRead. Pentru ao folosi, deschideți fișierul și inițializați noul obiect AiffRead cu un fișier deschis.
Clasa AiffRead este similară cu cea a WaveRead, care a fost discutată în capitolul precedent.
Listarea 18.2. Programul aiff.h
bool IsAiffFile (istream fișier);
clasa AiffRead: public AudioAbstract
istream _stream;
AbstractDecompressor * _decoder; // Object-
nesignificat char * _formatData; // Conținutul blocului COMM.
nesemnate longformatDataLength; // Lungimea datelor
void MinMaxSamplingRate (lung * min, lung * max, lung
void MinMaxChannels (int * min, int * max, int * preferat);
AiffRead (istream s);
size_t GetSamples (tampon AudioSample *, size_t numSamples);
size_t ReadBytes (tampon AudioByte *, size_t numSamples);
Un macro destul de mare ChunkName convertește patru caractere într-un singur caracter.
Codul pe 32 de biți. Astfel de coduri sunt utilizate pe scară largă.
Listing 18.3. Programul aiff.cpp
#define ChunkName (a, b, c, d) (\ ((static_cast
AiffRead :: AiffRead (istream s): _stream (e)
cerr <<"File Format: Apple AIFF/AIFF-C\n";