diff --git a/src/gui/sampleEdit.cpp b/src/gui/sampleEdit.cpp index 1e442914..7c08ba47 100644 --- a/src/gui/sampleEdit.cpp +++ b/src/gui/sampleEdit.cpp @@ -49,6 +49,27 @@ const double timeMultipliers[13]={ _x+=_text; \ } +#define MAX_RATE(_name,_x) \ + if (e->isPreviewingSample()) { \ + if ((int)e->getSamplePreviewRate()>(int)(_x)) { \ + SAMPLE_WARN(warnRate,fmt::sprintf("%s: maximum sample rate is %d",_name,(int)(_x))); \ + } \ + } + +#define MIN_RATE(_name,_x) \ + if (e->isPreviewingSample()) { \ + if ((int)e->getSamplePreviewRate()<(int)(_x)) { \ + SAMPLE_WARN(warnRate,fmt::sprintf("%s: minimum sample rate is %d",_name,(int)(_x))); \ + } \ + } + +#define EXACT_RATE(_name,_x) \ + if (e->isPreviewingSample()) { \ + if ((int)e->getSamplePreviewRate()!=(int)(_x)) { \ + SAMPLE_WARN(warnRate,fmt::sprintf("%s: sample rate must be %d",_name,(int)(_x))); \ + } \ + } + void FurnaceGUI::drawSampleEdit() { if (nextWindow==GUI_WINDOW_SAMPLE_EDIT) { sampleEditOpen=true; @@ -173,7 +194,7 @@ void FurnaceGUI::drawSampleEdit() { ImGui::Separator(); String warnLoop, warnLoopMode, warnLoopPos; - String warnLength; + String warnLength, warnRate; bool isChipVisible[DIV_MAX_CHIPS]; bool isTypeVisible[DIV_MAX_SAMPLE_TYPE]; @@ -185,6 +206,8 @@ void FurnaceGUI::drawSampleEdit() { memset(isMemWarning,0,DIV_MAX_CHIPS*DIV_MAX_SAMPLE_TYPE*sizeof(bool)); for (int i=0; isong.systemLen; i++) { + DivDispatch* dispatch=e->getDispatch(i); + // warnings switch (e->song.system[i]) { case DIV_SYSTEM_SNES: @@ -193,6 +216,9 @@ void FurnaceGUI::drawSampleEdit() { SAMPLE_WARN(warnLoopPos,"SNES: loop must be a multiple of 16"); } } + if (dispatch!=NULL) { + MAX_RATE("SNES",dispatch->chipClock/8.0); + } break; case DIV_SYSTEM_QSOUND: if (sample->loop) { @@ -226,6 +252,9 @@ void FurnaceGUI::drawSampleEdit() { if (sample->loop) { SAMPLE_WARN(warnLoop,"GA20: samples can't loop"); } + if (dispatch!=NULL) { + MIN_RATE("GA20",dispatch->chipClock/1024); + } break; case DIV_SYSTEM_YM2608: case DIV_SYSTEM_YM2608_EXT: @@ -250,6 +279,9 @@ void FurnaceGUI::drawSampleEdit() { if (sample->samples>2097152) { SAMPLE_WARN(warnLength,"YM2610: maximum ADPCM-A sample length is 2097152"); } + if (dispatch!=NULL) { + EXACT_RATE("YM2610 (ADPCM-A)",dispatch->chipClock/432); + } break; case DIV_SYSTEM_AMIGA: if (sample->loop) { @@ -266,6 +298,9 @@ void FurnaceGUI::drawSampleEdit() { if (sample->samples>65280) { SAMPLE_WARN(warnLength,"SegaPCM: maximum sample length is 65280"); } + if (dispatch!=NULL) { + MAX_RATE("SegaPCM",dispatch->chipClock/256); + } break; case DIV_SYSTEM_K053260: if (sample->loop) { @@ -296,7 +331,6 @@ void FurnaceGUI::drawSampleEdit() { } // chips grid - DivDispatch* dispatch=e->getDispatch(i); if (dispatch==NULL) continue; for (int j=0; j