hdspmixer: Fix read/write from/to preset files on MADI-like cards

The old hdspmixer (prior to e24e56795e,
that is pre-1.0.24) has used the hard-coded value "14" for
reading/storing 14 ints from/to preset files, however, it's actually
HDSP_MAX_DEST that should be used.

HDSP_MAX_DEST was bumped from 14 to 32 to allow for MADI cards (32
stereo pairs equal 64 output channels on MADI cards)

Signed-off-by: Adrian Knoth <adi@drcomp.erfurt.thur.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Adrian Knoth 2011-04-08 19:58:35 +02:00 committed by Takashi Iwai
parent f9147bfc2c
commit 25bd81562a

View file

@ -337,7 +337,25 @@ static int handler_cb(int event)
void HDSPMixerWindow::save() 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; FILE *file;
if ((file = fopen(file_name, "w")) == NULL) { if ((file = fopen(file_name, "w")) == NULL) {
fl_alert("Error opening file %s for saving", file_name); fl_alert("Error opening file %s for saving", file_name);
} }
@ -356,17 +374,17 @@ void HDSPMixerWindow::save()
for (int preset = 0; preset < 8; ++preset) { for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) { for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */ /* 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; 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; goto save_error;
} }
/* playbacks pans and volumes */ /* 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; 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; goto save_error;
} }
/* inputs mute/solo/dest */ /* inputs mute/solo/dest */
@ -469,12 +487,15 @@ void HDSPMixerWindow::load()
/* check for new ondisk format */ /* check for new ondisk format */
char buffer[sizeof(header)]; char buffer[sizeof(header)];
bool ondisk_v1 = false; 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)) { if (fread(&buffer, sizeof(char), sizeof(buffer), file) != sizeof(buffer)) {
goto load_error; goto load_error;
} }
if (0 == strncmp(buffer, header, sizeof(buffer))) { if (0 == strncmp(buffer, header, sizeof(buffer))) {
/* new ondisk format found */ /* new ondisk format found */
ondisk_v1 = true; ondisk_v1 = true;
pan_array_size = HDSP_MAX_DEST;
} else { } else {
/* old format, rewind to the start and simply read all data */ /* old format, rewind to the start and simply read all data */
rewind(file); rewind(file);
@ -485,17 +506,17 @@ void HDSPMixerWindow::load()
for (int preset = 0; preset < 8; ++preset) { for (int preset = 0; preset < 8; ++preset) {
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) { for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
/* inputs pans and volumes */ /* 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; 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; goto load_error;
} }
/* playbacks pans and volumes */ /* 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; 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; goto load_error;
} }
/* inputs mute/solo/dest */ /* inputs mute/solo/dest */