Cihaz Topolojileri
DeviceTopology API'si istemcilere, MMDevice API, WASAPIveya EndpointVolume APIüzerinden erişemeyecekleri çeşitli ses bağdaştırıcıları iç işlevleri üzerinde denetim sağlar.
Daha önce açıklandığı gibi, MMDevice API'si, WASAPIve EndpointVolume API'si istemcilere mikrofonlar, hoparlörler, kulaklıklar ve diğer ses giriş ve çıkış cihazlarını ses uç noktası cihazları olarak sunar. Uç nokta cihaz modeli, istemcilere ses cihazlarında ses düzeyi ve sesi kapatma denetimlerine kolay erişim sağlar. Yalnızca bu basit denetimleri gerektiren istemciler, ses bağdaştırıcılarındaki donanım cihazlarının iç topolojilerini dolaşmaktan kaçınabilir.
Windows Vista'da ses altyapısı, ses uygulamaları tarafından kullanılmak üzere ses cihazlarının topolojilerini otomatik olarak yapılandırıyor. Bu nedenle, uygulamaların bu amaçla DeviceTopology API'sini kullanması gerekirse, nadiren gerekir. Örneğin, ses bağdaştırıcısının bir satır girişinden veya mikrofondan akış yakalayabilen ancak her iki uç nokta cihazından aynı anda akış yakalayamayan bir giriş çoğullayıcı içerdiğini varsayalım. Kullanıcının, Exclusive-Mode Streams'da açıklandığı gibi, paylaşılan mod uygulamaları tarafından bir ses uç noktası cihazının kullanımını önceden ayarlamak için özel mod uygulamalarını etkinleştirdiğini varsayalım. Paylaşılan modlu bir uygulama, özel moddaki bir uygulamanın mikrofondan akış kaydetmeye başladığı sırada satır girişinden bir akış kaydediyorsa, ses altyapısı satır girişinden mikrofona otomatik olarak çoğullayıcıyı geçirir. Buna karşılık, Windows XP de dahil olmak üzere Windows'un önceki sürümlerinde, bu örnekteki özel kullanım modu uygulaması, bağdaştırıcı cihazlarının topolojilerinde gezinmek, çoklayıcıyı bulmak ve çoklayıcıyı mikrofon girişini seçmek üzere yapılandırmak için Windows multimedya API'sindeki mixerXxx işlevlerini kullanırdı. Windows Vista'da bu adımlar artık gerekli değildir.
Ancak, bazı istemciler MMDevice API, WASAPI veya EndpointVolume API'si aracılığıyla erişilemeyen ses donanım denetimi türleri üzerinde açık denetim gerektirebilir. Bu istemciler için DeviceTopology API'si, cihazlardaki ses denetimlerini bulmak ve yönetmek için bağdaştırıcı cihazlarının topolojilerini dolaşma olanağı sağlar. DeviceTopology API'sini kullanan uygulamalar, Windows ses ilkesine müdahale etmekten ve diğer uygulamalarla paylaşılan ses cihazlarının iç yapılandırmalarını bozmaktan kaçınmak için dikkatli bir şekilde tasarlanmalıdır. Windows ses ilkesi hakkında daha fazla bilgi için bkz. User-Mode Ses Bileşenleri.
DeviceTopology API'sinde, bir cihaz topolojisinde aşağıdaki türdeki ses denetimlerini bulmak ve yönetmek için arabirimler sağlanır:
- Otomatik kazanç denetimi
- Bas denetimi
- Giriş seçici (çoğullayıcı)
- Ses denetimi
- Orta düzen denetimi
- Denetimin sesini kapatma
- Çıkış seçici (demultiplexer)
- Tepe ölçer
- Treble denetimi
- Ses düzeyi denetimi
Buna ek olarak, DeviceTopology API istemcilerin bağdaştırıcı cihazlarını destekledikleri akış biçimleri hakkında bilgi için sorgulamasına olanak tanır. Devicetopology.h üst bilgi dosyası, DeviceTopology API'sindeki arabirimleri tanımlar.
Aşağıdaki diyagramda, bir pci bağdaştırıcısının mikrofondan, satır girişinden ve CD oynatıcıdan ses yakalayan bölümü için bağlı birkaç cihaz topolojisi örneği gösterilmektedir.
dört bağlı cihaz topolojisinin
Yukarıdaki diyagramda analog girişlerden sistem veri yoluna giden veri yolları gösterilmektedir. Aşağıdaki cihazların her biri, IDeviceTopology arabirimine sahip bir cihaz-topoloji nesnesi olarak temsil edilir:
- Dalga yakalama cihazı
- Giriş çoklayıcı cihazı
- Uç nokta cihazı A
- Uç nokta cihazı B
Topoloji diyagramının bağdaştırıcı cihazlarını (dalga yakalama ve giriş çoklayıcı cihazları) uç nokta cihazlarıyla birleştirdiğini unutmayın. Cihazlar arasındaki bağlantılar aracılığıyla ses verileri bir cihazdan diğerine geçer. Bir bağlantının her tarafında, verilerin bir cihaza girdiği veya cihazdan ayrıldığı bir bağlayıcı (diyagramda Con olarak etiketlenmiştir) bulunur.
Diyagramın sol kenarında, çizgi girişi ve mikrofon jaklarından gelen sinyaller uç nokta cihazlarına girer.
Dalga yakalama cihazının ve giriş çoklayıcı cihazının içinde, DeviceTopology API'sinin terminolojisinde alt birimler olarak adlandırılan akış işleme işlevleri bulunur. Yukarıdaki diyagramda aşağıdaki alt birim türleri görüntülenir:
- Ses denetimi (Vol etiketli)
- Denetimin sesini kapatma (Sessiz etiketli)
- Çoklayıcı (veya giriş seçicisi; MUX etiketli)
- Analog-dijital dönüştürücü (ADC etiketli)
Birim, sessiz ve çoklayıcı alt birimlerindeki ayarlar istemciler tarafından denetlenebilir ve DeviceTopology API'si bunları denetlemek için istemcilere denetim arabirimleri sağlar. Bu örnekte, ADC alt biriminin hiçbir denetim ayarı yoktur. Bu nedenle, DeviceTopology API'si ADC için denetim arabirimi sağlamaz.
DeviceTopology API'sinin terminolojisinde bağlayıcılar ve alt birimler aynı genel kategoriye (parçalar) aittir. Bağlayıcı veya alt birim olmasına bakılmaksızın tüm parçalar ortak bir işlev kümesi sağlar. DeviceTopology API,bağlayıcılar ve alt birimler için ortak olan genel işlevleri temsil eden bir IPart arabirimi uygular. API, bağlayıcıların ve alt birimlerin belirli yönlerini temsil etmek için IConnector ve ISubunit arabirimlerini uygular.
DeviceTopology API'si, ses sürücüsünün bu cihazları temsil etmek için işletim sistemine gösterdiği çekirdek akışı (KS) filtrelerinden dalga yakalama cihazının ve giriş çoklayıcı cihazının topolojilerini oluşturur. (Ses bağdaştırıcısı sürücüsü, bu filtrelerin donanıma bağımlı kısımlarını temsil eden IMiniportWaveXxx ve IMiniportTopology arabirimleri uygular; bu arabirimler ve KS filtreleri hakkında daha fazla bilgi için Windows DDK belgelerine bakın.)
DeviceTopology API'si, önceki diyagramda A ve B uç nokta cihazlarını temsil etmek için önemsiz topolojiler oluşturur. Uç nokta cihazının cihaz topolojisi tek bir bağlayıcıdan oluşur. Bu topoloji yalnızca uç nokta cihazı için bir yer tutucudur ve ses verilerini işlemek için alt birim içermez. Aslında bağdaştırıcı cihazları, istemci uygulamalarının ses işlemeyi denetlemek için kullandığı tüm alt birimleri içerir. Uç nokta cihazının cihaz topolojisi, öncelikle bağdaştırıcı cihazlarının cihaz topolojilerini keşfetmeye yönelik bir başlangıç noktası görevi görür.
Cihaz topolojisindeki iki bölüm arasındaki iç bağlantılar bağlantı olarak adlandırılır. DeviceTopology API'sinde, bir cihaz topolojisinde bağlantıları bir bölümden diğerine geçirme yöntemleri sağlanır. API ayrıca cihaz topolojileri arasındaki bağlantıların geçişini sağlamak için yöntemler sağlar.
Bir dizi bağlı cihaz topolojisini keşfetmeye başlamak için, istemci uygulaması bir ses uç noktası cihazının IDeviceTopology arabirimini etkinleştirir. Uç nokta cihazındaki bağlayıcı, ses bağdaştırıcısındaki bir bağlayıcıya veya bir ağa bağlanır. Uç nokta ses bağdaştırıcısındaki bir cihaza bağlanıyorsa DeviceTopology API'sindeki yöntemler, bağlantının diğer tarafındaki bağdaştırıcı cihazının IDeviceTopology arabirimine başvuru alarak uygulamanın uç noktadan bağdaştırıcıya bağlantı boyunca adım atmasını sağlar. Öte yandan bir ağın cihaz topolojisi yoktur. Ağ bağlantısı, bir ses akışını sisteme uzaktan erişen bir istemciye aktarır.
DeviceTopology API,yalnızca bir ses bağdaştırıcısındaki donanım cihazlarının topolojilerine erişim sağlar. Diyagramın sol kenarındaki dış cihazlar ve sağ kenardaki yazılım bileşenleri API'nin kapsamının dışındadır. Diyagramın iki tarafındaki kesikli çizgiler, DeviceTopology API'sinin sınırlarını gösterir. İstemci, giriş girişinden sistem veri yoluna kadar uzanan bir veri yolunu keşfetmek için API'yi kullanabilir, ancak API bu sınırların ötesine geçemez.
Yukarıdaki diyagramdaki her bağlayıcı, bağlayıcının yaptığı bağlantı türünü gösteren ilişkili bir bağlantı türüne sahiptir. Bu nedenle, bir bağlantının iki tarafındaki bağlayıcılar her zaman aynı bağlantı türlerine sahiptir. Bağlantı türü Physical_External, Physical_Internal, Software_Fixed, Software_IO veya Ağ gibi ConnectorType numaralandırma değeriyle gösterilir. Giriş çoklayıcı cihazı ile uç nokta cihazları A ve B arasındaki bağlantılar Physical_External türündedir; bu da bağlantının dış cihaza fiziksel bir bağlantıyı (başka bir deyişle, kullanıcı tarafından erişilebilen bir ses jakı) temsil ettiği anlamına gelir. İç CD oynatıcıdan analog sinyale bağlantı, sistem kasasına monte edilen yardımcı cihaza fiziksel bir bağlantıyı gösteren Physical_Internal türündedir. Dalga yakalama cihazı ile giriş çoğullayıcı cihazı arasındaki bağlantı, sabit ve yazılım denetimi altında yapılandırılamayan kalıcı bir bağlantıyı gösteren Software_Fixed türündedir. Son olarak, diyagramın sağ tarafındaki sistem veri yolu bağlantısı, bağlantının veri G/Ç'sinin yazılım denetimi altındaki bir DMA altyapısı tarafından uygulandığını gösteren Software_IO türündedir. (Diyagramda Ağ bağlantı türü örneği yoktur.)
İstemci uç nokta cihazında bir veri yolundan geçmeye başlar. İlk olarak istemci, Ses Cihazlarını Numaralandırmabölümünde açıklandığı gibi uç nokta cihazını temsil eden bir IMMDevice arabirimi alır. Uç nokta cihazının IDeviceTopology arabirimini almak için istemci, IMMDevice::Activate yöntemini parametre iid REFIID IID_IDeviceTopology olarak ayarlı olarak çağırır.
Önceki diyagramdaki örnekte, giriş çoklayıcı cihazı, çizgi girişi ve mikrofon jaklarından yakalama akışları için tüm donanım denetimlerini (ses düzeyi, sesi kapatma ve çoklayıcı) içerir. Aşağıdaki kod örneğinde, satır girişi veya mikrofonu için uç nokta cihazının IMMCihaz arabiriminden giriş çoklayıcı cihazı için IDeviceTopology arabiriminin nasıl alın aldığı gösterilmektedir:
//-----------------------------------------------------------
// The input argument to this function is a pointer to the
// IMMDevice interface of an endpoint device. The function
// outputs a pointer (counted reference) to the
// IDeviceTopology interface of the adapter device that
// connects to the endpoint device.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres) \
if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
const IID IID_IDeviceTopology = __uuidof(IDeviceTopology);
const IID IID_IPart = __uuidof(IPart);
HRESULT GetHardwareDeviceTopology(
IMMDevice *pEndptDev,
IDeviceTopology **ppDevTopo)
{
HRESULT hr = S_OK;
IDeviceTopology *pDevTopoEndpt = NULL;
IConnector *pConnEndpt = NULL;
IConnector *pConnHWDev = NULL;
IPart *pPartConn = NULL;
// Get the endpoint device's IDeviceTopology interface.
hr = pEndptDev->Activate(
IID_IDeviceTopology, CLSCTX_ALL,
NULL, (void**)&pDevTopoEndpt);
EXIT_ON_ERROR(hr)
// The device topology for an endpoint device always
// contains just one connector (connector number 0).
hr = pDevTopoEndpt->GetConnector(0, &pConnEndpt);
EXIT_ON_ERROR(hr)
// Use the connector in the endpoint device to get the
// connector in the adapter device.
hr = pConnEndpt->GetConnectedTo(&pConnHWDev);
EXIT_ON_ERROR(hr)
// Query the connector in the adapter device for
// its IPart interface.
hr = pConnHWDev->QueryInterface(
IID_IPart, (void**)&pPartConn);
EXIT_ON_ERROR(hr)
// Use the connector's IPart interface to get the
// IDeviceTopology interface for the adapter device.
hr = pPartConn->GetTopologyObject(ppDevTopo);
Exit:
SAFE_RELEASE(pDevTopoEndpt)
SAFE_RELEASE(pConnEndpt)
SAFE_RELEASE(pConnHWDev)
SAFE_RELEASE(pPartConn)
return hr;
}
Önceki kod örneğindeki GetHardwareDeviceTopology işlevi, giriş çoklayıcı cihazı için IDeviceTopology arabirimini almak için aşağıdaki adımları gerçekleştirir:
- Uç nokta cihazının IDeviceTopology arabirimini almak için IMMDevice::Activate yöntemini çağırın.
- Önceki adımda elde edilen IDeviceTopology arabirimiyle, uç nokta cihazında tek bağlayıcının (bağlayıcı numarası 0) IConnector arabirimini almak için IDeviceTopology::GetConnector yöntemini çağırın.
- Önceki adımda elde edilen IConnector arabirimiyle, giriş çoklayıcı cihazında bağlayıcının IConnector arabirimini almak için IConnector::GetConnectedTo yöntemini çağırın.
- Önceki adımda elde edilen IConnector arabirimini IPart arabirimi için sorgular.
- Önceki adımda alınan IPart arabirimiyle, giriş çoklayıcı cihazının IDeviceTopology arabirimini almak için IPart::GetTopologyObject yöntemini çağırın.
Kullanıcının önceki diyagramdaki mikrofondan kayıt yapabilmesi için istemci uygulamasının, çoklayıcının mikrofon girişini seçtiğinden emin olması gerekir. Aşağıdaki kod örneği, istemcinin çoklayıcıyı bulana kadar mikrofondan veri yolunda nasıl geçiş yapabileceğinizi ve ardından mikrofon girişini seçmeyi programladığı gösterir:
//-----------------------------------------------------------
// The input argument to this function is a pointer to the
// IMMDevice interface for a capture endpoint device. The
// function traverses the data path that extends from the
// endpoint device to the system bus (for example, PCI)
// or external bus (USB). If the function discovers a MUX
// (input selector) in the path, it selects the MUX input
// that connects to the stream from the endpoint device.
//-----------------------------------------------------------
#define EXIT_ON_ERROR(hres) \
if (FAILED(hres)) { goto Exit; }
#define SAFE_RELEASE(punk) \
if ((punk) != NULL) \
{ (punk)->Release(); (punk) = NULL; }
const IID IID_IDeviceTopology = __uuidof(IDeviceTopology);
const IID IID_IPart = __uuidof(IPart);
const IID IID_IConnector = __uuidof(IConnector);
const IID IID_IAudioInputSelector = __uuidof(IAudioInputSelector);
HRESULT SelectCaptureDevice(IMMDevice *pEndptDev)
{
HRESULT hr = S_OK;
DataFlow flow;
IDeviceTopology *pDeviceTopology = NULL;
IConnector *pConnFrom = NULL;
IConnector *pConnTo = NULL;
IPart *pPartPrev = NULL;
IPart *pPartNext = NULL;
IAudioInputSelector *pSelector = NULL;
if (pEndptDev == NULL)
{
EXIT_ON_ERROR(hr = E_POINTER)
}
// Get the endpoint device's IDeviceTopology interface.
hr = pEndptDev->Activate(
IID_IDeviceTopology, CLSCTX_ALL, NULL,
(void**)&pDeviceTopology);
EXIT_ON_ERROR(hr)
// The device topology for an endpoint device always
// contains just one connector (connector number 0).
hr = pDeviceTopology->GetConnector(0, &pConnFrom);
SAFE_RELEASE(pDeviceTopology)
EXIT_ON_ERROR(hr)
// Make sure that this is a capture device.
hr = pConnFrom->GetDataFlow(&flow);
EXIT_ON_ERROR(hr)
if (flow != Out)
{
// Error -- this is a rendering device.
EXIT_ON_ERROR(hr = AUDCLNT_E_WRONG_ENDPOINT_TYPE)
}
// Outer loop: Each iteration traverses the data path
// through a device topology starting at the input
// connector and ending at the output connector.
while (TRUE)
{
BOOL bConnected;
hr = pConnFrom->IsConnected(&bConnected);
EXIT_ON_ERROR(hr)
// Does this connector connect to another device?
if (bConnected == FALSE)
{
// This is the end of the data path that
// stretches from the endpoint device to the
// system bus or external bus. Verify that
// the connection type is Software_IO.
ConnectorType connType;
hr = pConnFrom->GetType(&connType);
EXIT_ON_ERROR(hr)
if (connType == Software_IO)
{
break; // finished
}
EXIT_ON_ERROR(hr = E_FAIL)
}
// Get the connector in the next device topology,
// which lies on the other side of the connection.
hr = pConnFrom->GetConnectedTo(&pConnTo);
EXIT_ON_ERROR(hr)
SAFE_RELEASE(pConnFrom)
// Get the connector's IPart interface.
hr = pConnTo->QueryInterface(
IID_IPart, (void**)&pPartPrev);
EXIT_ON_ERROR(hr)
SAFE_RELEASE(pConnTo)
// Inner loop: Each iteration traverses one link in a
// device topology and looks for input multiplexers.
while (TRUE)
{
PartType parttype;
UINT localId;
IPartsList *pParts;
// Follow downstream link to next part.
hr = pPartPrev->EnumPartsOutgoing(&pParts);
EXIT_ON_ERROR(hr)
hr = pParts->GetPart(0, &pPartNext);
pParts->Release();
EXIT_ON_ERROR(hr)
hr = pPartNext->GetPartType(&parttype);
EXIT_ON_ERROR(hr)
if (parttype == Connector)
{
// We've reached the output connector that
// lies at the end of this device topology.
hr = pPartNext->QueryInterface(
IID_IConnector,
(void**)&pConnFrom);
EXIT_ON_ERROR(hr)
SAFE_RELEASE(pPartPrev)
SAFE_RELEASE(pPartNext)
break;
}
// Failure of the following call means only that
// the part is not a MUX (input selector).
hr = pPartNext->Activate(
CLSCTX_ALL,
IID_IAudioInputSelector,
(void**)&pSelector);
if (hr == S_OK)
{
// We found a MUX (input selector), so select
// the input from our endpoint device.
hr = pPartPrev->GetLocalId(&localId);
EXIT_ON_ERROR(hr)
hr = pSelector->SetSelection(localId, NULL);
EXIT_ON_ERROR(hr)
SAFE_RELEASE(pSelector)
}
SAFE_RELEASE(pPartPrev)
pPartPrev = pPartNext;
pPartNext = NULL;
}
}
Exit:
SAFE_RELEASE(pConnFrom)
SAFE_RELEASE(pConnTo)
SAFE_RELEASE(pPartPrev)
SAFE_RELEASE(pPartNext)
SAFE_RELEASE(pSelector)
return hr;
}
DeviceTopology API'si, önceki diyagramdaki gibi bir çoğullayıcıyı kapsüllemek için bir IAudioInputSelector arabirimi uygular. (IAudioOutputSelector arabirimi bir demultiplexer kapsüller.) Yukarıdaki kod örneğinde SelectCaptureDevice işlevinin iç döngüsü, alt birimin bir çoklayıcı olup olmadığını bulmak için bulduğu her alt birimi sorgular. Alt birim bir çoklayıcıysa işlev, uç nokta cihazından akışa bağlanan girişi seçmek için IAudioInputSelector::SetSelection yöntemini çağırır.
Yukarıdaki kod örneğinde, dış döngünün her yinelemesi bir cihaz topolojisini aşıyor. Önceki diyagramda cihaz topolojileri arasında geçiş yaparken, ilk yineleme giriş çoklayıcı cihazına, ikinci yineleme ise dalga yakalama cihazına doğru ilerler. İşlev, diyagramın sağ kenarındaki bağlayıcıya ulaştığında sonlandırılır. sonlandırma, işlev Software_IO bağlantı türüne sahip bir bağlayıcı algıladığında oluşur. Bu bağlantı türü, bağdaştırıcı cihazının sistem veri yolu'na bağlandığı noktayı tanımlar.
Yukarıdaki kod örneğindeki IPart::GetPartType yöntemine yapılan çağrı, geçerli bölümün bağlayıcı mı yoksa ses işleme alt birimi mi olduğunu gösteren bir IPartType numaralandırma değeri alır.
Yukarıdaki kod örneğindeki iç döngü, IPart::EnumPartsOutgoing yöntemini çağırarak bir bölümden diğerine bağlantı boyunca ilerler. (Ters yönde ilerlemek için bir IPart::EnumPartsIncoming yöntemi de vardır.) Bu yöntem, tüm giden bölümlerin listesini içeren bir IPartsList nesnesi alır. Ancak, SelectCaptureDevice işlevinin bir yakalama cihazında karşılaşmayı beklediği tüm bölümler her zaman tam olarak bir giden parçaya sahip olur. Bu nedenle, IPartsList::GetPart sonraki çağrı, listenin ilk bölümü olan 0. bölümü her zaman istemektedir çünkü işlev listenin tek parçasının bu olduğunu varsayar.
SelectCaptureDevice işlevi, bu varsayımın geçerli olmadığı bir topolojiyle karşılaşırsa, işlev cihazı doğru yapılandıramayabilir. Böyle bir hatayı önlemek için işlevin daha genel amaçlı bir sürümü aşağıdakileri yapabilir:
- Giden parça sayısını belirlemek için IPartsList::GetCount yöntemini çağırın.
- Her giden bölüm için, ipartslist::GetPart çağırarak parçadan giden veri yolundan geçmeye başlayın.
Bazı parçalar, istemcilerin ayarlayabileceğiniz veya alabildiği ilişkili donanım denetimlerine sahiptir. Belirli bir bölümün sıfır, bir veya daha fazla donanım denetimi olabilir. Donanım denetimi aşağıdaki arabirim çifti ile temsil edilir:
- Tüm donanım denetimleri için ortak yöntemler içeren IControlInterfacegenel bir denetim arabirimi.
- Belirli bir donanım denetimi türü (örneğin, birim denetimi) için denetim parametrelerini kullanıma sunan işleve özgü arabirim (örneğin, IAudioVolumeLevel).
Bir parçanın donanım denetimlerini numaralandırmak için istemci, parçayla ilişkili donanım denetimlerinin sayısını belirlemek üzere ilk olarak IPart::GetControlInterfaceCount yöntemini çağırır. Ardından istemci, her donanım denetimi için IControlInterface arabirimini almak için IPart::GetControlInterface yöntemine bir dizi çağrı yapar. Son olarak istemci, arabirim kimliğini almak için IControlInterface::GetIID yöntemini çağırarak her donanım denetimi için işleve özgü arabirimi alır. İstemci, işleve özgü arabirimi elde etmek için bu kimlikle IPart::Activate yöntemini çağırır.
Bağlayıcı olan bir bölüm, aşağıdaki işleve özgü denetim arabirimlerinden birini destekleyebileceğinden:
Alt birim olan bir bölüm, aşağıdaki işleve özgü denetim arabirimlerinden birini veya daha fazlasını destekleyebileceğinden:
- IAudioAutoGainControl
- IAudioBass
- IAudioChannelConfig
- IAudioInputSelector
- IAudioLoudness
- IAudioMidrange
- IAudioMute
- IAudioOutputSelector
- IAudioPeakMeter
- IAudioTreble
- IAudioVolumeLevel
- IDeviceSpecificProperty
Bir parça, IDeviceSpecificProperty arabirimini yalnızca temel alınan donanım denetiminin cihaza özgü bir denetim değerine sahip olması ve denetimin önceki listedeki işleve özgü diğer arabirimlerle yeterince temsil edilememesi durumunda destekler. Genellikle, cihaza özgü bir özellik yalnızca parça türü, parça alt türü ve parça adı gibi bilgilerden özellik değerinin anlamını çıkarabilen bir istemci için yararlıdır. İstemci, IPart::GetPartType, IPart::GetSubTypeve IPart::GetName yöntemlerini çağırarak bu bilgileri alabilir.
İlgili konular