Відкриття звукового файлу

Зазвичай користувачі не замислюються про формати файлів, вважаючи, що, якщо у файлі записана музика, вони можуть її відтворити Розглянута нижче функція спрощує ситуацію, створюючи обєкт, відповідний для читання інформації з файлу будь-якого підтримуваного типу B його основі лежать написані для кожного файлового формату функції IsXxxxFile

Лістинг 54 Програма openh

#include                         &quotaudioh&quot

#include                         &ltistream&gt AudioAbstract *OpenFormat(istream &amp file)

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

Проте, щоб визначити формат файлу, вам доведеться кілька разів повертатися на його початок Це не виключає можливості зчитування даних з каналу або в мережі (жодна з цих операцій установки покажчика не зажадає зворотного переміщення більш, ніж на 1024 байт, що припустимо у випадку відповідним чином буферизованного класу istream) Проте, якщо ви плануєте використовувати ці функції для роботи з потоковими даними, іноді необхідно це враховувати

Лістинг 55 Програма opencpp

#include &quotopenh&quot

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

#include &quotmpegh&quot // MPEG Audio File

#include &quotauh&quot   // Sun AU / NeXT SND

#include &quotvoch&quot  // Creative Labs VOC

#include &quotwavh&quot  // Microsoft RIFF WAVE

#include &quotaiffh&quot // Apple AIFF, Apple AIFF-C

#include &quotiffh&quot  // Electronic Arts IFF/8SVX

#include &quotmidih&quot // MIDI File

#include &quotmodh&quot  // ProTracker MOD AudioAbstract *OpenFormat(istream &ampfile) {

if (IsVocFile(file)) {

fileseekg(0)

return new VocRead(file)

}

if (IsAuFile(file)) {

fileseekg(0)

return new AuRead(file)

}

if (IsWaveFile(file)) {

fileseekg(0)

return new WaveRead(file)

}

if (IsAiffFile(file)) {

fileseekg(0)

return new AiffRead(file)

}

if (IsIffFile(file)) {

fileseekg(0)

return new IffRead(file)

}

if (IsMidiFile(file)) {

fileseekg(0)

return new MidiRead(file)

}

if (IsModFile(file)) {

fileseekg (0)

return new ModRead(file)

}

if (IsMpegFile(file)) {

fileseekg(0)

return new MpegRead(file)

}

/ / Формат файлу не розпізнаний

cerr &lt&lt &quotI dont recognize this format\n"

return 0

}

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

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

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

*

*