You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

121 lines
3.4 KiB

#include <WaveSabreCore.h>
#include <WaveSabrePlayerLib.h>
using namespace WaveSabrePlayerLib;
#include <string.h>
WaveSabreCore::Device *SongFactory(SongRenderer::DeviceId id)
{
switch (id)
{
case SongRenderer::DeviceId::Falcon: return new WaveSabreCore::Falcon();
case SongRenderer::DeviceId::Slaughter: return new WaveSabreCore::Slaughter();
case SongRenderer::DeviceId::Thunder: return new WaveSabreCore::Thunder();
case SongRenderer::DeviceId::Scissor: return new WaveSabreCore::Scissor();
case SongRenderer::DeviceId::Leveller: return new WaveSabreCore::Leveller();
case SongRenderer::DeviceId::Crusher: return new WaveSabreCore::Crusher();
case SongRenderer::DeviceId::Echo: return new WaveSabreCore::Echo();
case SongRenderer::DeviceId::Smasher: return new WaveSabreCore::Smasher();
case SongRenderer::DeviceId::Chamber: return new WaveSabreCore::Chamber();
case SongRenderer::DeviceId::Twister: return new WaveSabreCore::Twister();
case SongRenderer::DeviceId::Cathedral: return new WaveSabreCore::Cathedral();
case SongRenderer::DeviceId::Adultery: return new WaveSabreCore::Adultery();
case SongRenderer::DeviceId::Specimen: return new WaveSabreCore::Specimen();
}
return nullptr;
}
void progressCallback(double progress, void *data)
{
const int barLength = 32;
int filledChars = (int)(progress * (double)(barLength - 1));
printf("\r[");
for (int j = 0; j < barLength; j++) putchar(filledChars >= j ? '*' : '-');
printf("]");
}
int main(int argc, char **argv)
{
bool writeWav = argc >= 3 && !strcmp(argv[2], "-w");
bool preRender = argc == 3 && !strcmp(argv[2], "-p");
const int numRenderThreads = 3;
FILE * pFile;
long lSize;
unsigned char * buffer;
size_t result;
pFile = fopen(argv[1], "rb");
if (pFile == NULL) { fputs("File error", NULL); exit(1); }
// obtain file size:
fseek(pFile, 0, SEEK_END);
lSize = ftell(pFile);
rewind(pFile);
// allocate memory to contain the whole file:
buffer = (unsigned char*)malloc(sizeof(unsigned char)*lSize);
// copy the file into the buffer:
result = fread(buffer, 1, lSize, pFile);
if (result != lSize) { fputs("Reading error", NULL); exit(3); }
// terminate
fclose(pFile);
SongRenderer::Song song;
song.blob = buffer;
song.factory = SongFactory;
if (writeWav)
{
WavWriter wavWriter(&song, numRenderThreads);
printf("WAV writer activated.\n");
auto fileName = argc >= 4 ? argv[3] : "out.wav";
printf("Rendering...\n");
wavWriter.Write(fileName, progressCallback, nullptr);
printf("\n\nWAV file written to \"%s\". Enjoy.\n", fileName);
}
else
{
IPlayer *player;
if (preRender)
{
printf("Prerender activated.\n");
printf("Rendering...\n");
player = new PreRenderPlayer(&song, numRenderThreads, progressCallback, nullptr);
printf("\n\n");
}
else
{
player = new RealtimePlayer(&song, numRenderThreads);
}
printf("Realtime player activated. Press ESC to quit.\n");
player->Play();
while (!GetAsyncKeyState(VK_ESCAPE))
{
auto songPos = player->GetSongPos();
if (songPos >= player->GetLength()) break;
int minutes = (int)songPos / 60;
int seconds = (int)songPos % 60;
int hundredths = (int)(songPos * 100.0) % 100;
printf("\r %.1i:%.2i.%.2i", minutes, seconds, hundredths);
Sleep(10);
}
printf("\n");
delete player;
}
free(buffer);
return 0;
}