Bagikan melalui


Pertimbangan Implementasi Perutean Aliran

Di Windows 7, API platform tingkat tinggi yang menggunakan API Audio Inti, seperti Media Foundation, DirectSound, dan Wave API, menerapkan fitur perutean aliran dengan menangani pengalihan aliran dari perangkat yang ada ke titik akhir audio default baru. Aplikasi media yang menggunakan API ini menggunakan perilaku perutean aliran tanpa modifikasi apa pun pada sumbernya. Klien WASAPI langsung dapat menggunakan pemberitahuan yang dikirim oleh komponen Core Audio dan mengimplementasikan fitur perutean aliran.

Klien WASAPI langsung (aplikasi media yang menggunakan WASAPI secara langsung) menerima pemberitahuan sesi perangkat dan audio baru yang dikirim oleh komponen Core Audio. Perilaku fitur perutean aliran didefinisikan oleh cara aplikasi menangani pemberitahuan ini.

MMDevice API dan sesi audio mengirim pemberitahuan tentang perubahan status perangkat dan perubahan sesi pada klien WASAPI dalam bentuk panggilan balik. Untuk mendapatkan pemberitahuan ini, klien harus mendaftarkan implementasinya IMMNotificationClient dan IAudioSessionEvents. Untuk informasi selengkapnya, lihat Pemberitahuan relevan untuk Perutean Aliran.

Dalam skenario headset USB yang dijelaskan dalam Perutean Aliran, aplikasi memutar aliran audio dan menggunakan MMDeviceAPI dan WASAPI untuk merender aliran pada perangkat penyajian default, Speaker. Ketika perangkat default diubah, aplikasi menerima pemberitahuan IMMNotificationClient. Aplikasi ini juga menerima pemberitahuan IAudioSessionEvents yang menunjukkan bahwa pengguna menghapus perangkat titik akhir audio atau bahwa format aliran berubah untuk perangkat yang terhubung dengan sesi audio. Setelah menerima pemberitahuan, aplikasi berhenti melakukan streaming ke titik akhir speaker dan membuka kembali aliran untuk penyajian pada titik akhir default saat ini, headset.

diagram aliran data untuk pemberitahuan perangkat.

Sebagai respons terhadap pemberitahuan tersebut, klien mungkin membuka kembali aliran pada perangkat default baru dalam format baru yang dipilih oleh pengguna.

Streaming Managment

Daftar berikut ini meringkas langkah-langkah yang harus dilakukan klien WASAPI untuk menyediakan fungsionalitas pengalihan aliran.

  1. Tunggu pemberitahuanIMMNotificationClient yang relevan. Jika perangkat adalah perangkat default, pemberitahuan IMMNotificationClient::OnDefaultDeviceChanged diterima.

  2. Jika perangkat baru tersedia, dapatkan referensi ke titik akhir perangkat baru. Panggil IMMDeviceEnumerator::GetDefaultAudioEndpoint untuk perangkat default baru. Jika perangkat baru bukan perangkat default, Anda dapat mengambil perangkat dengan memanggil IMMDeviceEnumerator::GetDevice. Untuk informasi selengkapnya, lihat Mendapatkan Titik Akhir Perangkat untuk Perutean Aliran.

  3. Tunggu IAudioSessionEvents::OnSessionDisconnected dengan nilai alasan.

    Nota

    Karena semua operasi ini tidak sinkron, urutan aplikasi menerima pemberitahuan perubahan perangkat dan pemutusan sesi diprediksi. Aplikasi harus menerapkan penanganan pemberitahuan untuk menerima pemberitahuan ini dalam urutan apa pun. Namun, biasanya, aplikasi menerima nilai AudioSessionDisconnect sebelum pemberitahuan perubahan perangkat default.

     

  4. Evaluasi nilai alasan dan tentukan apakah aliran perlu ditransfer ke titik akhir audio lain atau aliran perlu diinisialisasi ulang dengan format baru.

  5. Hentikan streaming ke perangkat default lama jika alasannya menunjukkan bahwa aliran harus dirutekan kembali ke perangkat default baru.

  6. Lakukan penghitungan pemetaan posisi.

  7. Buka aliran pada perangkat baru dan transfer semua informasi status.

  8. Lanjutkan streaming pada perangkat default baru.

  9. Tangani keberangkatan perangkat default lama.

Untuk membuat operasi pengalihan aliran tampak mulus, operasi harus dilakukan secepat mungkin. Ini tergantung pada performa komponen yang terlibat dalam inisiasi ulang aliran pada perangkat baru.

Pertimbangan Pemetaan Posisi

Ketika aplikasi mendapatkan IMMNotificationClient dan IAudioSessionEvents pemberitahuan, aplikasi dapat merutekan aliran yang ada ke perangkat default baru. Ketika aliran audio yang ada terganggu dan dibuka pada perangkat baru, penyajian pada perangkat baru harus dimulai pada posisi di mana aliran dihentikan pada perangkat lama. Untuk melakukan ini, aplikasi harus memiliki posisi perangkat terakhir yang diketahui, untuk menghitung posisi mulai pada perangkat baru. Misalnya, posisi ini dapat digunakan sebagai offset delta untuk pemetaan posisi berikutnya. Saat aliran mulai dirender, posisi perangkat baru dapat dipetakan ulang ke posisi perangkat yang di-cache.

Langkah-langkah berikut meringkas proses membuat transisi aliran yang mulus.

  1. Cache posisi perangkat terakhir aliran pada perangkat lama.
  2. Hentikan streaming pada perangkat lama.
  3. Lakukan penghitungan remapping untuk mendapatkan posisi baru.
  4. Mulai merender aliran pada perangkat baru.
  5. Merilis aliran lama.

Selama transisi, aplikasi harus memastikan bahwa jam tidak keluar dari sinkronisasi, yang mengakibatkan aliran audio dan video yang tidak sinkron. Ini dapat terjadi jika sampel video terus dirender saat aliran audio dirutekan ke perangkat baru. Aplikasi harus menyimpan posisi jam untuk perhitungan remapping dan memastikan bahwa sampel video tidak dirender sampai aliran audio dibuka kembali pada perangkat baru, sehingga ketika klip dilanjutkan penyajian, aliran audio dan video disinkronkan. Dalam beberapa kasus, di mana waktu presentasi untuk merender bingkai video didasarkan pada jam audio, cukup untuk menghentikan aliran audio hingga pengalihan aliran selesai dan tidak ada implementasi pemetaan posisi lain untuk aliran video yang diperlukan untuk sinkronisasi video audio.

Jika saat penyajian, IAudioRenderClient::GetBuffer mengembalikan kesalahan karena perangkat lama hilang, aplikasi tidak perlu menghentikan streaming lama karena operasi streaming telah dihentikan. Untuk informasi tentang menangani kesalahan ini, lihat Memulihkan dari kesalahan Invalid-Device.

Tentang MMDevice API

Tentang WASAPI

Perutean Aliran