Aracılığıyla paylaş


Ses Ayırma

Bir synthesizer miniport sürücüsü içeren çoğu bağdaştırıcı sürücüsü de DirectSound donanım hızlandırması içerir. Bu, sentezleyici sesleri ve donanım hızlandırmalı DirectSound arabellekleri arasında ses ayırma sorusunu ortaya çıkarır.

DirectMusic synths (hem donanım hem de yazılım) eşzamanlı istemci sayısını en üst düzeye çıkarmak için birden çok örneği desteklemelidir. Bir synth yazıcısı, sesleri statik olarak synth'lere ayırmak isteyebilir, ancak büyük olasılıkla tüm kullanılabilir synth örneklerini ortak, dinamik bir ses havuzundan çizim olarak düşünmelidir. Ardından her örnek, kullanılabilir ses sayısını havuzda kullanılabilen toplam sayı olarak bildirir.

Bu şekilde uygulandığında, sınırlı sayıda fiziksel sese sahip bir donanım synth bile çok sayıda synth örneğini destekleyebilir. STATS çağrısı, her örneğin şu anda kaç ses kullandığını istemciye gerçek zamanlı olarak bildirir. Dinamik havuz tükenmişse ve bir synth örneği yeni bir ses gerektiriyorsa, söz konusu synth örneğinin bir sesi bu örnekten serbest bırakması için bir ses çalma düzeni uygulaması gerekir.

Aşağıdaki ayırma şeması, sentezleyici tarafından kullanılan seslerin DirectSound arabelleklerinden daha kolay paylaşıldığı fikrine dayanır çünkü sürücü, hangi verilerin hangi sese gireceğini denetler ve ses çalınması hakkında kararlar alabilir (DLS Düzey 1 belirtiminde özetlenmiştir).

Miniport sürücüsünde kullanılabilen tüm sesler (donanım, yazılım veya bazı donanım ve yazılım bileşimleri) iki havuza ayrılır. İlk havuz olan serbest havuz, herhangi bir yere tahsis edilmemiş seslerden oluşur. Dinamik havuz olan ikinci havuz, sentezleyici örneklerinin kullanımına tahsis edilen seslerden oluşur. Bu sesler şu anda bir sentezleyici örneği tarafından kullanılıyor olabilir veya olmayabilir. Dinamik havuz, serbest havuzun geçerli içeriğine bağlı olarak herhangi bir sentezleyici örneği tarafından istenen maksimum ses sayısı olarak boyutlandırılır. DirectSound arabellekleri, tahsis edildikten sonra serbest havuzdan kaldırılır ve boşaltıldığında geri döndürülür.

Aşağıdaki tabloda, şemayı pratikte gösteren örnek bir ses ayırma dizisi yer alır.

Zaman İstek Ücretsiz Havuz Dinamik Havuz MiniPort Sürücüsü Eylemi

T0

Açma/Kapama

64

0

Başlatmak.

T1

DSound (4)

60

0

DirectSound arabelleklere statik olarak dört ses ayırın.

T2

Synth (32)

28

32

Dinamik havuzu 32 sese yükseltin.

T3

Synth (24)

28

32

Eylem yok. Dinamik havuzda zaten 24'ten fazla ses var.

T4

DSound (24)

4

32

DirectSound arabelleklerine statik olarak 24 ses ayırın.

T5

Synth (48)

0

36

Dinamik havuzu 36 sese yükseltin. (Bağlantı noktasını oluşturan yöntem S_FALSE döndürür ve DMUS_PORTPARAMS ayarlar. dwVoices = 36.)

T6

DSound (10)

0

36

Başarısız. Ücretsiz havuzda ses yok.

T7

DSound (-5)

5

36

Bedava beş ses. Son talep (T5 zamanında) verilenden daha fazlası için olsa bile, bunların dinamik havuza geri dönmediğini unutmayın.

DirectSound arabelleklerinin aslında tek tek ayrıldığını ve okunabilirlik amacıyla tabloda gruplanarak gösterildiğini unutmayın.

Bir sentezleyici pin örneği oluşturulduktan hemen sonra, bu örnek için hiçbir ses tahsis edilmemelidir. Oluşturma işleminden kısa süre sonra bir KSPROPERTY_SYNTH_PORTPARAMETERS özellik öğesi alınır. Bu özellik öğesi, diğer öğelerin yanında bu örnekle ilişkilendirilecek ses sayısını gösterir. Bu öğe, istenen tüm seslerin ayrılamadığı durumlarda miniport sürücüsüne dinamik havuzun gerçek yeni boyutunu geri bildirme şansı verir.