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.cpp144
1 files changed, 104 insertions, 40 deletions
diff --git a/src/midiplay/adlmidiplay.cpp b/src/midiplay/adlmidiplay.cpp
index cbea468..f2781f2 100644
--- a/src/midiplay/adlmidiplay.cpp
+++ b/src/midiplay/adlmidiplay.cpp
@@ -5,10 +5,14 @@
#include <cstdlib>
#include <cstring>
#include <deque>
+#include <signal.h>
+#define SDL_MAIN_HANDLED
#include <SDL2/SDL.h>
#include <adlmidi.h>
+#include "wave_writer.h"
+
class MutexType
{
SDL_mutex *mut;
@@ -40,8 +44,9 @@ static void SDL_AudioCallbackX(void *, Uint8 *stream, int len)
/*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();
+ unsigned ate = (unsigned)len / 2; // number of shorts
+ if(ate > AudioBuffer.size())
+ ate = (unsigned)AudioBuffer.size();
for(unsigned a = 0; a < ate; ++a)
{
target[a] = AudioBuffer[a];
@@ -64,10 +69,15 @@ static void printError(const char *err)
std::fflush(stderr);
}
-#undef main
-int main(int argc, char **argv)
+static int stop = 0;
+static void sighandler(int dum)
{
+ if((dum == SIGINT) || (dum == SIGHUP) || (dum == SIGTERM))
+ stop = 1;
+}
+int main(int argc, char **argv)
+{
if(argc < 2 || std::string(argv[1]) == "--help" || std::string(argv[1]) == "-h")
{
std::printf(
@@ -87,7 +97,7 @@ int main(int argc, char **argv)
);
int banksCount = adl_getBanksCount();
- const char* const* banknames = adl_getBankNames();
+ const char *const *banknames = adl_getBankNames();
if(banksCount > 0)
{
@@ -108,7 +118,9 @@ int main(int argc, char **argv)
" Miles four-op set requires the maximum of numcards*6.\n"
"\n"
);
- } else {
+ }
+ else
+ {
std::printf(" This build of libADLMIDI has no embedded banks!\n\n");
}
@@ -134,17 +146,6 @@ int main(int argc, char **argv)
spec.samples = Uint16((double)spec.freq * AudioBufferLength);
spec.callback = SDL_AudioCallbackX;
- // Set up SDL
- if(SDL_OpenAudio(&spec, &obtained) < 0)
- {
- std::fprintf(stderr, "\nERROR: Couldn't open audio: %s\n\n", SDL_GetError());
- //return 1;
- }
- 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);
-
ADL_MIDIPlayer *myDevice;
myDevice = adl_init(44100);
if(myDevice == NULL)
@@ -153,6 +154,9 @@ int main(int argc, char **argv)
return 1;
}
+ bool recordWave = false;
+
+ adl_setLoopEnabled(myDevice, 1);
while(argc > 2)
{
@@ -162,6 +166,11 @@ int main(int argc, char **argv)
adl_setPercMode(myDevice, 1);
else if(!std::strcmp("-v", argv[2]))
adl_setHVibrato(myDevice, 1);
+ else if(!std::strcmp("-w", argv[2]))
+ {
+ recordWave = true;
+ adl_setLoopEnabled(myDevice, 0);//Disable loop while record WAV
+ }
else if(!std::strcmp("-t", argv[2]))
adl_setHTremolo(myDevice, 1);
else if(!std::strcmp("-nl", argv[2]))
@@ -175,6 +184,24 @@ int main(int argc, char **argv)
argc -= (had_option ? 2 : 1);
}
+ if(!recordWave)
+ {
+ // Set up SDL
+ if(SDL_OpenAudio(&spec, &obtained) < 0)
+ {
+ std::fprintf(stderr, "\nERROR: Couldn't open audio: %s\n\n", SDL_GetError());
+ std::fflush(stderr);
+ //return 1;
+ }
+ 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);
+ std::fflush(stderr);
+ }
+ }
+
if(argc >= 3)
{
if(is_number(argv[2]))
@@ -183,7 +210,7 @@ int main(int argc, char **argv)
if(adl_setBank(myDevice, bankno) != 0)
{
printError(adl_errorString());
- return 0;
+ return 1;
}
}
else
@@ -195,7 +222,7 @@ int main(int argc, char **argv)
std::fprintf(stdout, "FAILED!\n");
std::fflush(stdout);
printError(adl_errorString());
- return 0;
+ return 1;
}
std::fprintf(stdout, "OK!\n");
std::fflush(stdout);
@@ -207,7 +234,7 @@ int main(int argc, char **argv)
if(adl_setNumCards(myDevice, std::atoi(argv[3])) != 0)
{
printError(adl_errorString());
- return 0;
+ return 1;
}
std::fprintf(stdout, "Number of cards %s\n", argv[3]);
}
@@ -217,7 +244,7 @@ int main(int argc, char **argv)
if(adl_setNumCards(myDevice, 4) != 0)
{
printError(adl_errorString());
- return 0;
+ return 1;
}
}
@@ -226,7 +253,7 @@ int main(int argc, char **argv)
if(adl_setNumFourOpsChn(myDevice, std::atoi(argv[4])) != 0)
{
printError(adl_errorString());
- return 0;
+ return 1;
}
std::fprintf(stdout, "Number of four-ops %s\n", argv[4]);
}
@@ -237,31 +264,68 @@ int main(int argc, char **argv)
return 2;
}
- SDL_PauseAudio(0);
+ signal(SIGINT, sighandler);
+ signal(SIGHUP, sighandler);
+ signal(SIGTERM, sighandler);
- while(1)
+ if(!recordWave)
{
- short buff[4096];
- size_t got = (size_t)adl_play(myDevice, 4096, buff);
- if(got <= 0)
- break;
-
- AudioBuffer_lock.Lock();
- size_t pos = AudioBuffer.size();
- AudioBuffer.resize(pos + got);
- for(size_t p = 0; p < got; ++p)
- AudioBuffer[pos + p] = buff[p];
- AudioBuffer_lock.Unlock();
-
- const SDL_AudioSpec &spec = obtained;
- while(AudioBuffer.size() > spec.samples + (spec.freq * 2) * OurHeadRoomLength)
+ SDL_PauseAudio(0);
+
+ while(!stop)
{
- SDL_Delay(1);
+ short buff[4096];
+ size_t got = (size_t)adl_play(myDevice, 4096, buff);
+ if(got <= 0)
+ break;
+
+ AudioBuffer_lock.Lock();
+ size_t pos = AudioBuffer.size();
+ AudioBuffer.resize(pos + got);
+ for(size_t p = 0; p < got; ++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);
+ }
+ }
+
+ SDL_CloseAudio();
+ }
+ else
+ {
+ std::string wave_out = std::string(argv[1]) + ".wav";
+ std::fprintf(stdout, "Recording WAV file %s...\n", wave_out.c_str());
+ std::fflush(stdout);
+
+ if(wave_open(spec.freq, wave_out.c_str()) == 0)
+ {
+ wave_enable_stereo();
+ while(!stop)
+ {
+ short buff[4096];
+ size_t got = (size_t)adl_play(myDevice, 4096, buff);
+ if(got <= 0)
+ break;
+ wave_write(buff, (long)got);
+ }
+ wave_close();
+
+ std::fprintf(stdout, "Completed!\n");
+ std::fflush(stdout);
+ }
+ else
+ {
+ adl_close(myDevice);
+ return 1;
}
}
adl_close(myDevice);
- SDL_CloseAudio();
+
return 0;
}