diff --git a/TODO.md b/TODO.md index 01ce8170..c8d7684a 100644 --- a/TODO.md +++ b/TODO.md @@ -6,7 +6,6 @@ - the last three compat flags - add OPL drum instrument type - Game Boy envelope macro/sequence -- drag-and-drop ins/wave/sample loading - sample editor preview in selection - rewrite the system name detection function anyway - unified data view diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index dd45dbd5..14694415 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -1760,7 +1760,7 @@ int DivEngine::addWave() { return waveCount; } -bool DivEngine::addWaveFromFile(const char* path) { +bool DivEngine::addWaveFromFile(const char* path, bool addRaw) { if (song.wave.size()>=256) { lastError="too many wavetables!"; return false; @@ -1856,8 +1856,27 @@ bool DivEngine::addWaveFromFile(const char* path) { } } else { // read as binary - logI("reading binary..."); + if (addRaw) { + logI("reading binary..."); + len=reader.size(); + if (len>256) len=256; + reader.seek(0,SEEK_SET); + for (int i=0; idata[i]=(unsigned char)reader.readC(); + if (wave->maxdata[i]) wave->max=wave->data[i]; + } + wave->len=len; + } else { + delete wave; + delete[] buf; + return false; + } + } + } catch (EndOfFileException& e) { + // read as binary + if (addRaw) { len=reader.size(); + logI("reading binary for being too small..."); if (len>256) len=256; reader.seek(0,SEEK_SET); for (int i=0; imaxdata[i]) wave->max=wave->data[i]; } wave->len=len; + } else { + delete wave; + delete[] buf; + return false; } - } catch (EndOfFileException& e) { - // read as binary - len=reader.size(); - logI("reading binary for being too small..."); - if (len>256) len=256; - reader.seek(0,SEEK_SET); - for (int i=0; idata[i]=(unsigned char)reader.readC(); - if (wave->maxdata[i]) wave->max=wave->data[i]; - } - wave->len=len; } } } catch (EndOfFileException& e) { diff --git a/src/engine/engine.h b/src/engine/engine.h index 94c12219..ceb786a7 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -674,7 +674,7 @@ class DivEngine { int addWave(); // add wavetable from file - bool addWaveFromFile(const char* path); + bool addWaveFromFile(const char* path, bool loadRaw=true); // delete wavetable void delWave(int index); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2428e9db..2bf6888f 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -2544,7 +2544,23 @@ bool FurnaceGUI::loop() { break; case SDL_DROPFILE: if (ev.drop.file!=NULL) { - if (modified) { + std::vector instruments=e->instrumentFromFile(ev.drop.file); + if (!instruments.empty()) { + if (!e->getWarnings().empty()) { + showWarning(e->getWarnings(),GUI_WARN_GENERIC); + } + for (DivInstrument* i: instruments) { + e->addInstrumentPtr(i); + } + nextWindow=GUI_WINDOW_INS_LIST; + MARK_MODIFIED; + } else if (e->addWaveFromFile(ev.drop.file,false)) { + nextWindow=GUI_WINDOW_WAVE_LIST; + MARK_MODIFIED; + } else if (e->addSampleFromFile(ev.drop.file)!=-1) { + nextWindow=GUI_WINDOW_SAMPLE_LIST; + MARK_MODIFIED; + } else if (modified) { nextFile=ev.drop.file; showWarning("Unsaved changes! Save changes before opening file?",GUI_WARN_OPEN_DROP); } else {