Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
336
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

328

хронизации не учитывает этот фактор. Однако не волнуйтесь, вам просто необходимо немного сместить время анимации для решения этой проблемы. Просто вычтите небольшое количества времени из анимации, я предлагаю от 30 до 80 миллисекунд, но вы можете попробовать варьировать это значение для повышения точности синхронизации.

Зацикливание воспроизведения звуков

Кажется чего-то не хватает... Хм, что же это может быть? Конечно же IMediaEvent, третий дополнительный интерфейс, который вы получили из объекта IgraphBuilder. Интерфейс IMediaEvent становится действительно полезным, если вам необходимо узнать, закончилось ли воспроизведение звука. (Это все, что нас заботит на данный момент.) Он полезен, если вы хотите определить, должен ли звук начаться сначала или должно ли произойти другое событие при окончании проигрывании звука.

События представлены командным кодом и двумя параметрами, приведенными к типу данных long.

long Code, Param1, Param2;

Для получения кода события и параметров вы можете вызвать IMediaEvent::GetEvent, как показано тут:

HRESULT hr = pEvent->GetEvent(&Code, &Param1, &Param2, 1);

Запись значения, возвращаемого IMediaEvent::GetEvent, является очень важным. Значение S_OK соответствует корректному получению события, а любое другое значение ошибки означает, что больше нет обрабатываемых событий. Т. к. обработки может ожидать любое количество событий, вам необходимо непрерывно вызывать GetEvent, пока все события не закончатся. Вы можете увидеть этот процесс здесь, содержащийся в цикле while.

Замечание. Четвертым параметром функции IMediaEvent::GetEvent является количество миллисекунд, которые необходимо подождать перед получением события. Я всегда жду одну миллисекунду прежде чем продолжить.

while(SUCCESS(pEvent->GetEvent(&Code,&Param1,&Param2,1))) { // Обработать событие завершения проигрывания

if(Code == EC_COMPLETE) {

// Сделать что-нибудь по завершению проигрывания

}

// Освободить данные события pEvent->FreeEventParams(Code, Param1, Param2);

}

Соседние файлы в предмете Программирование на C++