Serwis Edukacyjny
Nauczycieli
w I-LO w Tarnowie

obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz       Dalej  

Autor artykułu: mgr Jerzy Wałaszek
Uaktualniono: 31.07.2022

©2022 mgr Jerzy Wałaszek
I LO w Tarnowie

Interfejs SDL2:

SDL_OpenAudioDevice

SPIS TREŚCI

Rozdział jest tłumaczeniem oryginalnej instrukcji dla biblioteki SDL2.

SDL_OpenAudioDevice

Użyj tej funkcji, aby otworzyć określone urządzenie dźwiękowe.

Składnia

SDL_AudioDeviceID SDL_OpenAudioDevice(const char*          device,
                                      int                  iscapture,
                                      const SDL_AudioSpec* desired,
                                      SDL_AudioSpec*       obtained,
                                      int                  allowed_changes)

Parametry funkcji

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.

Wartość zwracana

Zwraca ważny identyfikator ID urządzenia, który przy sukcesie jest większy od 0, a równy 0 przy niepowodzeniu; wywołaj funkcję SDL_GetError(), aby otrzymać więcej informacji na temat błędu.

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().

Przykładowy kod

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);
}

Uwagi

SDL_OpenAudio(), w przeciwieństwie do tej funkcji, zawsze działa na urządzeniu o identyfikatorze ID równym 1.  Z tego powodu ta funkcja nigdy nie zwróci 1, aby nie wejść w konflikt z przestarzałą funkcją.

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.

Wersja

Funkcja dostępna od SDL 2.0.0.

Powiązane funkcje

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2022 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: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.