Odpowiednie powiadomienia dotyczące routingu strumienia
W systemie Windows 7 interfejsy API platformy wysokiego poziomu, które używają podstawowych interfejsów audio API, takich jak Media Foundation, DirectSound i Wave API, implementują funkcję kierowania strumieniami, obsługując przełączanie strumienia z istniejącego urządzenia do nowego domyślnego punktu końcowego audio. Aplikacje multimedialne korzystające z tych interfejsów API używają zachowania routingu strumienia bez żadnych modyfikacji źródła. Bezpośredni klienci WASAPI mogą używać powiadomień wysyłanych przez składniki Core Audio i implementować funkcję routingu strumienia.
Aby zaimplementować funkcję routingu strumienia, klient musi nasłuchiwać dwóch typów zdarzeń: powiadomienia o zmianie urządzenia i powiadomienia o rozłączeniu sesji. W implementacji zapewnianej przez wysokopoziomowe interfejsy API, te zdarzenia są wysyłane dla domyślnych punktów końcowych urządzeń utworzonych poprzez wywołanie IMMDeviceEnumerator::GetDefaultAudioEndpoint. Aby uzyskać więcej informacji, zobacz Uzyskiwanie punktu końcowego urządzenia na potrzeby routingu strumienia.
Składnik Core Audio MMDeviceAPI dostarcza powiadomienia zwrotne, gdy urządzenia dźwiękowe są dodawane, usuwane lub modyfikowane. Zmiany formatu i sesji audio są zgłaszane jako zdarzenia za pośrednictwem interfejsu WASAPI.
Powiadomienia o zmianie urządzenia
MMDeviceAPI zgłasza zdarzenia podczas dodawania, usuwania lub modyfikowania urządzeń audio. Jeśli klient ma zapewnić funkcjonalność routingu strumienia, musi zaimplementować interfejs IMMNotificationClient i zarejestrować jego implementację w programie MMDeviceAPI.
Aby uzyskać powiadomienia o zmianie urządzenia, klient musi wykonać następujące zadania:
- Zaimplementuj interfejs IMMNotificationClient do obsługi powiadomień o zmianie urządzenia wysyłanych przez mmDeviceAPI.
- Zarejestruj implementację IMMNotificationClient za pomocą interfejsu MMDeviceAPI, wywołując metodę IMMDeviceEnumerator::RegisterEndpointNotificationCallback.
Po zarejestrowaniu implementacji tych interfejsów przez klienta klient odbiera powiadomienia w postaci wywołań zwrotnych za pomocą metod tych interfejsów. metody IMMNotificationClient są wywoływane przez mmDeviceAPI, gdy zgłasza zdarzenia na poziomie punktu końcowego (zmiany stanu punktu końcowego, nowe przybycie punktu końcowego, usuwanie punktów końcowych, domyślne zmiany punktu końcowego i zmiany właściwości punktu końcowego).
Jeśli klient chce zapewnić routing strumienia dla urządzenia domyślnego, musi zaimplementować zachowanie zmiany urządzenia po otrzymaniu powiadomienia za pośrednictwem wywołania zwrotnego IMMNotificationClient::OnDefaultDeviceChanged.
Powiadomienia o zmianie sesji audio
Zmiany sesji audio i zmiany formatu są zgłaszane jako zdarzenia sesji audio za pośrednictwem WASAPI. Klient WASAPI implementuje interfejs IAudioSessionEvents i rejestruje tę implementację przy użyciu WASAPI.
Aby uzyskać powiadomienia o zmianie sesji audio, klient musi wykonać następujące zadania:
- Zaimplementuj interfejs IAudioSessionEvents, aby obsługiwać powiadomienia o zmianie formatu wysyłane przez interfejs WASAPI.
- Zarejestruj implementację IAudioSessionEvents za pomocą interfejsu WASAPI, wywołując metodę IAudioSessionControl::RegisterAudioSessionNotification.
metody IAudioSessionEvents są wywoływane przez WASAPI, gdy wystąpią zmiany sesji audio. Te zdarzenia są wywoływane podczas zmiany nazwy wyświetlanej sesji, ścieżki ikony, woluminu, parametru grupowania lub stanu.
Aby zaimplementować funkcję routingu strumienia, klient musi poczekać na powiadomienie o rozłączeniu sesji. Po rozłączeniu sesji audio lub zmianie formatu urządzenia, interfejs WASAPI wysyła klientowi powiadomienia w postaci wywołań zwrotnych za pośrednictwem IAudioSessionEvents::OnSessionDisconnected. Po powiadomieniu o rozłączeniu interfejs WASAPI wysyła również wartość wskazującą, dlaczego sesja została rozłączona. Może się to zdarzyć z kilku powodów, takich jak usunięcie urządzenia, zatrzymanie serwera itd. Aby uzyskać pełną listę przyczyn, zapoznaj się z wyliczeniem AudioSessionDisconnectReason zdefiniowanym w pliku AudioPolicy.h. Jeśli domyślne urządzenie ulegnie zmianie, klient musi poczekać na powiadomienia z wartością DisconnectReasonDeviceRemoval, jeśli te nie zostały jeszcze odebrane. W odpowiedzi na takie powiadomienia klient może ponownie otworzyć strumień na nowym urządzeniu domyślnym.
Ponieważ wszystkie te operacje są asychroniczne, kolejność, w której aplikacja odbiera powiadomienia, nie można przewidzieć. Zazwyczaj jednak aplikacja odbiera wartość AudioSessionDisconnect przed powiadomieniem o zmianie domyślnego urządzenia.
Powiadomienia o zmianie formatu
Zmiany formatu audio zachodzą, kiedy zmienia się format strumienia. Może się tak zdarzyć, gdy użytkownik wybierze nowy format w panelu sterowania Dźwięk lub nowe urządzenie domyślne obsługuje nowy format (na przykład HDMI lub niektóre profesjonalne interfejsy audio z ręcznym dostosowaniem częstotliwości próbkowania). Aby powiadomić klienta o tych typach zmian formatu, WASAPI wysyła powiadomienie o rozłączeniu sesji poprzez zarejestrowaną implementację IAudioSessionEvents::OnSessionDisconnected, z podanym powodem rozłączenia: DisconnectReasonFormatChanged. Klient może obsłużyć powiadomienie, ponownie otwierając strumień w nowym formacie.
Tematy pokrewne