Ідентифікація файлів aiff

Файли 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(A) 255)<<24) \

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

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

Схожі статті