Запис файлів AU

проводиться аналогічним чином Процедура запису файлів AU це, по суті, обєкт програвача, тому він успадковує від AbstractPlayer і реалізує метод Play для запису даних Конструктор приймає і зберігає вихідний потік

Лістинг 156 Члени класу AuWrite

private:

ostream &amp_stream

public:

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

:AbstractPlayer(audio),_stream(output) {

}

Оскільки AuWrite це клас програвача, йому необхідна функціячлен Play для виконання реальної роботи Так як файли AU можуть мати безліч форматів, узгодження останніх, використовується за умовчанням, здійснюватиметься належним чином

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

public:

void Play(void)

Ця версія записує файли тільки в 16-бітному лінійному форматі Досить просто додати підтримку для 8-бітної мю-функції або інших вихідних форматів

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

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

static void WriteBuffer

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

AudioByte *byteBuff =

reinterpret_cast&ltAudioByte *&gt(buffer)

int i = length

while (i–&gt0) {

int sample = *sampleBuff++

*byteBuff++ = sample &gt&gt 8

*byteBuff++ = sample

}

outwrite(reinterpret_cast&ltchar *&gt(buffer),length*2)

}

void AuWrite::Play(void) {

int samplingRate = SamplingRate()

int channels = Channels()

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

_streamwrite (. 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()-&gtGetSamples(buff,BuffSize)

WriteBuffer(_stream,buff,length)

} while (length &gt 0)

}

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

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

16-бітної лінійної ІКМ

Лістинг 158 Програма autoaucpp

#include &quotauh&quot

int main(int, char **) {

AuRead auIn / / Читаємо з cin.

AuWrite auOut (& auIn) / / Пишемо в cout.

auOutPlay()

return 0

}

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

*

*