Читання файлів AU

Всі класи читання аудіофайлів, які ми побудуємо, мають схожу основу Як було показано на рис 101, коли у класу файлу запитуються відліки, він направляє закид до обєкта декодера

Лістинг 154 Члени класу AuRead

private:

istream &amp_stream

AbstractDecompressor *_decoder

public:

AuRead(istream &ampinput = cin):AudioAbstract(),_stream(input) {

/ / Формат файлу: Sun AU

/ / (Також відомий як NeXT SND)

cerr &lt&lt &quotFile Format: Sun AU (also known as NeXT SND)\n"

_headerRead = false / / Тема ще не читали

_decoder = 0

}

~AuRead() {

if (_decoder) delete _decoder

}

size_t GetSamples(AudioSample *buffer, size_t numSamples) {

return _decoder-&gtGetSamples(buffer,numSamples)

}

Обєкт декодера буде, у свою чергу, викликати метод ReadBytes для отримання необроблених байтів з файлу Для файлів AU метод ReadBytes простий: він запитує з потоку дані і веде їх підрахунок, гарантуючи тим самим, що після закінчення даних зчитування не проводиться

Лістинг 154 Члени класу AuRead (продовження)

private:

size_t _dataLength

public:

size_t ReadBytes(AudioByte *buffer, size_t length)

Лістинг 155 Реалізація класу AuRead

size_t AuRead::ReadBytes(AudioByte *buffer, size_t length) {

if (length &gt _dataLength) { length = _dataLength }

_streamread(reinterpret_cast&ltchar *&gt(buffer),length)

size_t lengthRead = _streamgcount()

_dataLength = lengthRead

return lengthRead

}

Єдине, що залишається, прочитати заголовок файлу і провести согласен-

вання відповідно до параметрів файлу

Лістинг 154 Члени класу AuRead (продовження)

private:

bool _headerRead / / Істина, якщо заголовок вже прочитаний

int _headerChannels / / Канали з заголовка

int _headerRate / / Частота дискретизації із заголовка

void ReadHeader(void)

Проводячи узгодження формату даних між обєктами, я встановлюю параметри відповідно до характеристик читаного файлу

Лістинг 154 Члени класу AuRead (продовження)

protected:

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

{

ReadHeader()

*min = *max = *preferred = _headerRate

}

void MinMaxChannels(int *min, int *max, int *preferred) { ReadHeader()

*min = *max = *preferred = _headerChannels

}

}

Крім читання відповідних даних із заголовка важливо пропустити будь-які дані, які слідують за стандартною інформацією Формат AU використовувався як основа для ряду інших форматів, просто додають специфічні для них дані в кінець стандартного заголовка AU Виходити з припущення, що заголовок складе рівно 28 байт, небезпечно

Лістинг 155 Реалізація класу AuRead (продовження)

void AuRead::ReadHeader(void) {

if (_headerRead) return

_headerRead = true

char header[24]

_streamread(header,24)

long magic = BytesToIntMsb(header+0,4)

if (magic = 0x2E736E64) {     // &quot.snd&quot.

/ / Формат вихідного файлу

/ / Відрізняється від AU

cerr &lt&lt &quotInput file is not an AU file\n"

exit(1)

}

long headerLength = BytesToIntMsb(header+4,4)

_dataLength = BytesToIntMsb(header+8,4)

int format = BytesToIntMsb(header+12,4)

_headerRate = BytesToIntMsb(header+16,4)

_headerChannels = BytesToIntMsb (header +20,4) SkipBytes (_stream, headerLength 24) / / Відкидаємо

/ / Що залишилася

/ / Частина заголовка

/ / Створюємо підходящий обєкт-декомпрессор

switch(format) {

case 1: / / ITU G711 мю-функція

_decoder = new DecompressG711MuLaw(*this)

break

case 2: / / 8-бітний лінійний

_decoder = new DecompressPcm8Unsigned(*this)

break

case 3: / / 16-бітний лінійний

_decoder = new DecompressPcm16MsbSigned(*this)

break

default:

/ / AU формат … не підтримується

cerr &lt&lt &quotAU format &quot &lt&lt format &lt&lt &quot not supported\n"

exit(1)

}

/ / Частота дискретизації:

cerr &lt&lt &quotSampling Rate: &quot &lt&lt _headerRate

/ / Канали:

cerr &lt&lt &quot Channels: &quot &lt&lt _headerChannels

cerr &lt&lt &quot\n"

Джерело: Кінтцель Т Керівництво програміста по роботі зі звуком = 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>

*

*