다음을 통해 공유


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 또는 Windows 멀티미디어 waveOut API와 같은 오디오 렌더링 모듈에 연결합니다.

기본적으로 DirectMusic은 내부 IDirectMusicSynthSink 구현을 사용하여 소프트웨어 신시사이저가 생성하는 웨이브 데이터를 처리합니다. 이 웨이브 싱크는 데이터를 DirectSound에 공급합니다.

신시사이저를 활성화하려면 먼저 IDirectMusicSynth::SetSynthSink 호출을 통해 웨이브 싱크를 만들고 신시사이저에 연결해야 합니다. 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 또는 waveOut API에 공급할 수 있습니다. 웨이브 스트림 개체를 만드는 경우 IDirectMusicSynth 개체에 연결하려면 IDirectMusicSynthSink 인터페이스가 있어야 합니다.

웨이브 스트림을 관리하는 것 외에도 웨이브 싱크는 신시사이저의 타이밍을 제어합니다. 웨이브 싱크는 IDirectMusicSynth::SetMasterClock을 호출하여 master 클록을 수신합니다. 이 호출은 IDirectMusicSynthSink::SetMasterClock에 대한 동일한 호출로 master 시간 원본을 전달합니다. master 클록은 웨이브 스트림과 동일한 결정에서 생성되지 않으므로 웨이브 싱크는 클록 드리프트에 대한 보상으로 동기화된 상태로 유지해야 합니다.

또한 신시사이저가 시간을 적절하게 추적할 수 있도록 master 클록 시간에서 샘플링 시간으로 변환하는 두 가지 호출을 제공합니다.

  • IDirectMusicSynthSink::RefTimeToSample

  • IDirectMusicSynthSink::SampleToRefTime

웨이브 싱크는 IDirectMusicSynth::Render 호출로 샘플을 작성하는 시간을 실제로 관리하기 때문에 대기 시간 클록을 생성합니다. DirectMusic이 DirectMusic 포트에서 IDirectMusicSynth::GetLatencyClock 을 호출하면 단순히 돌아서서 IDirectMusicSynthSink::GetLatencyClock을 호출합니다.

소프트웨어 신시사이저를 처음 열면 DirectMusic은 오디오 출력 스트림의 샘플 속도와 채널 수를 지정하는 DMUS_PORTPARAMS 구조(Microsoft Windows SDK 설명서에 설명됨)를 신시사이저에 제공합니다. 그런 다음, 신시사이저는 이를 웨이브 싱크가 IDirectMusicSynth::GetFormat 메서드를 호출할 때 웨이브 싱크에 전달하는 표준 WAVEFORMATEX 구조체로 변환합니다.

자세한 내용은 Windows SDK 설명서의 IDirectMusicIDirectMusicPort 인터페이스에 대한 설명을 참조하세요.