#define DCMD_AUDIO_GET_SAMPLE_RATE 2
int io_devctl(resmgr_context_t *ctp, io_devctl_t *msg,
iofunc_ocb_t *ocb) {
int sts;
void *data;
int nbytes;
if ((sts =
iofunc_devctl_default(ctp, msg, ocb)) !=
_RESMGR_DEFAULT) {
return (sts);
}
// 1) Установить указатель на область данных сообщения
data = _DEVCTL_DATA(msg);
// 2) Установить число возвращаемых байт в 0
nbytes = 0;
// Проверить все команды; покажем только те, которые нам
// здесь интересны
switch (msg->i.dcmd) {
...
// 3) Обработать команду SET
case DCMD_AUDIO_SET_SAMPLE_RATE:
audio_set_samplerate(*(int*)data);
break;
// 4) Обработать команду GET
case DCMD_AUDIO_GET_SAMPLE_RATE:
*(int*)data = audio_get_samplerate();
nbytes = sizeof(int);
break;
...
}
// 5) Возвратить данные (если есть) клиенту
memset(&msg->о, 0, sizeof(msg->о));
msg->о.nbytes = nbytes;
SETIOV(ctp->iov, &msg->o, sizeof(msg->o) + nbytes);
return (_RESMGR_NPARTS(1));
}
В «шапке» мы декларировали указатель типа void*
Здесь мы должны указать, сколько байт мы собираемся возвратить клиенту. Я для удобства обнулил переменную
switch
/case
.Пришло время для команды «set» («установить»). Мы вызываем фиктивную функцию
Обработка команды «get» («получить») на этапе 4 во многом аналогична (по части приведения типов), кроме того, что на этот раз мы записываем данные в структуру вместо считывания из нее. Заметьте, что мы также присваиваем переменной
Наконец, для возврата данных клиенту мы должны вспомнить, что клиент ожидает не только возвращаемые данные (если таковые имеются), но и заголовочную структуру, за которой идут эти данные. Поэтому на этом этапе мы обнуляем заголовочную структуру и устанавливаем число байт (поле
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT