Serwis Edukacyjny Nauczycieli w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2025 mgr Jerzy Wałaszek
|
SDL_OpenAudioDevice
SPIS TREŚCI |
Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.
Użyj tej funkcji, aby otworzyć określone urządzenie dźwiękowe.
SDL_AudioDeviceID SDL_OpenAudioDevice(const char* device, int iscapture, const SDL_AudioSpec* desired, SDL_AudioSpec* obtained, int allowed_changes) |
device | łańcuch w kodzie UTF-8 zwrócony przez SDL_GetAudioDeviceName(); zobacz do Uwag. |
iscapture | wartość niezerowa określa, że urządzenie powinno zostać otwarte do nagrywania, nie do odtwarzania dźwięku |
desired | struktura SDL_AudioSpec reprezentująca pożądany format wyjściowy; więcej szczegółów w opisie SDL_OpenAudio() |
obtained | struktura SDL_AudioSpec wypełniana faktycznym formatem wyjściowym; więcej szczegółów w opisie SDL_OpenAudio() |
allowed_changes | znaczniki połączone ze sobą bitową alternatywą; zobacz do Uwag. |
Dla kompatybilności z SDL 1.2 funkcja nigdy nie zwróci 1, ponieważ SDL rezerwuje ten identyfikator ID dla przestarzałej funkcji SDL_OpenAudio().
SDL_AudioSpec want, have; SDL_AudioDeviceID dev; SDL_memset(&want, 0, sizeof(want)); /* lub SDL_zero(want) */ want.freq = 48000; want.format = AUDIO_F32; want.channels = 2; want.samples = 4096; want.callback = MyAudioCallback; /* napisałeś tę funkcję w innym miejscu - szczegóły w opisie SDL_AudioSpec */ dev = SDL_OpenAudioDevice(NULL, 0, &want, &have, SDL_AUDIO_ALLOW_FORMAT_CHANGE); if (dev == 0) { SDL_Log("Failed to open audio: %s", SDL_GetError()); } else { if (have.format != want.format) { /* tu zezwoliliśmy na zmianę. */ SDL_Log("We didn't get Float32 audio format."); } SDL_PauseAudioDevice(dev, 0); /* start odtwarzania dźwięku. */ SDL_Delay(5000); /* niech funkcja dźwiękowa odtwarza jakiś dźwięk przez 5 sekund. */ SDL_CloseAudioDevice(dev); } |
Proszę zauważyć, że biblioteka SDL 2.0 przed wersją 2.0.5 nie obsługiwała nagrywania; dlatego funkcja ta kończyła się niepowodzeniem, jeśli parametr iscapture miał wartość niezerową. Poczynając od wersji SDL 2.0.5 nagrywanie zostało zaimplementowane i teraz ta wartość może być niezerowa.
Przekazując w parametrze device wartość NULL żądamy najbardziej sensownego urządzenia standardowego (i jest to ekwiwalent tego, co robi SDL_OpenAudio() przy wyborze urządzenia). Nazwa urządzenia jest łańcuchem tekstowym kodowanym w UTF-8 zwracanym przez SDL_GetAudioDeviceName(), lecz niektóre sterowniki zezwalają na łańcuchy oraz specyficzne dla sterownika, takie jak adresy IP dla zdalnego serwera dźwiękowego lub nazwy plików dla sterownika dyskowego audio.
Parametr allowed_changes może składać się z następujących znaczników połączonych bitową alternatywą:
SDL_AUDIO_ALLOW_FREQUENCY_CHANGE |
SDL_AUDIO_ALLOW_FORMAT_CHANGE |
SDL_AUDIO_ALLOW_CHANNELS_CHANGE |
SDL_AUDIO_ALLOW_ANY_CHANGE |
Znaczniki te określają sposób zachowania się SDL, gdy urządzenie nie może zaoferować określonej cechy. Jeśli aplikacja zażąda cechy, której sprzęt nie oferuje, SDL zawsze będzie próbowało zastosować najbliższy ekwiwalent.
Na przykład, jeśli poprosisz o format dźwiękowy float32, a karta dźwiękowa obsługuje tylko int16, SDL ustawi sprzęt na int16. Jeśli wcześniej ustawiłeś znacznik SDL_AUDIO_ALLOW_FORMAT_CHANGE, to SDL zmieni format w strukturze obtained. Jeśli znacznik ten nie był ustawiony, SDL przygotuje konwersję danych dźwiękowych float32 funkcji callback na dane int16 przed przesłaniem ich do sprzętu odtwarzającego i zachowa pierwotnie zażądany format w strukturze obtained.
Jeśli twoja aplikacja może obsługiwać tylko jeden określony format danych, prześlij zero w parametrze allowed_changes i pozwól SDL przezroczyście zająć się obsługą różnic.
Otwarte urządzenie dźwiękowe startuje w trybie pauzy i powinno zostać włączone do odtwarzania przez wywołanie SDL_PauseAudioDevice(devid, 0), gdy będziesz gotowy na wywołanie swojej funkcji dźwiękowej callback. Ponieważ sterownik dźwięku może zmodyfikować zażądany rozmiar bufora dźwiękowego, powinieneś przydzielać pamięć dla wszystkich lokalnych buforów miksowania dopiero po otwarciu danego urządzenia dźwiękowego.
W większości przypadków funkcja dźwiękowa callback (wywoływana zwrotnie przez sterownik dźwięku) pracuje w osobnym wątku; możesz uniknąć warunków wyścigu pomiędzy swoją funkcją callback a innymi wątkami bez pełnego zatrzymywania odtwarzania za pomocą SDL_LockAudioDevice(). Więcej informacji znajdziesz w opisie SDL_AudioSpec.
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2025 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.