Чтобы проще было определить ошибки, решил воспользоваться "интерфейсом управляющих строк":
TCHAR Text_err[MAX_PATH];
MCIERROR Res = 0;
//Открытие устройства для записи
if(Res = mciSendString(TEXT("open new type waveaudio alias rec wait"), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Open waveaudio unknown error!"), TEXT("Open error"), 0);
}
MessageBox(0, Text_err, TEXT("Open error"), 0);
return 1;
}
MessageBox(0, TEXT("Open waveaudio OK!"), TEXT("Внимание!"), 0);
/*
//Установка параметров записи
if(Res = mciSendString(TEXT("set rec bitspersample 16 channels 1 samplespersec 44100"), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Set settings unknown error!"), TEXT("Set settings"), 0);
}
MessageBox(0, Text_err, TEXT("Set settings!"), 0);
return 3;
}
MessageBox(0, TEXT("Set settings OK!"), TEXT("Settings error"), 0);
*/
//Запуск записи
if(Res = mciSendString(TEXT("record rec"), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Start record unknown error!"), TEXT("Start error"), 0);
}
MessageBox(0, Text_err, TEXT("Start error"), 0);
return 4;
}
MessageBox(0, TEXT("Start record OK!"), TEXT("Start"), 0);
Sleep(1000);
//Остановка записи
if(Res = mciSendString(TEXT("stop rec"), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Stop record unknown error!"), TEXT("Stop"), 0);
}
MessageBox(0, Text_err, TEXT("Stop error"), 0);
return 5;
}
MessageBox(0, TEXT("Stop record OK!"), TEXT("Stop"), 0);
//Сохранение записи в файл
if(Res = mciSendString(TEXT("save rec \"D:\\temp.wav\""), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Save record unknown error!"), TEXT("Save"), 0);
}
MessageBox(0, Text_err, TEXT("Save error"), 0);
return 6;
}
MessageBox(0, TEXT("Save record OK!"), TEXT("Save"), 0);
//закрытие устройства записи
if(Res = mciSendString(TEXT("close rec"), NULL, 0, NULL))
{
if(!mciGetErrorString(Res, Text_err, MAX_PATH))
{
MessageBox(0, TEXT("Close unknown error!"), TEXT("Close"), 0);
}
MessageBox(0, Text_err, TEXT("Close error"), 0);
return 7;
}
MessageBox(0, TEXT("Close OK!"), TEXT("Close"), 0);
Открытие устройства проходит успешно. Ошибка возникла при установке параметров со следующим сообщением: "Указанный параметр команды не распознан драйвером". Думал, что ошибся при написании команды, проверил - вроде всё правильно, менял сами параметры: частоту дискретизации и т.д. Потом решил попробовать не устанавливать параметры "вручную". Теперь возникла ошибка при запуске записи, со следующим сообщением: "Не установлено ни одного устройства, позволяющего записать файлы в текущем формате. Для установки звукового устройства откройте панель управления, щелкните "принтеры и другое оборудование", а затем "Установка оборудования"".
Насчет инициализации звуковой карты и загрузки драйверов звука - прочитал(в интернете), что звуковая карта инициализируется ещё во время заставки "Windows XP" при включении, с характерными щелчками динамиков.
Еще узнал, что за звук в ОС отвечает служба Windows Audio, которая запускается автоматически. Прочитал про порядок загрузки драйверов и служб, узнал, что Windows Audio относится к группе AudioGroup(логично), зависит от служб Plug and Play и RPC. Поставил загрузку Windows Audio в реестре сразу после P&P, которая идёт гораздо позже RPC. Получается, что WinAudio всё равно загружается раньше входа пользователя в систему. Но запись звука не работает...