Возможно вы искали: 'Combat Engineer'

May 15 2025 18:52:44
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Написание программы для копирования треков с Audio-CD (cdrom audio sound gcc example)

Написание программы для копирования треков с 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



Заголовочные файлы:

#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <linux/cdrom.h>
#include <linux/types.h>
#include <sys/stat.h>

#define CD_DEVICE "/dev/cdrom" // имя файла устройства
#define WAV_HDR_LEN 44 // размер WAV-заголовка
#define WAV_HDR_LEN 44 // размер WAV-заголовка


Следующая структура описывает формат WAV-заголовка (взято из исх.
текстов cdda2wav)

typedef struct {
__u8 riff[4];
__u32 size;
__u8 wave[8];
__u32 size1;
__u16 format_tag;
__u16 channels;
__u32 sample_per_sec;
__u32 byte_per_sec;
__u16 block_align;
__u16 bit_per_sample;
__u8 data[4];
__u32 size2;
} __attribute__ ((packed)) wav_header_t;

wav_header_t w_hdr;

int main()
{
int fd, out, n;
unsigned int i, start_lba, end_lba;
unsigned int i, start_lba, end_lba;


Буфер для аудиоданных:

__u8 buff[CD_FRAMESIZE_RAW];
__u8 buff[CD_FRAMESIZE_RAW];


Значение CD_FRAMESIZE_RAW определено в файле <linux/cdrom.h>:

#define CD_FRAMESIZE_RAW 2352

struct stat s;
struct stat s;


Следующие структуры определены в файле <linux/cdrom.h>:

struct cdrom_tochdr hdr;
struct cdrom_tocentry toc;
struct cdrom_read_audio cda;
struct cdrom_read_audio cda;


Структура 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) */
};
};


Открываем файл устройства:

fd = open(CD_DEVICE, O_RDONLY|O_NONBLOCK);
if(fd < 0) {
perror("open");
return -1;
}
}


Проверяем тип компакт-диска. Это должен быть Audio-CD:

if(ioctl(fd, CDROM_DISC_STATUS) != CDS_AUDIO) {
printf("I need Audio-CD!n");
return 0;
}
}


Определяем число треков на компакт-диске:

memset((void *)&hdr, 0, sizeof(struct cdrom_tochdr));
if(ioctl(fd, CDROMREADTOCHDR, &hdr) < 0) {
perror("ioctl");
return(errno);
}

printf("First: %dt", hdr.cdth_trk0);
printf("Last: %dn", hdr.cdth_trk1);

#define FIRST hdr.cdth_trk0
#define LAST hdr.cdth_trk1
#define LAST hdr.cdth_trk1


Вводим номер трека, который мы хотим считать с диска:

printf("Enter track number: ");
scanf("%d", &n);

if((n < 1) || (n > LAST)) {
printf("Wrong track numbern");
return -1;
}
}


Задаем формат адреса LBA и считываем стартовые координаты трека:

toc.cdte_format = CDROM_LBA;
toc.cdte_track = n;

if(ioctl(fd, CDROMREADTOCENTRY, &toc) < 0) {
perror("ioctl");
return -1;
}

start_lba = toc.cdte_addr.lba; // стартовый адрес трека
start_lba = toc.cdte_addr.lba; // стартовый адрес трека


Конечный адрес трека определим как стартовый адрес следующего трека.
Если мы выбрали последний трек на диске, то необходимо определить начало
Lead-Out области диска

if(n == LAST) toc.cdte_track = CDROM_LEADOUT;
else toc.cdte_track = n + 1;

if(ioctl(fd, CDROMREADTOCENTRY, &toc) < 0) {
perror("ioctl");
return -1;
}

end_lba = toc.cdte_addr.lba; // конечный адрес трека
end_lba = toc.cdte_addr.lba; // конечный адрес трека


Создаем файл track.wav для хранения считанных аудиоданных:

out = open("./track.wav", O_CREAT|O_RDWR|O_TRUNC, 0600);
if(out < 0) {
perror("open");
return -1;
}
}


В начале файла должен находится заголовок установленного формата длиной
44 байта. Но так как нам пока неизвестны все значения полей заголовка (в
частности, размер файла), запишем в файл пустой заголовок:

memset(&w_hdr, 0, sizeof(wav_header_t));
write(out, (void *)&w_hdr, WAV_HDR_LEN);
write(out, (void *)&w_hdr, WAV_HDR_LEN);


Начинаем считывать аудиоданные. При каждом обращении к диску считываем
один фрейм (2352 байта), адресация в формате LBA, считанные данные
помещаем в буфер buff, а затем записываем в файл track.wav

cda.addr_format = CDROM_LBA;
cda.nframes = 1;
cda.buf = buff;

printf("Track size - %d sectorsn", end_lba - start_lba);

for(i = start_lba; i < end_lba; i++) {

memset(buff, 0, sizeof(buff));

cda.addr.lba = i;
printf("%c", 0x0D);
printf("lba: %u", i - start_lba + 1);

/* Читаем аудиоданные*/
if(ioctl(fd, CDROMREADAUDIO, &cda) < 0) {
perror("ioctl");
return -1;
}

if(write(out, (__u8 *)buff, CD_FRAMESIZE_RAW) < 0) {
perror("write");
return -1;
}
}

printf("n");
printf("n");


Определяем размер файла track.wav:

memset(&s, 0, sizeof(struct stat));
if(fstat(out, &s) < 0) {
perror("fstat");
exit(-1);
}
}


Теперь необходимо сформировать WAV-заголовок и записать его в начало файла:

memset(&w_hdr, 0, sizeof(wav_header_t));
memcpy(w_hdr.riff, "RIFF", 4);
w_hdr.size = s.st_size - 8;
memcpy(w_hdr.wave, "WAVEfmt ", 8); // последний символ - пробел
w_hdr.size1 = 16;
w_hdr.format_tag = 1;
w_hdr.channels = 2;
w_hdr.sample_per_sec = 44100;
w_hdr.byte_per_sec = 176400;
w_hdr.block_align = 4;
w_hdr.bit_per_sample = 16;
memcpy(w_hdr.data, "data", 4);
w_hdr.size2 = s.st_size - WAV_HDR_LEN;
w_hdr.size2 = s.st_size - WAV_HDR_LEN;


Записываем сформированный заголовок в файл track.wav:

lseek(out, 0, 0);
write(out, (void *)&w_hdr, WAV_HDR_LEN);
printf("OKn");

close(fd);
close(out);

return 0;
}
}


Полученный в результате работы программы файл track.wav можно
сконвертировать в любой цифровой формат - MP3 или Ogg Vorbis, например:

# oggenc -b 192 track.wav


В результате получаем файл track.ogg, который можно прослушать при
помощи утилиты ogg123:

# ogg123 track.ogg


Утилиты и библтотеки для работы с файлами формата Ogg Vorbis можно
скачать с сайта http://www.vorbis.com.
1184 Прочтений •  [Написание программы для копирования треков с Audio-CD (cdrom audio sound gcc example)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Написание программы для копирования... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка