Sesje audio
Sesja audio to grupa powiązanych strumieni audio, którymi klient WASAPI może zarządzać zbiorczo. Klienci mogą kontrolować poziom woluminu i stan wyciszenia poszczególnych sesji. System stosuje wolumin określony przez klienta i ustawienia wyciszenia jednolicie do wszystkich strumieni w sesji.
Gdy klient inicjuje strumień audio, przypisuje strumień audio do sesji audio. Aby uzyskać więcej informacji, zobacz IAudioClient::Initialize.
Sesja audio zawiera strumienie renderowania lub strumienie przechwytywania, ale nie obie. Domyślnie ustawienia woluminu i wyciszenia sesji renderowania są trwałe podczas ponownego uruchamiania systemu. Ustawienia woluminu i wyciszenia sesji przechwytywania nie są trwałe. (Sesja zawierająca strumienie działające w trybie sprzężenia zwrotnego jest traktowana tak samo jak sesja przechwytywania. Oznacza to, że ustawienia sesji nie są trwałe. Aby uzyskać więcej informacji na temat trybu sprzężenia zwrotnego, zobacz rejestrowanie sprzężenia zwrotnego.)
Każdy strumień audio należy do dokładnie jednej sesji. Klient przypisuje strumień audio do określonej sesji w momencie inicjowania obiektu strumienia. Strumień zachowuje członkostwo w sesji przez cały okres istnienia strumienia. Po utworzeniu obiektu strumienia obiekt istnieje, dopóki klient nie zwolni ostatniego zliczonego odwołania do obiektu, a następnie obiekt zostanie usunięty.
Mimo że klient nie może zmienić sesji, do której przypisano istniejący strumień, może osiągnąć podobny efekt, usuwając strumień (zwalniając wszystkie odwołania do niego), tworząc nowy strumień, aby zastąpić usunięty strumień i przypisując nowy strumień do innej sesji.
Każda sesja renderowania reprezentuje podzbiór strumieni, które tworzą mieszankę globalną, która jest odtwarzana za pośrednictwem określonego urządzenia punktu końcowego audio . Mieszanka globalna łączy wszystkie sesje ze wszystkich aplikacji współużytkujących urządzenie.
Często aplikacja z kilkoma strumieniami przypisuje wszystkie strumienie do tej samej sesji. Jednak aplikacja może, jako opcję, przypisać różne strumienie do różnych sesji. Każdy strumień, który aplikacja nie przypisuje jawnie do sesji, należy do sesji domyślnej.
Typowe aplikacje audio powinny unikać modyfikowania ustawień głośności i wyciszania sesji. Zamiast tego użytkownicy kontrolują te ustawienia za pomocą interfejsów użytkownika programów sterujących. Na przykład w systemie Windows Vista program dostarczany przez system, Sndvol.exe, wyświetla kontrolkę głośności i wyciszenie dla każdej aktywnej lub ostatnio aktywnej sesji renderowania w systemie. Za pomocą tych kontrolek użytkownicy mogą dostosować ustawienia głośności i wyciszenia dla wszystkich sesji w systemie.
Program Sndvol aktualnie wyświetla kontrolki głośności tylko dla urządzeń punktów końcowych renderowania audio. Nie wyświetla kontrolek głośności dla urządzeń do przechwytywania dźwięku.
Sesja jest aktywna, jeśli zawiera co najmniej jeden aktywny strumień. Aktywny strumień znajduje się w stanie uruchomienia. Nieaktywny strumień znajduje się w stanie zatrzymania . Sesja staje się aktywna, gdy jej pierwszy strumień staje się aktywny. Sesja staje się nieaktywna, gdy ostatni aktywny strumień stanie się nieaktywny. Po tym, jak sesja była nieaktywna przez pewien czas, system zmienia stan sesji z nieaktywnej na wygasłą.
Sndvol wyświetla kontrolki woluminu i wyciszenia dla wszystkich aktywnych i nieaktywnych sesji renderowania. Usługa Sndvol usuwa kontrolki woluminu i wyciszenia dla sesji, gdy stan sesji zmieni się z nieaktywnej na wygasłą lub po zakończeniu sesji. (Sesja kończy się po usunięciu ostatniego strumienia; oznacza to, że gdy klient zwalnia ostateczną liczbę odwołań dla ostatniego pozostałego obiektu strumienia w sesji). Jednym wyjątkiem od tej reguły są dźwięki powiadomień systemowych. Sndvol zawsze wyświetla kontrolki głośności i wyciszenia dla dźwięków powiadomień systemowych niezależnie od stanu sesji dla tych dźwięków.
Zazwyczaj strumień należy do sesji obejmującej tylko proces, który zawiera aplikację, która utworzyła strumień. Jednak aplikacje mają możliwość definiowania sesji między procesami, które łączą strumienie z co najmniej dwóch procesów.
Interfejs WASAPI obsługuje przede wszystkim sesje między procesami, aby:
- Program Sndvol może przedstawić użytkownikowi pojedynczą kontrolkę głośności w celu zarządzania dźwiękami powiadomień systemowych we wszystkich aplikacjach.
- Odtwarzacz multimedialny uruchamiany w jednym procesie może przesyłać strumieniowo chronioną zawartość do programu odszyfrowywania uruchamianego w innym procesie.
Podobnie jak w przypadku ustawień sterowania sesji renderowania specyficznych dla procesu, ustawienia sterowania sesji renderowania między procesami są domyślnie trwałe w przypadku ponownych uruchomień systemu. Interfejs WASAPI zapewnia to zachowanie przede wszystkim z korzyścią dla dźwięków powiadomień systemowych, które muszą zachować wolumin użytkownika i ustawienia wyciszenia, ponieważ połączenie aplikacji zmienia się w czasie.
Program Sndvol oznacza kontrolkę woluminu dla każdej sesji z nazwą wyświetlaną i ikoną. Klient ma możliwość jawnego przypisania nazwy wyświetlanej i ikony do sesji. Jeśli klient nie udostępnia tych elementów, zamiast tego usługa Sndvol wyświetla domyślną nazwę i ikonę domyślną. Nazwa domyślna zawiera informacje, takie jak tytuł okna aplikacji. Ikona domyślna to ikona okna aplikacji. Tylko w przypadku sesji specyficznych dla procesu te wartości domyślne udostępniają użytkownikom istotne informacje. Należy pamiętać, że sesja między procesami może być skojarzona z więcej niż jedną aplikacją. W tym przypadku zrozumiała jest tylko nazwa wyświetlana i ikona podana przez klienta.
Mimo że ustawienia woluminu i wyciszenia sesji renderowania są domyślnie trwałe w przypadku ponownego uruchomienia systemu, nazwa wyświetlana i ikona podana przez klienta nie są. Aby upewnić się, że usługa Sndvol wyświetla nazwę i ikonę podaną przez klienta, klient musi jawnie przypisać nazwę i ikonę do sesji w momencie przypisania pierwszego strumienia do sesji. System zachowuje nazwę wyświetlaną i ikonę sesji tylko do momentu zakończenia sesji.
Każda sesja jest identyfikowana przez identyfikator GUID sesji. W momencie otwarcia strumienia przez klienta klient przypisuje ten strumień do określonej sesji. Klient dostarcza następujące dwie informacje w celu zidentyfikowania tej sesji:
- Identyfikator GUID sesji.
- Czy sesja jest sesją między procesami, czy sesją specyficzną dla procesu — sesja specyficzna dla procesu zawiera tylko strumienie z procesu klienta.
Te informacje są wystarczające, aby odróżnić określoną sesję od wszystkich innych sesji na tym samym komputerze. Identyfikator GUID sesji dla sesji specyficznej dla procesu jednoznacznie identyfikuje sesję tylko w zakresie procesu, który jest właścicielem sesji. Natomiast identyfikator GUID sesji dla sesji między procesami jest unikatowy w zakresie wszystkich procesów uruchomionych na komputerze.
W przypadku sesji specyficznej dla procesu system używa kombinacji identyfikatora GUID sesji i identyfikatora procesu, aby jednoznacznie zidentyfikować sesję w zakresie komputera. W związku z tym, jeśli klienci w dwóch różnych procesach przypisują swoje strumienie do dwóch sesji specyficznych dla procesu z identycznymi identyfikatorami GUID sesji, system traktuje sesje jako oddzielne, ponieważ ich identyfikatory procesów są różne. Ponadto jeśli sesja między procesami używa tego samego identyfikatora GUID sesji co jedna lub więcej sesji specyficznych dla procesu, system traktuje sesję między procesami w odróżnieniu od sesji specyficznych dla procesu, mimo że współużytkują ten sam identyfikator GUID sesji.
Na przykład w systemie Windows Vista interfejsy API wyższego poziomu, takie jak multimedia systemu Windows funkcje waveOutXxx i DirectSound zazwyczaj przypisują strumienie audio tworzone do domyślnych sesji specyficznych dla procesu, które są identyfikowane przez wartość identyfikatora GUID sesji GUID_NULL. W przypadku klientów tych interfejsów API sesja domyślna dla każdego procesu klienta jest oddzielona od sesji domyślnych dla innych procesów klienta, mimo że sesje mają identyczne identyfikatory GUID sesji. Ponadto jeśli co najmniej jedna aplikacja przypisuje strumienie do sesji między procesami, która jest identyfikowana przez wartość identyfikatora GUID sesji GUID_NULL, system traktuje tę sesję między procesami jako oddzieloną od domyślnych sesji specyficznych dla procesu, które współużytkują ten sam identyfikator GUID sesji sesji. W związku z tym program Sndvol wyświetla oddzielną kontrolkę woluminu dla każdej sesji klienta, sesji specyficznej dla procesu i wyświetla dodatkową kontrolę woluminu dla sesji między procesami, która jest identyfikowana przez wartość identyfikatora GUID sesji GUID_NULL, jeśli ta sesja istnieje.
Każda sesja jest skojarzona tylko z jednym urządzeniem punktu końcowego audio. Jeśli dwie sesje mają identyczne identyfikatory GUID sesji i identyfikatory procesów, ale są skojarzone z różnymi urządzeniami, system traktuje dwie sesje jako oddzielne. Sesja nigdy nie może zawierać strumieni przechwytywania i renderowania, ponieważ strumień przechwytywania może być skojarzony tylko z urządzeniem przechwytywania, a strumień renderowania może być skojarzony tylko z urządzeniem renderowania.
Jak wspomniano wcześniej, ustawienia woluminu i wyciszenia sesji są trwałe w przypadku ponownych uruchomień systemu. Co najmniej dwa wystąpienia aplikacji mogą tworzyć sesje specyficzne dla procesu z identycznymi identyfikatorami GUID sesji. Za pośrednictwem programu Sndvol użytkownik może wybrać różne ustawienia woluminu i wyciszenia dla każdej z tych sesji. Po zakończeniu tych sesji system zachowuje ustawienia sterowania tylko jednej z tych sesji — ostatniej sesji do zakończenia. Później, jeśli nowe wystąpienie aplikacji tworzy sesję specyficzną dla procesu z tym samym identyfikatorem GUID sesji, co poprzednio, ta sesja dziedziczy wcześniej zapisany wolumin i ustawienia wyciszenia.
Aplikacja nie powinna próbować dodawać strumienia do lub kontrolować poziom woluminu sesji należącej do innej, niepowiązanej aplikacji. Ponadto aplikacja nie powinna próbować kontrolować poziomu głośności sesji zarządzanej przez system pod kątem dźwięków powiadomień. Jednak aplikacja może odtwarzać dźwięk przez sesję systemową pod kątem dźwięków powiadomień, wywołując funkcję PlaySound. Aby uzyskać więcej informacji, zobacz Notification Sounds for Legacy Audio Applications.
Aplikacja może zarejestrować się, aby otrzymywać powiadomienia, gdy stan sesji ulegnie zmianie. Aby uzyskać więcej informacji, zobacz zdarzenia sesji audio.
W rzadkich przypadkach aplikacja tworząca sesję specyficzną dla procesu może wymagać skonsolidowania kontroli sesji specyficznych dla procesu dla co najmniej dwóch wystąpień aplikacji w ramach pojedynczej kontrolki woluminu w usłudze Sndvol. Aby uzyskać więcej informacji, zobacz Parametry grupowania.
Tematy pokrewne