diff options
author | Vitaly Novichkov <admin@wohlnet.ru> | 2018-12-13 02:28:57 +0300 |
---|---|---|
committer | Vitaly Novichkov <admin@wohlnet.ru> | 2018-12-13 02:29:16 +0300 |
commit | 68c03edbb563983b6ac3e81a826871bfdf9e3bd4 (patch) | |
tree | c9bdcb2dfeaa60cececdd602b8a9f5fdb0b815fa /examples/sdl2_audio | |
parent | d89084d6eaf3bb65c134201f61449656226cbf80 (diff) | |
download | libADLMIDI-68c03edbb563983b6ac3e81a826871bfdf9e3bd4.tar.gz libADLMIDI-68c03edbb563983b6ac3e81a826871bfdf9e3bd4.tar.bz2 libADLMIDI-68c03edbb563983b6ac3e81a826871bfdf9e3bd4.zip |
Build: Splid the main CMake build script
Keep it have library code only but no utils and examples are will be built independently
#196
Diffstat (limited to 'examples/sdl2_audio')
-rw-r--r-- | examples/sdl2_audio/CMakeLists.txt | 38 | ||||
-rw-r--r-- | examples/sdl2_audio/sdl2_sample.c | 124 |
2 files changed, 162 insertions, 0 deletions
diff --git a/examples/sdl2_audio/CMakeLists.txt b/examples/sdl2_audio/CMakeLists.txt new file mode 100644 index 0000000..6061b92 --- /dev/null +++ b/examples/sdl2_audio/CMakeLists.txt @@ -0,0 +1,38 @@ +cmake_minimum_required (VERSION 3.2) +project(adlmidi_vlc_plugin C) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}) + +find_library(SDL2_LIBRARY SDL2 REQUIRED) +include_directories(${SDL2_INCLUDE_DIR}) +message("Found ${SDL2_LIBRARY}") + +add_executable(adlmidi_sdl2_demo sdl2_sample.c) + +if(WIN32) + if(MSVC) + target_link_libraries(adlmidi_sdl2_demo ADLMIDI_IF ${SDL2_LIBRARY}) + else() + target_link_libraries(adlmidi_sdl2_demo ADLMIDI_IF ${SDL2_LIBRARY} pthread) + endif() +else() + target_link_libraries(adlmidi_sdl2_demo ADLMIDI_IF ${SDL2_LIBRARY} pthread dl m stdc++) +endif() + +if(MSDOS OR DJGPP) + set_target_properties(adlmidi_sdl2_demo PROPERTIES OUTPUT_NAME adlmidi) +endif() + +if(libADLMIDI_SHARED) + add_dependencies(adlmidi_sdl2_demo ADLMIDI_shared) + set_target_properties(adlmidi_sdl2_demo PROPERTIES COMPILE_FLAGS "-Wl,-rpath='$$ORIGIN/../lib'") +else() + if(NOT libADLMIDI_STATIC) + message(FATAL_ERROR "libADLMIDI is required to be built!") + endif() + add_dependencies(adlmidi_sdl2_demo ADLMIDI_static) +endif() + +install(TARGETS adlmidi_sdl2_demo + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") + diff --git a/examples/sdl2_audio/sdl2_sample.c b/examples/sdl2_audio/sdl2_sample.c new file mode 100644 index 0000000..b6307d7 --- /dev/null +++ b/examples/sdl2_audio/sdl2_sample.c @@ -0,0 +1,124 @@ +#include <SDL2/SDL.h> +#include <adlmidi.h> + +/* prototype for our audio callback */ +/* see the implementation for more information */ +void my_audio_callback(void *midi_player, Uint8 *stream, int len); + +/* variable declarations */ +static Uint32 is_playing = 0; /* remaining length of the sample we have to play */ +static short buffer[4096]; /* Audio buffer */ + + +int main(int argc, char *argv[]) +{ + /* local variables */ + static SDL_AudioSpec spec; /* the specs of our piece of music */ + static struct ADL_MIDIPlayer *midi_player = NULL; /* Instance of ADLMIDI player */ + static const char *music_path = NULL; /* Path to music file */ + + if (argc < 2) + { + fprintf(stderr, "\n" + "\n" + "No given files to play!\n" + "\n" + "Syntax: %s <path-to-MIDI-file>\n" + "\n", argv[0]); + return 2; + } + + music_path = argv[1]; + + /* Initialize SDL.*/ + if(SDL_Init(SDL_INIT_AUDIO) < 0) + return 1; + + spec.freq = 44100; + spec.format = AUDIO_S16SYS; + spec.channels = 2; + spec.samples = 2048; + + /* Initialize ADLMIDI */ + midi_player = adl_init(spec.freq); + if (!midi_player) + { + fprintf(stderr, "Couldn't initialize ADLMIDI: %s\n", adl_errorString()); + return 1; + } + + /* set the callback function */ + spec.callback = my_audio_callback; + /* set ADLMIDI's descriptor as userdata to use it for sound generation */ + spec.userdata = midi_player; + + /* Open the audio device */ + if (SDL_OpenAudio(&spec, NULL) < 0) + { + fprintf(stderr, "Couldn't open audio: %s\n", SDL_GetError()); + return 1; + } + + /* Optionally Setup ADLMIDI as you want */ + + /* Set using of embedded bank by ID */ + /*adl_setBank(midi_player, 68);*/ + + /* Set using of custom bank (WOPL format) loaded from a file */ + /*adl_openBankFile(midi_player, "/home/vitaly/Yandex.Disk/Музыка/Wolfinstein.wopl");*/ + + /* Open the MIDI (or MUS, IMF or CMF) file to play */ + if (adl_openFile(midi_player, music_path) < 0) + { + fprintf(stderr, "Couldn't open music file: %s\n", adl_errorInfo(midi_player)); + SDL_CloseAudio(); + adl_close(midi_player); + return 1; + } + + is_playing = 1; + /* Start playing */ + SDL_PauseAudio(0); + + printf("Playing... Hit Ctrl+C to quit!\n"); + + /* wait until we're don't playing */ + while (is_playing) + { + SDL_Delay(100); + } + + /* shut everything down */ + SDL_CloseAudio(); + adl_close(midi_player); + + return 0; +} + +/* + audio callback function + here you have to copy the data of your audio buffer into the + requesting audio buffer (stream) + you should only copy as much as the requested length (len) +*/ +void my_audio_callback(void *midi_player, Uint8 *stream, int len) +{ + struct ADL_MIDIPlayer* p = (struct ADL_MIDIPlayer*)midi_player; + + /* Convert bytes length into total count of samples in all channels */ + int samples_count = len / 2; + + /* Take some samples from the ADLMIDI */ + samples_count = adl_play(p, samples_count, (short*)buffer); + + if(samples_count <= 0) + { + is_playing = 0; + SDL_memset(stream, 0, len); + return; + } + + /* Send buffer to the audio device */ + SDL_memcpy(stream, (Uint8*)buffer, samples_count * 2); +} + |