aboutsummaryrefslogtreecommitdiff
path: root/src/midiplay/adlmidiplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/midiplay/adlmidiplay.cpp')
-rw-r--r--src/midiplay/adlmidiplay.cpp116
1 files changed, 79 insertions, 37 deletions
diff --git a/src/midiplay/adlmidiplay.cpp b/src/midiplay/adlmidiplay.cpp
index 34bf885..ca22025 100644
--- a/src/midiplay/adlmidiplay.cpp
+++ b/src/midiplay/adlmidiplay.cpp
@@ -11,29 +11,38 @@
class MutexType
{
- SDL_mutex* mut;
+ SDL_mutex *mut;
public:
MutexType() : mut(SDL_CreateMutex()) { }
- ~MutexType() { SDL_DestroyMutex(mut); }
- void Lock() { SDL_mutexP(mut); }
- void Unlock() { SDL_mutexV(mut); }
+ ~MutexType()
+ {
+ SDL_DestroyMutex(mut);
+ }
+ void Lock()
+ {
+ SDL_mutexP(mut);
+ }
+ void Unlock()
+ {
+ SDL_mutexV(mut);
+ }
};
static std::deque<short> AudioBuffer;
static MutexType AudioBuffer_lock;
-static void SDL_AudioCallbackX(void*, Uint8* stream, int len)
+static void SDL_AudioCallbackX(void *, Uint8 *stream, int len)
{
SDL_LockAudio();
- short* target = (short*) stream;
+ 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
+ unsigned ate = len / 2; // number of shorts
if(ate > AudioBuffer.size()) ate = AudioBuffer.size();
- for(unsigned a=0; a<ate; ++a)
+ for(unsigned a = 0; a < ate; ++a)
{
target[a] = AudioBuffer[a];
}
@@ -42,31 +51,45 @@ static void SDL_AudioCallbackX(void*, Uint8* stream, int len)
SDL_UnlockAudio();
}
-
+static bool is_number(const std::string &s)
+{
+ std::string::const_iterator it = s.begin();
+ while(it != s.end() && std::isdigit(*it)) ++it;
+ return !s.empty() && it == s.end();
+}
#undef main
-int main(int argc, char** argv)
+int main(int argc, char **argv)
{
if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h")
{
std::printf(
- "Usage: adlmidi <midifilename> [ <options> ] [ <banknumber> [ <numcards> [ <numfourops>] ] ]\n"
+ "Usage: adlmidi <midifilename> [ <options> ] [ <bank> [ <numcards> [ <numfourops>] ] ]\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"
+ "\n"
+ "Where <bank> - number of embeeded bank or filepath to custom WOPL bank file\n"
+ "\n"
+ "Note: To create WOPL bank files use OPL Bank Editor you can get here: \n"
+ "https://github.com/Wohlstand/OPL3BankEditor\n"
+ "\n"
);
-/*
- for(unsigned a=0; a<sizeof(banknames)/sizeof(*banknames); ++a)
- std::printf("%10s%2u = %s\n",
- a?"":"Banks:",
- a,
- banknames[a]);
-*/
+
+ int banksCount = adl_getBanksCount();
+ const char* const* banknames = adl_getBankNames();
+
+ std::printf(" Available embedded banks by number:\n\n");
+
+ for(int a = 0; a < banksCount; ++a)
+ std::printf("%10s%2u = %s\n", a ? "" : "Banks:", a, banknames[a]);
+
std::printf(
+ "\n"
" Use banks 2-5 to play Descent \"q\" soundtracks.\n"
" Look up the relevant bank number from descent.sng.\n"
"\n"
@@ -76,7 +99,7 @@ int main(int argc, char** argv)
" The Doom & Hexen sets require one or two, while\n"
" Miles four-op set requires the maximum of numcards*6.\n"
"\n"
- );
+ );
return 0;
}
@@ -107,12 +130,12 @@ int main(int argc, char** argv)
}
if(spec.samples != obtained.samples)
std::fprintf(stderr, "Wanted (samples=%u,rate=%u,channels=%u); obtained (samples=%u,rate=%u,channels=%u)\n",
- spec.samples, spec.freq, spec.channels,
- obtained.samples,obtained.freq,obtained.channels);
+ spec.samples, spec.freq, spec.channels,
+ obtained.samples, obtained.freq, obtained.channels);
- ADL_MIDIPlayer* myDevice;
+ ADL_MIDIPlayer *myDevice;
myDevice = adl_init(44100);
- if(myDevice==NULL)
+ if(myDevice == NULL)
{
std::fprintf(stderr, "Failed to init MIDI device!\n");
return 1;
@@ -136,17 +159,36 @@ int main(int argc, char** argv)
else break;
std::copy(argv + (had_option ? 4 : 3), argv + argc,
- argv+2);
+ argv + 2);
argc -= (had_option ? 2 : 1);
}
if(argc >= 3)
{
- int bankno = std::atoi(argv[2]);
- if(adl_setBank(myDevice, bankno)!=0)
+ if(is_number(argv[2]))
{
- std::fprintf(stderr,"%s", adl_errorString());
- return 0;
+ int bankno = std::atoi(argv[2]);
+ if(adl_setBank(myDevice, bankno) != 0)
+ {
+ std::fprintf(stderr, "%s\n", adl_errorString());
+ std::fflush(stderr);
+ return 0;
+ }
+ }
+ else
+ {
+ std::fprintf(stdout, "Loading custom bank file %s...", argv[2]);
+ std::fflush(stdout);
+ if(adl_openBankFile(myDevice, argv[2]) != 0)
+ {
+ std::fprintf(stdout, "FAILED!\n");
+ std::fflush(stdout);
+ std::fprintf(stderr, "%s\n", adl_errorString());
+ std::fflush(stderr);
+ return 0;
+ }
+ std::fprintf(stdout, "OK!\n");
+ std::fflush(stdout);
}
}
@@ -160,14 +202,14 @@ int main(int argc, char** argv)
}
if(argc >= 5)
{
- if(adl_setNumFourOpsChn(myDevice, std::atoi(argv[4]))!=0)
+ 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)
+ if(adl_openFile(myDevice, argv[1]) != 0)
{
std::fprintf(stderr, "%s\n", adl_errorString());
return 2;
@@ -179,17 +221,17 @@ int main(int argc, char** argv)
{
short buff[4096];
unsigned long gotten = adl_play(myDevice, 4096, buff);
- if(gotten<=0) break;
+ 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];
+ 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)
+ const SDL_AudioSpec &spec_ = obtained;
+ while(AudioBuffer.size() > spec_.samples + (spec_.freq * 2) * OurHeadRoomLength)
{
SDL_Delay(1);
}