void SdlMixerManager::init() { // Start SDL Audio subsystem if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } const int maxNameLen = 20; char sdlDriverName[maxNameLen]; sdlDriverName[0] = '\0'; SDL_AudioDriverName(sdlDriverName, maxNameLen); debug(1, "Using SDL Audio Driver \"%s\"", sdlDriverName); // Get the desired audio specs SDL_AudioSpec desired = getAudioSpec(SAMPLES_PER_SEC); // Needed as SDL_OpenAudio as of SDL-1.2.14 mutates fields in // "desired" if used directly. SDL_AudioSpec fmt = desired; // Start SDL audio with the desired specs if (SDL_OpenAudio(&fmt, &_obtained) != 0) { warning("Could not open audio device: %s", SDL_GetError()); _mixer = new Audio::MixerImpl(g_system, desired.freq); assert(_mixer); _mixer->setReady(false); } else { debug(1, "Output sample rate: %d Hz", _obtained.freq); if (_obtained.freq != desired.freq) warning("SDL mixer output sample rate: %d differs from desired: %d", _obtained.freq, desired.freq); debug(1, "Output buffer size: %d samples", _obtained.samples); if (_obtained.samples != desired.samples) warning("SDL mixer output buffer size: %d differs from desired: %d", _obtained.samples, desired.samples); if (_obtained.format != desired.format) warning("SDL mixer sound format: %d differs from desired: %d", _obtained.format, desired.format); #ifndef __SYMBIAN32__ // The SymbianSdlMixerManager does stereo->mono downmixing, // but otherwise we require stereo output. if (_obtained.channels != 2) error("SDL mixer output requires stereo output device"); #endif _mixer = new Audio::MixerImpl(g_system, _obtained.freq); assert(_mixer); _mixer->setReady(true); startAudio(); } }
void SdlMixerManager::init() { // Start SDL Audio subsystem if (SDL_InitSubSystem(SDL_INIT_AUDIO) == -1) { error("Could not initialize SDL: %s", SDL_GetError()); } #if SDL_VERSION_ATLEAST(2, 0, 0) const char *sdlDriverName = SDL_GetCurrentAudioDriver(); #else const int maxNameLen = 20; char sdlDriverName[maxNameLen]; sdlDriverName[0] = '\0'; SDL_AudioDriverName(sdlDriverName, maxNameLen); #endif debug(1, "Using SDL Audio Driver \"%s\"", sdlDriverName); // Get the desired audio specs SDL_AudioSpec desired = getAudioSpec(SAMPLES_PER_SEC); // Needed as SDL_OpenAudio as of SDL-1.2.14 mutates fields in // "desired" if used directly. SDL_AudioSpec fmt = desired; // Start SDL audio with the desired specs if (SDL_OpenAudio(&fmt, &_obtained) != 0) { warning("Could not open audio device: %s", SDL_GetError()); // The mixer is not marked as ready _mixer = new Audio::MixerImpl(g_system, desired.freq); return; } // The obtained sample format is not supported by the mixer, call // SDL_OpenAudio again with NULL as the second argument to force // SDL to do resampling to the desired audio spec. if (_obtained.format != desired.format) { debug(1, "SDL mixer sound format: %d differs from desired: %d", _obtained.format, desired.format); SDL_CloseAudio(); if (SDL_OpenAudio(&fmt, NULL) != 0) { warning("Could not open audio device: %s", SDL_GetError()); // The mixer is not marked as ready _mixer = new Audio::MixerImpl(g_system, desired.freq); return; } _obtained = desired; } debug(1, "Output sample rate: %d Hz", _obtained.freq); if (_obtained.freq != desired.freq) debug(1, "SDL mixer output sample rate: %d differs from desired: %d", _obtained.freq, desired.freq); debug(1, "Output buffer size: %d samples", _obtained.samples); if (_obtained.samples != desired.samples) debug(1, "SDL mixer output buffer size: %d differs from desired: %d", _obtained.samples, desired.samples); #ifndef __SYMBIAN32__ // The SymbianSdlMixerManager does stereo->mono downmixing, // but otherwise we require stereo output. if (_obtained.channels != 2) error("SDL mixer output requires stereo output device"); #endif _mixer = new Audio::MixerImpl(g_system, _obtained.freq); assert(_mixer); _mixer->setReady(true); startAudio(); }