Файли AIFF і IFF ідентичні, а будь-який файл IFF починається з чотирьох символів FORM. Далі слід 4-байтная довжина і код типу. B даному випадку нас цікавлять тільки типи AIFF і AIFFC.
Лістинг 18.1. Ідентифікація файлу в форматі AIFF
bool IsAiffFile (istream file)
file.seekg (0); // Пошук початку файлу. unsigned long form = ReadIntMsb (file, 4);
if (form! = ChunkName ( 'F', 'O', 'R', 'M'))
return false; // He IFF-файл.
SkipBytes (file, 4); // Пропускаємо довжину блоку.
unsigned long type = ReadIntMsb (file, 4);
if (type == ChunkName ( 'A', 'I', 'F', 'F'))
if (type == ChunkName ( 'A', 'I', 'F', 'C))
return false; // Файл IFF, але не AIFF або AIFF-C.
Для роботи з файлами AIFF і AIFF-C ми визначимо один клас AiffRead. Щоб використовувати його, відкрийте файл і проініціалізіруйте новий об'єкт AiffRead відкритим файлом.
Клас AiffRead схожий на WaveRead, про який йшла мова в попередньому розділі.
Лістинг 18.2. програма aiff.h
bool IsAiffFile (istream file);
class AiffRead: public AudioAbstract
istream _stream;
AbstractDecompressor * _decoder; // Використовуваний об'єкт-
unsigned char * _formatData; // Вміст блоку COMM.
unsigned long _formatDataLength; // Довжина даних
void MinMaxSamplingRate (long * min, long * max, long
void MinMaxChannels (int * min, int * max, int * preferred);
AiffRead (istream s);
size_t GetSamples (AudioSample * buffer, size_t numSamples);
size_t ReadBytes (AudioByte * buffer, size_t numSamples);
Досить розлогий макрос ChunkName перетворює чотири символи в еди-
ний 32-бітний код. Такі коди широко використовуються.
Лістинг 18.3. програма aiff.cpp
#define ChunkName (a, b, c, d) (\ ((static_cast
AiffRead :: AiffRead (istream s): _stream (s)
cerr <<"File Format: Apple AIFF/AIFF-C\n";