Главная » Программирование звука » Класс WaveRead

0

Как и для других файловых форматов, для работы с форматом WAVE определите  отдельный  класс  WaveRead.  Чтобы  воспользоваться  этим  классом,  откройте файл и проинициализируйте этим файлом новый объект класса WaveRead.

Задача WaveRead, как и большей части файловых классов, заключается  в том,

чтобы   отслеживать   состояние   определенного   потока   данных   и   декодирующего

объекта.  Кроме  того,  в  WaveRead хранится  копия  информации  о  формате  звуковых  данных.  Так  как  размер  данных  о  формате  может  изменяться  в  зависимости от  используемого  метода  компрессии,  приходится  динамически  выделять  подданные память в момент их получения.

Листинг 17.2. Программа wav.h

#include "audio.h"

#include "compress.h"

bool IsWaveFile(istream &file);

class WaveRead: public AudioAbstract {

private:

istream & _stream;

AbstractDecompressor *_decoder;  // Используемый  декомпрессор.

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

unsigned long _formatDataLength; // Длина   блока формата.

public:

WaveRead(istream & s);

~WaveRead() ;

};

«Многословный»   макрос   ChunkName преобразует   четыре   символа   в   единый

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

структор  и  деструктор  должны,  соответственно,  проинициализировать  и  очистить переменные-указатели.

Листинг 17.3. Программа wav.cpp

#include "wav.h"

#include "compress.h"

#include "imaadpcm.h"

#include "g711.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)))

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

// Формат   файла: Microsoft WAVE.

cerr << "File Format: Microsoft WAVE\n";

_decoder = 0;

_formatData = 0;

_formatDataLength = 0;

}

WaveRead::~WaveRead() {

if (_decoder) delete _decoder;

if(_formatData) { delete [] _formatData; }

}

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

По теме:

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