void HDSPMixerWindow::save()
{
+ const int pan_array_size =
+ sizeof(inputs->strips[0]->data[0][0][0]->pan_pos) /
+ sizeof(inputs->strips[0]->data[0][0][0]->pan_pos[0]);
+ /* MixerStripData defines pan_pos[HDSP_MAX_DEST], but just in case this
+ * will ever change, let's detect it early and fail safely instead of
+ * reading/writing garbage from/to preset files
+ */
+ assert (HDSP_MAX_DEST == pan_array_size);
+
+ /* also make sure that fader_pos[] has the same size as pan_pos. This comes
+ * naturally, but just to be sure.
+ */
+ assert (pan_array_size ==
+ sizeof(inputs->strips[0]->data[0][0][0]->fader_pos) /
+ sizeof(inputs->strips[0]->data[0][0][0]->fader_pos[0]));
+
+
FILE *file;
+
if ((file = fopen(file_name, "w")) == NULL) {
fl_alert("Error opening file %s for saving", file_name);
}
for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */
- if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
- if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
/* playbacks pans and volumes */
- if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
- if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto save_error;
}
/* inputs mute/solo/dest */
/* check for new ondisk format */
char buffer[sizeof(header)];
bool ondisk_v1 = false;
+ int pan_array_size = 14; /* old (pre 1.0.24) HDSP_MAX_DEST */
+
if (fread(&buffer, sizeof(char), sizeof(buffer), file) != sizeof(buffer)) {
goto load_error;
}
if (0 == strncmp(buffer, header, sizeof(buffer))) {
/* new ondisk format found */
ondisk_v1 = true;
+ pan_array_size = HDSP_MAX_DEST;
} else {
/* old format, rewind to the start and simply read all data */
rewind(file);
for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */
- if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto load_error;
}
- if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto load_error;
}
/* playbacks pans and volumes */
- if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto load_error;
}
- if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), 14, file) != 14) {
+ if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
goto load_error;
}
/* inputs mute/solo/dest */