Zgadzam się, ale device.audio to leczenie skutków choroby a nie przyczyny. Po pierwsze program taki jak SongPlayer, który zwyczajnie odtwarza muzykę z pliku, nie powinien działać w trybie wyłączności, tylko po prostu otwierać AHI jako device. Po drugie YAM powinien z łaski swojej sprawdzać wynik OpenDevice() a nie się prostacko wieszać.
Programowe miksowanie dźwięku zawsze niesie ze sobą ryzyko pogorszenia jego jakości. Oczywiście ma to niewielkie znaczenie w przypadku sygnałów wydzielanych przez YAM-a czy powiedzmy AmiGG. Nieco większe, jeżeli słuchamy sobie muzyki przy okazji. Zasadnicze, jeżeli tę muzykę tworzymy.
Pół biedy jeżeli wszystkie jednocześnie pracujące źródła dźwięku mają tę samą częstotliwość próbkowania. Wtedy mamy tylko problem głośności. Przykładowo, mamy w systemie aktywne (być może niejednocześnie) 4 źródła dźwięku. Jeżeli ustawimy w prefsach AHI skalowanie głośności na "bezpieczne", to każde źródło będzie pracowało z rozdzielczością 14-bitową. "Bezpieczne dynamiczne" daje 16-bitów dla każdego źródła, jeżeli tylko jedno pracuje w danym momencie, gdy wchodzi drugie, pierwsze zostanie ściszone o połowę (czyli przeskoczy na 15 bitów), drugie również wejdzie z dynamiką 15-bitową. "Pełny dźwięk" oznacza 16 bitów dla wszystkich, ale jeżeli w danej chwili suma sygnałów nie zmieści się w 16 bitach, cóż mamy obcięcie sygnału, czyli przesterowanie. Opcja "-3 dB" oznacza wstępne uciachanie najmłodszego bitu w każdym sygnale, a potem sumę jak wyżej. Dzięki temu przesterowanie jest możliwe dopiero przy 3 dźwiękach. "-6 dB" to kradzież 2 najmłodszych bitów i groźba przesterowania dopiero przy 5 źródłach.
Jeżeli dodatkowo źródła dźwięku mają różne częstotliwości próbkowania, to te "niepasujące" muszą zostać zresamplowane. Z tego co widziałem w źródłach AHI to resampling się odbywa metodą "najbliższego sąsiada", co powoduje spore zniekształcenia. Dowód? Bierzemy DigiBoostera 2 (który całe miksowanie zrzuca na AHI) i ładujemy sampla w rodzaju "sine sweep" czyli ton sinusoidalny o płynnie rosnącej wysokości dźwięku. Jeżeli zagramy go na jakiejkolwiek nucie innej od C-4, to AHI rozpocznie resampling i oprócz narastającego dźwięku usłyszymy wyraźnie dźwięk "lustrzany", opadający. To słyszalny objaw zjawiska aliasingu. Jeżeli resamplowaniu poddawany jest dźwięk złożony (a nie czysty ton), to dźwięk "lustrzany" jest słyszany jako szum powodujący zatarcie "czystości" brzmienia i pogorszenie panoramy stereo. Dźwięk lustrzany jest bardzo dobrze słyszalny, co daje pojęcie o tym jakiej jakości możemy się spodziewać po AHI...
Taka operacja naprawdę musi się kończyć tak tragicznie?
Nie musi gdyby programistom chciało się zamiast
OpenDevice("ahi.device", ...);
napisać
if (OpenDevice("ahi.device", ...) == 0) {...}
A że się tak da, potwierdza DigiBooster (również 2.x), który melduje jeżeli kanały są zajęte.