Главная » Программирование звука » Запись файлов AU

0

Запись   файлов   AU   производится   аналогичным   образом.   Процедура   записи файлов  AU   это,  по  существу,  объект  проигрывателя,  поэтому  он  наследует  от AbstractPlayer и  реализует  метод  Play  для  записи  данных.  Конструктор  принимает и сохраняет выходной поток.

Листинг 15.6. Члены класса AuWrite

private:

ostream &_stream;

public:

AuWrite(AudioAbstract *audio, ostream &output = cout)

:AbstractPlayer(audio),_stream(output) {

};

Поскольку   AuWrite   это   класс   проигрывателя,   ему   необходима   функциячлен  Play для  выполнения  реальной  работы.  Так  как  файлы  AU  могут  иметь  множество   форматов,   согласование   последних,   используемое   по   умолчанию,   будет осуществляться должным образом.

Листинг 15.6. Члены класса AuWrite (продолжение)

public:

void Play(void);

Эта  версия  записывает  файлы  только  в  16-битном  линейном  формате.  Достаточно  просто  добавить  поддержку  для  8-битной  мю-функции  или  других  выходных форматов.

WriteBuffer непосредственно  преобразует  буфер  отсчетов  в  буфер  байтов. Каждый   отсчет   занимает   два   байта,   представляя   знаковое   16-битное   значение формата MSB.

Листинг 15.7. Реализация класса AuWrite

static void WriteBuffer

(ostream &out, AudioSample *buffer, int length) { AudioSample *sampleBuff = buffer;

AudioByte *byteBuff =

reinterpret_cast<AudioByte *>(buffer);

int i = length;

while (i–>0) {

int sample = *sampleBuff++;

*byteBuff++ = sample >> 8;

*byteBuff++ = sample;

}

out.write(reinterpret_cast<char *>(buffer),length*2);

};

void AuWrite::Play(void) {

int samplingRate = SamplingRate();

int channels = Channels();

// Запись заголовка  AU-файла.

_stream.write(".snd",4);        // "Волшебный".

WriteIntMsb(_stream,28L,4);           // Длина   заголовка.

WriteIntMsb(_stream,0x7FFFFFFFL,4);   // Длина   данных. WriteIntMsb(_stream,3L,4);            // 1б-битный  линейный. WriteIntMsb(_stream,samplingRate,4); // Частота дискретизации. WriteIntMsb(_stream,channels,4);      // Число  каналов. WriteIntMsb(_stream,0,4);             // Для  выравнивания.

// Читаем аудиоданные

// и  пишем  их  в файл.

long length;

do {

const int BuffSize = 10240; AudioSample buff[BuffSize];

length = Previous()->GetSamples(buff,BuffSize);

WriteBuffer(_stream,buff,length);

} while (length > 0);

}

Простой фильтр AU

Вашему  вниманию  представлена  простейшая  программа,  использующая  вышеприведенные классы в тестовых целях. Просто прочитывает и записывая одни и те же  аудиоданные  в  общий  формат,  она  преобразует  их  из  мю-кодировки  в  формат

16-битной линейной ИКМ.

Листинг 15.8. Программа autoau.cpp

#include "au.h"

int main(int, char **) {

AuRead auIn; // Читаем из  ‘cin’.

AuWrite auOut(&auIn); // Пишем в ‘cout’.

auOut.Play() ;

return 0;

}

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

По теме:

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