From 90e3c6f54fddf8762f7349414211a8c0f94bf594 Mon Sep 17 00:00:00 2001 From: Wohlstand Date: Sat, 10 Oct 2015 01:51:33 +0300 Subject: Initial commit --- src/midiplay/adlmidiplay.cpp | 202 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 src/midiplay/adlmidiplay.cpp (limited to 'src/midiplay/adlmidiplay.cpp') diff --git a/src/midiplay/adlmidiplay.cpp b/src/midiplay/adlmidiplay.cpp new file mode 100644 index 0000000..3d58d37 --- /dev/null +++ b/src/midiplay/adlmidiplay.cpp @@ -0,0 +1,202 @@ + +#include +#include +#include +#include +#include +#include +#include + +#include + +class MutexType +{ + SDL_mutex* mut; +public: + MutexType() : mut(SDL_CreateMutex()) { } + ~MutexType() { SDL_DestroyMutex(mut); } + void Lock() { SDL_mutexP(mut); } + void Unlock() { SDL_mutexV(mut); } +}; + + +static std::deque AudioBuffer; +static MutexType AudioBuffer_lock; + +static void SDL_AudioCallbackX(void*, Uint8* stream, int len) +{ + SDL_LockAudio(); + short* target = (short*) stream; + AudioBuffer_lock.Lock(); + /*if(len != AudioBuffer.size()) + fprintf(stderr, "len=%d stereo samples, AudioBuffer has %u stereo samples", + len/4, (unsigned) AudioBuffer.size()/2);*/ + unsigned ate = len/2; // number of shorts + if(ate > AudioBuffer.size()) ate = AudioBuffer.size(); + for(unsigned a=0; a [ ] [ [ [ ] ] ]\n" + " -p Enables adlib percussion instrument mode\n" + " -t Enables tremolo amplification mode\n" + " -v Enables vibrato amplification mode\n" + " -s Enables scaling of modulator volumes\n" + " -nl Quit without looping\n" + " -w Write WAV file rather than playing\n" + ); +/* + for(unsigned a=0; a 2) + { + bool had_option = false; + + if(!std::strcmp("-p", argv[2])) + adl_setPercMode(myDevice, 1); + else if(!std::strcmp("-v", argv[2])) + adl_setHVibrato(myDevice, 1); + else if(!std::strcmp("-t", argv[2])) + adl_setHTremolo(myDevice, 1); + else if(!std::strcmp("-nl", argv[2])) + adl_setLoopEnabled(myDevice, 0); + else if(!std::strcmp("-s", argv[2])) + adl_setScaleModulators(myDevice, 1); + else break; + + std::copy(argv + (had_option ? 4 : 3), argv + argc, + argv+2); + argc -= (had_option ? 2 : 1); + } + + if(argc >= 3) + { + int bankno = std::atoi(argv[2]); + if(adl_setBank(myDevice, bankno)!=0) + { + std::fprintf(stderr,"%s", adl_errorString()); + return 0; + } + } + + if(argc >= 4) + { + if(adl_setNumCards(myDevice, std::atoi(argv[3])) != 0) + { + std::fprintf(stderr, "%s\n", adl_errorString()); + return 0; + } + } + if(argc >= 5) + { + if(adl_setNumFourOpsChn(myDevice, std::atoi(argv[4]))!=0) + { + std::fprintf(stderr, "%s\n", adl_errorString()); + return 0; + } + } + + if(adl_openFile(myDevice, argv[1])!=0) + { + std::fprintf(stderr, "%s\n", adl_errorString()); + return 2; + } + + SDL_PauseAudio(0); + + while(1) + { + int buff[4096]; + unsigned long gotten=adl_play(myDevice, 4096, buff); + if(gotten<=0) break; + + AudioBuffer_lock.Lock(); + size_t pos = AudioBuffer.size(); + AudioBuffer.resize(pos + gotten); + for(unsigned long p = 0; p < gotten; ++p) + AudioBuffer[pos+p] = buff[p]; + AudioBuffer_lock.Unlock(); + + const SDL_AudioSpec& spec_ = obtained; + while(AudioBuffer.size() > spec_.samples + (spec_.freq*2) * OurHeadRoomLength) + { + SDL_Delay(1); + } + } + + adl_close(myDevice); + SDL_CloseAudio(); + return 0; +} + -- cgit v1.2.3