Bagikan melalui


Mengekspos Efek Pengambilan Hardware-Accelerated

Di Windows XP dan yang lebih baru, kerangka kerja audio WDM mendukung akselerasi perangkat keras efek pengambilan audio yang diekspos melalui DirectSound. Efek ini termasuk pembatalan gema akustik (AEC) dan penekanan kebisingan (NS). Untuk informasi tentang bagaimana aplikasi DirectSoundCapture memungkinkan penggunaan AEC dan NS yang dipercepat perangkat keras, lihat dokumentasi Microsoft Windows SDK.

Driver miniport dapat mengekspos akselerasi perangkat keras untuk subset efek ini, tergantung pada kemampuan perangkat yang mendasar. Untuk mengekspos kemampuan perangkat keras untuk efek AEC dan NS, setiap pin pada filter AEC yang diterapkan driver harus memenuhi persyaratan ini:

Persyaratan khusus untuk mengekspos node AEC dan NS yang dipercepat perangkat keras disajikan di bawah ini.

Pembatalan Gema Akustik

Driver miniport PCM mengekspos dukungan perangkat keras untuk AEC dalam bentuk topologi untuk menangkap dan merender aliran yang memenuhi persyaratan tambahan ini:

  • Pin harus menyertakan simpul AEC (KSNODETYPE_ACOUSTIC_ECHO_CANCEL), yang harus ditentukan dalam posisi yang tepat dalam rantai simpul yang diurutkan (lihat di bawah).

Penekanan Kebisingan

Driver miniport PCM mengekspos dukungan perangkat keras untuk NS dalam bentuk topologi untuk aliran tangkapan yang memenuhi persyaratan tambahan ini:

  • Pin harus menyertakan simpul NS (KSNODETYPE_NOISE_SUPPRESS), yang harus ditentukan dalam posisi yang tepat dalam rantai simpul yang diurutkan (lihat di bawah).

Pengurutan Rantai Simpul

Saat ini, arsitektur efek tangkapan DirectSound mengharuskan node ditentukan dalam urutan permintaan aplikasi. Akibatnya, urutan di mana driver miniport menentukan simpulnya harus cocok dengan urutan yang digunakan oleh filter sistem AEC (Aec.sys), yang mengimplementasikan algoritma AEC dan NS dalam perangkat lunak.

Untuk mengaktifkan akselerasi perangkat keras, driver harus menentukan efek yang diimplementasikan oleh perangkat keras dalam urutan berikut:

KSNODETYPE_ADC

KSNODETYPE_ACOUSTIC_ECHO_CANCEL

KSNODETYPE_NOISE_SUPPRESS

Perhatikan bahwa daftar ini dapat menghilangkan efek yang tidak dibedakan selama pemesanan relatif dipertahankan.

Penetapan Pin Simpul AEC

Driver adaptor menggunakan array struktur PCCONNECTION_DESCRIPTOR untuk menentukan koneksi dalam filter. Setiap elemen array menjelaskan satu koneksi, yang dapat berupa node-to-node, node-to-pin, atau pin-to-pin. Untuk detailnya, lihat Simpul dan Koneksi.

Untuk menggunakan struktur PCCONNECTION_DESCRIPTOR, penulis driver menetapkan pin "logis" ke simpul. Ini adalah "pin" pada simpul itu sendiri dan hanya digunakan untuk menentukan koneksi di dalam filter. Ini berbeda dengan pin eksternal pada filter, yang digunakan untuk menyambungkan ke filter lain.

Tabel berikut menunjukkan ID pin yang harus ditetapkan driver adaptor ke empat pin logis pada simpul AEC.

Sematkan Nama Parameter ID Nilai Makna

KSNODEPIN_AEC_RENDER_IN

1

Pin sink (input simpul) untuk aliran render

KSNODEPIN_AEC_RENDER_OUT

0

Pin sumber (output simpul) untuk aliran render

KSNODEPIN_AEC_CAPTURE_IN

2

Pin sink (input simpul) untuk aliran pengambilan

KSNODEPIN_AEC_CAPTURE_OUT

3

Pin sumber (output simpul) untuk aliran pengambilan

ID pin dalam tabel sebelumnya ditentukan dalam file header Ksmedia.h.

Contoh kode berikut menunjukkan bagaimana driver adaptor dapat menentukan topologi internal filter AEC yang berisi simpul AEC dan simpul NS:

    // AEC Filter Topology

    // Pin IDs for external pins on AEC filter
    #define ID_CaptureOutPin   0   // microphone stream
    #define ID_CaptureInPin    1
    #define ID_RenderOutPin    2   // speaker stream
    #define ID_RenderInPin     3

    // Generic pin IDs for simple node with one input and one output
    #define NODE_INPUT_PIN     1
    #define NODE_OUTPUT_PIN    0

    // Node IDs
    #define NODE_ID_AEC        0   // acoustic echo cancellation
    #define NODE_ID_NS         1   // noise suppression

    // The array below defines the internal topology of an
    // AEC filter that contains an AEC node and an NS node.

    const PCCONNECTION_DESCRIPTOR AecConnections[] = {
        { PCFILTER_NODE, ID_RenderInPin,       NODE_ID_AEC,    KSNODEPIN_AEC_RENDER_IN  },
        { NODE_ID_AEC,   KSNODEPIN_AEC_RENDER_OUT,   PCFILTER_NODE,  ID_RenderOutPin    },
        { PCFILTER_NODE, ID_CaptureInPin,      NODE_ID_AEC,    KSNODEPIN_AEC_CAPTURE_IN },
        { NODE_ID_AEC,   KSNODEPIN_AEC_CAPTURE_OUT,  NODE_ID_NS,     NODE_INPUT_PIN     },
        { NODE_ID_NS,    NODE_OUTPUT_PIN,      PCFILTER_NODE,  ID_CaptureOutPin   }
    };

Array AecConnections dalam contoh kode sebelumnya menentukan topologi filter yang diperlihatkan dalam gambar berikut.

Diagram yang mengilustrasikan topologi internal filter AEC dengan simpul AEC dan NS.

Gambar sebelumnya mewakili setiap koneksi di dalam filter dengan panah putus-putus yang menunjuk ke arah aliran data. Total lima koneksi muncul dalam gambar. Setiap koneksi sesuai dengan salah satu dari lima elemen dalam array AecConnections dalam contoh kode.