Недавно мы писали о программе CD-WORX, главным достоинством которой является возможность цифрового считывания компактов CD-DA (то есть, музыкальных) и сохранения полученной информации в виде .wav-файла. Может возникнуть следующий вопрос - если и CD-ROM, и CD-DA представляют из себя устройства для записи информации в цифровой форме, причем, и в том, и в другом случае формат ее представления известен, то в чем же состоит сложность считывания информации с CD-DA? Ведь не так уж трудно, например, прочитать дискету Apple на компьютере IBM. Конечно, потребуется некоторое количество ассемблерного кода, но нельзя сказать, чтобы эта задача требовала вмешательства интеллекта - скорее, нужен хороший справочник.
К несчастью, в силу специфики накопителей CD-ROM, в данном случае для считывания информации в другом формате (а именно, в CD-DA) потребуется нечто большее, чем простое позиционирование головки на низком уровне. Вникнем же в суть проблемы.
Некоторые CD-ROM накопители вообще не могут осуществлять непосредственное низкоуровневое обращение к данным. Такие устройства будут читать только CD-ROM диски, и сделать с этим ничего нельзя. К счастью, подобных накопителей мало и они непопулярны. Поэтому в дальнейшем будем иметь в виду только CD-ROM, позволяющие осуществлять подобные функции.
Итак, для начала вспомним, каким образом осуществляется низкоуровневое чтение с дискет и винчестеров. Не вдаваясь в технические подробности, можно сказать, что для чтения конкретного сектора независимо от того, какая файловая система использована на накопителе, достаточно задать номер дорожки и сектора на ней низкоуровневой процедуре чтения и получить необходимые данные. Если же подобные действия проделать с каждым сектором, мы получим полное содержимое диска.
Почему бы не проделать ту же самую процедуру с CD, в частности - с CD-DA? Все не так просто, при работе с CD-ROM у вас, скорее всего, не возникнет проблем, хотя на физическом уровне такое считывание не будет иметь почти ничего общего со считыванием с магнитного носителя, но запросто считать таким образом CD-DA вам не удастся.
Причина неудачи кроется в разнице в физической организации магнитных дисков и дисков CD-ROM. Дискета (или винчестер) размечена таким образом, что дорожки представляют собой концентрические окружности, при этом для позиционирования головки на дорожку она просто должна быть перемещена на соответствующее расстояние от центра диска. Для позиционирования в рамках дорожки в дискете имеется специальная метка для обозначения ее начала. Понятно, что поиск информации на устройстве с такой организацией не слишком сложен.
Иное дело - CD-ROM. Несмотря на то, что отдельные песни на CD-DA принято называть дорожками (кстати, начальные сектора этих псевдодорожек хранятся в оглавлении диска), физически дорожка на CD только одна. Это длинная непрерывная спираль, начинающаяся у центра диска (а именно - на расстоянии 23 мм от его геометрического центра). Позиционирование на ней - совершенно нетривиальный алгоритм, представляющий из себя нечто вроде бинарного поиска.
Конечно, постольку, поскольку CD-DA все-таки воспроизводятся в накопителях CD-ROM, ясно, что каким-то образом данные с диска переправляются на ЦАП (цифро-аналоговый преобразователь, устройство, преобразующее цифровые данные с диска в аналоговые колебания, которые затем передаются на акустическую систему и воспринимаются нами как звук). Но ЦАП не знает, из каких в точности секторов он получил данные. Почему это так?
Посмотрим, что же происходит на физическом уровне. Все данные, считанные с CD, должны пройти через специальное устройство, называемое декодером. Только после него данные - эта та информация, которую мы хотим считать, поскольку на компакте она хранится не непосредственно, а в специальной кодировке (это нужно для обеспечения сохранности данных). Поскольку данные могут поступать в декодер быстрее, чем он их обрабатывает, они буферизируются в специальном модуле, построенном по принципу FIFO (по-английски - First In First Out, а по-русски - первым пришел - первым ушел, или очередь). Когда буфер наполняется, CD-ROM снижает скорость вращения мотора, давая возможность декодеру обработать накопившуюся информацию, если же данных в FIFO становится мало, мотор разгоняется. Данные о том, из какой точки диска было произведено считывание, передаются по специальному каналу, минуя FIFO, непосредственно микроконтроллеру.
Нетрудно видеть, что при таком положении вещей микроконтроллер сообщает номер вовсе не того сектора, что реально поступает с декодера. Для того чтобы разрешить проблему определения физического адреса данных, в формате CD-ROM данные о местоположении сектора на диске хранятся непосредственно внутри этого сектора вместе с байтами синхронизации. После декодирования они могут быть использованы любым приложением.
Проблема в том, что стандарт CD-DA не предусматривает размещения подобной информации внутри секторов (смотри мою предыдущую статью о форматах CD). Из-за этого накопители CD-ROM не могут точно позиционироваться на CD-DA. Это не значит, что они не удовлетворяют стандарту red book, поскольку он требует позиционирования с точностью только 1/75 секунды, что обеспечивается накопителями CD-ROM.
Однако все же существует возможность достоверно считать данные с CD-DA. Как же это делается? Для начала отметим тот факт, что если программа может читать диск строго последовательно, то она получает именно сектора с последовательными номерами, единственное место, где может вкрасться ошибка позиционирования - это поиск первого сектора. Почему это так, понять нетрудно - при последовательном чтении головка просто движется вдоль спирали, не производя поиск информации.
Однако как только считывание прерывается какой-либо другой операцией (типичный случай - запись на винчестер считанных данных), возникает необходимость повторного позиционирования. После его выполнения нельзя гарантировать того, что головка начнет чтение с точно той точки, где оно было закончено. Разница в позиции может достигать 1/75 секунды. Теперь возможно две ситуации - частичная потеря данных из-за того, что головка переместилась дальше, чем необходимо, либо повторное считывание части данных, если головка попала в уже считанный сектор. Это явление по-английски называется "jitter", что по-русски дословно ближе всего к термину "нервотрепка", но по духу понятия лучше выражается словом "бардак".
Если сложить данные, считанные таким образом, непосредственно в .wav-файл, то при его воспроизведении будут слышны ужасный треск и щелчки в местах ошибок позиционирования.
Процесс избавления от этой нервотрепки и прекращения бардака называют по-английски "jitter correction" или "synchronization" (последнее по-русски звучит, как синхронизация). Для осуществления этой синхронизации данные считываются таким образом, чтобы каждая новая считанная область заведомо перекрывала предыдущую (этого нетрудно достичь, зная значение ошибки позиционирования - 1/75 секунды). Понятно, что после этого начало каждого нового блока данных будет повторять конец предыдущего. Необходимо выделить подобные участки и удалить повторяющиеся части. Только теперь вы можете конвертировать считанные данные в корректный .wav-файл.
Денис МАРГОЛИН
Горячие темы