Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u opdrachten verzendt en wijzigingsmeldingen ontvangt van modules voor audioapparaten vanuit een UWP-app. Een audioapparaatmodule kan een hardware-effectverwerkingseenheid of een andere audioconfiguratiemodule zijn die is gedefinieerd door een audiostuurprogramma. Deze functie is ontworpen om moduleproviders in staat te stellen UWP-apps te maken waarmee gebruikers statusinformatie kunnen beheren en ophalen uit een module voor audioverwerking die wordt uitgevoerd in een DSP. Als u de API's van de module voor audioapparaten wilt gebruiken die in dit artikel worden weergegeven, moet u de beperkte mogelijkheid audioDeviceConfiguration opgeven in het manifest van uw app-pakket.
Een exemplaar van de klasse AudioDeviceModulesManager ophalen
Alle modulebewerkingen voor audioapparaten die in dit artikel worden weergegeven, beginnen met het verkrijgen van een exemplaar van de AudioDeviceModulesManager. Doe dit door eerst de statische GetDefaultAudioRenderId-methode van de Klasse MediaDevice aan te roepen. Hiermee wordt de id van het standaardapparaat voor audioweergave geretourneerd, dat vervolgens wordt doorgegeven aan de constructor voor AudioDeviceModulesManager om een exemplaar te maken van de klasse die is gekoppeld aan het audioapparaat.
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
Query uitvoeren op geïnstalleerde modules voor audioapparaten
Voer een query uit voor alle geïnstalleerde modules voor audioapparaten door de klasse FindAll van de klasse AudioDeviceModulesManager aan te roepen. Voer een query uit voor een specifieke set audioapparaatmodules door FindAllById aan te roepen en de id van de aangevraagde modules door te geven. In het volgende voorbeeld wordt een id gedefinieerd voor een set modules, wordt FindAllById aanroepen om een lijst met AudioDeviceModule-objecten op te halen en worden de details van elke module afgedrukt naar de uitvoer van foutopsporing.
C#
public const string Contoso_AudioDeviceModuleId = "F72E09C3-FEBA-4C50-93BE-2CA56123AF09";
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
var modules = audioModuleManager.FindAllById(Contoso_AudioDeviceModuleId);
foreach (var module in modules)
{
var classId = module.ClassId;
var name = module.DisplayName;
var minorVersion = module.MinorVersion;
var majorVersion = module.MajorVersion;
var instanceId = module.InstanceId;
Debug.WriteLine($"{classId} : {name} : {minorVersion} : {majorVersion} : {instanceId}");
}
Een opdracht verzenden naar een module voor een audioapparaat en resultaatgegevens ontvangen
Verzend opdrachten naar een audioapparaatmodule door SendCommandAsync aan te roepen op het object AudioDeviceModule . De methode SendCommandAsync neemt een bytematrix als argument. Deze bytematrix bevat doorgaans een opdracht-id gevolgd door de gegevens die aan de opdracht zijn gekoppeld, maar de opdrachtindeling en -waarden zijn volledig door de leverancier gedefinieerd en worden door het systeem als transparant behandeld.
De methode SendCommandAsync retourneert een asynchrone bewerking die na voltooiing een ModuleCommandResult-object retourneert dat het resultaat van de opdracht vertegenwoordigt. De eigenschap Status bevat een opsommingswaarde die aangeeft of het systeem de opdracht kan uitvoeren. Dit geeft niet noodzakelijkerwijs aan dat de module van het audioapparaat de opdracht kan uitvoeren. De eigenschap Resultaat bevat een bytematrix die wordt geretourneerd door de module audioapparaat om de status van de opdracht aan te geven. Dit is doorgaans een waarde die aangeeft dat de opdracht is geslaagd of mislukt, gevolgd door het gegevensresultaat van de opdracht. Net als bij moduleopdrachten worden moduleantwoordindelingen en -waarden door de leverancier gedefinieerd.
In het volgende voorbeeld wordt FindAllAsync aanroepen om een set audioapparaatmodules op te halen. Een DataWriter wordt gebruikt om een bytematrix te maken die een voorbeeldopdracht en gegevens bevat. SendCommandAsync wordt aangeroepen om de opdrachtbuffer te verzenden en, nadat de asynchrone bewerking is voltooid, wordt een ModuleCommandResult geretourneerd. Als de uitvoering van de opdracht is geslaagd, wordt er eerst een DataReader gebruikt om een geheel getal statuswaarde te lezen, geretourneerd uit de module. Als deze waarde de door de leverancier gedefinieerde succeswaarde is, worden de rest van de resultaatgegevens gelezen en gebruikt door de app, bijvoorbeeld om de gebruikersinterface bij te werken.
C#
public const byte Contoso_ReverbLevel_Command = 30;
public const byte Contoso_SendCommand_Success = 99;
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
var modules = audioModuleManager.FindAllById(Contoso_AudioDeviceModuleId);
foreach (var module in modules)
{
var writer = new Windows.Storage.Streams.DataWriter();
writer.WriteByte(Contoso_ReverbLevel_Command);
writer.WriteByte(100);
var command = writer.DetachBuffer();
var result = await module.SendCommandAsync(command);
if (result.Status == SendCommandStatus.Success)
{
using (DataReader reader = DataReader.FromBuffer(result.Result))
{
int bufferStatus = reader.ReadInt32();
if (bufferStatus == Contoso_SendCommand_Success)
{
byte[] data = { 0, 0 };
reader.ReadBytes(data);
// Do something with returned data, such as update UI
}
}
}
}
Meldingen ontvangen wanneer modules voor audioapparaten worden gewijzigd
Apps kunnen meldingen ontvangen wanneer een module voor een audioapparaat is bijgewerkt door u te registreren voor de gebeurtenis ModuleNotificationReceived .
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
audioModuleManager.ModuleNotificationReceived += AudioModuleManager_ModuleNotificationReceived;
ModuleNotificationReceived wordt gegenereerd wanneer een module van het audioapparaat die is gekoppeld aan het huidige audioapparaat wordt gewijzigd. Als u wilt bepalen of de gebeurtenis is gekoppeld aan een bepaalde module, haalt u een exemplaar van AudioDeviceModule op door de eigenschap Module van de module van de AudioDeviceModuleNoticiationEventArgs door te geven aan de gebeurtenis-handler en controleert u vervolgens de eigenschap ClassId die de module identificeert. De gegevens die aan de gebeurtenis zijn gekoppeld, worden doorgegeven als een bytematrix die is opgeslagen in de eigenschap NotificationData van de gebeurtenisargumenten. Net als bij opdrachten en resultaten is de indeling van de geretourneerde bytematrix door de leverancier gedefinieerd. Als in het onderstaande voorbeeld de eerste byte van de meldingsgegevens de voorbeeldwaarde voor de instelling op reverb-niveau van de module bevat, worden de gegevens gelezen en gebruikt om de gebruikersinterface bij te werken.
C#
public const byte Contoso_ReverbLevel_Data = 25;
C#
private void AudioModuleManager_ModuleNotificationReceived(AudioDeviceModulesManager sender, AudioDeviceModuleNotificationEventArgs args)
{
if (args.Module.ClassId == Contoso_AudioDeviceModuleId)
{
// Get the coefficient data from the reverb module.
using (DataReader reader = DataReader.FromBuffer(args.NotificationData))
{
// read notification data.
byte item = reader.ReadByte();
// if reverb coefficient data are changed.
if (item == Contoso_ReverbLevel_Data)
{
// read the new value
byte[] data = { 0 };
reader.ReadBytes(data);
ReverbLevelSlider.Value = data[0];
}
}
}
}