Autor Wątek: XAudio2 i przełączenie urządzeń  (Przeczytany 2827 razy)

Offline revo

  • Użytkownik

# Luty 03, 2013, 18:05:22
W tej chwili piszę obsługę dźwięku pod Windows 8 i natrafiłem na problem z obsługą słuchawek i przełączaniem urządzeń.

IXAudio2::CreateMasteringVoice tworzy się na bieżącym urządzeniu -- jeśli są słuchawki to dźwięk idzie na słuchawki, jeśli nie ma to dźwięk słychać z głośników. Problem pojawił się w sytuacji gdy zaczynam ze słuchawkami i wypinam je w trakcie odtwarzania dźwięku -- dźwięk znikał. Zgodnie z Marble Maze sample i forum msdn, dodałem reakcję na OnCriticalError i dźwięk pojawia się na głośnikach tak jak trzeba. Niestety ponowne wpięcie słuchawek nic nie zmienia i dźwięk leci dalej na głośnikach (OnCriticalError nie jest wywoływane).

Z jakiegoś powodu Marble Maze nie działa na moim komputerze i nie mogę sprawdzić czy problem też tam występuje, w kodzie nie widziałem specjalnej obsługi tej sytuacji.

Czy ktoś wie jak poprawnie zareagować na wpięcie słuchawek? Znalazłem coś o IMMNotificationClient, jednak z tego co widziałem nie jest dostępne to na Windows RT / Windows Phone 8.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline kubera

  • Użytkownik
    • Prywatna strona

# Luty 03, 2013, 20:58:10
Witam!

Odnoszę wrażenie, że obsługujesz sytuację poprawnie.
Jeżeli gra Microsoft-u, również tak działa,
to może zapytaj tam:
http://xboxforums.create.msdn.com/forums/33.aspx

Offline revo

  • Użytkownik

# Luty 03, 2013, 21:52:20
Udało mi się w końcu uruchomić Marble Maze i ten problem też tam występuje. Z ciekawości sprawdziłem jak jest w Angry Birds Space i Where's My Water -- obie gry po wypięciu słuchawek całkowicie tracą dźwięk.

Czy ktoś z Windows 8 i którąś z tych gier mógłby potwierdzić, że ma taką samą przypadłość? Zaczynam się zastanawiać czy to nie kwestia komputera / sterownika.

Offline kubera

  • Użytkownik
    • Prywatna strona

# Luty 04, 2013, 22:54:23
Odniosłem wrażenie, iż wrzuciłem post-a rano.
Poniższy tekst to propozycja, nie wiem, czy zadziała.
(ja tak wykrywam analogicznie odłączenie, podłączenie monitora)

Możesz wykryć komunikat WM_DEVICECHANGE i ustawić wymagane urządzenie odtwarzające.
Jakoś tak :)

Offline revo

  • Użytkownik

  • +1
# Luty 04, 2013, 23:28:33
Dla aplikacji pod Windows Store to chyba nie przejdzie ;)

Właśnie skończyłem implementować rozwiązanie, które jakoś nawet działa:
1) Dla 'klasycznego' Windowsa monitoruję zmiany przez IMMNotificationClient -- w OnDeviceAdded, OnDeviceRemoved, OnDeviceStateChanged, OnDefaultDeviceChanged uruchamiam timer 1s i po tym czasie inicjalizuję ponownie XAudio2
2) Dla Windows Store używam DeviceInformation::FindAllAsync(DeviceClass::AudioRender) -- na razie uruchamiam co sekundę i sprawdzam czy nie zmieniła się ilość urządzeń, jeśli tak to inicjalizuję ponownie XAudio2

W przyszłości zmienię 1) na poprawne użycie XAudio2 z DirectX, na razie nie jest mi to do szczęścia aż tak bardzo potrzebne. Dodatkowe informacje, które przydały się do rozwiązania problemu znalazłem na tej stronie.

Offline kubera

  • Użytkownik
    • Prywatna strona

# Luty 16, 2013, 13:52:23
2) Dla Windows Store używam DeviceInformation::FindAllAsync(DeviceClass::AudioRender) -- na razie uruchamiam co sekundę i sprawdzam czy nie zmieniła się ilość urządzeń, jeśli tak to inicjalizuję ponownie XAudio2

I jak, czy wymyśliłeś lub znalazłeś bardziej poprawne rozwiązanie problemu?
Jak należy reagować?

Pozdr.

Offline revo

  • Użytkownik

# Luty 16, 2013, 17:41:44
Na razie zostawiłem to i może wrócę do tego kiedyś jak znajdę więcej czasu -- na razie działa ;)

Offline kubera

  • Użytkownik
    • Prywatna strona

# Luty 16, 2013, 19:39:29
OKI