Bagikan melalui


Mengonfigurasi dan mengkueri modul perangkat audio

Artikel ini memperlihatkan cara mengirim perintah dan menerima pemberitahuan perubahan dari modul perangkat audio dari aplikasi UWP. Modul perangkat audio mungkin merupakan unit pemrosesan efek perangkat keras atau modul konfigurasi audio lainnya yang ditentukan oleh driver audio. Fitur ini dirancang untuk memungkinkan penyedia modul membuat aplikasi UWP yang memungkinkan pengguna mengontrol dan mendapatkan informasi status dari modul pemrosesan audio yang berjalan di DSP. Untuk menggunakan API modul perangkat audio yang ditampilkan dalam artikel ini, Anda harus menentukan kemampuan audioDeviceConfiguration terbatas dalam manifes paket aplikasi Anda.

Mendapatkan instans kelas AudioDeviceModulesManager

Semua operasi modul perangkat audio yang ditampilkan dalam artikel ini dimulai dengan mendapatkan instans AudioDeviceModulesManager. Lakukan ini dengan terlebih dahulu memanggil metode GetDefaultAudioRenderId statis dari kelas MediaDevice . Ini mengembalikan ID perangkat render audio default, yang kemudian diteruskan ke konstruktor untuk AudioDeviceModulesManager untuk membuat instans kelas yang terkait dengan perangkat audio.

C#

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

Kueri untuk modul perangkat audio yang diinstal

Kueri untuk semua modul perangkat audio yang diinstal dengan memanggil FindAll dari kelas AudioDeviceModulesManager . Kueri untuk sekumpulan modul perangkat audio tertentu dengan memanggil FindAllById dan meneruskan ID modul yang diminta. Contoh berikut menentukan ID untuk sekumpulan modul, memanggil FindAllById untuk mengambil daftar objek AudioDeviceModule , lalu mencetak detail setiap modul ke output debug.

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}");
}

Mengirim perintah ke modul perangkat audio dan menerima data hasil

Kirim perintah ke modul perangkat audio dengan memanggil SendCommandAsync pada objek AudioDeviceModule . Metode SendCommandAsync mengambil array byte sebagai argumen. Biasanya array byte ini berisi pengidentifikasi perintah yang diikuti oleh data yang terkait dengan perintah, tetapi format perintah dan nilai sepenuhnya ditentukan vendor dan diperlakukan transparan oleh sistem.

Metode SendCommandAsync mengembalikan operasi asinkron yang, setelah selesai, mengembalikan objek ModuleCommandResult yang mewakili hasil perintah. Properti Status berisi nilai enumerasi yang menunjukkan apakah sistem dapat menjalankan perintah. Ini tidak selalu menunjukkan bahwa modul perangkat audio berhasil menjalankan perintah. Properti Hasil berisi array byte yang dikembalikan oleh modul perangkat audio untuk menunjukkan status perintah. Biasanya, ini akan menjadi nilai yang menunjukkan keberhasilan atau kegagalan diikuti oleh hasil data perintah. Seperti halnya perintah modul, format dan nilai respons modul ditentukan vendor.

Contoh berikut memanggil FindAllAsync untuk mengambil sekumpulan modul perangkat audio. DataWriter digunakan untuk membuat array byte yang berisi contoh perintah dan data. SendCommandAsync dipanggil untuk mengirim buffer perintah dan, setelah operasi asinkron selesai, ModuleCommandResult dikembalikan. Jika eksekusi perintah berhasil, DataReader pertama kali digunakan untuk membaca nilai status bilangan bulat yang dikembalikan dari modul. Jika nilai ini adalah nilai keberhasilan yang ditentukan vendor, data hasil lainnya dibaca dan digunakan oleh aplikasi, seperti untuk memperbarui 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
            }
        }
    }
}

Menerima pemberitahuan saat modul perangkat audio dimodifikasi

Aplikasi dapat menerima pemberitahuan saat modul perangkat audio telah diperbarui dengan mendaftar untuk peristiwa ModuleNotificationReceived .

C#

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

audioModuleManager.ModuleNotificationReceived += AudioModuleManager_ModuleNotificationReceived;

ModuleNotificationReceived akan dinaikkan ketika modul perangkat audio apa pun yang terkait dengan perangkat audio saat ini dimodifikasi. Untuk menentukan apakah peristiwa dikaitkan dengan modul tertentu, dapatkan instans AudioDeviceModule dengan mengakses properti ModulaudioDeviceModuleNoticiationEventArgs yang diteruskan ke penanganan aktivitas, lalu periksa properti ClassId yang mengidentifikasi modul. Data yang terkait dengan peristiwa diteruskan sebagai array byte yang disimpan di properti NotificationData dari argumen peristiwa. Seperti halnya perintah dan hasil, format array byte yang dikembalikan ditentukan vendor. Dalam contoh di bawah ini, jika byte pertama data pemberitahuan berisi nilai contoh untuk pengaturan tingkat gaung modul, data dibaca dan digunakan untuk memperbarui 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];
            }
        }
    }
}