Index: Makefile =================================================================== --- Makefile (revision 12411) +++ Makefile (working copy) @@ -91,7 +91,6 @@ # (defaults are 0): # # NO_PULSEAUDIO=1 Avoid using PulseAudio, even if found -# NO_SDL=1 Avoid using SDL, even if found # NO_SDL2=1 Avoid using SDL2, even if found # NO_FLAC=1 Avoid using FLAC, even if found # NO_SNDFILE=1 Avoid using libsndfile, even if found @@ -617,11 +616,10 @@ ifeq ($(NO_SDL2),1) else #LDLIBS += -lsdl2 -ifeq ($(shell pkg-config$(TOOLCHAIN_SUFFIX) --exists sdl2 && echo yes),yes) -CPPFLAGS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --cflags-only-I sdl2 ) -DMPT_WITH_SDL2 -LDFLAGS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-L sdl2 ) $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-other sdl2 ) -LDLIBS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-l sdl2 ) -NO_SDL:=1 +ifeq ($(shell pkg-config$(TOOLCHAIN_SUFFIX) --exists 'sdl2 >= 2.0.4' && echo yes),yes) +CPPFLAGS_SDL2 := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --cflags-only-I 'sdl2 >= 2.0.4' ) -DMPT_WITH_SDL2 +LDFLAGS_SDL2 := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-L 'sdl2 >= 2.0.4' ) $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-other 'sdl2 >= 2.0.4' ) +LDLIBS_SDL2 := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-l 'sdl2 >= 2.0.4' ) else ifeq ($(FORCE_DEPS),1) $(error sdl2 not found) @@ -632,23 +630,6 @@ endif endif -ifeq ($(NO_SDL),1) -else -#LDLIBS += -lsdl -ifeq ($(shell pkg-config$(TOOLCHAIN_SUFFIX) --exists sdl && echo yes),yes) -CPPFLAGS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --cflags-only-I sdl ) -DMPT_WITH_SDL -LDFLAGS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-L sdl ) $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-other sdl ) -LDLIBS_SDL := $(shell pkg-config$(TOOLCHAIN_SUFFIX) --libs-only-l sdl ) -else -ifeq ($(FORCE_DEPS),1) -$(error sdl not found) -else -$(warning warning: sdl not found) -endif -NO_SDL:=1 -endif -endif - ifeq ($(NO_PORTAUDIO),1) else #LDLIBS += -lportaudio @@ -756,9 +737,9 @@ LDFLAGS += $(LDFLAGS_ZLIB) $(LDFLAGS_MPG123) $(LDFLAGS_OGG) $(LDFLAGS_VORBIS) $(LDFLAGS_VORBISFILE) LDLIBS += $(LDLIBS_ZLIB) $(LDLIBS_MPG123) $(LDLIBS_OGG) $(LDLIBS_VORBIS) $(LDLIBS_VORBISFILE) -CPPFLAGS_OPENMPT123 += $(CPPFLAGS_SDL2) $(CPPFLAGS_SDL) $(CPPFLAGS_PORTAUDIO) $(CPPFLAGS_PULSEAUDIO) $(CPPFLAGS_FLAC) $(CPPFLAGS_SNDFILE) $(CPPFLAGS_ALLEGRO42) -LDFLAGS_OPENMPT123 += $(LDFLAGS_SDL2) $(LDFLAGS_SDL) $(LDFLAGS_PORTAUDIO) $(LDFLAGS_PULSEAUDIO) $(LDFLAGS_FLAC) $(LDFLAGS_SNDFILE) $(LDFLAGS_ALLEGRO42) -LDLIBS_OPENMPT123 += $(LDLIBS_SDL2) $(LDLIBS_SDL) $(LDLIBS_PORTAUDIO) $(LDLIBS_PULSEAUDIO) $(LDLIBS_FLAC) $(LDLIBS_SNDFILE) $(LDLIBS_ALLEGRO42) +CPPFLAGS_OPENMPT123 += $(CPPFLAGS_SDL2) $(CPPFLAGS_PORTAUDIO) $(CPPFLAGS_PULSEAUDIO) $(CPPFLAGS_FLAC) $(CPPFLAGS_SNDFILE) $(CPPFLAGS_ALLEGRO42) +LDFLAGS_OPENMPT123 += $(LDFLAGS_SDL2) $(LDFLAGS_PORTAUDIO) $(LDFLAGS_PULSEAUDIO) $(LDFLAGS_FLAC) $(LDFLAGS_SNDFILE) $(LDFLAGS_ALLEGRO42) +LDLIBS_OPENMPT123 += $(LDLIBS_SDL2) $(LDLIBS_PORTAUDIO) $(LDLIBS_PULSEAUDIO) $(LDLIBS_FLAC) $(LDLIBS_SNDFILE) $(LDLIBS_ALLEGRO42) %: %.o Index: build/autotools/Makefile.am =================================================================== --- build/autotools/Makefile.am (revision 12411) +++ build/autotools/Makefile.am (working copy) @@ -466,9 +466,9 @@ if ENABLE_OPENMPT123 bin_PROGRAMS += bin/openmpt123 -bin_openmpt123_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -I$(srcdir)/src/openmpt123 $(PORTAUDIO_CFLAGS) $(PULSEAUDIO_CFLAGS) $(SDL2_CFLAGS) $(SDL_CFLAGS) $(SNDFILE_CFLAGS) $(FLAC_CFLAGS) +bin_openmpt123_CPPFLAGS = $(MINGWSTDTHREADS_CPPFLAGS) -I$(srcdir)/src/openmpt123 $(PORTAUDIO_CFLAGS) $(PULSEAUDIO_CFLAGS) $(SDL2_CFLAGS) $(SNDFILE_CFLAGS) $(FLAC_CFLAGS) bin_openmpt123_CXXFLAGS = $(WIN32_CONSOLE_CXXFLAGS) -bin_openmpt123_LDADD = libopenmpt.la $(PORTAUDIO_LIBS) $(PULSEAUDIO_LIBS) $(SDL2_LIBS) $(SDL_LIBS) $(SNDFILE_LIBS) $(FLAC_LIBS) $(OPENMPT123_WIN32_LIBS) +bin_openmpt123_LDADD = libopenmpt.la $(PORTAUDIO_LIBS) $(PULSEAUDIO_LIBS) $(SDL2_LIBS) $(SNDFILE_LIBS) $(FLAC_LIBS) $(OPENMPT123_WIN32_LIBS) bin_openmpt123_SOURCES = bin_openmpt123_SOURCES += openmpt123/openmpt123_allegro42.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_config.hpp @@ -479,7 +479,6 @@ bin_openmpt123_SOURCES += openmpt123/openmpt123_portaudio.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_pulseaudio.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_raw.hpp -bin_openmpt123_SOURCES += openmpt123/openmpt123_sdl.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_sdl2.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_sndfile.hpp bin_openmpt123_SOURCES += openmpt123/openmpt123_stdout.hpp Index: build/autotools/configure.ac =================================================================== --- build/autotools/configure.ac (revision 12411) +++ build/autotools/configure.ac (working copy) @@ -240,30 +240,15 @@ AM_CONDITIONAL([HAVE_PORTAUDIOCPP], [test x$have_portaudio = x1]) # Optional disabled openmpt123 dependency: libsdl2 -AC_ARG_WITH([sdl2], AS_HELP_STRING([--with-sdl2], [Enable use of libsdl2. Enabling libsdl2 automatically disables libsdl.])) +AC_ARG_WITH([sdl2], AS_HELP_STRING([--with-sdl2], [Enable use of libsdl2.])) AS_IF([test "x$enable_openmpt123" != "xno"],[ AS_IF([test "x$with_sdl2" = "xyes"], [ - PKG_CHECK_MODULES([SDL2], [sdl2], [AC_DEFINE([MPT_WITH_SDL2], [], [with libsdl2])], [AC_MSG_ERROR([Unable to find libsdl2.])]) + PKG_CHECK_MODULES([SDL2], [sdl2 >= 2.0.4], [AC_DEFINE([MPT_WITH_SDL2], [], [with libsdl2])], [AC_MSG_ERROR([Unable to find libsdl2.])]) ] ) ]) -# Optional disabled openmpt123 dependency: libsdl -AC_ARG_WITH([sdl], AS_HELP_STRING([--with-sdl], [Enable use of libsdl.])) -AS_IF([test "x$enable_openmpt123" != "xno"],[ -AS_IF([test "x$with_sdl2" != "xno"],[ -AS_IF([test "x$with_sdl" = "xyes"], - [ - PKG_CHECK_MODULES([SDL], [sdl], [AC_DEFINE([MPT_WITH_SDL], [], [with libsdl])], [AC_MSG_ERROR([Unable to find libsdl.])]) - ] -)], - [ - AC_MSG_WARN([Skipping libsdl because libsdl2 is enabled.]) - ] -) -]) - # Optional openmpt123 dependency: libsndfile AC_ARG_WITH([sndfile], AS_HELP_STRING([--without-sndfile], [Disable use of libsndfile.])) AS_IF([test "x$enable_openmpt123" != "xno"],[ Index: openmpt123/openmpt123.cpp =================================================================== --- openmpt123/openmpt123.cpp (revision 12411) +++ openmpt123/openmpt123.cpp (working copy) @@ -100,7 +100,6 @@ #include "openmpt123_allegro42.hpp" #include "openmpt123_portaudio.hpp" #include "openmpt123_pulseaudio.hpp" -#include "openmpt123_sdl.hpp" #include "openmpt123_sdl2.hpp" #include "openmpt123_waveout.hpp" @@ -515,18 +514,6 @@ log << "API: " << static_cast( sdlver.major ) << "." << static_cast( sdlver.minor ) << "." << static_cast( sdlver.patch ) << ""; log << " " << std::endl; #endif -#ifdef MPT_WITH_SDL - const SDL_version * linked_sdlver = SDL_Linked_Version(); - log << " libSDL "; - if ( linked_sdlver ) { - log << static_cast( linked_sdlver->major ) << "." << static_cast( linked_sdlver->minor ) << "." << static_cast( linked_sdlver->patch ) << " "; - } - SDL_version sdlver; - std::memset( &sdlver, 0, sizeof( SDL_version ) ); - SDL_VERSION( &sdlver ); - log << "(API: " << static_cast( sdlver.major ) << "." << static_cast( sdlver.minor ) << "." << static_cast( sdlver.patch ) << ")"; - log << " " << std::endl; -#endif #ifdef MPT_WITH_PULSEAUDIO log << " " << "libpulse, libpulse-simple" << " (headers " << pa_get_headers_version() << ", API " << PA_API_VERSION << ", PROTOCOL " << PA_PROTOCOL_VERSION << ", library " << ( pa_get_library_version() ? pa_get_library_version() : "unknown" ) << ") " << std::endl; #endif @@ -2052,9 +2039,6 @@ #if defined( MPT_WITH_SDL2 ) drivers << " " << "sdl2" << std::endl; #endif -#if defined( MPT_WITH_SDL ) - drivers << " " << "sdl" << std::endl; -#endif #if defined( MPT_WITH_PORTAUDIO ) drivers << " " << "portaudio" << std::endl; #endif @@ -2448,11 +2432,6 @@ sdl2_stream_raii sdl2_stream( flags, log ); render_files( flags, log, sdl2_stream, prng ); #endif -#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, prng ); -#endif #if defined( MPT_WITH_PORTAUDIO ) } else if ( flags.driver == "portaudio" || flags.driver.empty() ) { portaudio_stream_raii portaudio_stream( flags, log ); @@ -2509,12 +2488,6 @@ std_err.writeout(); return 1; #endif -#ifdef MPT_WITH_SDL - } catch ( sdl_exception & e ) { - std_err << "SDL error: " << e.what() << std::endl; - std_err.writeout(); - return 1; -#endif #ifdef MPT_WITH_SDL2 } catch ( sdl2_exception & e ) { std_err << "SDL2 error: " << e.what() << std::endl; Index: openmpt123/openmpt123.hpp =================================================================== --- openmpt123/openmpt123.hpp (revision 12411) +++ openmpt123/openmpt123.hpp (working copy) @@ -1308,77 +1308,6 @@ } }; -class write_buffers_blocking_wrapper : public write_buffers_interface { -protected: - std::size_t channels; - std::size_t sampleQueueMaxFrames; - std::deque sampleQueue; -protected: - virtual ~write_buffers_blocking_wrapper() { - return; - } -protected: - write_buffers_blocking_wrapper( const commandlineflags & flags ) - : channels(flags.channels) - , sampleQueueMaxFrames(0) - { - return; - } - void set_queue_size_frames( std::size_t frames ) { - sampleQueueMaxFrames = frames; - } - template < typename Tsample > - Tsample pop_queue() { - float val = 0.0f; - if ( !sampleQueue.empty() ) { - val = sampleQueue.front(); - sampleQueue.pop_front(); - } - return convert_sample_to( val ); - } - template < typename Tsample > - void fill_buffer( Tsample * buf, std::size_t framesToRender ) { - for ( std::size_t frame = 0; frame < framesToRender; ++frame ) { - for ( std::size_t channel = 0; channel < channels; ++channel ) { - *buf = pop_queue(); - buf++; - } - } - } -private: - void wait_for_queue_space() { - while ( sampleQueue.size() >= sampleQueueMaxFrames * channels ) { - unlock(); - sleep( 1 ); - lock(); - } - } -public: - void write( const std::vector buffers, std::size_t frames ) override { - lock(); - for ( std::size_t frame = 0; frame < frames; ++frame ) { - for ( std::size_t channel = 0; channel < channels; ++channel ) { - wait_for_queue_space(); - sampleQueue.push_back( buffers[channel][frame] ); - } - } - unlock(); - } - void write( const std::vector buffers, std::size_t frames ) override { - lock(); - for ( std::size_t frame = 0; frame < frames; ++frame ) { - for ( std::size_t channel = 0; channel < channels; ++channel ) { - wait_for_queue_space(); - sampleQueue.push_back( buffers[channel][frame] * (1.0f/32768.0f) ); - } - } - unlock(); - } - virtual void lock() = 0; - virtual void unlock() = 0; - bool sleep( int ms ) override = 0; -}; - class write_buffers_polling_wrapper : public write_buffers_interface { protected: std::size_t channels; Index: openmpt123/openmpt123_config.hpp =================================================================== --- openmpt123/openmpt123_config.hpp (revision 12411) +++ openmpt123/openmpt123_config.hpp (working copy) @@ -81,14 +81,6 @@ #endif // MPT_BUILD_MSVC -#if defined(MPT_WITH_SDL) && defined(MPT_WITH_SDL2) -#error "MPT_WITH_SDL2 and MPT_WITH_SDL are mutually exclusive." -#endif - -#if defined(MPT_WITH_SDL) -MPT_WARNING("SDL1 support is deprecated and will be removed in a future openmpt123 version.") -#endif - #define OPENMPT123_VERSION_STRING OPENMPT_API_VERSION_STRING #endif // OPENMPT123_CONFIG_HPP Index: openmpt123/openmpt123_sdl.hpp =================================================================== --- openmpt123/openmpt123_sdl.hpp (revision 12411) +++ openmpt123/openmpt123_sdl.hpp (working copy) @@ -1,140 +0,0 @@ -/* - * openmpt123_sdl.hpp - * ------------------ - * Purpose: libopenmpt command line player - * Notes : (currently none) - * Authors: OpenMPT Devs - * The OpenMPT source code is released under the BSD license. Read LICENSE for more details. - */ - -#ifndef OPENMPT123_SDL_HPP -#define OPENMPT123_SDL_HPP - -#include "openmpt123_config.hpp" -#include "openmpt123.hpp" - -#if defined(MPT_WITH_SDL) - -#if defined(__clang__) -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wreserved-id-macro" -#endif // __clang__ -#include -#if defined(__clang__) -#pragma clang diagnostic pop -#endif // __clang__ -#ifdef main -#undef main -#endif -#ifdef SDL_main -#undef SDL_main -#endif - -namespace openmpt123 { - -struct sdl_exception : public exception { - sdl_exception( int /*code*/ ) : exception( "SDL error" ) { } -}; - -class sdl_stream_raii : public write_buffers_blocking_wrapper { -private: - std::ostream & log; - std::size_t channels; -protected: - void check_sdl_error( int e ) { - if ( e < 0 ) { - throw sdl_exception( e ); - 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( commandlineflags & flags, std::ostream & log_ ) - : write_buffers_blocking_wrapper(flags) - , log(log_) - , channels(flags.channels) - { - 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 ) ); - audiospec.freq = flags.samplerate; - audiospec.format = AUDIO_S16SYS; - audiospec.channels = flags.channels; - audiospec.silence = 0; - 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 ) ); - SDL_PauseAudio( 0 ); - } - ~sdl_stream_raii() { - SDL_PauseAudio( 1 ); - SDL_CloseAudio(); - SDL_Quit(); - } -private: - static void sdl_callback_wrapper( void * userdata, Uint8 * stream, int len ) { - return reinterpret_cast( userdata )->sdl_callback( stream, len ); - } - void sdl_callback( Uint8 * stream, int len ) { - std::size_t framesToRender = len / sizeof( std::int16_t ) / channels; - for ( std::size_t frame = 0; frame < framesToRender; ++frame ) { - for ( std::size_t channel = 0; channel < channels; ++channel ) { - std::int16_t sample = pop_queue(); - std::memcpy( stream, &sample, sizeof( std::int16_t ) ); - stream += sizeof( std::int16_t ); - } - } - } -public: - bool pause() override { - SDL_PauseAudio( 1 ); - return true; - } - bool unpause() override { - SDL_PauseAudio( 0 ); - return true; - } - void lock() override { - SDL_LockAudio(); - } - void unlock() override { - SDL_UnlockAudio(); - } - bool sleep( int ms ) override { - SDL_Delay( ms ); - return true; - } -}; - -} // namespace openmpt123 - -#endif // MPT_WITH_SDL - -#endif // OPENMPT123_SDL_HPP - Index: openmpt123/openmpt123_sdl2.hpp =================================================================== --- openmpt123/openmpt123_sdl2.hpp (revision 12411) +++ openmpt123/openmpt123_sdl2.hpp (working copy) @@ -57,7 +57,7 @@ } }; -class sdl2_stream_raii : public write_buffers_blocking_wrapper { +class sdl2_stream_raii : public write_buffers_interface { private: std::ostream & log; sdl2_raii sdl2; @@ -64,6 +64,9 @@ int dev; std::size_t channels; bool use_float; + std::size_t sampleQueueMaxFrames; + std::vector sampleBufFloat; + std::vector sampleBufInt; protected: std::uint32_t round_up_power2(std::uint32_t x) { @@ -75,12 +78,12 @@ } public: sdl2_stream_raii( commandlineflags & flags, std::ostream & log_ ) - : write_buffers_blocking_wrapper(flags) - , log(log_) + : log(log_) , sdl2( SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER | SDL_INIT_AUDIO ) , dev(-1) , channels(flags.channels) , use_float(flags.use_float) + , sampleQueueMaxFrames(0) { if ( flags.buffer == default_high ) { flags.buffer = 160; @@ -101,14 +104,14 @@ audiospec.silence = 0; audiospec.samples = round_up_power2( ( flags.buffer * flags.samplerate ) / ( 1000 * 2 ) ); audiospec.size = audiospec.samples * audiospec.channels * ( flags.use_float ? sizeof( float ) : sizeof( std::int16_t ) ); - audiospec.callback = &sdl2_callback_wrapper; - audiospec.userdata = this; + audiospec.callback = NULL; + audiospec.userdata = NULL; if ( flags.verbose ) { log << "SDL2:" << 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 ) ) ); + sampleQueueMaxFrames = round_up_power2( ( flags.buffer * flags.samplerate ) / ( 1000 * 2 ) ); SDL_AudioSpec audiospec_obtained; std::memset( &audiospec_obtained, 0, sizeof( SDL_AudioSpec ) ); std::memcpy( &audiospec_obtained, &audiospec, sizeof( SDL_AudioSpec ) ); @@ -125,24 +128,45 @@ SDL_CloseAudioDevice( dev ); } private: - static void sdl2_callback_wrapper( void * userdata, Uint8 * stream, int len ) { - return reinterpret_cast( userdata )->sdl2_callback( stream, len ); + std::size_t get_num_writeable_frames() { + std::size_t num_queued_frames = SDL_GetQueuedAudioSize( dev ) / ( use_float ? sizeof( float ) : sizeof( std::int16_t ) ) / channels; + if ( num_queued_frames > sampleQueueMaxFrames ) { + return 0; + } + return sampleQueueMaxFrames - num_queued_frames; } - void sdl2_callback( Uint8 * stream, int len ) { - return ( use_float ? sdl2_callback_impl( stream, len ) : sdl2_callback_impl( stream, len ) ); + template + void write_frames( const Tsample * buffer, std::size_t frames ) { + while ( frames > 0 ) { + std::size_t chunk_frames = std::min( frames, get_num_writeable_frames() ); + if ( chunk_frames > 0 ) { + check_sdl2_error( SDL_QueueAudio( dev, buffer, chunk_frames * channels * ( use_float ? sizeof( float ) : sizeof( std::int16_t ) ) ) ); + frames -= chunk_frames; + buffer += chunk_frames * channels; + } else { + SDL_Delay( 1 ); + } + } } - template < typename Tsample > - void sdl2_callback_impl( Uint8 * stream, int len ) { - std::size_t framesToRender = len / sizeof( Tsample ) / channels; - for ( std::size_t frame = 0; frame < framesToRender; ++frame ) { +public: + void write( const std::vector buffers, std::size_t frames ) override { + sampleBufFloat.clear(); + for ( std::size_t frame = 0; frame < frames; ++frame ) { for ( std::size_t channel = 0; channel < channels; ++channel ) { - Tsample sample = pop_queue(); - std::memcpy( stream, &sample, sizeof( Tsample ) ); - stream += sizeof( Tsample ); + sampleBufFloat.push_back( buffers[channel][frame] ); } } + write_frames( sampleBufFloat.data(), frames ); } -public: + void write( const std::vector buffers, std::size_t frames ) override { + sampleBufInt.clear(); + for ( std::size_t frame = 0; frame < frames; ++frame ) { + for ( std::size_t channel = 0; channel < channels; ++channel ) { + sampleBufInt.push_back( buffers[channel][frame] ); + } + } + write_frames( sampleBufInt.data(), frames ); + } bool pause() override { SDL_PauseAudioDevice( dev, 1 ); return true; @@ -151,12 +175,6 @@ SDL_PauseAudioDevice( dev, 0 ); return true; } - void lock() override { - SDL_LockAudioDevice( dev ); - } - void unlock() override { - SDL_UnlockAudioDevice( dev ); - } bool sleep( int ms ) override { SDL_Delay( ms ); return true;