Програмная часть: MP3-декодер VS1001Файл модуля управления MP3-декодера называется VLSI.asm.inc. ИнициализацияВыполняется согласно документации, аппаратный сброс происходит только при включении плейера или смене режимов, программный (процедурой vlsi_Init, затем vlsi_Open) - перед воспроизведением каждого файла. Иногда при включении плейера, после выполнения програмного сброса, декодер не выставляет готовность на линии DREQ. Почему - не понятно. Однако на повторный программный сброс поведение декодера нормализуется. Воспроизведение файлаНачинается с вызова процедуры vlsi_Open; затем циклически вызывается vlsi_SendBuf, которая передает буфер, указанный в регистре Z, декодеру; в конце воспроизведения необходимо вызвать vlsi_Close - это процедура завершает воспроизведение файла в соответствии с документацией. Рекомендованная проверка фактической скорости входного потока (позволяющая определить сбои в работе декодера) не предусмотрена. Практика не обнаружила здесь какой либо проблемы (но моя коллекция музыки периодически проверяется утилитой mp3_check...). В случае, если нужно прервать воспроизведение текущего файла (инициированный пользователем переход на другую дорожку), vlsi_Close вызывать не обязательно. Специальной команды ПАУЗА у декодера нет, поэтому режим паузы в плейере реализован простой блокировкой потока данных. Таким образом, между нажатием кнопки ПАУЗА и фактическим прерыванием звучания может пройти пара секунд для файлов с очень низким битрейтом (16-32 кбит/с) - пока не иссякнет входной буфер декодера. Параметры воспроизведенияВо время воспроизведения код управления может вызывать процедуру vlsi_SetTones. Она возвращает характеристики воспроизводимого файла (текущее время, битрейт, частоту семплирования, признак "Стерео"), а также устанавливает громкость и управляющие биты (SM_DIFF - инверсия левого, SM_BASS - удаление средних частот). Следует отметить, что установка этих бит, на мой взгляд, не привносит особого улучшения в звук, но зато - особенно включение SM_BASS - подтормаживает декодер. Это приводит к явным заиканиям на 320 кбит/с-файлах. Параметры воспроизведения хранятся в энергонезависимой памяти ATmega32, считываются при включении (процедурой vlsi_Init) и сохраняются в конце воспроизведения файла (процедурой vlsi_Close). Изменение громкости выполняется внешним кодом через процедуру vlsi_ChVol - она модифицирует параметры Громкость и Балланс, учитывая верхнее и нижнее ограничение, затем вызывает процедуру vlsi_CalcVol, которая вычисляет из параметров Громкость и Балланс параметры Громкость Левого и Громкость Правого и заполняет соответствующие переменные для процедуры vlsi_SetTones. Вычисление происходит примерно так: Процедура vlsi_Sleep позволяет перевести декодер в состояние пониженного энергопотребления и вызывается при входе в режим чтения текстовых файлов. Она может быть вызвана в любой момент после инициализации декодера. |