Написание программы для копирования треков с Audio-CD (cdrom audio sound gcc example)
Ключевые слова: cdrom, audio, sound, gcc, example, (найти похожие документы)
From: Bob <ubob@mail.ru.>
Newsgroups: email
Date: Mon, 28 Jan 2005 14:31:37 +0000 (UTC)
Subject: Написание программы для копирования треков с Audio-CD
Копирование треков с Audio-CD
В статье рассматривается исходный текст программы для считывания
аудиоданных с музыкального компакт-диска (Audio-CD)
и сохранения их в WAV-файле. Программа функционирует под управлением ОС Linux.
Для понимания изложенного в статье материала необходимо знать структуру
и форматы данных, хранящихся на компакт-диске.
Эту информацию можно получить из следующих источников:
1. Information specification INF-8020i Rev 2.6. ATA Packet Interface for
CD-ROMs SFF-8020i, http://www.stanford.edu/~csapuntz/specs/INF-8020.PDF
2. Introduction to CD and CD-ROM (with information on CD and CD-ROM
formats, complete with diagrams and tables),
http://www.disctronics.co.uk/downloads/tech_docs/cdintroduction.pdf
3. Крис Касперски. "Техника защиты компакт-дисков от копирования",
издательство "BHV", 2004 г.
4. CD-Recordable FAQ, http://www.cdrfaq.org
5. Кулаков В. "Програмирование дисковых подсистем", издательство
"Питер", 2002 г.
6. Comprising a comprehensive list of terms and words used in connection
with CDs and DVDs and the applications that they support,
http://www.disctronics.co.uk/downloads/tech_docs/glossary.pdf
Структура struct cdrom_tochdr содержит заголовок таблицы содержания
диска (Table of Contents, TOC) - номера первого и последнего треков (см.
спецификацию INF-8020i, стр.171, табл.127):
/* This struct is used by the CDROMREADTOCHDR ioctl */
struct cdrom_tochdr
{
__u8 cdth_trk0; /* start track */
__u8 cdth_trk1; /* end track */
};
};
Структрура struct cdrom_tocentry содержит дескриптор трека (INF-8020i,
стр.171, табл.127):
/* This struct is used by the CDROMREADTOCENTRY ioctl */
struct cdrom_tocentry
{
__u8 cdte_track;
__u8 cdte_adr :4;
__u8 cdte_ctrl :4;
__u8 cdte_format;
union cdrom_addr cdte_addr;
__u8 cdte_datamode;
};
};
Поле cdte_track содержит номер трека, поле cdte_format определяет формат
адреса - MSF (Minute/Second/Frame) или LBA. Значения этого поля
определены в <linux/cdrom.h>:
/* CD-ROM address types (cdrom_tocentry.cdte_format) */
#define CDROM_LBA 0x01 /* "logical block": first frame is #0 */
#define CDROM_MSF 0x02 /* "minute-second-frame": binary, not bcd here! */
#define CDROM_MSF 0x02 /* "minute-second-frame": binary, not bcd here! */
В зависимости от выбранного формата адреса используется одно из полей
объединения union cdrom_addr:
/* Address in either MSF or logical format */
union cdrom_addr
{
struct cdrom_msf0 msf;
int lba;
};
};
Структура struct cdrom_read_audio используется для хранения аудиоданных:
/* This struct is used by the CDROMREADAUDIO ioctl */
struct cdrom_read_audio
{
union cdrom_addr addr; /* frame address */
__u8 addr_format; /* CDROM_LBA or CDROM_MSF */
int nframes; /* number of 2352-byte-frames to read at once */
__u8 *buf; /* frame buffer (size: nframes*2352 bytes) */
};
};
start_lba = toc.cdte_addr.lba; // стартовый адрес трека
start_lba = toc.cdte_addr.lba; // стартовый адрес трека
Конечный адрес трека определим как стартовый адрес следующего трека.
Если мы выбрали последний трек на диске, то необходимо определить начало
Lead-Out области диска
В начале файла должен находится заголовок установленного формата длиной
44 байта. Но так как нам пока неизвестны все значения полей заголовка (в
частности, размер файла), запишем в файл пустой заголовок:
Начинаем считывать аудиоданные. При каждом обращении к диску считываем
один фрейм (2352 байта), адресация в формате LBA, считанные данные
помещаем в буфер buff, а затем записываем в файл track.wav