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

Файли AIFF і IFF ідентичні, а будь-який файл IFF починається з чотирьох символів FORM Далі слід 4-байтна довжина і код типу B даному випадку нас цікавлять тільки типи AIFF і AIFFC

Лістинг 181 Ідентифікація файлу у форматі AIFF

bool IsAiffFile(istream &ampfile) {

fileseekg (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, про який йшла мова в попередньому розділі

Лістинг 182 Програма aiffh

#include &quotaudioh&quot

#include &quotcompressh&quot

bool IsAiffFile(istream &ampfile)

class AiffRead: public AudioAbstract {

private:

istream &amp _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 &amp s)

~AiffRead()

size_t GetSamples(AudioSample *buffer, size_t numSamples)

size_t ReadBytes(AudioByte *buffer, size_t numSamples)

}

Досить розлогий макрос ChunkName перетворює чотири символи в оди-

ний 32-бітний код Такі коди широко використовуються

Лістинг 183 Програма aiffcpp

#include &quotaiffh&quot

#include &quotcompressh&quot

#include &quotg711h&quot

#include &quotimaadpcmh&quot

#include &ltcstdlib&gt

#define ChunkName(a,b,c,d) (                            \ ((static_cast&ltunsigned long&gt(a)&amp255)&lt&lt24)           \

+ ((static_cast&ltunsigned long&gt(b)&amp255)&lt&lt16)            \

+ ((static_cast&ltunsigned long&gt(c)&amp255)&lt&lt8)             \

+ ((static_cast&ltunsigned long&gt(d)&amp255)))

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

cerr &lt&lt &quotFile Format: Apple AIFF/AIFF-C\n"

_decoder = 0

_formatData = 0

_formatDataLength = 0

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

}

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = A Programmers Guide to Sound: Пер з англ М: ДМК Пресс, 2000 432 с, іл (Серія «Для програмістів»)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*