다음을 통해 공유


오디오 디바이스 모듈 구성 및 쿼리

이 문서에서는 UWP 앱에서 명령을 보내고 오디오 디바이스 모듈에서 변경 알림을 받는 방법을 보여 줍니다. 오디오 디바이스 모듈은 하드웨어 효과 처리 장치 또는 오디오 드라이버에서 정의한 다른 오디오 구성 모듈일 수 있습니다. 이 기능은 모듈 공급자가 사용자가 DSP에서 실행되는 오디오 처리 모듈에서 상태 정보를 제어하고 가져올 수 있는 UWP 앱을 만들 수 있도록 설계되었습니다. 이 문서에 표시된 오디오 디바이스 모듈 API를 사용하려면 앱 패키지 매니페스트에서 제한된 audioDeviceConfiguration 기능을 지정해야 합니다.

AudioDeviceModulesManager 클래스의 instance 가져옵니다.

이 문서에 표시된 모든 오디오 디바이스 모듈 작업은 AudioDeviceModulesManager의 instance 가져오는 것으로 시작합니다. 먼저 MediaDevice 클래스의 정적 GetDefaultAudioRenderId 메서드를 호출하여 이 작업을 수행합니다. 그러면 기본 오디오 렌더링 디바이스의 ID가 반환되며, 이 ID는 AudioDeviceModulesManager의 생성자에 전달되어 오디오 디바이스와 연결된 클래스의 instance 만듭니다.

C#

var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);

설치된 오디오 디바이스 모듈에 대한 쿼리

AudioDeviceModulesManager 클래스의 FindAll을 호출하여 설치된 모든 오디오 디바이스 모듈을 쿼리합니다. FindAllById를 호출하고 요청된 모듈의 ID를 전달하여 특정 오디오 디바이스 모듈 집합을 쿼리합니다. 다음 예제에서는 모듈 집합에 대한 ID를 정의하고 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}");
}

오디오 디바이스 모듈에 명령 보내기 및 결과 데이터 수신

AudioDeviceModule 개체에서 SendCommandAsync를 호출하여 오디오 디바이스 모듈에 명령을 보냅니다. SendCommandAsync 메서드는 바이트 배열을 인수로 사용합니다. 일반적으로 이 바이트 배열에는 명령 식별자 뒤에 명령과 연결된 데이터가 포함되지만 명령 형식과 값은 완전히 공급업체에서 정의되며 시스템에서 투명하게 처리됩니다.

SendCommandAsync 메서드는 완료 시 명령의 결과를 나타내는 ModuleCommandResult 개체를 반환하는 비동기 작업을 반환합니다. Status 속성에는 시스템이 명령을 실행할 수 있는지 여부를 나타내는 열거형 값이 포함되어 있습니다. 이는 오디오 디바이스 모듈이 명령을 성공적으로 실행할 수 있었다는 것을 의미하지는 않습니다. Result 속성에는 명령의 상태 나타내기 위해 오디오 디바이스 모듈에서 반환되는 바이트 배열이 포함되어 있습니다. 일반적으로 이 값은 성공 또는 실패와 명령의 데이터 결과를 나타내는 값입니다. 모듈 명령과 마찬가지로 모듈 응답 형식 및 값은 공급업체에서 정의됩니다.

다음 예제에서는 FindAllAsync 를 호출하여 오디오 디바이스 모듈 집합을 검색합니다. DataWriter는 예제 명령 및 데이터를 포함하는 바이트 배열을 만드는 데 사용됩니다. SendCommandAsync 는 명령 버퍼를 보내기 위해 호출되고, 비동기 작업이 완료된 후 ModuleCommandResult 가 반환됩니다. 명령 실행에 성공하면 먼저 DataReader를 사용하여 모듈에서 반환된 정수 상태 값을 읽습니다. 이 값이 공급업체에서 정의한 성공 값인 경우 UI를 업데이트하는 등 앱에서 나머지 결과 데이터를 읽고 사용합니다.

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
            }
        }
    }
}

오디오 디바이스 모듈이 수정될 때 알림 받기

모듈NotificationReceived 이벤트에 등록하여 오디오 디바이스 모듈이 업데이트된 경우 앱에서 알림을 받을 수 있습니다.

C#

var endpointId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
var audioModuleManager = new AudioDeviceModulesManager(endpointId);

audioModuleManager.ModuleNotificationReceived += AudioModuleManager_ModuleNotificationReceived;

ModuleNotificationReceived 는 현재 오디오 디바이스와 연결된 오디오 디바이스 모듈이 수정될 때 발생합니다. 이벤트가 특정 모듈과 연결되어 있는지 확인하려면 이벤트 처리기에 전달된 AudioDeviceModuleNoticiationEventArgsModule 속성에 액세스한 다음 모듈을 식별하는 ClassId 속성을 확인하여 AudioDeviceModule의 instance 가져옵니다. 이벤트와 연결된 데이터는 이벤트 인수의 NotificationData 속성에 저장된 바이트 배열로 전달됩니다. 명령 및 결과와 마찬가지로 반환된 바이트 배열의 형식은 공급업체에서 정의됩니다. 아래 예제에서 알림 데이터의 첫 번째 바이트에 모듈의 반향 수준 설정에 대한 예제 값이 포함되어 있으면 데이터를 읽고 UI를 업데이트하는 데 사용됩니다.

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];
            }
        }
    }
}