add option to swap nibbles on raw sample import

issue #791
This commit is contained in:
tildearrow 2022-12-17 22:45:08 -05:00
parent 4affc48ebd
commit ceb27728d3
4 changed files with 17 additions and 4 deletions

View file

@ -3293,7 +3293,7 @@ DivSample* DivEngine::sampleFromFile(const char* path) {
#endif #endif
} }
DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign) { DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign, bool swapNibbles) {
if (song.sample.size()>=256) { if (song.sample.size()>=256) {
lastError="too many samples!"; lastError="too many samples!";
return NULL; return NULL;
@ -3459,6 +3459,14 @@ DivSample* DivEngine::sampleFromFileRaw(const char* path, DivSampleDepth depth,
} }
delete[] buf; delete[] buf;
// swap nibbles if needed
if (swapNibbles) {
unsigned char* b=(unsigned char*)sample->getCurBuf();
for (unsigned int i=0; i<sample->getCurBufLen(); i++) {
b[i]=(b[i]<<4)|(b[i]>>4);
}
}
BUSY_END; BUSY_END;
return sample; return sample;
} }

View file

@ -796,7 +796,7 @@ class DivEngine {
DivSample* sampleFromFile(const char* path); DivSample* sampleFromFile(const char* path);
// get raw sample // get raw sample
DivSample* sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign); DivSample* sampleFromFileRaw(const char* path, DivSampleDepth depth, int channels, bool bigEndian, bool unsign, bool swapNibbles);
// delete sample // delete sample
void delSample(int index); void delSample(int index);

View file

@ -5019,8 +5019,12 @@ bool FurnaceGUI::loop() {
ImGui::Checkbox("Big endian",&pendingRawSampleBigEndian); ImGui::Checkbox("Big endian",&pendingRawSampleBigEndian);
ImGui::EndDisabled(); ImGui::EndDisabled();
ImGui::BeginDisabled(pendingRawSampleDepth==DIV_SAMPLE_DEPTH_16BIT);
ImGui::Checkbox("Swap nibbles",&pendingRawSampleSwapNibbles);
ImGui::EndDisabled();
if (ImGui::Button("OK")) { if (ImGui::Button("OK")) {
DivSample* s=e->sampleFromFileRaw(pendingRawSample.c_str(),(DivSampleDepth)pendingRawSampleDepth,pendingRawSampleChannels,pendingRawSampleBigEndian,pendingRawSampleUnsigned); DivSample* s=e->sampleFromFileRaw(pendingRawSample.c_str(),(DivSampleDepth)pendingRawSampleDepth,pendingRawSampleChannels,pendingRawSampleBigEndian,pendingRawSampleUnsigned,pendingRawSampleSwapNibbles);
if (s==NULL) { if (s==NULL) {
showError(e->getLastError()); showError(e->getLastError());
} else { } else {
@ -5684,6 +5688,7 @@ FurnaceGUI::FurnaceGUI():
pendingRawSampleChannels(1), pendingRawSampleChannels(1),
pendingRawSampleUnsigned(false), pendingRawSampleUnsigned(false),
pendingRawSampleBigEndian(false), pendingRawSampleBigEndian(false),
pendingRawSampleSwapNibbles(false),
globalWinFlags(0), globalWinFlags(0),
curFileDialog(GUI_FILE_OPEN), curFileDialog(GUI_FILE_OPEN),
warnAction(GUI_WARN_OPEN), warnAction(GUI_WARN_OPEN),

View file

@ -1116,7 +1116,7 @@ class FurnaceGUI {
String pendingRawSample; String pendingRawSample;
int pendingRawSampleDepth, pendingRawSampleChannels; int pendingRawSampleDepth, pendingRawSampleChannels;
bool pendingRawSampleUnsigned, pendingRawSampleBigEndian; bool pendingRawSampleUnsigned, pendingRawSampleBigEndian, pendingRawSampleSwapNibbles;
ImGuiWindowFlags globalWinFlags; ImGuiWindowFlags globalWinFlags;