Главная » Программирование звука » Идентификация файлов AIFF

0

Файлы  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’))

return true;

if (type == ChunkName(‘A’,’I’,’F’,’C))

return true;

return false;         // Файл  IFF, но   не   AIFF или   AIFF-C.

}

Класс AiffRead

Для  работы  с  файлами  AIFF  и  AIFF-C  мы  определим  один  класс  AiffRead. Чтобы   использовать   его,   откройте   файл   и   проинициализируйте   новый   объект AiffRead открытым файлом.

Класс AiffRead похож на WaveRead, о котором шла речь в предыдущей главе.

Листинг 18.2. Программа aiff.h

#include "audio.h"

#include "compress.h"

bool IsAiffFile(istream &file);

class AiffRead: public AudioAbstract {

private:

istream & _stream;

AbstractDecompressor *_decoder;       // Используемый  объект-

// декомпрессор.

void InitializeDecompression();

unsigned char *_formatData;           // Содержимое блока  COMM.

unsigned long _formatDataLength;      // Длина   данных

// в блоке COMM.

void MinMaxSamplingRate(long *min, long *max, long

*preferred);

void MinMaxChannels(int *min, int *max, int *preferred);

public:

AiffRead(istream & s);

~AiffRead();

size_t GetSamples(AudioSample *buffer, size_t numSamples);

size_t ReadBytes(AudioByte *buffer, size_t numSamples);

};

Довольно пространный макрос ChunkName преобразует четыре символа в еди-

ный 32-битный код. Такие коды широко используются.

Листинг 18.3. Программа aiff.cpp

#include "aiff.h"

#include "compress.h"

#include "g711.h"

#include "imaadpcm.h"

#include <cstdlib>

#define ChunkName(a,b,c,d) (                            \ ((static_cast<unsigned long>(a)&255)<<24)           \

+ ((static_cast<unsigned long>(b)&255)<<16)            \

+ ((static_cast<unsigned long>(c)&255)<<8)             \

+ ((static_cast<unsigned long>(d)&255)))

AiffRead::AiffRead(istream & s): _stream(s) {

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

_decoder = 0;

_formatData = 0;

_formatDataLength = 0;

AiffRead::~AiffRead() { if(_decoder) delete _decoder; if(_formatData) { delete [] _formatData; }

}

Источник: Кинтцель Т.  Руководство программиста по работе со звуком = A Programmer’s Guide to Sound: Пер. с англ. М.: ДМК Пресс, 2000. 432 с, ил. (Серия «Для программистов»).

По теме:

  • Комментарии