[ English | Español | Pyccκuú ]

μFMOD v1.25 для Linux (i386)

uFMOD - это компактная, шустрая, надёжная, мультиплатформенная библиотека для качественного воспроизведения аудио в формате XM, разработанная полностью на ассемблере. XM может храниться в отдельном файле или предварительно загружен в память. Поддерживаются также битые и не совсем стандартные файлы. Библиотека распространяется с открытым исходным кодом и примерами для следующих компиляторов: GCC, Tcl/Tk, PureBasic, BlitzMax, FreeBASIC, FreePascal, FASM, NASM и GAS.

 
OSS, ALSA или OpenAL?

uFMOD для Linux поддерживает OSS, ALSA и OpenAL. Все 3 подсистемы имеют свои плюсы и минусы. ALSA является встроенной по умолчанию аудио системой в большинстве дистрибутивов Linux на базе ядра 2.6.x. С другой стороны, OSS поддерживается в дистрибутивах на базе 2.4.x и старше (такие уже пора относить к разряду анахронизмов). Поэтому многие считают OSS устаревшей системой, а ALSA - её достойной заменой. На самом деле всё сложнее, так как существуют коммерческие драйверы OSS для узкоспециализированных приложений. Некоторые звуковые карты поддерживаются не полностью или совсем не поддерживаются в ALSA, а в OSS их вполне можно использовать. Обратное тоже верно. В настоящее время, ALSA поддерживается только в Linux, тогда как OSS доступна и на многих других Unix-подобных системах, например: FreeBSD, Solaris и т.д. ALSA и OpenAL навязывают использование динамической библиотеки (libasound.so и libopenal.so соответственно), а это затрудняет или даже делает невозможной разработку статических приложений, без лишних зависимостей. Среди плюсов ALSA можно выделить высокую производительность на современных звуковых карточках, поддержку плагинов (виртуальных звуковых устройств), полную эмуляцию драйверов OSS для поддержки приложений, использующих OSS, и т.д. OpenAL кроссплатформенна (доступны версии для Windows, Linux, Macintosh и т.д.), поддерживает аппаратное ускорение эффектов 3D-окружения, что очень полезно для разработчиков игр. Для разработки приложений с использованием OpenAL необходимо скачать и установить соответствующий пакет, если он у Вас ещё не установлен. Если вы не уверены какую версию uFMOD выбрать для своего проекта, скорее всего вам больше подойдёт стандартная версия с OSS, так как она проще в использовании: для воспроизведения звука достаточно добавить всего лишь пару строчек кода. Версия с OSS для Linux полностью совместима на уровне исходных кодов с версиями WINMM для Win32 и OSS для Unix/BSD. Это позволяет писать мультиплатформенные приложения! Для приложений, ориентирующихся исключительно под Linux на ядре 2.6.x и новее, имеет смысл использовать ALSA. OpenAL также годится для мультиплатформенных проектов, в особенности в области игр.

 
Утилиты

В комплект включена пара бесплатных утилит для использования совместно с uFMOD: XMStrip и Eff. Обе утилиты заточены под консольный терминал. Графический интерфейс (GUI) доступен средствами Tcl/Tk. effgui и xmstripgui являются графическими расширениями eff и xmstrip соответственно. Обычно, для запуска скрипта Tcl/Tk в интерпретаторе, достаточно дважды щёлкнуть по файлу скрипта в графическом окружении, если Tcl/Tk установлен и настроен в системе. В некоторых конфигурациях популярных дистрибутивов требуется ввод команды wish ./<имя_скрипта> в эмуляторе терминала или выполнение более сложных действий для запуска нужного скрипта. Режим GUI интуитивно понятен. Давайте рассмотрим консольный интерфейс.

 SVN  Исходники доступны через SVN 

XMStrip обрабатывает заданный XM файл с целью уменьшения размера, без потери качества звучания. В процессе обработки, XMStrip удаляет неиспользующиеся инструменты и партитуры, вырезает комментарии и перепаковывает внутренние структуры файла для уменьшения размера и повышения скорости загрузки. Для начала, откроем терминал и введём ./xmstrip чтобы получить следующее сообщение:

 USAGE:  xmstrip [options] file [output]
         file   - input file name.
         output - optional output file name.          
 options:
  -c - clean only (don't strip)
 When [output] is not specified, XMSTRIP
 attempts to overwrite the input. If file
 name contains spaces, enclose it in "".

Если имя сохраняемого файла не указано, XMStrip перезапишет заданный файл. Если имя файла содержит пробелы, его необходимо заключить в кавычки ("").

Имейте в виду, что другие проигрыватели XM файлов, возможно, откажутся воспроизводить файл, обработанный XMStrip. Опция -c предусмотрена для восстановления таких файлов или обработки обычных XM файлов, которые планируется проигрывать не только в uFMOD.

Eff предназначается для опытных кодеров, желающих сэкономить каждый байт в своих приложениях. Для этого нужно выделить только те функции uFMOD, которые действительно будут использованы в целевом приложении, перекомпилировать библиотеку и получить наименьший возможный размер. Вот, что выдаёт ./eff :

 USAGE:  eff [options] file
         file - input file name
         options:
          /Dm - generate a masm32/tasm dump
          /Dd - generate a Pascal (Delphi) dump
          /Dc - generate a C/C++ dump
          /Ds - generate an RCDATA resource dump
          /Di - disable infoAPI:
                    uFMOD_GetStats, uFMOD_GetRowOrder,
                    uFMOD_GetTitle and uFMOD_GetTime
          /Dp - disable uFMOD_Pause, uFMOD_Resume
                    and XM_SUSPENDED
          /Dv - disable volume control
          /Dj - disable Jump2Pattern
          /Df - disable loading XM from file
          /Dl - disable XM_NOLOOP
          /M  - mark & clear unused chunks of
                data in a masm32/tasm compatible dump

Последний параметр - имя XM файла, на использование которого ориентируются следующие параметры оптимизации:

Eff создаёт файл EFF.INC и, согласно заданным опциям, текстовый дамп. Рассмотрим несколько одинаковых примеров (все верны):

eff /Dmpvjfl /M file.xm
eff /M /Dm /Dp /Dv /Dj /Df /Dl file.xm
eff -M -Dmpvjfl file.xm

Любой из предыдущих примеров создаст ассемблерный дамп, выделит "дыры" и предварительно заполнит их нулями. Файл EFF.INC содержит список эффектов XM, которые действительно используются в заданном файле, и некоторые дополнительные флаги для отключения pause/resume, регулятора громкости, Jump2Pattern, поддержки файлов и XM_NOLOOP. Поместите этот новый EFF.INC в ufmodlib/src/ и перекомпилируйте библиотеку (в следующем разделе освещены некоторые вопросы касающиеся компиляции исходников библиотеки). Теперь у Вас имеется свой собственный оптимизированный билд uFMOD, но имейте в виду, что в этом билде включены не все эффекты XM. Поэтому, не следует использовать его для проигрывания других XM файлов, отличных от обработанного утилитой Eff!

 
Компиляция библиотеки

Необходимость компиляции исходников библиотеки uFMOD возникает при использовании утилиты Eff, а также для включения особых режимов и опций, которые отключены в сборке по умолчанию (см. таблицу Опции ниже). Для тех, кто хочет попрактиковаться в ассемблере и/или разобраться в библиотеке на самом низком уровне, и предназначен данный раздел.

Исходники uFMOD расположены в ufmodlib/src/:

Следующим после внесения изменений в исходники шагом является компиляция. Выберите один из makefile'ов в ufmodlib/, в зависимости от целевого компилятора, для которого нужно собрать библиотеку. Следующая таблица поможет сделать выбор:

MakefileКомпилятор(ы)Комментарии
MakefileGCC, Tcl/Tk, FreeBASIC, FreePascal, FASM, NASM, GASПользователи FreePascal должны установить значение LIB в опции UF_FMT перед сборкой. Все остальные должны установить значение OBJ.
FreeBASIC, FreePascal, FASM и NASM также являются проектами SourceForge!
MakePBPureBasic
MakeBModBlitzMax
make.batGCC, Tcl/Tk, FreeBASIC, FreePascal, FASM, NASM, GASЭто батник, которым можно собрать uFMOD для Linux из Win32.

Теперь откройте выбранный makefile или батник в текстовом редакторе. Всё, что находится между следующих строк:

*** CONFIG START
и
*** CONFIG END
подлежит настройке. При кросс-компиляции из Win32 требуется дополнительный шаг (если Вы собираете библиотеку в Linux, пропустите следующий блок):
Обратите внимание на секцию Pathes. Там есть такая опция:
SET UF_NASM=\nasm
Если у Вас установлен NASM, удостоверьтесь, что путь в данной опции указывает точно туда, где находится nasmw.exe. Допустим, NASM установлен в D:\TOOLS\NASM. В таком случае, необходимо скорректировать опцию следующим образом:
SET UF_NASM=D:\TOOLS\NASM
Не все пути необходимы для успешной компиляции. Например, если Вы намерены использовать FASM, не нужно настраивать UF_NASM. Путь в опции UF_ARCH содержит имя файла:
SET UF_ARCH=ar
ar.exe должен находиться в одном из каталогов в списке переменной окружения PATH. Если это не так, необходимо указать полный путь. Предположим, ar.exe находится в C:\Program files\BlitzMax\bin\ar.exe. Тогда опцию UF_ARCH нужно определить следующим образом:
SET UF_ARCH=C:\Program files\BlitzMax\bin\ar.exe
Проверьте правильность всех путей, необходимых для компиляции.
Теперь настройте параметры конфигурации, согласно следующей таблице:

Опция*ОписаниеЗначения*
UF_RAMPДанная опция позволяет настроить механизм интерполяции, который предназначен для погашения щелчков - резкие перепады амплитуды сигнала, характерные для трекерской музыки. С другой стороны, интерполяция вносит искажение в высокочастотные спектральные составляющие сигнала, что иногда бывает заметно. STRONG - это значение по умолчанию, рекомендуемое для большинства приложений. В данном режиме миксер сглаживает резкие перепады амплитуды, применяя линейную 32-ступенчатую интерполяцию. WEAK накладывает лишь 16 ступеней - этот режим менее эффективен, чем STRONG, но зато вероятность деградации сигнала в этом режиме ниже. NONE вообще отключает интерполяцию. Без сглаживания не будет и деградации, но большинство композиций без сглаживания будет звучать заметно хуже из-за наложения щелчков. Особым образом сбалансированные композиции без сглаживания могут звучать лучше.NONE, WEAK, STRONG
UF_FREQЧастота дискретизации (в Гц). 44100 было значением по умолчанию до версии 1.20. Данное значение полезно только для совместимости с системами Linux, установленными поверх эмулятора QEMU. При использовании значения 48КГц воспроизводится более чистый звук на большинстве звуковых карточек и потребляется меньше системных ресурсов. Поэтому, 48000 является новым значением по умолчанию, рекомендуемым для большинства приложений. 22050 предусмотрено для тех, кто ещё помнит славные деньки Amiga.22050, 44100, 48000
UF_FMTСоздать статическую библиотеку (lib*.a) или просто обьектный файл (*.o). Примеры для FreePascal используют статические библиотеки, тогда как все остальные примеры рассчитаны на обьектные файлы.OBJ, LIB
UF_ASMАссемблер. Да, uFMOD можно собирать либо FASM'ом, либо NASM'ом - выбирайте тот, который больше нравится :)FASM, NASM
UF_MODENORMAL - это значение по умолчанию. Ничего особенного. UNSAFE отключает проверку правильности формата XM перед загрузкой композиции. Если Вы уверены, что все композиции, которые будут проигрываться в вашем приложении, корректны (правильность формата XM-файла можно проверить в Eff или XMStrip), можете пересобрать библиотеку в режиме UNSAFE, чтобы выйграть в размере и скорости загрузки. Имейте в виду, что загрузка неправильного XM-файла в режиме UNSAFE может привести к краху! В режиме BENCHMARK доступен счётчик производительности, который хранит точное количество тактов, которое уходит на синтез чуть более 21 мс звука при частоте в 48 КГц. Данный режим предназначен для сравнения производительности различных версий библиотеки. Режим BENCHMARK доступен только в C, FASM, NASM и GAS.NORMAL, UNSAFE, BENCHMARK
* Каждый makefile использует подмножество данных опций и значений.

При использовании Makefile, достаточно запустить GNU Make для компиляции библиотеки: make. При использовании файла с нестандартным именем, его следует указать в параметрах командной строки: make -f Makefile. Запустите makefile или батник, чтобы собрать библиотеку. Вот и всё!

 
Примеры

В каждом из каталогов представлены примеры с использованием всех трёх версий библиотеки: OSS, ALSA и OpenAL. Некоторые примеры сопровождаются откомпилированными экзешниками, чтобы показать минимальный размер, характерный для данного компилятора. Заметьте, что экзешники представлены без сжатия.

Если Вы намериваетесь использовать OpenAL...
Удостоверьтесь, что у Вас установлена последняя стабильная версия OpenAL. Настоятельно рекомендуется использовать как минимум версию 0.0.8. Версия 0.0.7 имеет склонность "подвисать" на несколько секунд при освобождении загруженного контекста. В версии 0.0.6 (эта версия предустановлена в Mandrake 10 и старше) наблюдается серьёзная утечка памяти. RPM'ы с последними стабильными релизами OpenAL можно скачать с официального сайта OpenAL.
КаталогКомпиляторАвтор(ы)Комментарии
TclTkTcl/Tk*Графические плееры XM-файлов.
GccGNU C*Здесь находится графический пример использования функции Jump2Pattern, построенный на GTK. В этом примере проигрывается композитный XM, любезно предоставленный товарищем Kim (он же norki). Описание техники создания и использования подобных композиций можно найти в следующем разделе.

Ещё здесь находится пример динамической загрузки библиотеки OpenAL, который таким образом способен запускаться и в отсутствии libopenal.so.

FasmFlat Assembler*Примеры для FASM, как с использованием линкера от GNU C, так и без (OSS).
NasmNetwide Assembler*Примеры для NASM, как с использованием линкера от GNU C, так и без (OSS).
GasGNU Assembler*
PureBasicPureBasic*Требуется PureBasic 3.81 или новее. Не забудьте поместить библиотеки в [PureBasic]/purelibraries/userlibraries перед компиляцией. Документация для API-функций uFMOD в PureBasic доступна в подкаталоге HELP.

Вы также найдёте здесь полную версию библиотеки OpenAL для PureBasic. uFMOD под OpenAL использует данную библиотеку, но Вы можете задействовать её и в сторонних проектах.

BlitzMaxBlitzMax*, flaithПолная документация (на английском).

Вы также найдёте здесь полную версию модуля OpenAL для BlitzMax. uFMOD под OpenAL использует данный модуль, но Вы можете задействовать его и в сторонних проектах.

FreeBASICFreeBASICvoodooattack, antarmanИспользуется визуализация товарища rel, именуемая Torus.
FreePascalFreePascal*Проверено на FPC версии 2.1.4.

Вы также найдёте здесь полную версию юнита OpenAL для FreePascal. uFMOD под OpenAL использует данный юнит, но Вы можете задействовать его и в сторонних проектах.

* Quantum, Asterix

 
Дополнительное уменьшение размера

Утилита Eff предназначена для оптимизации и уменьшения размера библиотеки uFMOD.

Если Вы собираетесь включить XM статически в экзешник, можете попробовать оптимизировать сначала сам XM. Modplug Player умеет сжимать XM-композиции по схеме APDCM, но учтите, что этот тип сжатия пагубно влияет на качество звучания! Утилита XMStrip перепаковывает XM файл без потери качества.

Если Вы уверены в корректности формата всех композиций, которые будут использованы в приложении, можете пересобрать библиотеку в режиме UNSAFE.

Используйте strip и sstrip для удаления из экзешника лишних данных, вставленных компилятором/линкером. Иногда бывает возможно полностью удалить некоторые секции не нарушая целостности экзешника.

Упаковщики, вроде UPX, умеют ужимать экзешники. Тем не менее, для наглядности, все примеры предоставлены без сжатия!

Дополнительные советы по уменьшению размера исполнимого модуля можно найти в статье Браяна Рейтера (Brian Raiter): "A Whirlwind Tutorial on Creating Really Teensy ELF Executables for Linux".

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

Файл 1 : XM1_HEADER P11 P12 P13     I11 I12
Файл 2 : XM2_HEADER P21 P22 P23 P24 I21 I22 I23 I24
Файл 3 : XM3_HEADER P31             I31
Пояснение: XMn_HEADER - это заголовок n-ного файла. Pnm - это m-ная партитура n-ного файла. Inm - это m-ный инструмент n-ного файла.

Для начала, совместим все 3 композиции без оптимизации инструментов:

Файл 4 : XM4_HEADER P11 P12 P13 P21 P22 P23 P24 P31 I11 I12 I21 I22 I23 I24 I31
Представьте, что I12 очень похож или идентичен I23; I24 и I31 тоже практически одинаковы. Мы можем заставить партитуры P2n использовать I12 вместо I23, а P31 переключить на I24. Тогда мы сможем удалить I23 и I31:
Файл 4 : XM4_HEADER P11 P12 P13 P21 P22 P23 P24 P31 I11 I12 I21 I22 I24
Необходимо скорректировать команды зацикливания и ссылки на партитуры в композициях 2 и 3 после совмещения. Конечно, можно совмещать и большее количество композиций, но формат XM имеет ограничения на максимальное количество партитур и инструментов в файле. Все операции над XM-файлами надлежит проводить в специальном ПО - трекере. Для проигрывания композитного файла достаточно одного вызова функции uFMOD_PlaySong. Далее нужно использовать функцию uFMOD_Jump2Pattern для проигрывания отдельных композиций из общего файла в произвольной последовательности. Например, uFMOD_Jump2Pattern(3) переключится на вторую композицию, uFMOD_Jump2Pattern(7) начнёт проигрывать третью, а uFMOD_Jump2Pattern(0) вернётся обратно к первой. Точные значения индексов стартовых партитур каждой композиции после совмещения легко вычислить в уме, но можно и в трекере подсмотреть :) Gcc/OSS/ содержит реальный пример всего вышесказанного.

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

 
ЧаВо

В: Библиотека uFMOD действительно бесплатна для любого использования, включая коммерческое?
О: Да, текущая версия абсолютно бесплатна для использования в любых целях.

В: Где бы достать композиции в формате XM?
О: The Mod Archive содержит внушительных размеров архив с бесплатными трекерскими композициями в формате XM, IT, S3M и MOD. Open Modplug Tracker умеет конвертировать IT, S3M и MOD в XM без потери качества. В сети много талантливых композиторов, которые бесплатно выкладывают свои работы. Не забывайте указывать соответствующие пометки об авторстве!

В: Существует ли какая-либо связь между проектом uFMOD и разработками Firelight Technologies®: FMOD и miniFMOD?
О: На данный момент никакой связи уже нет. До 2004го года включительно проект uFMOD основывался на исходных кодах библиотеки miniFMOD. С тех пор, код uFMOD был полностью переписан, оснащён новыми функциями, оптимизирован и отлажен. Таким образом, uFMOD более не связан ни с FMOD, ни с miniFMOD.

В: Некоторые разработчики утверждают, что их библиотеки увеличивают экзешники на N-ное количество килобайт. На сколько килобайт увеличивается размер экзешника при использовании uFMOD?
О: Точного ответа на этот вопрос нет, так как этот размер зависит от многих факторов: используемые характеристики библиотеки (особенно при использовании утилиты Eff), основной код программы, размер XM-файла (если XM включается в образ экзешника). Размер также зависит от опций линкера. Пример Fasm/minimal занимает 4921 байт без сжатия.

В: Где можно раздобыть официальное описание формата XM?
О: Полного официального описания современного формата XM нет. Позвольте предложить взамен этот документ: "The Unofficial XM File Format Specification: FastTracker II, ADPCM and Stripped Module Subformats" (только на англ.). В данном документе описаны многие тонкости работы с форматом XM, включая все нестандартные расширения, которые на данный момент поддерживает uFMOD. К тому же, из исходников ModPlug (на C++) можно почерпнуть массу полезной информации по трекерским форматам файлов.

 
Благодарности

antarman, Barracuda, bogrus, chris_b, cresta, dododo, flaith, Four-F, GL#0M, norki, q_q, ReSampled, S_T_A_S_, voodooattack и yoxola за помощь в устранении ошибок, предложения по улучшению библиотеки, примеры использования под разные компиляторы и всё остальное, так или иначе помогающее нам в развитии проекта.

[WASM.RU], CelerSMS и SourceForge.net за поддержку и хостинг.

 
Автор©тво

Исходные коды uFMOD и сопровождающие утилитарные приложения © 2005 - 2022 Asterix и Quantum.
Все права защищены.

Композиции:

Нашли ошибку? Желаете задать вопрос разработчикам или высказать предложение по улучшению библиотеки?
Разрабатываете интересный проект с использованием uFMOD? Вам сюда: ufmod@users.sf.net