Identificarea fișierelor aiff

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(a) 255)<<24) \

AiffRead :: AiffRead (istream s): _stream (e)

cerr <<"File Format: Apple AIFF/AIFF-C\n";







Articole similare

Trimiteți-le prietenilor: