IDirectMusicSynth и IDirectMusicSynthSink
Как описано в разделе Синтезаторы и приемники волн, можно реализовать пользовательский программный синтезатор или приемник волн, который работает в пользовательском режиме и взаимодействует с DirectMusic. Объект синтезатора должен иметь интерфейс IDirectMusicSynth. Объект приемника волны должен иметь интерфейс IDirectMusicSynthSink.
DirectMusic взаимодействует с программным синтезатором через интерфейс IDirectMusicSynth . DirectMusic поддерживает этот интерфейс в DirectX 6.1 и более поздних версиях. IDirectMusicSynth поддерживает методы, показанные в следующей таблице, которая упорядочивает методы в функциональные группы.
Группа | Имена методов |
---|---|
Активация | IDirectMusicSynth::Activate |
Каналы | IDirectMusicSynth::GetChannelPriority, IDirectMusicSynth::SetChannelPriority |
Инструменты | IDirectMusicSynth::D ownload, IDirectMusicSynth::Unload |
Сведения | IDirectMusicSynth::GetAppend, IDirectMusicSynth::GetFormat, IDirectMusicSynth::GetLatencyClock, IDirectMusicSynth::GetPortCaps , IDirectMusicSynth::GetRunningStats |
Воспроизведение | IDirectMusicSynth::P layBuffer, IDirectMusicSynth::Render |
порты; | IDirectMusicSynth::Open, IDirectMusicSynth::Close, IDirectMusicSynth::SetNumChannelGroups |
Прочие параметры | IDirectMusicSynth::SetMasterClock, IDirectMusicSynth::SetSynthSink |
Большинству приложений не требуется напрямую вызывать методы в интерфейсе IDirectMusicSynth ; Порт DirectMusic обычно управляет синтезатором. Однако приложение может напрямую обращаться к синтезатору во время разработки и тестирования.
Синтезатор не является полным без соединения с приемником волны, который представлен в виде объекта с интерфейсом IDirectMusicSynthSink . Приемник волны подключает поток вывода аудио синтезатора к модулю отрисовки звука, такому как DirectSound, DirectShow или API waveOut Windows Multimedia.
По умолчанию DirectMusic использует внутреннюю реализацию IDirectMusicSynthSink для обработки волновых данных, создаваемых программным синтезатором. Этот приемник волны передает данные в DirectSound.
Перед активацией синтезатора необходимо сначала создать приемник волн и подключить его к синтезатору с помощью вызова метода IDirectMusicSynth::SetSynth. Это должен быть самый первый вызов после создания синтезатора, так как многие связанные со временем вызовы, включая IDirectMusicSynth::GetLatencyClock и IDirectMusicSynth::SetMasterClock, фактически передаются в эквивалентные вызовы в IDirectMusicSynthSink.
Только DirectX 6.1 и DirectX 7 поддерживают реализацию пользовательского приемника волн в пользовательском режиме с интерфейсом IDirectMusicSynthSink . IDirectMusicSynthSink поддерживает методы, показанные в следующей таблице, которая упорядочивает методы в функциональные группы.
Группа | Имена методов |
---|---|
Инициализация | IDirectMusicSynthSink::Activate, IDirectMusicSynthSink::GetDesiredBufferSize |
IDirectMusicSynthSink::Init, IDirectMusicSynthSink::SetDirectSound | |
Временные свойства | IDirectMusicSynthSink::GetLatencyClock, IDirectMusicSynthSink::RefTimeToSample |
IDirectMusicSynthSink::SampleToRefTime, IDirectMusicSynthSink::SetMasterClock |
В DirectX 8 и более поздних версиях DirectMusic всегда использует свой внутренний приемник волн с синтезатором в пользовательском режиме. Эти более поздние версии DirectMusic не поддерживают пользовательские реализации IDirectMusicSynthSink.
Однако в DirectX 6.1 и DirectX 7 вы можете реализовать собственный объект IDirectMusicSynthSink и использовать его для управления аудиопотоком вывода синтезатора любым способом. Например, данные волн можно передать в DirectShow или в API waveOut . При создании объекта потока волны он должен иметь интерфейс IDirectMusicSynthSink для подключения к объекту IDirectMusicSynth .
Помимо управления потоком волны, приемник волны отвечает за управление временем синтезатора. Приемник волны получает часы master путем вызова метода IDirectMusicSynth::SetMasterClock, который передает master источник времени с идентичным вызовом IDirectMusicSynthSink::SetMasterClock. Так как master часы не создаются из того же кристалла, что и поток волны, приемник волны должен поддерживать их синхронизацию, компенсируя смещение часов.
Кроме того, чтобы синтезатор правильно отслеживал время, он предоставляет два вызова для преобразования времени master в время выборки и обратно:
IDirectMusicSynthSink::RefTimeToSample
IDirectMusicSynthSink::SampleToRefTime
Приемник волны создает часы задержки, так как фактически управляет временем записи примеров с помощью вызовов IDirectMusicSynth::Render. Когда DirectMusic вызывает IDirectMusicSynth::GetLatencyClock на порту DirectMusic, он просто поворачивается и вызывает IDirectMusicSynthSink::GetLatencyClock.
При первом открытии программного синтезатора DirectMusic предоставляет синтезатору DMUS_PORTPARAMS структуру (описанную в документации по Microsoft Windows SDK), которая определяет частоту выборки и количество каналов для выходного аудиопотока. Затем синтезатор преобразует их в стандартную структуру WAVEFORMATEX , которая передается приемнику волны, когда приемник волн вызывает метод IDirectMusicSynth::GetFormat .
Дополнительные сведения см. в описании интерфейсов IDirectMusic и IDirectMusicPort в документации по Windows SDK.