PKEY_AudioEngine_OEMFormat
Dans Windows Vista et versions ultérieures , la clé de propriété PKEY_AudioEngine_OEMFormat identifie le format de flux par défaut pour un appareil de point de terminaison audio. Les appareils de rendu et de capture ont des formats par défaut. Le moteur audio global utilise le format par défaut d’un appareil pour se connecter à l’appareil en vue d’une opération en mode partagé. Le fichier INF qui installe l’appareil charge le format par défaut de l’appareil dans le Registre. L’utilisateur peut modifier le format par défaut via le panneau de configuration multimédia Windows (Mmsys.cpl). Windows XP et les versions antérieures de Windows ne prennent pas en charge la clé de propriété PKEY_AudioEngine_OEMFormat .
Un fichier INF spécifie le format par défaut d’un périphérique de point de terminaison audio dans la section add-registry de cet appareil. L’exemple INF suivant montre une section add-registry qui charge le format par défaut d’un appareil de point de terminaison dans le Registre.
;;
;; Identify endpoint device as a set of speakers.
;; Set default format to 48-kHz, 16-bit stereo.
;; Add endpoint extension property page.
;;
[OEMSettingsOverride.AddReg]
HKR,"EP\\0", %PKEY_AudioEndpoint_Association%,,%KSNODETYPE_SPEAKER%
HKR,"EP\\0", %PKEY_AudioEngine_OEMFormat%, %REG_BINARY%, 41,00,00,00,28,00,00,00,
FE,FF,02,00,80,BB,00,00,00,EE,02,00,04,00,10,00,16,00,10,00,03,00,00,00,01,00,
00,00,00,00,10,00,80,00,00,AA,00,38,9B,71
HKR,"EP\\0", %PKEY_AudioEndpoint_ControlPanelProvider%,,%AUDIOENDPOINT_EXT_UI_CLSID
L’exemple précédent est tiré du fichier Sysfx.inf dans l’exemple audio Sysfx du Kit de pilotes Windows. La section Chaînes de ce fichier INF contient les définitions suivantes.
PKEY_AudioEndpoint_ControlPanelProvider = "{1DA5D803-D492-4EDD-8C23-E0C0FFEE7F0E},1"
PKEY_AudioEndpoint_Association = "{1DA5D803-D492-4EDD-8C23-E0C0FFEE7F0E},2"
PKEY_AudioEngine_OEMFormat = "{E4870E26-3CC5-4CD2-BA46-CA0A9A70ED04},3"
Dans l’exemple précédent, le nom de la section add-registry, OEMSettingsOverride.AddReg, est défini par une directive AddReg dans une section d’installation d’interface dans Sysfx.inf. L’exemple précédent ajoute plusieurs propriétés du point de terminaison numéro 0 (identifié par la chaîne « EP\\0 ») à l’entrée de Registre pour l’interface de l’appareil. (Si une interface d’appareil représente un filtre d’ondes avec plusieurs points de terminaison, les points de terminaison supplémentaires sont numérotés 1, 2, etc.) Pour plus d’informations sur les sections d’installation d’interface, consultez Directive INF AddInterface.
Une fois que le fichier INF a créé les trois clés de propriété et chargé leurs valeurs associées dans le Registre, les applications peuvent accéder aux propriétés en obtenant l’interface IPropertyStore pour l’appareil de point de terminaison. Le fichier d’en-tête Mmdeviceapi.h dans le Kit de développement logiciel (SDK) Windows contient des définitions C/C++ des trois clés de propriété. Pour plus d’informations sur l’obtention de l’interface IPropertyStore, consultez la description de la méthode IMMDevice::OpenPropertyStore dans la documentation du Kit de développement logiciel (SDK) Windows.
Dans l’exemple INF précédent, la clé de propriété PKEY_AudioEndpoint_Association identifie le GUID de catégorie de broche KS pour l’appareil de point de terminaison. La clé de propriété PKEY_AudioEndpoint_ControlPanelProvider identifie le GUID de classe pour l’objet d’interface COM qui fournit les valeurs de propriété à la page de propriétés dans Mmsys.cpl pour l’appareil de point de terminaison. Pour plus d’informations sur ces clés de propriété, consultez la documentation du Kit de développement logiciel (SDK) Windows. Pour plus d’informations sur les GUID de catégorie de broche KS, consultez Pin Category Property.
Dans l’exemple INF précédent, la valeur de propriété associée à la clé de propriété PKEY_AudioEngine_OEMFormat est une valeur de REG_BINARY de 48 octets qui contient une représentation sérialisée de la structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE qui décrit le format. Pour calculer la valeur de données REG_BINARY à associer à la clé de propriété PKEY_AudioEngine_OEMFormat , incorporez la structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE dans une structure PropVariant et sérialisez la structure PropVariant en appelant la fonction StgSerializePropVariant . Pour plus d’informations sur la structure PropVariant et la fonction StgSerializePropVariant , consultez la documentation du Kit de développement logiciel (SDK) Windows.
L’exemple de code suivant est une application console qui imprime les données REG_BINARY qui apparaissent dans l’exemple INF précédent.
//
// Embed a WAVEFORMATEXTENSIBLE structure in a PropVariant
// container, and print the PropVariant structure as a
// serialized stream of bytes in REG_BINARY format.
//
#include <stdio.h>
#include <wtypes.h>
#include <propidl.h>
#include <propvarutil.h>
#include <mmreg.h>
#include <ks.h>
#include <ksmedia.h>
void PrintSerializedFormat(WAVEFORMATEX *pWfx)
{
HRESULT hr;
PROPVARIANT var;
SERIALIZEDPROPERTYVALUE* pVal;
ULONG cb;
// Create a VT_BLOB from the WAVEFORMATEX structure.
var.vt = VT_BLOB;
var.blob.cbSize = sizeof(*pWfx) + pWfx->cbSize;
var.blob.pBlobData = (BYTE*)pWfx;
// Serialize the PROPVARIANT structure. The serialized byte stream
// will eventually be written to the registry as REG_BINARY data.
hr = StgSerializePropVariant(&var, &pVal, &cb);
if (SUCCEEDED(hr))
{
// Write the binary data to stdout. Format the output so you can
// copy and paste it directly into the INF file as REG_BINARY data.
for (UINT i = 0; i < cb; i++)
{
BYTE b = ((BYTE*)pVal)[i];
wprintf(L"%2.2X,", b);
}
wprintf(L"\n");
CoTaskMemFree(pVal);
}
}
//
// Use a WAVEFORMATEXTENSIBLE structure to specify the format
// for a 48-kHz, 16-bit, (2-channel) stereo audio stream.
//
void main()
{
WAVEFORMATEXTENSIBLE wfx;
wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wfx.Format.nChannels = 2;
wfx.Format.nSamplesPerSec = 48000;
wfx.Format.nAvgBytesPerSec = 4*48000;
wfx.Format.nBlockAlign = 4;
wfx.Format.wBitsPerSample = 16;
wfx.Format.cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
wfx.Samples.wValidBitsPerSample = 16;
wfx.dwChannelMask = 3;
wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
PrintSerializedFormat(&wfx.Format);
}
La fonction main dans l’exemple de code précédent crée une structure WAVEFORMATEXTENSIBLE pour décrire le format par défaut. Vous pouvez modifier la fonction main pour créer une structure WAVEFORMATEX ou WAVEFORMATEXTENSIBLE afin de décrire le format par défaut de votre appareil de point de terminaison.
La fonction PrintSerializedFormat dans l’exemple de code précédent sérialise la description du format et imprime la description du format sérialisé sous forme de données REG_BINARY. Vous pouvez copier la sortie imprimée produite par la fonction et la coller dans votre fichier INF.