Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
a = __swab16(a);
memcpy((void *)(buff + i), (void *)&a, 2);
}
В принципе этого можно и не делать, но тогда нам придется самостоятельно формировать RIFF-заголовок, чтобы получить файл в формате WAV. Лучше возложим эту почётную обязанность на sox. Конвертируем файл в WAV-формат:
# sox track.cdr track.wav
Полученный WAV-файл кодируем в формат Ogg Vorbis:
# oggenc track.wav -b 256 track.ogg
Системный вызов IOCTL
Теперь рассмотрим порядок посылки устройству пакетной команды при помощи системного вызова ioctl. Команда выглядит следующим образом:
ioctl(int fd, CDROM_SEND_PACKET, struct cdrom_generic_command *);
Первый параметр – дескриптор файла устройства. Второй параметр, CDROM_SEND_PACKET – спецификатор, указывающий на необходимость передачи устройству пакетной команды. Третий параметр – структура следующего типа:
/* for CDROM_PACKET_COMMAND ioctl */
struct cdrom_generic_command
{
unsigned char cmd[CDROM_PACKET_SIZE];
unsigned char *buffer;
unsigned int buflen;
int stat;
struct request_sense *sense;
unsigned char data_direction;
int quiet;
int timeout;
void *reserved[1];
};
Эта структура определена в файле <linux/cdrom.h>. Назначение полей структуры:
n cmd[CDROM_PACKET_SIZE] – 12-байтный командный пакет;
n buffer – указатель на буфер, куда будут помещены считанные данные. Также в этом буфере хранятся данные, которые будут переданы устройству;
n buflen – размер передаваемых (принимаемых) данных;
n sense – структура, содержащая информацию о состоянии устройства (см. команду REQUEST SENSE и рис. 10). Эта структура также определена в файле <linux/cdrom.h>;
n data_direction – направление обмена данными. Может принимать следующие значения:
#define CGC_DATA_WRITE 1 // передача данных устройству
#define CGC_DATA_READ 2 // приём данных от устройства
#define CGC_DATA_NONE 3 // нет обмена данными
n timeout – допустимое время выполнения команды.
Рассмотрим примеры программ, выполняющих доступ к ATAPI-устройству при помощи системного вызова IOCTL.
Первый пример – открытие и закрытие лотка CD-ROM (файл IOCTL/open_close.c).
/* Файл open_close.c */
#include <stdio.h>
#include <fcntl.h>
#include <linux/types.h>
#include <linux/cdrom.h>
int main()
{
int fd;
struct cdrom_generic_command cgc;
/* Открываем файл устройства */
fd = open("/dev/cdrom", O_RDONLY|O_NONBLOCK);
memset((void *)&cgc, 0, sizeof(struct cdrom_generic_command));
/* Ждём готовность устройства к выполнению пакетной команды. Поле data_direction будет содержать CGC_DATA_NONE,
* т.к. команда не требует передачи данных
*/
cgc.cmd[0] = GPCMD_TEST_UNIT_READY; // см. <linux/cdrom.h>
cgc.data_direction = CGC_DATA_NONE;
/* Посылаем устройству команду */