diff --git a/demos/CMakeLists.txt b/demos/CMakeLists.txt index 854bc0e..28bb493 100644 --- a/demos/CMakeLists.txt +++ b/demos/CMakeLists.txt @@ -9,6 +9,9 @@ TARGET_LINK_LIBRARIES(lines SDL2pp) ADD_EXECUTABLE(rendertarget rendertarget.cc) TARGET_LINK_LIBRARIES(rendertarget SDL2pp) +ADD_EXECUTABLE(audio_sine audio_sine.cc) +TARGET_LINK_LIBRARIES(audio_sine SDL2pp) + IF(SDL2PP_WITH_IMAGE) ADD_EXECUTABLE(image image.cc) TARGET_LINK_LIBRARIES(image SDL2pp) diff --git a/demos/audio_sine.cc b/demos/audio_sine.cc new file mode 100644 index 0000000..9106494 --- /dev/null +++ b/demos/audio_sine.cc @@ -0,0 +1,67 @@ +/* + libSDL2pp - C++ wrapper for libSDL2 + Copyright (C) 2013-2014 Dmitry Marakasov + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include + +#include + +#include + +using namespace SDL2pp; + +int Run() { + SDL sdl(SDL_INIT_AUDIO); + + const int samplerate = 48000; + float frequency = 2093.00f; // C7 tone + int64_t nsample = 0; + + // Setup audio device, and provide callback which plays sine wave with specified frequency + AudioSpec spec(samplerate, AUDIO_S16SYS, 1, 4096, [&nsample, frequency, samplerate](Uint8* stream, int len) { + // fill provided buffer with sine wave + for (Uint8* ptr = stream; ptr < stream + len; ptr += 2) + *(Uint16*)ptr = (Uint16)(32766.0f * sin(nsample++ / (float)samplerate * frequency)); + } + ); + + // Open audio device + AudioDevice dev("", 0, spec); + + // Sound plays after this call + dev.Pause(false); + + // Play for 1 second, after which everything is stopped and closed + SDL_Delay(1000); + + return 0; +} + +int main() { + try { + return Run(); + } catch (Exception& e) { + std::cerr << "Error: " << e.what() << " (" << e.GetSDLError() << ")" << std::endl; + } catch (std::exception& e) { + std::cerr << "Error: " << e.what() << std::endl; + } + + return -1; +}