Прежде чем рассматривать эту функцию с позиций администратора ресурсов, надо сначала понять, что это за зверь. Функция
Функция
Дескриптор файла администратора ресурсов, которому вы посылаете команду | |
Собственно команда — комбинация из двух разрядов направления обмена данными и 30 разрядов команды (см. ниже). | |
Указатель на область данных, которые передаются, принимаются или и то, и другое. | |
Размер области данных, на которую указывает | |
Переменная для дополнительной информации, установку которой может выполнить администратор ресурса. |
Двумя старшими разрядами команды
Когда администратор ресурсов принимает сообщение _IO_DEVCTL, оно обрабатывается вашей функцией
/*
* io_devctl1.c
*/
#include
#include
#include
#include
#include
#include
#define DCMD_AUDIO_SET_CHANNEL_MONO 1
#define DCMD_AUDIO_SET_CHANNEL_STEREO 2
#define DCMD_AUDIO_SET_SAMPLE_RATE_CD 3
#define DCMD_AUDIO_SET_SAMPLE_RATE_DAT 4
int io_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
iofunc_ocb_t *ocb) {
int sts;
// 1) Проверить, не является ли это обычным
// POSIX-совместимым devctl()
if ((sts =
iofunc_devctl_default(ctp, msg, ocb)) !=
_RESMGR_DEFAULT) {
return (sts);
}
// 2) Узнать, что за команда, и отработать ее
switch (msg->i.dcmd) {
case DCMD_AUDIO_SET_CHANNEL_MONO:
audio_set_nchannels(1);
break;
case DCMD_AUDIO_SET_CHANNEL_STEREO:
audio_set_nchannels(2);
break;
case DCMD_AUDIO_SET_SAMPLE_RATE_CD:
audio_set_samplerate(44100);
break;
case DCMD_AUDIO_SET_SAMPLE_RATE_DAT:
audio_set_samplerate(48000);
break;
// 3) Если мы не знаем такой команды, отвергнуть ее
default:
return (ENOSYS);
}
// 4) Сказать клиенту, что все отработано
memset(imsg->о, 0, sizeof(msg->о));
SETIOV(ctp->iov, &msg->o, sizeof(msg->o));
return (_RESMGR_NPARTS(1));
}
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT