From: <man...@us...> - 2015-02-22 13:12:07
|
Revision: 4786 http://sourceforge.net/p/modplug/code/4786 Author: manxorist Date: 2015-02-22 13:11:53 +0000 (Sun, 22 Feb 2015) Log Message: ----------- [Mod] openmpt123: When both, PortAudio and SDL, are available, default to SDL backend now. SDL is more widespread and generally more reliable. PortAudio support is still valuable because it has no dependency on X11 on Unix-like systems. [Fix] openmpt123: SDL requires power-of-2 buffer sizes and there are backends which enforce this. Round up the buffer size accordingly. [Mod] openmpt123: Make the default buffer sizes for SDL and WaveOut slightly more aggressive. Modified Paths: -------------- trunk/OpenMPT/libopenmpt/dox/changelog.md trunk/OpenMPT/openmpt123/openmpt123.cpp trunk/OpenMPT/openmpt123/openmpt123.hpp trunk/OpenMPT/openmpt123/openmpt123_sdl.hpp trunk/OpenMPT/openmpt123/openmpt123_waveout.hpp Modified: trunk/OpenMPT/libopenmpt/dox/changelog.md =================================================================== --- trunk/OpenMPT/libopenmpt/dox/changelog.md 2015-02-21 21:34:40 UTC (rev 4785) +++ trunk/OpenMPT/libopenmpt/dox/changelog.md 2015-02-22 13:11:53 UTC (rev 4786) @@ -5,6 +5,12 @@ For fully detailed change log, please see the source repository directly. This is just a high-level summary. +### libopenmpt svn + + * openmpt123: When both, SDL1.2 and PortAudio, are available, SDL is now the + preferred backend because SDL is more widespread and better tested on all + kinds of different platforms, and in generel, SDL is just more reliable. + ### 2015-02-17 - libopenmpt 0.2-beta10 * Makefile configuration filenames changed from Modified: trunk/OpenMPT/openmpt123/openmpt123.cpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.cpp 2015-02-21 21:34:40 UTC (rev 4785) +++ trunk/OpenMPT/openmpt123/openmpt123.cpp 2015-02-22 13:11:53 UTC (rev 4786) @@ -383,9 +383,6 @@ } log << " libopenmpt Features: " << openmpt::string::get( openmpt::string::library_features ) << std::endl; log << " libopenmpt Build: " << openmpt::string::get( openmpt::string::build ) << std::endl; -#ifdef MPT_WITH_PORTAUDIO - log << " " << Pa_GetVersionText() << " (" << Pa_GetVersion() << ") <http://portaudio.com/>" << std::endl; -#endif #ifdef MPT_WITH_SDL const SDL_version * linked_sdlver = SDL_Linked_Version(); log << " libSDL "; @@ -398,6 +395,9 @@ log << "(API: " << static_cast<int>( sdlver.major ) << "." << static_cast<int>( sdlver.minor ) << "." << static_cast<int>( sdlver.patch ) << ")"; log << " <https://libsdl.org/>" << std::endl; #endif +#ifdef MPT_WITH_PORTAUDIO + log << " " << Pa_GetVersionText() << " (" << Pa_GetVersion() << ") <http://portaudio.com/>" << std::endl; +#endif #ifdef MPT_WITH_FLAC log << " FLAC " << FLAC__VERSION_STRING << ", " << FLAC__VENDOR_STRING << ", API " << FLAC_API_VERSION_CURRENT << "." << FLAC_API_VERSION_REVISION << "." << FLAC_API_VERSION_AGE << " <https://xiph.org/flac/>" << std::endl; #endif @@ -1470,7 +1470,7 @@ mod.select_subsong( -1 ); // play all subsongs consecutively silentlog.str( std::string() ); // clear, loader messages get stored to get_metadata( "warnings" ) by libopenmpt internally render_mod_file( flags, filename, filesize, mod, log, audio_stream ); - } + } } catch ( prev_file & ) { throw; @@ -1628,12 +1628,12 @@ std::ostringstream drivers; drivers << " Available drivers:" << std::endl; drivers << " " << "default" << std::endl; +#if defined( MPT_WITH_SDL ) + drivers << " " << "sdl" << std::endl; +#endif #if defined( MPT_WITH_PORTAUDIO ) drivers << " " << "portaudio" << std::endl; #endif -#if defined( MPT_WITH_SDL ) - drivers << " " << "sdl" << std::endl; -#endif #if defined( WIN32 ) drivers << " " << "waveout" << std::endl; #endif @@ -1935,20 +1935,18 @@ flags.apply_default_buffer_sizes(); file_audio_stream_raii file_audio_stream( flags, flags.output_filename, log ); render_files( flags, log, file_audio_stream ); +#if defined( MPT_WITH_SDL ) + } else if ( flags.driver == "sdl" || flags.driver.empty() ) { + sdl_stream_raii sdl_stream( flags, log ); + render_files( flags, log, sdl_stream ); +#endif #if defined( MPT_WITH_PORTAUDIO ) } else if ( flags.driver == "portaudio" || flags.driver.empty() ) { portaudio_stream_raii portaudio_stream( flags, log ); render_files( flags, log, portaudio_stream ); #endif -#if defined( MPT_WITH_SDL ) - } else if ( flags.driver == "sdl" || flags.driver.empty() ) { - flags.apply_default_buffer_sizes(); - sdl_stream_raii sdl_stream( flags ); - render_files( flags, log, sdl_stream ); -#endif #if defined( WIN32 ) } else if ( flags.driver == "waveout" || flags.driver.empty() ) { - flags.apply_default_buffer_sizes(); waveout_stream_raii waveout_stream( flags ); render_files( flags, log, waveout_stream ); #endif Modified: trunk/OpenMPT/openmpt123/openmpt123.hpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123.hpp 2015-02-21 21:34:40 UTC (rev 4785) +++ trunk/OpenMPT/openmpt123/openmpt123.hpp 2015-02-22 13:11:53 UTC (rev 4786) @@ -279,7 +279,7 @@ bool paused; void apply_default_buffer_sizes() { if ( ui_redraw_interval == default_high ) { - ui_redraw_interval = 40; + ui_redraw_interval = 50; } else if ( ui_redraw_interval == default_low ) { ui_redraw_interval = 10; } @@ -296,11 +296,11 @@ } commandlineflags() { mode = ModeUI; - ui_redraw_interval = default_high; // 50 ... (-2 == 10) + ui_redraw_interval = default_high; driver = ""; device = -1; - buffer = default_high; // 250 ... (-2 == 50) - period = default_high; // 50 ... (-2 == 10) + buffer = default_high; + period = default_high; samplerate = 48000; channels = 2; use_float = true; Modified: trunk/OpenMPT/openmpt123/openmpt123_sdl.hpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123_sdl.hpp 2015-02-21 21:34:40 UTC (rev 4785) +++ trunk/OpenMPT/openmpt123/openmpt123_sdl.hpp 2015-02-22 13:11:53 UTC (rev 4786) @@ -16,8 +16,12 @@ #if defined(MPT_WITH_SDL) #include <SDL.h> +#ifdef main #undef main +#endif +#ifdef SDL_main #undef SDL_main +#endif namespace openmpt123 { @@ -27,6 +31,7 @@ class sdl_stream_raii : public write_buffers_blocking_wrapper { private: + std::ostream & log; std::size_t channels; protected: void check_sdl_error( int e ) { @@ -35,12 +40,31 @@ return; } } + std::uint32_t round_up_power2(std::uint32_t x) + { + std::uint32_t result = 1; + while ( result < x ) { + result *= 2; + } + return result; + } public: - sdl_stream_raii( const commandlineflags & flags ) + sdl_stream_raii( commandlineflags & flags, std::ostream & log ) : write_buffers_blocking_wrapper(flags) + , log(log) , channels(flags.channels) { - double bufferSeconds = flags.buffer * 0.001; + if ( flags.buffer == default_high ) { + flags.buffer = 160; + } else if ( flags.buffer == default_low ) { + flags.buffer = 80; + } + if ( flags.period == default_high ) { + flags.period = 20; + } else if ( flags.period == default_low ) { + flags.period = 10; + } + flags.apply_default_buffer_sizes(); check_sdl_error( SDL_Init( SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER | SDL_INIT_AUDIO ) ); SDL_AudioSpec audiospec; std::memset( &audiospec, 0, sizeof( SDL_AudioSpec ) ); @@ -48,12 +72,17 @@ audiospec.format = AUDIO_S16SYS; audiospec.channels = flags.channels; audiospec.silence = 0; - audiospec.samples = bufferSeconds * 0.5 * flags.samplerate; + audiospec.samples = round_up_power2( ( flags.buffer * flags.samplerate ) / ( 1000 * 2 ) ); audiospec.size = audiospec.samples * audiospec.channels * sizeof( std::int16_t ); audiospec.callback = &sdl_callback_wrapper; audiospec.userdata = this; + if ( flags.verbose ) { + log << "SDL:" << std::endl; + log << " latency: " << ( audiospec.samples * 2.0 / flags.samplerate ) << " (2 * " << audiospec.samples << ")" << std::endl; + log << std::endl; + } + set_queue_size_frames( round_up_power2( ( flags.buffer * flags.samplerate ) / ( 1000 * 2 ) ) ); check_sdl_error( SDL_OpenAudio( &audiospec, NULL ) ); - set_queue_size_frames( static_cast<std::size_t>( bufferSeconds * 0.5 * flags.samplerate ) ); SDL_PauseAudio( 0 ); } ~sdl_stream_raii() { Modified: trunk/OpenMPT/openmpt123/openmpt123_waveout.hpp =================================================================== --- trunk/OpenMPT/openmpt123/openmpt123_waveout.hpp 2015-02-21 21:34:40 UTC (rev 4785) +++ trunk/OpenMPT/openmpt123/openmpt123_waveout.hpp 2015-02-22 13:11:53 UTC (rev 4786) @@ -32,13 +32,24 @@ std::vector<std::vector<char> > wavebuffers; std::deque<char> byte_queue; public: - waveout_stream_raii( const commandlineflags & flags ) + waveout_stream_raii( commandlineflags & flags ) : waveout(NULL) , num_channels(0) , num_chunks(0) , frames_per_chunk(0) , bytes_per_chunk(0) { + if ( flags.buffer == default_high ) { + flags.buffer = 150; + } else if ( flags.buffer == default_low ) { + flags.buffer = 50; + } + if ( flags.period == default_high ) { + flags.period = 30; + } else if ( flags.period == default_low ) { + flags.period = 10; + } + flags.apply_default_buffer_sizes(); WAVEFORMATEX wfx; ZeroMemory( &wfx, sizeof( wfx ) ); wfx.wFormatTag = flags.use_float ? WAVE_FORMAT_IEEE_FLOAT : WAVE_FORMAT_PCM; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |