Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
}
/* Считываем данные – заголовок и дескриптор трека (рис. 12) */
memset(data_buff, 0, 12);
for(n = 0; n < 12; n += 2) {
IN_P_W(a, 0x170);
memcpy((void *)(data_buff + n), (void *)&a, 2);
}
/* Отобразим размер данных TOC и номер первого и последнего трека */
if (i == 1) {
memcpy((void *)&a, (void *)(data_buff), 2);
printf("TOC lenght - %d ", __swab16(a));
printf("First: %d ", data_buff[2]);
printf("Last: %d ", data_buff[3]);
max_track_num = data_buff[3];
}
/* Копируем дескриптор трека в структуру struct toc */
memcpy((void *)t, (data_buff + 4), 8);
t->lba = __swab32(t->lba);
/* Считываем дескриптор следующего трека. Если треков больше нет, считываем дескриптор Lead-Out области последней сессии. */
i += 1;
if(i == (max_track_num + 1)) i = 0xAA;
t->next = read_toc();
return t;
}
Просмотр содержимого TOC выполняет рекурсивная функция view_toc( ):
void view_toc(struct toc *t)
{
if(t == NULL) return;
if(t->trk_num == 0xAA) printf("lead out: ");
else printf("track: %d ", t->trk_num);
printf("lba: %u ", t->lba);
view_toc(t->next);
}
Извлечь из сформированного списка дескриптор трека можно при помощи следующей функции:
struct toc_entry * get_toc_entry(int trk_num, struct toc *t)
{
struct toc_entry *t_entry;
int i = 1;
for(;i < trk_num; i++) t = t->next;
t_entry = (struct toc_entry *) ї
malloc(sizeof(struct toc_entry));
t_entry->start_lba = t->lba;
t_entry->end_lba = t->next->lba;
return t_entry;
}
Входные параметры функции – номер трека и указатель на начало списка с данными TOC. Результат сохраняется в структуре struct toc_entry следующего вида:
struct toc_entry {
__u32 start_lba; // стартовый адрес трека
__u32 end_lba; // конечный адрес трека
};
Полный листинг программы, выполняющей чтение TOC, приведен в файле RAW/read_toc.c.
Если скомпоновать вместе функции read_cd и read_toc, можно написать программу чтения треков с компакт-диска. В файле RAW/read_cdda_track.c находится листинг программы, которая считывает треки с Audio-CD и сохраняет их в файле track.cdr. Детально изучать этот листинг мы не будем, т.к. только что подробно рассмотрели его основные составляющие. Единственное замечание – в отличие от ранее рассмотренной функции read_cd при считывании сектора с аудиодиска соседние байты меняются местами. Это связано с порядком расположения аудиоданных в секторе:
for(i = 0; i < 2352; i += 2) {
IN_P_W(a, 0x170);