diff --git a/src/engine/sample.cpp b/src/engine/sample.cpp index 0dd2c8512..80db23a0f 100644 --- a/src/engine/sample.cpp +++ b/src/engine/sample.cpp @@ -1,4 +1,48 @@ #include "sample.h" +#include "../ta-log.h" +#include +#include + +const int sampleRates[6]={ + 4000, 8000, 11025, 16000, 22050, 32000 +}; + +bool DivSample::save(const char* path) { + SNDFILE* f; + SF_INFO si; + memset(&si,0,sizeof(SF_INFO)); + + if (length<1) return false; + + si.channels=1; + si.samplerate=sampleRates[rate]; + if (depth==16) { + si.format=SF_FORMAT_PCM_16|SF_FORMAT_WAV; + } else { + si.format=SF_FORMAT_PCM_U8|SF_FORMAT_WAV; + } + + f=sf_open(path,SFM_WRITE,&si); + + if (f==NULL) { + logE("could not open wave file for saving! %s\n",sf_error_number(sf_error(f))); + return false; + } + + if (depth==16) { + sf_writef_short(f,data,length); + } else { + short* cbuf=new short[length]; + for (int i=0; i=0 && curSample<(int)e->song.sample.size()) openFileDialog(GUI_FILE_SAMPLE_SAVE); } ImGui::SameLine(); if (ImGui::ArrowButton("SampleUp",ImGuiDir_Up)) { @@ -1459,6 +1459,9 @@ bool FurnaceGUI::loop() { e->addSampleFromFile(copyOfName.c_str()); break; case GUI_FILE_SAMPLE_SAVE: + if (curSample>=0 && curSample<(int)e->song.sample.size()) { + e->song.sample[curSample]->save(copyOfName.c_str()); + } break; } curFileDialog=GUI_FILE_OPEN;