Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как отправлять команды и получать уведомления об изменениях из модулей аудиоустройств из приложения UWP. Модуль звукового устройства может быть аппаратным модулем обработки эффектов или любым другим модулем конфигурации звука, определенным звуковым драйвером. Эта функция предназначена для создания приложений UWP, позволяющих пользователям контролировать и получать сведения о состоянии из модуля обработки звука, работающего в DSP. Чтобы использовать API модуля аудиоустройства, показанные в этой статье, необходимо указать возможность ограниченной функции audioDeviceConfiguration в манифесте пакета приложения.
Получение экземпляра класса AudioDeviceModulesManager
Все операции с модулями аудиоустройств, описанные в этой статье, начинаются с получения экземпляра AudioDeviceModulesManager. Для этого сначала вызовите статический метод GetDefaultAudioRenderId класса MediaDevice . Возвращает идентификатор устройства отрисовки звука по умолчанию, который затем передается конструктору для AudioDeviceModulesManager , чтобы создать экземпляр класса, связанного с звуковым устройством.
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
Запрос установленных модулей устройств аудио
Запрос всех установленных модулей звукового устройства путем вызова FindAll класса AudioDeviceModulesManager . Запросите определенный набор модулей аудиоустройств, вызвав FindAllById и передав идентификатор запрошенных модулей. В следующем примере определяется идентификатор набора модулей, вызывает FindAllById для получения списка объектов AudioDeviceModule , а затем выводит сведения о каждом модуле в выходные данные отладки.
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}");
}
Отправка команды в модуль аудиоустройства и получение данных результатов
Отправьте команды в модуль звукового устройства, вызвав SendCommandAsync в объекте AudioDeviceModule . Метод SendCommandAsync принимает массив байтов в качестве аргумента. Обычно этот массив байтов содержит идентификатор команды, за которым следует данные, связанные с командой, но формат и значения команд полностью определены поставщиком и обрабатываются как прозрачные системой.
Метод SendCommandAsync возвращает асинхронную операцию, которая после завершения возвращает объект ModuleCommandResult , представляющий результат команды. Свойство Status содержит значение перечисления, указывающее, удалось ли системе выполнить команду. Это не обязательно означает, что модуль аудиоустройства смог успешно выполнить команду. Свойство Result содержит массив байтов, возвращаемый модулем звукового устройства, чтобы указать состояние команды. Как правило, это будет значение, указывающее на успех или сбой, за которым следует результат команды. Как и в командах модуля, форматы ответа модуля и значения определяются поставщиком.
В следующем примере вызывается FindAllAsync для получения набора модулей аудиоустройств. DataWriter используется для создания массива байтов, содержащего пример команды и данных. SendCommandAsync вызывается для отправки буфера команд, и после завершения асинхронной операции возвращается ModuleCommandResult. Если выполнение команды выполнено успешно, dataReader сначала используется для чтения целочисленного значения состояния, возвращаемого из модуля. Если это значение является значением успешного выполнения, определяемым поставщиком, остальные данные результатов считываются и используются приложением, например для обновления пользовательского интерфейса.
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
}
}
}
}
Получение уведомлений при изменении модулей аудиоустройств
Приложения могут получать уведомления при обновлении модуля звукового устройства, зарегистрировав событие ModuleNotificationReceived .
C#
var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);
audioModuleManager.ModuleNotificationReceived += AudioModuleManager_ModuleNotificationReceived;
ModuleNotificationReceived будет возникать при изменении любого модуля звукового устройства, связанного с текущим звуковым устройством. Чтобы определить, связано ли событие с определенным модулем, получите экземпляр AudioDeviceModule путем доступа к свойству Module объекта AudioDeviceModuleNoticiationEventArgs , переданного в обработчик событий, а затем проверив свойство ClassId , которое идентифицирует модуль. Данные, связанные с событием, передаются в виде массива байтов, хранящегося в свойстве NotificationData события args. Как и команды и результаты, формат возвращаемого массива байтов определяется поставщиком. В приведенном ниже примере, если первый байт данных уведомления содержит пример значения для параметра ревербатора модуля, данные считываются и используются для обновления пользовательского интерфейса.
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];
}
}
}
}