Bagikan melalui


Menerapkan Komunikasi Modul Audio

Modul Audio adalah bagian yang berbeda dari logika pemrosesan audio yang melakukan fungsi yang relatif atomik. Modul audio dapat berada di driver audio atau di DSP audio. Contoh modul audio adalah pemrosesan audio berbasis DSP.

Mulai Windows 10, rilis 1703, ada API dan DDI untuk mendukung komunikasi dari aplikasi Platform Windows Universal (UWP) dan driver perangkat mode kernel.

Topik ini menyediakan informasi tentang Menerapkan Komunikasi Modul Audio di driver perangkat kernel.

Untuk informasi tentang cara mengirim perintah dan menerima pemberitahuan perubahan dari modul perangkat audio menggunakan aplikasi UWP, lihat Mengonfigurasi dan mengkueri modul perangkat audio.

Mengapa Menggunakan Modul Audio?

OEM biasanya membundel aplikasi konfigurasi pada sistem mereka yang memungkinkan pelanggan untuk mengontrol aspek sistem audio ini dan menyetelnya sesuai preferensi mereka. Subsistem audio dapat berisi berbagai komponen seperti objek pemrosesan audio on-host, pemrosesan DSP perangkat keras, dan perangkat keras khusus seperti smart amp (semua selain codec audio itu sendiri). Dalam kebanyakan kasus, komponen ini dibuat dan dijual oleh vendor yang berbeda. Secara historis, IHV telah membuat API privat mereka sendiri untuk berintegrasi satu sama lain dan mengirim informasi antara komponen individu. Aplikasi konfigurasi WIN32 yang ada kemudian akan memanfaatkan API privat ini.

Platform Windows Universal (UWP), menyediakan sekumpulan API yang memungkinkan satu aplikasi berjalan di seluruh perangkat. UWP juga memperkenalkan tampilan dan nuansa baru yang telah menjadi harapan pelanggan untuk aplikasi yang berjalan di Windows 10. Begitu banyak OEM yang ingin membangun aplikasi konfigurasi audio mereka di UWP. Namun, fitur keamanan inti UWP (kotak pasir AppContainer) mencegah komunikasi dari aplikasi ke komponen lain dalam subsistem audio. Ini merender API privat yang sebelumnya digunakan oleh aplikasi konfigurasi tidak dapat diakses di UWP.

Mulai windows 10, rilis 1703, Modul Audio UWP API memungkinkan aplikasi konfigurasi dan komponen mode pengguna untuk berkomunikasi dengan modul di lapisan kernel dan perangkat keras yang dapat ditemukan melalui set properti KS baru. IHV audio dan ISV dapat menulis aplikasi dan layanan yang dapat berkomunikasi dengan modul perangkat keras mereka menggunakan antarmuka yang ditentukan dengan baik yang disediakan oleh Windows. Untuk informasi selengkapnya tentang API modul audio, lihat Namespace Layanan Windows.Media.Devices

Definisi Modul Audio

Definisi ini khusus untuk modul audio.

Term Definisi
Modul Audio Bagian berbeda dari logika pemrosesan audio yang melakukan fungsi yang relatif atomik. Dapat berada di driver audio atau di DSP audio. Contoh modul audio adalah Objek Pemrosesan Audio (APO).

Definisi Audio Umum

Definisi ini biasanya digunakan saat bekerja dengan driver audio.

Term Definisi
OEM Produsen Peralatan Asli
IHV Vendor Perangkat Keras Independen
ISV Vendor Perangkat Lunak Independen
HSA Aplikasi Dukungan Perangkat Keras
UWP Platform Windows Universal
APO Objek Pemrosesan Audio
DSP Pemrosesan Sinyal Digital

Sistem

Modul Audio menempatkan mekanisme yang didukung Windows untuk mengirim pesan antara mode pengguna dan komponen audio mode kernel. Perbedaan penting adalah Modul Audio menstandarkan alur transportasi. Ini tidak menetapkan protokol komunikasi atas transportasi tersebut dan bergantung pada ISV dan IHV untuk menentukan protokol. Tujuannya adalah untuk memungkinkan desain pihak ketiga yang ada untuk bermigrasi dengan mudah ke Modul Audio dengan perubahan yang sangat sedikit.

<Diagram Tertunda>

API Modul Audio menyediakan akses ke modul melalui dua metode penargetan yang berbeda: filter gelombang KS dan pin KS yang diinisialisasi (streaming). Penempatan dan akses ke modul tertentu spesifik implementasinya.

HSA dan aplikasi lain hanya akan dapat mengakses modul yang tersedia melalui handel filter. API individual yang dimuat pada aliran adalah satu-satunya objek yang akan memiliki akses ke modul audio yang ditargetkan aliran.

Untuk informasi selengkapnya tentang API, lihat Objek Pemrosesan Audio Windows.

Mengirim Perintah

Jalan klien Modul Audio untuk mengkueri dan mengubah parameter adalah mengirim perintah ke modul audio di komponen kernel dan perangkat keras di subsistem audio. Struktur perintah API Modul Audio didefinisikan secara longgar dan memformalkan cara modul ditemukan dan mengidentifikasi diri mereka sendiri. Namun, struktur perintah terperinci harus dirancang dan diimplementasikan oleh ISV dan IHV yang terlibat untuk menetapkan protokol untuk pesan apa yang dapat dikirim dan respons yang diharapkan.

Pemberitahuan Modul ke Klien Modul Audio

Miniport audio juga memiliki cara untuk memberi tahu dan meneruskan informasi ke klien Modul Audio jika klien telah berlangganan pemberitahuan pada modul tertentu. Informasi yang diteruskan dalam pemberitahuan ini tidak ditentukan oleh API Modul Audio, melainkan ditentukan oleh ISV dan/atau IHV.

Mengaktifkan, Menonaktifkan, dan Informasi Topologi Umum

API Modul Audio menentukan cara menghitung dan mengirim perintah ke modul. Namun, API tidak secara eksplisit menentukan bagaimana klien Modul Audio dapat mengaktifkan atau menonaktifkan modul tertentu. Selain itu, tidak menetapkan cara bagi klien untuk menemukan informasi topologi atau penempatan modul dalam kaitannya satu sama lain. IHV dan ISV dapat menentukan apakah fungsionalitas ini diperlukan dan memutuskan cara mengimplementasikannya.

Pendekatan yang direkomendasikan adalah mengekspos modul driver global. Modul driver global akan menangani perintah kustom untuk permintaan khusus topologi ini.

DDI Modul Audio

Properti Modul Audio Streaming Kernel

Kumpulan Properti KS baru, yang diidentifikasi oleh KSPROPSETID_AudioModule, telah didefinisikan untuk tiga properti khusus untuk modul audio.

Driver miniport PortCls perlu langsung menangani respons untuk setiap properti karena tidak ada antarmuka pembantu yang disediakan.

ksmedia.h:

#define STATIC_KSPROPSETID_AudioModule \
    0xc034fdb0, 0xff75, 0x47c8, 0xaa, 0x3c, 0xee, 0x46, 0x71, 0x6b, 0x50, 0xc6
DEFINE_GUIDSTRUCT("C034FDB0-FF75-47C8-AA3C-EE46716B50C6", KSPROPSETID_AudioModule);
#define KSPROPSETID_AudioModule DEFINE_GUIDNAMED(KSPROPSETID_AudioModule)

typedef enum {
    KSPROPERTY_AUDIOMODULE_DESCRIPTORS            = 1,  
    KSPROPERTY_AUDIOMODULE_COMMAND                = 2,
    KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID = 3,
} KSPROPERTY_AUDIOMODULE;

Deskriptor Modul Audio

Dukungan untuk properti KSPROPERTY_AUDIOMODULE_DESCRIPTORS mengidentifikasi driver sebagai sadar Modul Audio. Properti akan dikueri melalui pegangan filter atau pin dan KSPROPERTY diteruskan sebagai buffer input untuk panggilan DeviceIoControl. KSAUDIOMODULE_DESCRIPTOR telah didefinisikan untuk menjelaskan setiap modul dalam perangkat keras audio. Array deskriptor ini dikembalikan sebagai respons terhadap permintaan ini

ksmedia.h:

#define AUDIOMODULE_MAX_NAME_SIZE 128

typedef struct _KSAUDIOMODULE_DESCRIPTOR
{
    GUID    ClassId; 
    ULONG   InstanceId;
    ULONG   VersionMajor;
    ULONG   VersionMinor;
    WCHAR   Name[AUDIOMODULE_MAX_NAME_SIZE];
} KSAUDIOMODULE_DESCRIPTOR, *PKSAUDIOMODULE_DESCRIPTOR;

Untuk informasi selengkapnya, lihat KSAUDIOMODULE_DESCRIPTOR.

Perintah Modul Audio

Dukungan untuk properti KSPROPERTY_AUDIOMODULE_COMMAND memungkinkan klien Modul Audio mengirim perintah kustom untuk mengkueri dan mengatur parameter pada Modul Audio. Properti dapat dikirim melalui handel filter atau pin dan KSAUDIOMODULE_PROPERTY diteruskan sebagai buffer input untuk panggilan DeviceIoControl. Klien dapat secara opsional mengirim informasi tambahan yang segera berdekatan dengan KSAUDIOMODULE_PROPERTY di buffer input untuk mengirim perintah kustom.

ksmedia.h:

#define AUDIOMODULE_MAX_DATA_SIZE 64000

typedef struct _KSPAUDIOMODULE_PROPERTY
{
    KSPROPERTY Property;
    GUID       ClassId;
    ULONG      InstanceId;
} KSAUDIOMODULE_PROPERTY, *PKSPAUDIOMODULE_PROPERTY;

Untuk informasi selengkapnya, lihat KSAUDIOMODULE_PROPERTY.

ID Perangkat Pemberitahuan Modul Audio

Dukungan untuk KSPROPERTY_AUDIOMODULE_NOTIFICATION_DEVICE_ID diperlukan untuk mengaktifkan miniport untuk memberi sinyal pemberitahuan dan meneruskan informasi ke klien Modul Audio. Masa pakai ID ini terkait dengan masa pakai perangkat audio yang diekspos dan aktif ke tumpukan Audio Windows. Properti dapat dikirim melalui handel filter atau pin dan KSPROPERTY diteruskan sebagai buffer input untuk panggilan DeviceIoControl.

Untuk informasi selengkapnya, lihat KSAUDIOMODULE_PROPERTY.

Pembantu PortCls - Pemberitahuan Modul Audio

Antarmuka port baru telah ditambahkan untuk membantu pengembang driver mengirim pemberitahuan ke klien Modul Audio.

PortCls.h:

typedef struct _PCNOTIFICATION_BUFFER 
{
    UCHAR NotificationBuffer[1];
} PCNOTIFICATION_BUFFER, *PPCNOTIFICATION_BUFFER;

DECLARE_INTERFACE_(IPortClsNotifications,IUnknown)
{
    DEFINE_ABSTRACT_UNKNOWN()   // For IUnknown

    STDMETHOD_(NTSTATUS, AllocNotificationBuffer)
    (   THIS_
        _In_    POOL_TYPE       PoolType,
        _In_    USHORT          NumberOfBytes,
        _Out_   PPCNOTIFICATION_BUFFER* NotificationBuffer
    )   PURE;
    
    STDMETHOD_(void, FreeNotificationBuffer)
    (   THIS_
        _In_    PPCNOTIFICATION_BUFFER NotificationBuffer
    )   PURE;
    
    STDMETHOD_(void, SendNotificationBuffer)
    (   THIS_
        _In_    const GUID*     NotificationId,
        _In_    PPCNOTIFICATION_BUFFER NotificationBuffer
    )   PURE;
};

//
// Audio module notification definitions.
//
#define STATIC_KSNOTIFICATIONID_AudioModule \
    0x9C2220F0, 0xD9A6, 0x4D5C, 0xA0, 0x36, 0x57, 0x38, 0x57, 0xFD, 0x50, 0xD2
DEFINE_GUIDSTRUCT("9C2220F0-D9A6-4D5C-A036-573857FD50D2", KSNOTIFICATIONID_AudioModule);
#define KSNOTIFICATIONID_AudioModule DEFINE_GUIDNAMED(KSNOTIFICATIONID_AudioModule)

typedef struct _KSAUDIOMODULE_NOTIFICATION {
    union {
        struct {
            GUID        DeviceId;
            GUID        ClassId;
            ULONG       InstanceId;
            ULONG       Reserved;
        } ProviderId;
        LONGLONG        Alignment;
    };
} KSAUDIOMODULE_NOTIFICATION, *PKSAUDIOMODULE_NOTIFICATION;


Untuk informasi selengkapnya, lihat:

IPortClsNotifications

IPortClsNotifications::AllocNotificationBuffer

IPortClsNotifications::FreeNotificationBuffer

IPortClsNotifications::SendNotificationBuffer

Urutan Panggilan

Miniport akan memanggil ke port mereka untuk membuat dan mengirim pemberitahuan. Urutan panggilan umum ditampilkan dalam diagram ini.

Diagram memperlihatkan urutan panggilan untuk AudioIPortClsNotifications.