> **Источник:** https://python-all.ru/2.7/library/cd.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 39.3. [`cd`](https://python-all.ru/2.7/library/cd.html#module-cd) – доступ к CD-ROM на системах SGI

Устарело с версии 2.6: Модуль [`cd`](https://python-all.ru/2.7/library/cd.html#module-cd) удалён в Python 3.

Этот модуль предоставляет интерфейс к библиотеке CD от Silicon Graphics. Он доступен только на системах Silicon Graphics.

Библиотека работает следующим образом. Программа открывает устройство CD-ROM с помощью [`open()`](https://python-all.ru/2.7/library/cd.html#cd.open) и создаёт синтаксический анализатор для разбора данных с CD с помощью [`createparser()`](https://python-all.ru/2.7/library/cd.html#cd.createparser). Объект, возвращаемый [`open()`](https://python-all.ru/2.7/library/cd.html#cd.open), можно использовать для чтения данных с CD, а также для получения информации о состоянии устройства CD-ROM и получения информации о CD, например, оглавления. Данные с CD передаются анализатору, который разбирает фреймы и вызывает все ранее добавленные колбэк-функции.

Аудио CD делится на *дорожки* или *программы* (термины используются как синонимы). Дорожки можно подразделять на *индексы*. Аудио CD содержит *оглавление*, в котором указаны начала дорожек на CD. Индекс 0 – это обычно пауза перед началом дорожки. Начало дорожки, указанное в оглавлении, обычно является началом индекса 1.

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

Модуль [`cd`](https://python-all.ru/2.7/library/cd.html#module-cd) определяет следующие функции и константы:

#### `cd.createparser()`

Создаёт и возвращает непрозрачный объект синтаксического анализатора. Методы объекта анализатора описаны ниже.

#### `cd.msftoframe(minutes, seconds, frames)`

Преобразует тройку `(minutes, seconds, frames)`, представляющую время в абсолютном временном коде, в соответствующий номер фрейма CD.

#### `cd.open([device[, mode]])`

Открывает устройство CD-ROM. Возвращаемое значение – непрозрачный объект проигрывателя; методы объекта проигрывателя описаны ниже. Устройство – это имя файла SCSI-устройства, например `'/dev/scsi/sc0d4l0'` или `None`. Если оно опущено или равно `None`, производится опрос аппаратной конфигурации для поиска привода CD-ROM. Параметр *режим*, если не опущен, должен быть строкой `'r'`.

Модуль определяет следующие переменные:

#### `exception cd.error`

Исключение, возбуждаемое при различных ошибках.

#### `cd.DATASIZE`

Размер одного фрейма аудиоданных. Это размер аудиоданных, передаваемых колбэку типа `audio`.

#### `cd.BLOCKSIZE`

Размер одного неинтерпретированного фрейма аудиоданных.

Следующие переменные – это состояния, возвращаемые `getstatus()`:

#### `cd.READY`

Привод готов к работе, загружен аудио CD.

#### `cd.NODISC`

В приводе нет загруженного CD.

#### `cd.CDROM`

В привод загружен CD-ROM. Последующие операции воспроизведения или чтения будут возвращать ошибки ввода-вывода.

#### `cd.ERROR`

Произошла ошибка при попытке чтения диска или его оглавления.

#### `cd.PLAYING`

Привод находится в режиме CD-плеера, воспроизводя аудио CD через его аудиоразъёмы.

#### `cd.PAUSED`

Привод находится в режиме CD-плеера с приостановленным воспроизведением.

#### `cd.STILL`

Эквивалент [`PAUSED`](https://python-all.ru/2.7/library/cd.html#cd.PAUSED) на старых (не 3301) моделях приводов CD-ROM Toshiba. Такие приводы никогда не поставлялись SGI.

#### `cd.audio`

#### `cd.pnum`

#### `cd.index`

#### `cd.ptime`

#### `cd.atime`

#### `cd.catalog`

#### `cd.ident`

#### `cd.control`

Целочисленные константы, описывающие различные типы колбэков синтаксического анализатора, которые можно установить с помощью метода `addcallback()` объектов синтаксического анализатора CD (см. ниже).

## 39.3.1. Объекты проигрывателя

Объекты проигрывателя (возвращаемые [`open()`](https://python-all.ru/2.7/library/cd.html#cd.open)) имеют следующие методы:

#### `CD player.allowremoval()`

Разблокирует кнопку извлечения на приводе CD-ROM, позволяя пользователю извлечь кадди при желании.

#### `CD player.bestreadsize()`

Возвращает наилучшее значение для использования в качестве параметра *num\_frames* метода `readda()`. Наилучшим считается значение, обеспечивающее непрерывный поток данных с привода CD-ROM.

#### `CD player.close()`

Освобождает ресурсы, связанные с объектом проигрывателя. После вызова `close()` методы объекта больше не следует использовать.

#### `CD player.eject()`

Извлекает кадди из привода CD-ROM.

#### `CD player.getstatus()`

Возвращает информацию о текущем состоянии привода CD-ROM. Возвращаемая информация представляет собой кортеж со следующими значениями: *state*, *track*, *rtime*, *atime*, *ttime*, *first*, *last*, *scsi\_audio*, *cur\_block*. *rtime* – это время относительно начала текущей дорожки; *atime* – это время относительно начала диска; *ttime* – это общее время на диске. Для получения дополнительной информации о значении этих полей см. man-страницу *CDgetstatus(3dm)*. Значение *state* – одно из следующих: [`ERROR`](https://python-all.ru/2.7/library/cd.html#cd.ERROR), [`NODISC`](https://python-all.ru/2.7/library/cd.html#cd.NODISC), [`READY`](https://python-all.ru/2.7/library/cd.html#cd.READY), [`PLAYING`](https://python-all.ru/2.7/library/cd.html#cd.PLAYING), [`PAUSED`](https://python-all.ru/2.7/library/cd.html#cd.PAUSED), [`STILL`](https://python-all.ru/2.7/library/cd.html#cd.STILL) или [`CDROM`](https://python-all.ru/2.7/library/cd.html#cd.CDROM).

#### `CD player.gettrackinfo(track)`

Возвращает информацию о заданном треке. Возвращаемая информация представляет собой кортеж из двух элементов: время начала трека и его длительность.

#### `CD player.msftoblock(min, sec, frame)`

Преобразует тройку (минуты, секунды, кадры), представляющую время в абсолютном временном коде, в соответствующий номер логического блока для указанного привода CD-ROM. Для сравнения времени следует использовать [`msftoframe()`](https://python-all.ru/2.7/library/cd.html#cd.msftoframe), а не `msftoblock()`. Номер логического блока отличается от номера кадра на смещение, необходимое для некоторых приводов CD-ROM.

#### `CD player.play(start, play)`

Начинает воспроизведение аудиодиска в приводе CD-ROM с заданного трека. Аудиовыход появляется на разъёмах для наушников и аудиоразъёмах привода CD-ROM (если они имеются). Воспроизведение останавливается в конце диска. *начало* – номер трека, с которого начать воспроизведение CD; если *воспроизведение* равно 0, CD переводится в начальное состояние паузы. Затем метод `togglepause()` можно использовать для начала воспроизведения.

#### `CD player.playabs(minutes, seconds, frames, play)`

Аналогично `play()`, но начальная позиция задаётся в минутах, секундах и кадрах, а не номером трека.

#### `CD player.playtrack(start, play)`

Аналогично `play()`, но воспроизведение останавливается в конце трека.

#### `CD player.playtrackabs(track, minutes, seconds, frames, play)`

Аналогично `play()`, но воспроизведение начинается в заданное абсолютное время и заканчивается в конце указанного трека.

#### `CD player.preventremoval()`

Блокирует кнопку извлечения на приводе CD-ROM, предотвращая произвольное извлечение каретки.

#### `CD player.readda(num_frames)`

Считывает указанное количество кадров с аудиодиска, установленного в приводе CD-ROM. Возвращаемое значение – строка, представляющая аудиокадры. Эту строку можно передать без изменений методу `parseframe()` объекта парсера.

#### `CD player.seek(minutes, seconds, frames)`

Устанавливает указатель, определяющий начальную точку следующего чтения цифровых аудиоданных с CD-ROM. Указатель устанавливается на позицию абсолютного временного кода, заданную в *минутах*, *секундах* и *кадрах*. Возвращаемое значение – номер логического блока, на который установлен указатель.

#### `CD player.seekblock(block)`

Устанавливает указатель, определяющий начальную точку следующего чтения цифровых аудиоданных с CD-ROM. Указатель устанавливается на заданный номер логического блока. Возвращаемое значение – номер логического блока, на который установлен указатель.

#### `CD player.seektrack(track)`

Устанавливает указатель, определяющий начальную точку следующего чтения цифровых аудиоданных с CD-ROM. Указатель устанавливается на заданный трек. Возвращаемое значение – номер логического блока, на который установлен указатель.

#### `CD player.stop()`

Останавливает текущую операцию воспроизведения.

#### `CD player.togglepause()`

Приостанавливает CD, если он играет, и запускает воспроизведение, если он на паузе.

## 39.3.2. Объекты Parser

Объекты Parser (возвращаемые [`createparser()`](https://python-all.ru/2.7/library/cd.html#cd.createparser)) имеют следующие методы:

#### `CD parser.addcallback(type, func, arg)`

Добавляет колбэк для парсера. У парсера есть колбэки для восьми различных типов данных в потоке цифровых аудиоданных. Константы для этих типов определены на уровне модуля [`cd`](https://python-all.ru/2.7/library/cd.html#module-cd) (см. выше). Колбэк вызывается следующим образом: `func(arg, type, data)`, где *аргумент* – переданный пользователем аргумент, *тип* – конкретный тип колбэка, а *данные* – данные, возвращаемые для этого *типа* колбэка. Тип данных зависит от *типа* колбэка следующим образом:

| Тип | Значение |
| --- | --- |
| `audio` | Строка, которую можно передать без изменений в `al.writesamps()`. |
| `pnum` | Целое число, задающее номер программы (трека). |
| `index` | Целое число, задающее номер индекса. |
| `ptime` | Кортеж, состоящий из времени программы в минутах, секундах и кадрах. |
| `atime` | Кортеж, состоящий из абсолютного времени в минутах, секундах и кадрах. |
| `catalog` | Строка из 13 символов, задающая каталожный номер диска. |
| `ident` | Строка из 12 символов, задающая идентификационный номер ISRC записи. Строка состоит из двух символов кода страны, трёх символов кода владельца, двух символов, задающих год, и пяти символов, задающих серийный номер. |
| `control` | Целое число, задающее управляющие биты из субкодовых данных CD. |

#### `CD parser.deleteparser()`

Удаляет парсер и освобождает используемую им память. Объект не должен использоваться после этого вызова. Этот вызов выполняется автоматически, когда последняя ссылка на объект удаляется.

#### `CD parser.parseframe(frame)`

Разбирает один или несколько кадров цифровых аудиоданных с CD, например, возвращённых методом `readda()`. Определяет, какие субкоды присутствуют в данных. Если с момента последнего кадра эти субкоды изменились, то `parseframe()` выполняет колбэк соответствующего типа, передавая ему субкодовые данные, обнаруженные в кадре. В отличие от C-функции, этому методу можно передать более одного кадра цифровых аудиоданных.

#### `CD parser.removecallback(type)`

Удаляет колбэк для заданного *типа*.

#### `CD parser.resetparser()`

Сбрасывает поля парсера, используемые для отслеживания субкодов, в начальное состояние. `resetparser()` следует вызывать после замены диска.
