Разработка программного обеспечения для голосового управления трехмерными моделями функционирования промышленных роботов

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



ваемого устройства

CALLBACK_EVENTв параметре dwCallback находится событие THandle, через которое происходит информирование о ходе воспроизведения;CALLBACK_FUNCTIONв dwCallback находится указатель на функцию;CALLBACK_THREADв dwCallback находится идентификатор потокаCALLBACK_WINDOWв dwCallback находится указатель на окно, которому посылается сообщениеCALLBACK_NULLв dwCallback ничего нетWAVE_ALLOWSYNCможно открыть устройство в синхронном режимеWAVE_FORMAT_DIRECTзапрещается преобразование данных с помощью АСМ-драйвера (ACM - Audio Compression Manager)WAVE_FORMAT_QUERYесли установить этот параметр, то реального открытия звуковой карты не происходит, функция проверяет возможность открытия с заданными параметрами, и если всё нормально, то возвращает MMSYSERRNOERROR (если параметры недопустимы, то возвращается код ошибки)MMS YSERR_ALLOCATEDуказанный ресурс уже занятMMSYSERR_BADDEVICEIDуказанный идентификатор устройства не существуетMMSYSERR_NODRIVERнет драйвера для устройстваMMSYSERR_NOMEMневозможно использовать памятьWAVERR_BADFORMATпопытка открытия в неподдерживаемом звуковом формате

Необходимо заполнить структуру WAVEFORMATEX. Она имеет следующий вид:

typedef struct WAVEFORMATEX { WORD wFormatTag;

WORD nChannels;

DWORD nSamplesPerSec;

DWORD nAvgBytesPerSec;

WORD nBlockAlign;

WORD wBitsPerSample;

WORD cbSize;} WAVEFORMATEX;

В этой структуре:

wFormatTag формат звуковых данных (чаще всего используется WAVE_FORMAT_PCM);

nChannels количество каналов (1 - монО, 2 - стерео);

nSamplesPerSec частота дискретизации (возможны значения 8000, 11025, 22050 и 44100);

nAvgBytesPerSec количество байт в секунду для WAVEFORMATPCM это является результатом nSamplesPerSec* nBlockAlign;

nBlockAlign выравнивание блока (для WAVEFORMATPCM равен wBitsPerSample /8* nChannels);

wBitsPerSample количество бит в одной выборке (для WAVE_FORMAT_PCM может быть 8 или 16);

cbSize - размер дополнительной информации, которая располагается после структуры (если ничего нет, то должен быть 0).

Теперь следует подготовить заголовки, которые будут отправляться драйверу. Для этого существует функция waveInPrepareHeader

MMRESULT waveInPrepareHeader(

HWAVEOUT hwo,

LPWAVEHDR pwh,

U1NT cbwh);

Внутренняя структура:

hwo идентификатор устройства записи (полученный после вызова функции wavelnOpen).

pwh указатель на структуру wavehdr_tag;

cbwh размер структуры wavehdr_tag.

Функция возвращает значения, приведенные в табл. 3.3.

При этом lpData, dwBufferLength, и dwFlags члены структуры

WAVEHDR - должны быть установлены перед запросом этой функции (dwFlags должен быть нулевым).

Таблица 3.3 Возвращаемые значения

MMSYSERR_NOERRORуспехMMSYSERR_INVALHANDLEуказанный дескриптор устройства недействителенMMSYSERR_INVALPARAMбазовый адрес буфера не выровнен с объемом выборкиMMSYSERR_NODRIVERнет драйвера для устройстваMMSYSERR_NOMEMневозможно использовать память

Для того, чтобы освободить драйвер необходимо использовать функцию waveInUnprepareHeader. Эта функция должна быть вызвана после того, как драйвер устройства заполняет буфер и возвращает его приложению. Необходимо вызвать эту функцию перед освобождением буфера.

MMRESULT waveInUnprepareHeader(

HWAVEIN hwi,

LPWAVEHDR pwh,

U1NT cbwh);

Параметры:

hwi - указатель на записывающее устройство;

pwh - указатель на структуру WAVEHDR, идентифицирующую буфер, который необходимо очистить.

cbwh - размер, в байтах, структуры WAVEHDR.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно из значений, приведенных в табл. 3.4.

Эта функция дополняет waveInPrepareHeader функцию. Необходимо вызвать эту функцию перед освобождением буфера. После передачи буфера в драйвер устройства функцией waveInAddBuffer, необходимо ждать, пока драйвер не закончит работу с буфером перед запросом waveInUnprepareHeader. Очистка буфера, который не был занят, не имеет никакого эффекта, и функция возвращает ноль.

Таблица 3.4 Значения, выдаваемые при ошибках

ОшибкаЗначениеMMSYSERR_INVALHANDLEуказанный дескриптор устройства недействителенMMSYSERR_NODRIVERнет драйвера для устройстваMMSYSERR_NOMEMневозможно использовать памятьMMSYSERR_STILLPLAYINGбуфер, указанный pwh, занят

Для передачи буфера приёма данных предоставленному звуковому устройству используется функция waveInAddBuffer. Когда буфер заполнен, приложение получает соответствующее сообщение. Функция имеет следующий вид:

MMRESULT waveInAddBuffer(HWAVEIN hwi,

LPWAVEHDR pwh,

UINT cbwh);

Описание параметров:

hwi- указатель на входное устройство;

pwh - указатель на структуру WAVEHDR, которая идентифицирует буфер.

cbwh - размер, в байтах, структуры WAVEHDR.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращает одно из значений, приведенных в табл. 3.5.

Таблица 3.5 - Возвращаемые значения

ОшибкаЗначениеMMSYSERR_INVALHANDLEуказанный дескриптор устройства недействителенMMSYSERR_NODRIVERнет драйвера для устройстваMMSYSERR_NOMEMневозможно использовать памятьWAVERR_UNPREPAREDбуфер, указанный pwh, не был готов

Когда буфер заполнен, бит WHDR_DONE установлен в dwFlags -члене структуры WAVEHDR.

Буфер должен быть подготовлен функцией waveInPrepareHeader перед тем, как это будет передаваться функции waveInAddBuffer.

Далее вызывается функция waveInStart. Она начинает ввод данных через предоставленное устройство. Эта функция выглядит следующим образом:

MMRESULT waveInStart(HWAVEIN hwi);

Параметр hwi указывает на устройство, принимающее информацию.

Функция возвращает MMSYSERR_NOERROR, если всё проходит успешно, если есть ошибки, возвращается одно значений, приведенных в табл. 3.6

Таблица 3.6 - Возвращаемые значения

ОшибкаЗначениеMMSYSERR_INVALHANDLEуказанный дескриптор устройства недействителенMMSYSERR_NODRIVERнет драйвера для устрой