#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) { short 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; }