|
Packit |
427e91 |
/*
|
|
Packit |
427e91 |
* HDSPMixer
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
427e91 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
427e91 |
* the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
427e91 |
* (at your option) any later version.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
427e91 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
427e91 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
427e91 |
* GNU General Public License for more details.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
427e91 |
* along with this program; if not, write to the Free Software
|
|
Packit |
427e91 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* @version 04-12-2009 [FF]
|
|
Packit |
427e91 |
* - updated deprecated fl_ask calls
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
#pragma implementation
|
|
Packit |
427e91 |
#include "HDSPMixerWindow.h"
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* header used in .mix file */
|
|
Packit |
427e91 |
const char header[] = "HDSPMixer v1";
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void readregisters_cb(void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
snd_hwdep_t *hw;
|
|
Packit |
427e91 |
hdsp_peak_rms_t hdsp_peak_rms;
|
|
Packit |
427e91 |
struct hdspm_peak_rms hdspm_peak_rms;
|
|
Packit |
427e91 |
bool isMADI = false;
|
|
Packit |
427e91 |
uint32_t *input_peaks, *playback_peaks, *output_peaks;
|
|
Packit |
427e91 |
uint64_t *input_rms, *playback_rms, *output_rms;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (!w->visible()) {
|
|
Packit |
427e91 |
Fl::add_timeout(0.03, readregisters_cb, w);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = snd_hwdep_open(&hw, w->cards[w->current_card]->name, SND_HWDEP_OPEN_READ)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Couldn't open hwdep device. Metering stopped\n");
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((HDSPeMADI == w->cards[w->current_card]->type) ||
|
|
Packit |
427e91 |
(HDSPeAIO == w->cards[w->current_card]->type) ||
|
|
Packit |
427e91 |
(HDSP_AES == w->cards[w->current_card]->type) ||
|
|
Packit |
427e91 |
(HDSPeRayDAT == w->cards[w->current_card]->type)) {
|
|
Packit |
427e91 |
isMADI = true;
|
|
Packit |
427e91 |
if ((err = snd_hwdep_ioctl(hw, SNDRV_HDSPM_IOCTL_GET_PEAK_RMS, (void *)&hdspm_peak_rms)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "HwDep ioctl failed. Metering stopped\n");
|
|
Packit |
427e91 |
snd_hwdep_close(hw);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if ((err = snd_hwdep_ioctl(hw, SNDRV_HDSP_IOCTL_GET_PEAK_RMS, (void *)&hdsp_peak_rms)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "HwDep ioctl failed. Metering stopped\n");
|
|
Packit |
427e91 |
snd_hwdep_close(hw);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
snd_hwdep_close(hw);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (isMADI) {
|
|
Packit |
427e91 |
// check for speed change
|
|
Packit |
427e91 |
if (hdspm_peak_rms.speed != w->cards[w->current_card]->speed_mode) {
|
|
Packit |
427e91 |
w->cards[w->current_card]->setMode(hdspm_peak_rms.speed);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
input_peaks = hdspm_peak_rms.input_peaks;
|
|
Packit |
427e91 |
playback_peaks = hdspm_peak_rms.playback_peaks;
|
|
Packit |
427e91 |
output_peaks = hdspm_peak_rms.output_peaks;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
input_rms = hdspm_peak_rms.input_rms;
|
|
Packit |
427e91 |
playback_rms = hdspm_peak_rms.playback_rms;
|
|
Packit |
427e91 |
output_rms = hdspm_peak_rms.output_rms;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* speed changes on non-MADI are already handled via alsactl_cb and
|
|
Packit |
427e91 |
* getSpeed(), but the metering structs differ.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
input_peaks = hdsp_peak_rms.input_peaks;
|
|
Packit |
427e91 |
playback_peaks = hdsp_peak_rms.playback_peaks;
|
|
Packit |
427e91 |
output_peaks = hdsp_peak_rms.output_peaks;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
input_rms = hdsp_peak_rms.input_rms;
|
|
Packit |
427e91 |
playback_rms = hdsp_peak_rms.playback_rms;
|
|
Packit |
427e91 |
output_rms = hdsp_peak_rms.output_rms;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* update the meter */
|
|
Packit |
427e91 |
if (w->inputs->buttons->input) {
|
|
Packit |
427e91 |
for (int i = 0; i < w->cards[w->current_card]->channels_input; ++i) {
|
|
Packit |
427e91 |
w->inputs->strips[i]->meter->update(input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xffffff00,
|
|
Packit |
427e91 |
input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xf,
|
|
Packit |
427e91 |
input_rms[(w->cards[w->current_card]->meter_map_input[i])]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (w->inputs->buttons->playback) {
|
|
Packit |
427e91 |
for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++i) {
|
|
Packit |
427e91 |
w->playbacks->strips[i]->meter->update(playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00,
|
|
Packit |
427e91 |
playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf,
|
|
Packit |
427e91 |
playback_rms[(w->cards[w->current_card]->meter_map_playback[i])]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (w->inputs->buttons->output) {
|
|
Packit |
427e91 |
for (int i = 0; i < w->cards[w->current_card]->channels_output; ++i) {
|
|
Packit |
427e91 |
w->outputs->strips[i]->meter->update(output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00,
|
|
Packit |
427e91 |
output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf,
|
|
Packit |
427e91 |
output_rms[(w->cards[w->current_card]->meter_map_playback[i])]);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
Fl::add_timeout(0.03, readregisters_cb, w);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void exit_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (w->dirty) {
|
|
Packit |
427e91 |
if (!fl_choice("There are unsaved changes, quit anyway ?", "Return", "Quit", NULL)) return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
exit(EXIT_SUCCESS);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void view_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
const Fl_Menu_Item *item = ((Fl_Menu_ *)widget)->mvalue();
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (!strncmp(item->label(), "Input", 5)) {
|
|
Packit |
427e91 |
if (w->inputs->buttons->view->input) {
|
|
Packit |
427e91 |
w->inputs->buttons->view->input = 0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->view->input = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!strncmp(item->label(), "Playback", 8)) {
|
|
Packit |
427e91 |
if (w->inputs->buttons->view->playback) {
|
|
Packit |
427e91 |
w->inputs->buttons->view->playback = 0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->view->playback = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!strncmp(item->label(), "Output", 6)) {
|
|
Packit |
427e91 |
if (w->inputs->buttons->view->output) {
|
|
Packit |
427e91 |
w->inputs->buttons->view->output = 0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->view->output = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
w->reorder();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void submix_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (w->inputs->buttons->view->submix) {
|
|
Packit |
427e91 |
w->inputs->buttons->view->submix = 0;
|
|
Packit |
427e91 |
w->unsetSubmix();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->view->submix = 1;
|
|
Packit |
427e91 |
w->setSubmix(w->inputs->buttons->view->submix_value);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
w->inputs->buttons->view->redraw();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void dirty_cb(void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (!w->inputs->buttons->presets->saving) {
|
|
Packit |
427e91 |
if (w->inputs->buttons->presets->presetmask == (int)pow(2, w->inputs->buttons->presets->preset-1)) {
|
|
Packit |
427e91 |
w->inputs->buttons->presets->presetmask = 0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->presets->presetmask = (int)pow(2, w->inputs->buttons->presets->preset-1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->inputs->buttons->presets->redraw();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (w->dirty) {
|
|
Packit |
427e91 |
Fl::add_timeout(0.3, dirty_cb, arg);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
w->inputs->buttons->presets->presetmask = (int)pow(2, w->inputs->buttons->presets->preset-1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void setup_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
w->setup->show();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void about_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
w->about->show();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void open_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (!(w->file_name = fl_file_chooser("Choose a file to load presets from :", "HDSPMixer preset file (*.mix)", NULL, 0))) return;
|
|
Packit |
427e91 |
w->load();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void save_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (w->file_name == NULL) {
|
|
Packit |
427e91 |
if (!(w->file_name = fl_file_chooser("Choose a file to save presets to :", "HDSPMixer preset file (*.mix)", NULL, 0))) return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->save();
|
|
Packit |
427e91 |
w->setTitleWithFilename();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void make_default_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (w->file_name) {
|
|
Packit |
427e91 |
w->prefs->set("default_file", w->file_name);
|
|
Packit |
427e91 |
w->prefs->flush();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
fl_alert("Please save to a file before setting to default");
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void restore_defaults_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
int i = 0;
|
|
Packit |
427e91 |
if (w->dirty) {
|
|
Packit |
427e91 |
if (!fl_choice("There are unsaved changes, restore factory settings anyway ?", "Don't restore", "Restore them", NULL)) return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->prefs->deleteEntry("default_file");
|
|
Packit |
427e91 |
w->prefs->flush();
|
|
Packit |
427e91 |
w->file_name = NULL;
|
|
Packit |
427e91 |
w->setTitleWithFilename();
|
|
Packit |
427e91 |
w->resetMixer();
|
|
Packit |
427e91 |
while (i < MAX_CARDS && w->cards[i] != NULL) {
|
|
Packit |
427e91 |
w->restoreDefaults(i++);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->inputs->buttons->presets->preset_change(1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void save_as_cb(Fl_Widget *widget, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
|
Packit |
427e91 |
if (!(w->file_name = fl_file_chooser("Choose a file to save presets to :", "HDSPMixer preset file (*.mix)", NULL, 0))) return;
|
|
Packit |
427e91 |
w->save();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static void atclose_cb(Fl_Window *w, void *arg)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
if (strncmp("HDSPMixer", w->label(), 9) == 0) {
|
|
Packit |
427e91 |
if (((HDSPMixerWindow *)w)->dirty) {
|
|
Packit |
427e91 |
if (!fl_choice("There are unsaved changes, quit anyway ?", "Don't quit", "Quit", NULL)) return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
exit(EXIT_SUCCESS);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
w->hide();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
static int handler_cb(int event)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
HDSPMixerWindow *w = NULL;
|
|
Packit |
427e91 |
Fl_Window *fl_win = Fl::first_window();
|
|
Packit |
427e91 |
while (1) {
|
|
Packit |
427e91 |
if (fl_win->label()) {
|
|
Packit |
427e91 |
if (strncmp("HDSPMixer", fl_win->label(), 9) == 0) {
|
|
Packit |
427e91 |
w = (HDSPMixerWindow *)fl_win;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if ((fl_win = Fl::next_window(fl_win))) return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!w) return 0;
|
|
Packit |
427e91 |
int key = Fl::event_key();
|
|
Packit |
427e91 |
switch (event) {
|
|
Packit |
427e91 |
case FL_SHORTCUT:
|
|
Packit |
427e91 |
if (key == FL_Escape) {
|
|
Packit |
427e91 |
if (w->dirty) {
|
|
Packit |
427e91 |
if (!fl_choice("There are unsaved changes, quit anyway ?", "Don't quit", "Quit", NULL)) return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
exit(EXIT_SUCCESS);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (!w->setup->visible()) {
|
|
Packit |
427e91 |
if (key == 'r' || key == 'R') {
|
|
Packit |
427e91 |
/* numbers should show peak values */
|
|
Packit |
427e91 |
w->setup->numbers_val = 0;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else if (key == 'e' || key == 'E') {
|
|
Packit |
427e91 |
/* numbers should show rms values */
|
|
Packit |
427e91 |
w->setup->numbers_val = 1;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (key == '0' || key == '0'+FL_KP) {
|
|
Packit |
427e91 |
/* rms +0dB */
|
|
Packit |
427e91 |
w->setup->rmsplus3_val = 0;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else if (key == '3' || key == '3'+FL_KP) {
|
|
Packit |
427e91 |
/* rms +3dB */
|
|
Packit |
427e91 |
w->setup->rmsplus3_val = 1;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (key == '4' || key == '4'+FL_KP) {
|
|
Packit |
427e91 |
/* meter range is 40 dB */
|
|
Packit |
427e91 |
w->setup->level_val = 0;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
} else if (key == '6' || key == '6'+FL_KP) {
|
|
Packit |
427e91 |
/* meter range is 60 dB */
|
|
Packit |
427e91 |
w->setup->level_val = 1;
|
|
Packit |
427e91 |
w->checkState();
|
|
Packit |
427e91 |
return 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
return 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::save()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
const int pan_array_size =
|
|
Packit |
427e91 |
sizeof(inputs->strips[0]->data[0][0][0]->pan_pos) /
|
|
Packit |
427e91 |
sizeof(inputs->strips[0]->data[0][0][0]->pan_pos[0]);
|
|
Packit |
427e91 |
/* MixerStripData defines pan_pos[HDSP_MAX_DEST], but just in case this
|
|
Packit |
427e91 |
* will ever change, let's detect it early and fail safely instead of
|
|
Packit |
427e91 |
* reading/writing garbage from/to preset files
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
assert (HDSP_MAX_DEST == pan_array_size);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* also make sure that fader_pos[] has the same size as pan_pos. This comes
|
|
Packit |
427e91 |
* naturally, but just to be sure.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
assert (pan_array_size ==
|
|
Packit |
427e91 |
sizeof(inputs->strips[0]->data[0][0][0]->fader_pos) /
|
|
Packit |
427e91 |
sizeof(inputs->strips[0]->data[0][0][0]->fader_pos[0]));
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
FILE *file;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((file = fopen(file_name, "w")) == NULL) {
|
|
Packit |
427e91 |
fl_alert("Error opening file %s for saving", file_name);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (dirty) {
|
|
Packit |
427e91 |
inputs->buttons->presets->save_preset(current_preset+1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* since hdspmixer 1.11, we also store the meter level settings. Indicate
|
|
Packit |
427e91 |
* the new on-disk structure via a small header */
|
|
Packit |
427e91 |
if (fwrite((void *)&header, sizeof(char), sizeof(header), file) !=
|
|
Packit |
427e91 |
sizeof(header)) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (int speed = 0; speed < 3; ++speed) {
|
|
Packit |
427e91 |
for (int card = 0; card < MAX_CARDS; ++card) {
|
|
Packit |
427e91 |
for (int preset = 0; preset < 8; ++preset) {
|
|
Packit |
427e91 |
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
|
|
Packit |
427e91 |
/* inputs pans and volumes */
|
|
Packit |
427e91 |
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* playbacks pans and volumes */
|
|
Packit |
427e91 |
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* inputs mute/solo/dest */
|
|
Packit |
427e91 |
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(inputs->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* playbacks mute/solo/dest */
|
|
Packit |
427e91 |
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(playbacks->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* outputs volumes */
|
|
Packit |
427e91 |
if (fwrite((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Lineouts */
|
|
Packit |
427e91 |
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Global settings */
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->input), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->output), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->playback), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->submix), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->submix_value), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->last_destination), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->rmsplus3), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->numbers), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->over), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->level), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fwrite((void *)&(data[card][speed][preset]->rate), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto save_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
fclose(file);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
save_error:
|
|
Packit |
427e91 |
fclose(file);
|
|
Packit |
427e91 |
fl_alert("Error saving presets to file %s", file_name);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::load()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
FILE *file;
|
|
Packit |
427e91 |
if ((file = fopen(file_name, "r")) == NULL) {
|
|
Packit |
427e91 |
int i = 0;
|
|
Packit |
427e91 |
fl_alert("Error opening file %s for reading", file_name);
|
|
Packit |
427e91 |
while (i < MAX_CARDS && cards[i] != NULL) {
|
|
Packit |
427e91 |
restoreDefaults(i++);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
inputs->buttons->presets->preset_change(1);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* check for new ondisk format */
|
|
Packit |
427e91 |
char buffer[sizeof(header)];
|
|
Packit |
427e91 |
bool ondisk_v1 = false;
|
|
Packit |
427e91 |
int pan_array_size = 14; /* old (pre 1.0.24) HDSP_MAX_DEST */
|
|
Packit |
427e91 |
int channels_per_card = 26; /* old (pre 1.0.24) HDSP_MAX_CHANNELS */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (fread(&buffer, sizeof(char), sizeof(buffer), file) != sizeof(buffer)) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (0 == strncmp(buffer, header, sizeof(buffer))) {
|
|
Packit |
427e91 |
/* new ondisk format found */
|
|
Packit |
427e91 |
ondisk_v1 = true;
|
|
Packit |
427e91 |
pan_array_size = HDSP_MAX_DEST;
|
|
Packit |
427e91 |
channels_per_card = HDSP_MAX_CHANNELS;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* There are two different kinds of old format: pre 1.0.24 and
|
|
Packit |
427e91 |
* the one used for 1.0.24/1.0.24.1. We can distinguish between
|
|
Packit |
427e91 |
* these two by checking the file size, becase HDSP_MAX_CHANNELS
|
|
Packit |
427e91 |
* was bumped right before the 1.0.24 release.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
fseek (file, 0, SEEK_END);
|
|
Packit |
427e91 |
long filesize = ftell (file);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (1163808 == filesize) {
|
|
Packit |
427e91 |
/* file written by hdspmixer v1.0.24 or v1.0.24.1 with
|
|
Packit |
427e91 |
* HDSP_MAX_CHANNELS set to 64, but pan_array_size still at
|
|
Packit |
427e91 |
* 14, so setting channels_per_card should get the correct
|
|
Packit |
427e91 |
* mapping.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
channels_per_card = 64; /* HDSP_MAX_CHANNELS */
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* rewind to the start and simply read all data */
|
|
Packit |
427e91 |
rewind(file);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (int speed = 0; speed < 3; ++speed) {
|
|
Packit |
427e91 |
for (int card = 0; card < MAX_CARDS; ++card) {
|
|
Packit |
427e91 |
for (int preset = 0; preset < 8; ++preset) {
|
|
Packit |
427e91 |
for (int channel = 0; channel < channels_per_card; ++channel) {
|
|
Packit |
427e91 |
/* inputs pans and volumes */
|
|
Packit |
427e91 |
if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* playbacks pans and volumes */
|
|
Packit |
427e91 |
if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->pan_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->fader_pos[0]), sizeof(int), pan_array_size, file) != pan_array_size) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* inputs mute/solo/dest */
|
|
Packit |
427e91 |
if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(inputs->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* playbacks mute/solo/dest */
|
|
Packit |
427e91 |
if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(playbacks->strips[channel]->data[card][speed][preset]->dest), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* outputs volumes */
|
|
Packit |
427e91 |
if (fread((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Lineouts */
|
|
Packit |
427e91 |
if (fread((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Global settings */
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->input), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->output), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->playback), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->submix), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->submix_value), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->solo), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->mute), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* read additional meter settings only present in newer mix files */
|
|
Packit |
427e91 |
if (ondisk_v1) {
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->last_destination), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->rmsplus3), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->numbers), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->over), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->level), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (fread((void *)&(data[card][speed][preset]->rate), sizeof(int), 1, file) != 1) {
|
|
Packit |
427e91 |
goto load_error;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
fclose(file);
|
|
Packit |
427e91 |
setTitleWithFilename();
|
|
Packit |
427e91 |
resetMixer();
|
|
Packit |
427e91 |
inputs->buttons->presets->preset_change(1);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
load_error:
|
|
Packit |
427e91 |
fclose(file);
|
|
Packit |
427e91 |
fl_alert("Error loading presets from file %s", file_name);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::setTitle(std::string suffix)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
std::string title = "HDSPMixer (";
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
title = title + cards[current_card]->cardname + ") "; /*cardname */
|
|
Packit |
427e91 |
title = title + suffix;
|
|
Packit |
427e91 |
snprintf(window_title, FL_PATH_MAX, "%s", title.c_str());
|
|
Packit |
427e91 |
label(window_title);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::setTitleWithFilename(void)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
const char *filename = fl_filename_name(file_name);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (NULL == file_name) {
|
|
Packit |
427e91 |
filename = "(unsaved)";
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
setTitle(filename);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::stashPreset(void)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
cards[current_card]->last_preset = current_preset;
|
|
Packit |
427e91 |
cards[current_card]->last_dirty = dirty;
|
|
Packit |
427e91 |
/* save the current mixer state to the virtual 9th preset */
|
|
Packit |
427e91 |
inputs->buttons->presets->save_preset(9);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::unstashPreset(void)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* load temporary data from virtual 9th preset */
|
|
Packit |
427e91 |
inputs->buttons->presets->restore_preset(9);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
current_preset = cards[current_card]->last_preset;
|
|
Packit |
427e91 |
/* Internal notion of playback in use. Relevant for blinking buttons */
|
|
Packit |
427e91 |
inputs->buttons->presets->preset = current_preset + 1;
|
|
Packit |
427e91 |
dirty = cards[current_card]->last_dirty;
|
|
Packit |
427e91 |
/* Preset masks (which preset button is green) */
|
|
Packit |
427e91 |
inputs->buttons->presets->presetmask = (int)pow(2, current_preset);
|
|
Packit |
427e91 |
if (dirty) {
|
|
Packit |
427e91 |
/* make the buttons blink if it's unsaved. We need to remove any
|
|
Packit |
427e91 |
* existing triggers to dirty_cb, because dirty_cb is called
|
|
Packit |
427e91 |
* every 0.3 seconds and enabling/disabling (highlight/unlight) the
|
|
Packit |
427e91 |
* buttons, so if we have too many callbacks, the buttons would
|
|
Packit |
427e91 |
* remain in one state --> no blinking. We need exactly one.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
Fl::remove_timeout(dirty_cb, (void *)this);
|
|
Packit |
427e91 |
Fl::add_timeout(0.3, dirty_cb, (void *)this);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
/* Hack. I don't know why this is necessary, but if we're clean,
|
|
Packit |
427e91 |
* we need to recall the preset again to correctly reflect
|
|
Packit |
427e91 |
* the dirty/undirty state.
|
|
Packit |
427e91 |
*
|
|
Packit |
427e91 |
* Though it's a little bit redundant, it at least won't do any harm.
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
inputs->buttons->presets->preset_change(current_preset+1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::restoreDefaults(int card)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int chnls[3];
|
|
Packit |
427e91 |
int maxdest[3];
|
|
Packit |
427e91 |
int h9632_spdif_submix[3];
|
|
Packit |
427e91 |
int h9632_an12_submix[3];
|
|
Packit |
427e91 |
int num_modes = 2;
|
|
Packit |
427e91 |
int ndb = inputs->strips[0]->fader->ndb;
|
|
Packit |
427e91 |
switch (cards[card]->type) {
|
|
Packit |
427e91 |
case Multiface:
|
|
Packit |
427e91 |
chnls[0] = 18;
|
|
Packit |
427e91 |
chnls[1] = 14;
|
|
Packit |
427e91 |
maxdest[0] = 10;
|
|
Packit |
427e91 |
maxdest[1] = 8;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case Digiface:
|
|
Packit |
427e91 |
chnls[0] = 26;
|
|
Packit |
427e91 |
chnls[1] = 14;
|
|
Packit |
427e91 |
maxdest[0] = 14;
|
|
Packit |
427e91 |
maxdest[1] = 8;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case RPM:
|
|
Packit |
427e91 |
chnls[0] = chnls[1] = 6;
|
|
Packit |
427e91 |
maxdest[0] = maxdest[1] = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case H9652:
|
|
Packit |
427e91 |
chnls[0] = 26;
|
|
Packit |
427e91 |
chnls[1] = 14;
|
|
Packit |
427e91 |
maxdest[0] = 13;
|
|
Packit |
427e91 |
maxdest[1] = 7;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case H9632:
|
|
Packit |
427e91 |
chnls[0] = 16;
|
|
Packit |
427e91 |
chnls[1] = 12;
|
|
Packit |
427e91 |
chnls[2] = 8;
|
|
Packit |
427e91 |
maxdest[0] = 8;
|
|
Packit |
427e91 |
maxdest[1] = 6;
|
|
Packit |
427e91 |
maxdest[2] = 4;
|
|
Packit |
427e91 |
h9632_spdif_submix[0] = 4;
|
|
Packit |
427e91 |
h9632_spdif_submix[1] = 2;
|
|
Packit |
427e91 |
h9632_spdif_submix[2] = 0;
|
|
Packit |
427e91 |
h9632_an12_submix[0] = 5;
|
|
Packit |
427e91 |
h9632_an12_submix[1] = 3;
|
|
Packit |
427e91 |
h9632_an12_submix[2] = 1;
|
|
Packit |
427e91 |
num_modes = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case HDSPeMADI:
|
|
Packit |
427e91 |
chnls[0] = 64;
|
|
Packit |
427e91 |
chnls[1] = 32;
|
|
Packit |
427e91 |
chnls[2] = 16;
|
|
Packit |
427e91 |
maxdest[0] = 32;
|
|
Packit |
427e91 |
maxdest[1] = 16;
|
|
Packit |
427e91 |
maxdest[2] = 8;
|
|
Packit |
427e91 |
num_modes = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case HDSP_AES: /* these cards support full channel count at all modes */
|
|
Packit |
427e91 |
chnls[0] = 16;
|
|
Packit |
427e91 |
chnls[1] = 16;
|
|
Packit |
427e91 |
chnls[2] = 16;
|
|
Packit |
427e91 |
maxdest[0] = 8;
|
|
Packit |
427e91 |
maxdest[1] = 8;
|
|
Packit |
427e91 |
maxdest[2] = 8;
|
|
Packit |
427e91 |
num_modes = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case HDSPeAIO:
|
|
Packit |
427e91 |
chnls[0] = 18;
|
|
Packit |
427e91 |
chnls[1] = 14;
|
|
Packit |
427e91 |
chnls[2] = 12;
|
|
Packit |
427e91 |
maxdest[0] = 10;
|
|
Packit |
427e91 |
maxdest[1] = 8;
|
|
Packit |
427e91 |
maxdest[2] = 7;
|
|
Packit |
427e91 |
num_modes = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case HDSPeRayDAT:
|
|
Packit |
427e91 |
chnls[0] = 36;
|
|
Packit |
427e91 |
chnls[1] = 20;
|
|
Packit |
427e91 |
chnls[2] = 12;
|
|
Packit |
427e91 |
maxdest[0] = 18;
|
|
Packit |
427e91 |
maxdest[1] = 10;
|
|
Packit |
427e91 |
maxdest[2] = 6;
|
|
Packit |
427e91 |
num_modes = 3;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
default:
|
|
Packit |
427e91 |
/* should never happen */
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (int preset = 0; preset < 8; ++preset) {
|
|
Packit |
427e91 |
for (int speed = 0; speed < num_modes; ++speed) {
|
|
Packit |
427e91 |
for (int i = 0; i < 2*maxdest[speed]; i+=2) {
|
|
Packit |
427e91 |
for (int z = 0; z < maxdest[speed]; ++z) {
|
|
Packit |
427e91 |
/* Gain setup */
|
|
Packit |
427e91 |
if (cards[card]->type == H9632) {
|
|
Packit |
427e91 |
inputs->strips[i]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 1 && z == h9632_an12_submix[speed]) || (i == z*2 && ((preset > 1 && preset < 4) || (preset == 7))) || ((preset == 5) && (z == h9632_spdif_submix[speed]))) ? ndb : 0;
|
|
Packit |
427e91 |
inputs->strips[i+1]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 1 && z == h9632_an12_submix[speed]) || (i == z*2 && ((preset > 1 && preset < 4) || (preset == 7))) || ((preset == 5) && (z == h9632_spdif_submix[speed]))) ? ndb : 0;
|
|
Packit |
427e91 |
playbacks->strips[i]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 1 && z == h9632_an12_submix[speed]) || i == z*2 || (preset == 5 && z == h9632_spdif_submix[speed])) ? ndb : 0;
|
|
Packit |
427e91 |
playbacks->strips[i+1]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 1 && z == h9632_an12_submix[speed]) || i == z*2 || (preset == 5 && z == h9632_spdif_submix[speed])) ? ndb : 0;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
inputs->strips[i]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 6 && z == (maxdest[speed]-1)) || (i == z*2 && (preset > 1 && preset < 4)) || (((preset > 0 && preset < 4) || preset == 7) && (z == maxdest[speed]-1))) ? ndb : 0;
|
|
Packit |
427e91 |
inputs->strips[i+1]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset == 6 && z == (maxdest[speed]-1)) || (i == z*2 && (preset > 1 && preset < 4)) || (((preset > 0 && preset < 4) || preset == 7) && (z == maxdest[speed]-1))) ? ndb : 0;
|
|
Packit |
427e91 |
playbacks->strips[i]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset > 4 && preset < 7 && z == (maxdest[speed]-1)) || i == z*2 || ((z == maxdest[speed]-1))) ? ndb : 0;
|
|
Packit |
427e91 |
playbacks->strips[i+1]->data[card][speed][preset]->fader_pos[z] =
|
|
Packit |
427e91 |
((preset > 4 && preset < 7 && z == (maxdest[speed]-1)) || i == z*2 || ((z == maxdest[speed]-1))) ? ndb : 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Pan setup */
|
|
Packit |
427e91 |
inputs->strips[i]->data[card][speed][preset]->pan_pos[z] = 0;
|
|
Packit |
427e91 |
inputs->strips[i+1]->data[card][speed][preset]->pan_pos[z] = 28*CF;
|
|
Packit |
427e91 |
playbacks->strips[i]->data[card][speed][preset]->pan_pos[z] = 0;
|
|
Packit |
427e91 |
playbacks->strips[i+1]->data[card][speed][preset]->pan_pos[z] = 28*CF;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (i < (chnls[speed]-(cards[card]->h9632_aeb.aebo ? 2 : 0))) {
|
|
Packit |
427e91 |
inputs->strips[i]->data[card][speed][preset]->dest =
|
|
Packit |
427e91 |
inputs->strips[i+1]->data[card][speed][preset]->dest =
|
|
Packit |
427e91 |
playbacks->strips[i]->data[card][speed][preset]->dest =
|
|
Packit |
427e91 |
playbacks->strips[i+1]->data[card][speed][preset]->dest = (int)floor(i/2);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
outputs->strips[i]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
|
|
Packit |
427e91 |
outputs->strips[i+1]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
|
|
Packit |
427e91 |
if (preset == 3 || preset == 7) {
|
|
Packit |
427e91 |
inputs->strips[i]->data[card][speed][preset]->mute = 1;
|
|
Packit |
427e91 |
inputs->strips[i+1]->data[card][speed][preset]->mute = 1;
|
|
Packit |
427e91 |
if (preset == 7) {
|
|
Packit |
427e91 |
playbacks->strips[i]->data[card][speed][preset]->mute = 1;
|
|
Packit |
427e91 |
playbacks->strips[i+1]->data[card][speed][preset]->mute = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (cards[card]->type == H9632) {
|
|
Packit |
427e91 |
if (preset == 1 || preset == 6) {
|
|
Packit |
427e91 |
data[card][speed][preset]->submix_value = h9632_an12_submix[speed];
|
|
Packit |
427e91 |
outputs->strips[h9632_an12_submix[speed]*2]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
outputs->strips[h9632_an12_submix[speed]*2+1]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
} else if (preset == 5) {
|
|
Packit |
427e91 |
data[card][speed][preset]->submix_value = h9632_spdif_submix[speed];
|
|
Packit |
427e91 |
outputs->strips[h9632_spdif_submix[speed]*2]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
outputs->strips[h9632_spdif_submix[speed]*2+1]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
data[card][speed][preset]->submix = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else if (preset > 4 && preset < 7) {
|
|
Packit |
427e91 |
data[card][speed][preset]->submix_value = maxdest[speed]-1;
|
|
Packit |
427e91 |
if (preset == 5) {
|
|
Packit |
427e91 |
outputs->strips[chnls[speed]-2]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
outputs->strips[chnls[speed]-1]->data[card][speed][preset]->fader_pos = ndb;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
data[card][speed][preset]->submix = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (preset == 3 || preset == 7) {
|
|
Packit |
427e91 |
data[card][speed][preset]->mute = 1;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
HDSPMixerWindow::HDSPMixerWindow(int x, int y, int w, int h, const char *label, HDSPMixerCard *hdsp_card1, HDSPMixerCard *hdsp_card2, HDSPMixerCard *hdsp_card3):Fl_Double_Window(x, y, w, h, label)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
cards[0] = hdsp_card1;
|
|
Packit |
427e91 |
cards[1] = hdsp_card2;
|
|
Packit |
427e91 |
cards[2] = hdsp_card3;
|
|
Packit |
427e91 |
current_card = current_preset = 0;
|
|
Packit |
427e91 |
prefs = new Fl_Preferences(Fl_Preferences::USER, "thomasATundata.org", "HDSPMixer");
|
|
Packit |
427e91 |
if (!prefs->get("default_file", file_name_buffer, NULL, FL_PATH_MAX-1)) {
|
|
Packit |
427e91 |
file_name = NULL;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
struct stat buf;
|
|
Packit |
427e91 |
if (!stat(file_name_buffer, &buf)) {
|
|
Packit |
427e91 |
file_name = file_name_buffer;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
file_name = NULL;
|
|
Packit |
427e91 |
prefs->deleteEntry("default_file");
|
|
Packit |
427e91 |
prefs->flush();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
for (int j = 0; j < MAX_CARDS; j++) {
|
|
Packit |
427e91 |
for (int i = 0; i < NUM_PRESETS; ++i) {
|
|
Packit |
427e91 |
data[j][0][i] = new HDSPMixerPresetData();
|
|
Packit |
427e91 |
data[j][1][i] = new HDSPMixerPresetData();
|
|
Packit |
427e91 |
data[j][2][i] = new HDSPMixerPresetData();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
buttons_removed = 0;
|
|
Packit |
427e91 |
dirty = 0;
|
|
Packit |
427e91 |
scroll = new Fl_Scroll(0, 0, w, h);
|
|
Packit |
427e91 |
menubar = new Fl_Menu_Bar(0, 0, w, MENU_HEIGHT);
|
|
Packit |
427e91 |
menubar->textfont(FL_HELVETICA);
|
|
Packit |
427e91 |
menubar->textsize(12);
|
|
Packit |
427e91 |
menubar->box(FL_THIN_UP_BOX);
|
|
Packit |
427e91 |
menubar->add("&File/Open preset file", FL_CTRL+'o', (Fl_Callback *)open_cb, (void *)this);
|
|
Packit |
427e91 |
menubar->add("&File/Save preset file", FL_CTRL+'s', (Fl_Callback *)save_cb, (void *)this);
|
|
Packit |
427e91 |
menubar->add("&File/Save preset file as ...", 0, (Fl_Callback *)save_as_cb, (void *)this, FL_MENU_DIVIDER);
|
|
Packit |
427e91 |
menubar->add("&File/Make current file default", 'd', (Fl_Callback *)make_default_cb, (void *)this);
|
|
Packit |
427e91 |
menubar->add("&File/Restore factory settings", 'f', (Fl_Callback *)restore_defaults_cb, (void *)this, FL_MENU_DIVIDER);
|
|
Packit |
427e91 |
menubar->add("&File/E&xit", FL_CTRL+'q', (Fl_Callback *)exit_cb, (void *)this);
|
|
Packit |
427e91 |
menubar->add("&View/Input", 'i', (Fl_Callback *)view_cb, (void *)this, FL_MENU_TOGGLE|FL_MENU_VALUE);
|
|
Packit |
427e91 |
menubar->add("&View/Playback", 'p', (Fl_Callback *)view_cb, (void *)this, FL_MENU_TOGGLE|FL_MENU_VALUE);
|
|
Packit |
427e91 |
menubar->add("&View/Output", 'o', (Fl_Callback *)view_cb, (void *)this, FL_MENU_DIVIDER|FL_MENU_TOGGLE|FL_MENU_VALUE);
|
|
Packit |
427e91 |
menubar->add("&View/Submix", 's', (Fl_Callback *)submix_cb, (void *)this, FL_MENU_TOGGLE|FL_MENU_VALUE);
|
|
Packit |
427e91 |
menubar->add("&Options/Level Meter Setup", 'm', (Fl_Callback *)setup_cb, (void *)this);
|
|
Packit |
427e91 |
menubar->add("&?/About", 0, (Fl_Callback *)about_cb, (void *)this);
|
|
Packit |
427e91 |
inputs = new HDSPMixerInputs(0, MENU_HEIGHT, w, FULLSTRIP_HEIGHT, cards[0]->channels_input);
|
|
Packit |
427e91 |
inputs->buttons->input = 1;
|
|
Packit |
427e91 |
inputs->buttons->output = 1;
|
|
Packit |
427e91 |
inputs->buttons->submix = 1;
|
|
Packit |
427e91 |
inputs->buttons->playback = 1;
|
|
Packit |
427e91 |
playbacks = new HDSPMixerPlaybacks(0, MENU_HEIGHT+FULLSTRIP_HEIGHT, w, FULLSTRIP_HEIGHT, cards[0]->channels_playback);
|
|
Packit |
427e91 |
outputs = new HDSPMixerOutputs(0, MENU_HEIGHT+FULLSTRIP_HEIGHT*2, w, SMALLSTRIP_HEIGHT, cards[0]->channels_output);
|
|
Packit |
427e91 |
scroll->end();
|
|
Packit |
427e91 |
end();
|
|
Packit |
427e91 |
setup = new HDSPMixerSetup(400, 260, "Level Meters Setup", this);
|
|
Packit |
427e91 |
about = new HDSPMixerAbout(360, 300, "About HDSPMixer", this);
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
while (i < MAX_CARDS && cards[i] != NULL) {
|
|
Packit |
427e91 |
cards[i++]->initializeCard(this);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
size_range(MIN_WIDTH, MIN_HEIGHT, cards[current_card]->window_width, cards[current_card]->window_height);
|
|
Packit |
427e91 |
resetMixer();
|
|
Packit |
427e91 |
if (file_name) {
|
|
Packit |
427e91 |
printf("Restoring last presets used\n");
|
|
Packit |
427e91 |
load();
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
printf("Initializing default presets\n");
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
while (i < MAX_CARDS && cards[i] != NULL) {
|
|
Packit |
427e91 |
current_card = i;
|
|
Packit |
427e91 |
restoreDefaults(i++);
|
|
Packit |
427e91 |
inputs->buttons->presets->preset_change(1);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
Fl::atclose = atclose_cb;
|
|
Packit |
427e91 |
Fl::add_handler(handler_cb);
|
|
Packit |
427e91 |
Fl::add_timeout(0.030, readregisters_cb, this);
|
|
Packit |
427e91 |
i = 0;
|
|
Packit |
427e91 |
while (i < MAX_CARDS && cards[i] != NULL) {
|
|
Packit |
427e91 |
current_card = i;
|
|
Packit |
427e91 |
inputs->buttons->cardselector->ActivateCard (i++);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int HDSPMixerWindow::handle(int e)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
return Fl_Double_Window::handle(e);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::resize(int x, int y, int w, int h)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
Fl_Double_Window::resize(x, y, w, h);
|
|
Packit |
427e91 |
scroll->resize (0, 0, w, h);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::reorder()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int xpos = scroll->x();
|
|
Packit |
427e91 |
int ypos = scroll->y();
|
|
Packit |
427e91 |
int ytemp = ypos+MENU_HEIGHT;
|
|
Packit |
427e91 |
if (inputs->buttons->view->input) {
|
|
Packit |
427e91 |
scroll->add(inputs);
|
|
Packit |
427e91 |
inputs->add(*(inputs->buttons));
|
|
Packit |
427e91 |
buttons_removed = 0;
|
|
Packit |
427e91 |
inputs->buttons->position(inputs->buttons->x(), MENU_HEIGHT);
|
|
Packit |
427e91 |
inputs->position(xpos, ytemp);
|
|
Packit |
427e91 |
ytemp += FULLSTRIP_HEIGHT;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if (!buttons_removed) {
|
|
Packit |
427e91 |
buttons_removed = 1;
|
|
Packit |
427e91 |
playbacks->add(*(inputs->buttons));
|
|
Packit |
427e91 |
inputs->buttons->position(playbacks->empty->x(), playbacks->empty->y());
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
scroll->remove(*inputs);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (inputs->buttons->view->playback) {
|
|
Packit |
427e91 |
scroll->add(playbacks);
|
|
Packit |
427e91 |
playbacks->position(xpos, ytemp);
|
|
Packit |
427e91 |
ytemp += FULLSTRIP_HEIGHT;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
scroll->remove(*playbacks);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
if (inputs->buttons->view->output) {
|
|
Packit |
427e91 |
scroll->add(outputs);
|
|
Packit |
427e91 |
outputs->position(xpos, ytemp);
|
|
Packit |
427e91 |
ytemp += SMALLSTRIP_HEIGHT;
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
scroll->remove(*outputs);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
scroll->init_sizes();
|
|
Packit |
427e91 |
resize(x(), y(), w(), ytemp);
|
|
Packit |
427e91 |
size_range(MIN_WIDTH, MIN_HEIGHT, cards[current_card]->window_width, ytemp);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::checkState()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int speed = cards[current_card]->speed_mode;
|
|
Packit |
427e91 |
int p = inputs->buttons->presets->preset-1;
|
|
Packit |
427e91 |
int corrupt = 0;
|
|
Packit |
427e91 |
/* Mixer strips */
|
|
Packit |
427e91 |
for (int i = 0; i < HDSP_MAX_CHANNELS; ++i) {
|
|
Packit |
427e91 |
for (int j = 0; j < HDSP_MAX_DEST; ++j) {
|
|
Packit |
427e91 |
/* Inputs */
|
|
Packit |
427e91 |
if (inputs->strips[i]->data[current_card][speed][p]->pan_pos[j] != inputs->strips[i]->pan->pos[j])
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (inputs->strips[i]->data[current_card][speed][p]->fader_pos[j] != inputs->strips[i]->fader->pos[j])
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (playbacks->strips[i]->data[current_card][speed][p]->pan_pos[j] != playbacks->strips[i]->pan->pos[j])
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (playbacks->strips[i]->data[current_card][speed][p]->fader_pos[j] != playbacks->strips[i]->fader->pos[j])
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
/* Inputs row */
|
|
Packit |
427e91 |
if (inputs->strips[i]->data[current_card][speed][p]->mute != inputs->strips[i]->mutesolo->mute)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (inputs->strips[i]->data[current_card][speed][p]->solo != inputs->strips[i]->mutesolo->solo)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (inputs->strips[i]->data[current_card][speed][p]->dest != inputs->strips[i]->targets->selected)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
/* Playbacks row */
|
|
Packit |
427e91 |
if (playbacks->strips[i]->data[current_card][speed][p]->mute != playbacks->strips[i]->mutesolo->mute)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (playbacks->strips[i]->data[current_card][speed][p]->solo != playbacks->strips[i]->mutesolo->solo)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (playbacks->strips[i]->data[current_card][speed][p]->dest != playbacks->strips[i]->targets->selected)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
/* Outputs row */
|
|
Packit |
427e91 |
if (outputs->strips[i]->data[current_card][speed][p]->fader_pos != outputs->strips[i]->fader->pos[0])
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
/* Global settings */
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->mute != inputs->buttons->master->mute)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->solo != inputs->buttons->master->solo)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->input != inputs->buttons->view->input)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->output != inputs->buttons->view->output)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->playback != inputs->buttons->view->playback)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->submix != inputs->buttons->view->submix)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (data[current_card][speed][p]->submix_value != inputs->buttons->view->submix_value)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
/* Setup options */
|
|
Packit |
427e91 |
if (setup->over_val != data[current_card][speed][p]->over)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (setup->rate_val != data[current_card][speed][p]->rate)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (setup->level_val != data[current_card][speed][p]->level)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (setup->rmsplus3_val != data[current_card][speed][p]->rmsplus3)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
if (setup->numbers_val != data[current_card][speed][p]->numbers)
|
|
Packit |
427e91 |
corrupt++;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (corrupt) {
|
|
Packit |
427e91 |
if (!dirty) {
|
|
Packit |
427e91 |
dirty = 1;
|
|
Packit |
427e91 |
setTitleWithFilename();
|
|
Packit |
427e91 |
Fl::add_timeout(0.3, dirty_cb, (void *)this);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
setTitleWithFilename();
|
|
Packit |
427e91 |
dirty = 0;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::setSubmix(int submix_value)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
for (int i = 0; i < cards[current_card]->channels_playback; i++) {
|
|
Packit |
427e91 |
inputs->strips[i]->targets->value(submix_value);
|
|
Packit |
427e91 |
inputs->strips[i]->targets->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->fader->dest = submix_value;
|
|
Packit |
427e91 |
inputs->strips[i]->fader->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->pan->dest = submix_value;
|
|
Packit |
427e91 |
inputs->strips[i]->pan->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->fader->sendGain();
|
|
Packit |
427e91 |
playbacks->strips[i]->targets->value(submix_value);
|
|
Packit |
427e91 |
playbacks->strips[i]->targets->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->dest = submix_value;
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->pan->dest = submix_value;
|
|
Packit |
427e91 |
playbacks->strips[i]->pan->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->sendGain();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::unsetSubmix()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
for (int i = 0; i < cards[current_card]->channels_input; i++) {
|
|
Packit |
427e91 |
inputs->strips[i]->targets->value(inputs->strips[i]->targets->selected);
|
|
Packit |
427e91 |
inputs->strips[i]->targets->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->fader->dest = inputs->strips[i]->targets->selected;
|
|
Packit |
427e91 |
inputs->strips[i]->fader->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->pan->dest = inputs->strips[i]->targets->selected;
|
|
Packit |
427e91 |
inputs->strips[i]->pan->redraw();
|
|
Packit |
427e91 |
inputs->strips[i]->fader->sendGain();
|
|
Packit |
427e91 |
playbacks->strips[i]->targets->value(playbacks->strips[i]->targets->selected);
|
|
Packit |
427e91 |
playbacks->strips[i]->targets->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->dest = playbacks->strips[i]->targets->selected;
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->pan->dest = playbacks->strips[i]->targets->selected;
|
|
Packit |
427e91 |
playbacks->strips[i]->pan->redraw();
|
|
Packit |
427e91 |
playbacks->strips[i]->fader->sendGain();
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::refreshMixer()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
for (i = 1; i <= cards[current_card]->channels_input; ++i) {
|
|
Packit |
427e91 |
for (j = 0; j < inputs->strips[0]->targets->max_dest; ++j) {
|
|
Packit |
427e91 |
setMixer(i, 0, j);
|
|
Packit |
427e91 |
setMixer(i, 1, j);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::refreshMixerStrip(int idx, int src)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i;
|
|
Packit |
427e91 |
for (i = 0; i < inputs->strips[0]->targets->max_dest; ++i) {
|
|
Packit |
427e91 |
setMixer(idx, src, i);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::resetMixer()
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
int i, j;
|
|
Packit |
427e91 |
for (i = 0; i < (cards[current_card]->playbacks_offset*2) ; ++i) {
|
|
Packit |
427e91 |
for (j = 0; j < (cards[current_card]->playbacks_offset); ++j) {
|
|
Packit |
427e91 |
setGain(i, j, 0);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::setGain(int in, int out, int value)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* just a wrapper around the 'Mixer' ctl */
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
int err;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_id_t *id;
|
|
Packit |
427e91 |
snd_ctl_elem_value_t *ctl;
|
|
Packit |
427e91 |
snd_ctl_t *handle;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
//printf("setGain(%d, %d, %d)\n", in, out, value);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_alloca(&ctl;;
|
|
Packit |
427e91 |
snd_ctl_elem_id_alloca(&id;;
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_name(id, "Mixer");
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_device(id, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_index(id, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(ctl, id);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = snd_ctl_open(&handle, cards[current_card]->name, SND_CTL_NONBLOCK)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Alsa error 1: %s\n", snd_strerror(err));
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 0, in);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 1, out);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 2, value);
|
|
Packit |
427e91 |
if ((err = snd_ctl_elem_write(handle, ctl)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Alsa error 2: %s\n", snd_strerror(err));
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
void HDSPMixerWindow::setMixer(int idx, int src, int dst)
|
|
Packit |
427e91 |
{
|
|
Packit |
427e91 |
/* idx is the strip number (indexed fom 1)
|
|
Packit |
427e91 |
src is the row (0 = inputs, 1 = playbacks, 2 = outputs)
|
|
Packit |
427e91 |
dst is the destination stereo channel
|
|
Packit |
427e91 |
*/
|
|
Packit |
427e91 |
int err,gsolo_active,gmute_active, gmute, gsolo;
|
|
Packit |
427e91 |
snd_ctl_elem_id_t *id;
|
|
Packit |
427e91 |
snd_ctl_elem_value_t *ctl;
|
|
Packit |
427e91 |
snd_ctl_t *handle;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
char *channel_map;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
switch (src) {
|
|
Packit |
427e91 |
case 0:
|
|
Packit |
427e91 |
channel_map = cards[current_card]->channel_map_input;
|
|
Packit |
427e91 |
break;
|
|
Packit |
427e91 |
case 1:
|
|
Packit |
427e91 |
case 2:
|
|
Packit |
427e91 |
channel_map = cards[current_card]->channel_map_playback;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
gsolo_active = inputs->buttons->master->solo_active;
|
|
Packit |
427e91 |
gmute_active = inputs->buttons->master->mute_active;
|
|
Packit |
427e91 |
gsolo = inputs->buttons->master->solo;
|
|
Packit |
427e91 |
gmute = inputs->buttons->master->mute;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (src == 0 || src == 1) {
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
double vol, pan, attenuation_l, attenuation_r, left_val, right_val;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_alloca(&ctl;;
|
|
Packit |
427e91 |
snd_ctl_elem_id_alloca(&id;;
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_name(id, "Mixer");
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_device(id, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_id_set_index(id, 0);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_id(ctl, id);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if ((err = snd_ctl_open(&handle, cards[current_card]->name, SND_CTL_NONBLOCK)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Alsa error 3: %s\n", snd_strerror(err));
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (src) {
|
|
Packit |
427e91 |
if ((gmute && playbacks->strips[idx-1]->mutesolo->mute && !(playbacks->strips[idx-1]->mutesolo->solo && gsolo)) || (gsolo && gsolo_active && !(playbacks->strips[idx-1]->mutesolo->solo)) ) {
|
|
Packit |
427e91 |
left_val = right_val = 0;
|
|
Packit |
427e91 |
goto muted;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
if ((gmute && inputs->strips[idx-1]->mutesolo->mute && !(inputs->strips[idx-1]->mutesolo->solo && gsolo)) || (gsolo && gsolo_active && !(inputs->strips[idx-1]->mutesolo->solo)) ) {
|
|
Packit |
427e91 |
left_val = right_val = 0;
|
|
Packit |
427e91 |
goto muted;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
if (src) {
|
|
Packit |
427e91 |
vol = playbacks->strips[idx-1]->fader->posToInt(playbacks->strips[idx-1]->fader->pos[dst]);
|
|
Packit |
427e91 |
pan = (double)(playbacks->strips[idx-1]->pan->pos[dst])/(double)(PAN_WIDTH*CF);
|
|
Packit |
427e91 |
} else {
|
|
Packit |
427e91 |
vol = inputs->strips[idx-1]->fader->posToInt(inputs->strips[idx-1]->fader->pos[dst]);
|
|
Packit |
427e91 |
pan = (double)(inputs->strips[idx-1]->pan->pos[dst])/(double)(PAN_WIDTH*CF);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
attenuation_l = (double)(outputs->strips[dst*2]->fader->posToInt(outputs->strips[dst*2]->fader->pos[0]))/65535.0;
|
|
Packit |
427e91 |
attenuation_r = (double)(outputs->strips[dst*2+1]->fader->posToInt(outputs->strips[dst*2+1]->fader->pos[0]))/65535.0;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
left_val = attenuation_l* vol * (1.0 - pan);
|
|
Packit |
427e91 |
right_val = attenuation_r* vol * pan;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
muted:
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 0, src*cards[current_card]->playbacks_offset+channel_map[idx-1]);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 1, cards[current_card]->dest_map[dst]);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 2, (int)left_val);
|
|
Packit |
427e91 |
if ((err = snd_ctl_elem_write(handle, ctl)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Alsa error 4: %s\n", snd_strerror(err));
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 0, src*cards[current_card]->playbacks_offset+channel_map[idx-1]);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 1, cards[current_card]->dest_map[dst]+1);
|
|
Packit |
427e91 |
snd_ctl_elem_value_set_integer(ctl, 2, (int)right_val);
|
|
Packit |
427e91 |
if ((err = snd_ctl_elem_write(handle, ctl)) < 0) {
|
|
Packit |
427e91 |
fprintf(stderr, "Alsa error 5: %s\n", snd_strerror(err));
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
return;
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
snd_ctl_close(handle);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
} else if (src == 2) {
|
|
Packit |
427e91 |
int i, vol, dest;
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
dest = (int)floor((idx-1)/2);
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < cards[current_card]->channels_input; ++i) {
|
|
Packit |
427e91 |
if ((vol = inputs->strips[i]->fader->posToInt(inputs->strips[i]->fader->pos[dest])) != 0) {
|
|
Packit |
427e91 |
setMixer(i+1, 0, dest);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|
|
Packit |
427e91 |
for (i = 0; i < cards[current_card]->channels_playback; ++i) {
|
|
Packit |
427e91 |
if ((vol = playbacks->strips[i]->fader->posToInt(playbacks->strips[i]->fader->pos[dest])) != 0) {
|
|
Packit |
427e91 |
setMixer(i+1, 1, dest);
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
}
|
|
Packit |
427e91 |
|