Если ты изучаешь плеер, то Карл выкладывал старый-классический вариант плеера без возможности буфферизации ... Буфферизация это маленький набор ассемблерных процедур надстраиваемых над плеером в память ниже 49152. Надо собрать красивый вариант плеера без лишних наворотов. Просто у меня подход что ставить задачу основываясь на том сколько сам по себе ест плеер не есть правильно. Нужно ставить задачу вообщем, и тогда можно сделать оптимальный вариант. Например мне в деме OSCOSS надо:
0. буферы
1. стабильность без скачков вообще, синхронизация относительно первого пикселя в инте.
2. гранулярность 4-ре такта, для создания мултиколоров по горизонтали не стабилизируя плеер
3. быстрый доступ к регистрам, что бы всякие эквалайзеры творить
4. возможность разбивать на куски по каналам, используется в зебра-девочке, между полосками у неё играет музыка, примерно в нижней третьи экрана в зависимости от кранча.
Я постарался сделать плеер таким. Что бы каждый мог разбить на нужные ему куски. Кстати, можно вообще выкинуть какой-нибудь канал, допустим если надо только два канала. Плеер во многом универсален и добавляя эффекты в редакторе не надо менять сам плеер. Его устройство очень просто. Музыка разбита на два этапа. У меня не хранятся орнаменты и ноты вообще. При компиляции анализируются часто используемые ноты после этапа обработки орнаментом и всеми эффектами. По сути это набор нот+орнамент+эффект=готовы тон из таблицы. Этот тон, по частоте использования, кодируется одним байтом и на ходу распаковки может меняться. То есть кодировка может к середине модуля динамически переползти в набор других нот(тонов). Далее уже не этот тон обрабатывается инструментом. Так же происходит с громкостью. Эта универсальность позволяет мне не менять плеер, но добавлять эффекты. Далее данные разбиты на два типа, команда CALL(симуляция) и сами данные. Вот кодировка-то тонов и CALL'ов динамически впихнута в один байт, или в два, если не хватает одного. Допустим ты где-то в модуле использовал дважды кусочек из четырёх нот, в любом канале, на этот кусок будет выполнен CALL(симуляция), проигрыш и возврат. В компиляторе стоят ограничения по CALL в CALL в CALL, и CALL, который сразу вызывает CALL. Прости за кашу в обяснении, просто такова запутанная логика. Что бы плеер не выпрыгивал более чем на NNN тактов, делается предел на количество CALL'ов за один шаг проигрывания. Сейчас по дефолту стоит 8 CALL'ов. Если поставить только два CALL'а, то объём модуля увеличится, а количество тактов уменьшится. Увеличиваться может до в 2 раза. Предел размера модуля 49152 байта, это предел кодировки смещения CALL'а ...





Ответить с цитированием