Главная » Программирование звука » Открытие звукового файла

0

Обычно   пользователи   не   задумываются   о   форматах   файлов,   считая,   что, если  в  файле  записана  музыка,  они  могут  ее  воспроизвести.  Рассмотренная  ниже функция  упрощает  ситуацию,  создавая  объект,  подходящий  для  чтения  информации  из  файла  любого  поддерживаемого  типа.  B  его  основе  лежат  написанные  для каждого файлового формата функции IsXxxxFile.

Листинг 5.4. Программа open.h

#include                         "audio.h"

#include                         <istream> AudioAbstract *OpenFormat(istream & file) ;

Большая  часть  обработчиков  файлов  различных  форматов,  о  которых  я  буду рассказывать, могут работать с потоками данных, то есть код написан так, что программа  может  считывать  данные  и  обрабатывать  их  на  лету  по  мере  доступности. Данное  свойство  позволяет  с  помощью  этих  классов  считывать  данные  в  сети  или из  каналов  UNIX  так  же  легко,  как  и  из  файлов,  расположенных  на  локальных компьютерах.

Тем  не  менее,  чтобы  определить  формат  файла,  вам  придется  несколько  раз возвращаться  на  его  начало.  Это  не  исключает  возможности  считывания  данных из канала или в сети (ни одна из этих операций установки указателя  не потребует обратного  перемещения  более,  чем  на  1024  байт,  что  допустимо  в  случае  соответствующим  образом  буферизованного  класса  istream).  Тем  не  менее,  если  вы  планируете  использовать  эти  функции  для  работы  с  потоковыми  данными,  иногда необходимо это учитывать.

Листинг 5.5. Программа open.cpp

#include "open.h"

// Подключаем  заголовки  для различных форматов;

#include "mpeg.h" // MPEG Audio File;

#include "au.h"   // Sun AU / NeXT SND;

#include "voc.h"  // Creative Labs VOC;

#include "wav.h"  // Microsoft RIFF WAVE;

#include "aiff.h" // Apple AIFF, Apple AIFF-C;

#include "iff.h"  // Electronic Arts IFF/8SVX;

#include "midi.h" // MIDI File;

#include "mod.h"  // ProTracker MOD. AudioAbstract *OpenFormat(istream &file) {

if (IsVocFile(file)) {

file.seekg(0);

return new VocRead(file);

}

if (IsAuFile(file)) {

file.seekg(0);

return new AuRead(file);

}

if (IsWaveFile(file)) {

file.seekg(0);

return new WaveRead(file);

}

if (IsAiffFile(file)) {

file.seekg(0);

return new AiffRead(file);

}

if (IsIffFile(file)) {

file.seekg(0);

return new IffRead(file);

}

if (IsMidiFile(file)) {

file.seekg(0);

return new MidiRead(file);

}

if (IsModFile(file)) {

file.seekg (0);

return new ModRead(file);

}

if (IsMpegFile(file)) {

file.seekg(0);

return new MpegRead(file);

}

// Формат   файла  не   распознан.

cerr << "I don’t recognize this format.\n";

return 0;

}

Порядок  следования  функций  проверки  формата  файла  не  совсем  случаен. Проверка  на  соответствие  форматам  с  четко  определенными  сигнатурами  проводится  в первую  очередь, так  как шансы  ложного определения  формата минимальны.  Соответствие  форматам  с  менее  четкими  сигнатурами  проводится  в  последнюю   очередь.   Наибольшее   беспокойство   вызывают   форматы   MPEG   и   MOD. Сигнатура  формата  MPEG  занимает  меньше  2  байт(12  бит).  У  формата  MOD  четырехбайтная  сигнатура,  но  она  расположена  не  в  начале  файла.  Это  повышает вероятность того, что в файле какого-нибудь другого формата случайным образом встретится последовательность из этих 4 байт.

У   большинства   из   рассмотренных   форматов   файлов   сигнатуры   находятся в  начале  файла,  что  уменьшает  вероятность  имитации  одного  типа  файла  другим. B этом отношении особенно хорош формат VOC. B начале файла этого формата  находится  20-байтная  сигнатура.  Шансы,  что  эта  последовательность  случайно встретится в начале файла другого формата, очень невелики.

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

По теме:

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