다음을 통해 공유


음성 할당

신시사이저 미니포트 드라이버가 포함된 대부분의 어댑터 드라이버에는 DirectSound 하드웨어 가속도 포함되어 있습니다. 이렇게 하면 신시사이저 음성과 하드웨어 가속 DirectSound 버퍼 간의 음성 할당 문제가 제기됩니다.

DirectMusic 신디사이저(하드웨어 및 소프트웨어 모두)는 동시 클라이언트 수를 최대화하기 위해 여러 인스턴스를 지원해야 합니다. 신디사이저 작성기는 정적으로 신디사이저에 음성을 할당하는 유혹 할 수 있지만, 아마 일반적인 동적 음성 풀에서 그리기로 신디사이저의 사용 가능한 모든 인스턴스를 고려해야합니다. 그런 다음 각 instance 풀에서 사용할 수 있는 총 수로 사용 가능한 음성 수를 보고합니다.

이러한 방식으로 구현되면 물리적 음성 수가 제한된 하드웨어 신디사이저도 수많은 신디사이저 인스턴스를 지원할 수 있습니다. 실시간으로 STATS 호출은 각 instance 현재 사용 중인 음성 수를 클라이언트에 알릴 수 있습니다. 동적 풀이 고갈되고 신디사이저 instance 새 음성이 필요한 경우 해당 신디사이저 instance 음성 도용 체계를 구현하여 해당 instance 내에서 음성을 해제해야 합니다.

다음 할당 체계는 드라이버가 음성에서 어떤 데이터가 전달되는지 제어하고 음성 도용에 대한 의사 결정을 내릴 수 있기 때문에(DLS 수준 1 사양에 설명된) 신디사이저에서 사용하는 음성이 DirectSound 버퍼보다 더 쉽게 공유된다는 아이디어를 기반으로 합니다.

미니포트 드라이버(하드웨어, 소프트웨어 또는 하드웨어와 소프트웨어의 일부 조합)에서 사용할 수 있는 모든 음성은 두 개의 풀로 나뉩니다. 첫 번째 풀인 무료 풀은 아무 데도 커밋되지 않은 음성으로 구성됩니다. 두 번째 풀인 동적 풀은 신디사이저 인스턴스에서 사용하기 위해 커밋된 음성으로 구성됩니다. 이러한 음성은 현재 신시사이저 instance 사용 중이거나 사용하지 않을 수 있습니다. 동적 풀은 무료 풀의 현재 내용에 따라 모든 신시사이저 instance 요청한 최대 음성 수로 크기가 조정됩니다. DirectSound 버퍼는 할당 시 무료 풀에서 제거되고 할당 취소 시 반환됩니다.

다음 표에는 실제로 스키마를 보여 주는 음성 할당의 예제 시퀀스가 포함되어 있습니다.

시간 요청 무료 풀 동적 풀 미니포트 드라이버 작업

T0

전원 켜기

64

0

초기화.

T1

DSound (4)

60

0

DirectSound 버퍼에 4개의 음성을 정적으로 할당합니다.

T2

신스 (32)

28

32

동적 풀을 32개의 음성으로 늘입니다.

T3

신스 (24)

28

32

작업이 필요 없습니다. 동적 풀에는 이미 24개 이상의 음성이 있습니다.

T4

DSound (24)

4

32

DirectSound 버퍼에 24개의 음성을 정적으로 할당합니다.

T5

신스 (48)

0

36

동적 풀을 36개의 음성으로 늘입니다. (포트를 만드는 메서드는 S_FALSE 반환하고 DMUS_PORTPARAMS 설정합니다. dwVoices = 36.)

T6

DSound (10)

0

36

실패 무료 수영장에는 음성이 없습니다.

T7

DSound (-5)

5

36

5개의 음성을 무료로 제공합니다. 마지막 요청(T5 시간)이 부여된 것보다 더 많았음에도 불구하고 이러한 요청은 동적 풀로 돌아가지 않습니다.

DirectSound 버퍼는 실제로 하나씩 할당되며 가독성을 위해 테이블에서 함께 그룹화됩니다.

신시사이저 핀 instance 생성된 직후에 이를 기반으로 음성을 할당해서는 안 됩니다. 만든 직후 KSPROPERTY_SYNTH_PORTPARAMETERS 속성 항목이 수신됩니다. 이 속성 항목은 무엇보다도 이 instance 연결할 음성 수를 나타냅니다. 또한 이 항목은 요청된 모든 음성을 할당할 수 없는 경우 미니포트 드라이버가 동적 풀의 실제 새 크기를 다시 보고할 수 있는 기회를 제공합니다.