mirror of
https://github.com/alsa-project/alsa-tools.git
synced 2025-10-29 05:40:25 -04:00
hdspmixer: add output loopback buttons
This adds "LPBK" buttons to the output strip channels for toggling the hardware output loopback functionality recently added for HDSP9632. The preset data is just appended to the preset file so that it can still be loaded in older versions.
This commit is contained in:
parent
82979c32e4
commit
4f777e605a
16 changed files with 266 additions and 5 deletions
|
|
@ -231,6 +231,8 @@ void HDSPMixerCard::adjustSettings() {
|
|||
/* should never happen */
|
||||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_mf_ss);
|
||||
}
|
||||
|
||||
if (type == Digiface) {
|
||||
|
|
@ -253,6 +255,8 @@ void HDSPMixerCard::adjustSettings() {
|
|||
/* should never happen */
|
||||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_df_ss);
|
||||
}
|
||||
|
||||
if (type == RPM) {
|
||||
|
|
@ -263,6 +267,8 @@ void HDSPMixerCard::adjustSettings() {
|
|||
channel_map_input = channel_map_playback = channel_map_rpm;
|
||||
dest_map = dest_map_rpm;
|
||||
meter_map_input = meter_map_playback = channel_map_rpm;
|
||||
|
||||
max_channels = sizeof(channel_map_rpm);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -286,6 +292,8 @@ void HDSPMixerCard::adjustSettings() {
|
|||
/* should never happen */
|
||||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_df_ss);
|
||||
}
|
||||
|
||||
if (type == H9632) {
|
||||
|
|
@ -312,6 +320,8 @@ void HDSPMixerCard::adjustSettings() {
|
|||
meter_map_input = meter_map_playback = channel_map_h9632_qs;
|
||||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_h9632_ss);
|
||||
}
|
||||
|
||||
if (HDSPeMADI == type) {
|
||||
|
|
@ -341,6 +351,7 @@ void HDSPMixerCard::adjustSettings() {
|
|||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_unity_ss);
|
||||
}
|
||||
|
||||
if (HDSPeAIO == type) {
|
||||
|
|
@ -379,6 +390,7 @@ void HDSPMixerCard::adjustSettings() {
|
|||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_aio_out_ss);
|
||||
}
|
||||
|
||||
if (HDSP_AES == type) {
|
||||
|
|
@ -394,6 +406,7 @@ void HDSPMixerCard::adjustSettings() {
|
|||
meter_map_input = channel_map_aes32;
|
||||
meter_map_playback = channel_map_aes32;
|
||||
|
||||
max_channels = sizeof(channel_map_aes32);
|
||||
}
|
||||
|
||||
if (HDSPeRayDAT == type) {
|
||||
|
|
@ -426,6 +439,7 @@ void HDSPMixerCard::adjustSettings() {
|
|||
break;
|
||||
}
|
||||
|
||||
max_channels = sizeof(channel_map_raydat_ss);
|
||||
}
|
||||
|
||||
window_width = (channels_playback+2)*STRIP_WIDTH;
|
||||
|
|
@ -545,3 +559,23 @@ int HDSPMixerCard::initializeCard(HDSPMixerWindow *w)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int HDSPMixerCard::supportsLoopback() const
|
||||
{
|
||||
int err = 0;
|
||||
snd_ctl_elem_value_t *elemval;
|
||||
snd_ctl_elem_id_t * elemid;
|
||||
snd_ctl_t *handle;
|
||||
snd_ctl_elem_value_alloca(&elemval);
|
||||
snd_ctl_elem_id_alloca(&elemid);
|
||||
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0)
|
||||
return err;
|
||||
|
||||
snd_ctl_elem_id_set_name(elemid, "Output Loopback");
|
||||
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_HWDEP);
|
||||
snd_ctl_elem_id_set_index(elemid, 0);
|
||||
snd_ctl_elem_value_set_id(elemval, elemid);
|
||||
err = snd_ctl_elem_read(handle, elemval);
|
||||
snd_ctl_close(handle);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ public:
|
|||
HDSPMixerCard(int cardtype, int id, char *shortname);
|
||||
int channels_input, channels_playback, window_width, window_height, card_id;
|
||||
int channels_output;
|
||||
int max_channels;
|
||||
int type;
|
||||
int last_preset; /* Last activated preset before switching to another card */
|
||||
int last_dirty; /* Last dirty flag before switching to another card */
|
||||
|
|
@ -68,6 +69,7 @@ public:
|
|||
void adjustSettings();
|
||||
void getAeb();
|
||||
hdsp_9632_aeb_t h9632_aeb;
|
||||
int supportsLoopback() const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
133
hdspmixer/src/HDSPMixerLoopback.cxx
Normal file
133
hdspmixer/src/HDSPMixerLoopback.cxx
Normal file
|
|
@ -0,0 +1,133 @@
|
|||
/*
|
||||
* HDSPMixer
|
||||
*
|
||||
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#pragma implementation
|
||||
#include "HDSPMixerLoopback.h"
|
||||
|
||||
HDSPMixerLoopback::HDSPMixerLoopback(int x, int y, int idx):Fl_Widget(x, y, 34, 15)
|
||||
{
|
||||
basew = (HDSPMixerWindow *)window();
|
||||
index = idx;
|
||||
}
|
||||
|
||||
void HDSPMixerLoopback::draw()
|
||||
{
|
||||
if (_loopback == 1)
|
||||
fl_draw_pixmap(loopback_xpm, x(), y());
|
||||
}
|
||||
|
||||
int HDSPMixerLoopback::get()
|
||||
{
|
||||
auto const card { basew->cards[basew->current_card] };
|
||||
|
||||
if (card->supportsLoopback() != 0)
|
||||
return -1;
|
||||
|
||||
if (index >= card->max_channels)
|
||||
return -1;
|
||||
|
||||
int err;
|
||||
snd_ctl_elem_value_t *elemval;
|
||||
snd_ctl_elem_id_t * elemid;
|
||||
snd_ctl_t *handle;
|
||||
snd_ctl_elem_value_alloca(&elemval);
|
||||
snd_ctl_elem_id_alloca(&elemid);
|
||||
char const * const name = basew->cards[basew->current_card]->name;
|
||||
if ((err = snd_ctl_open(&handle, name, SND_CTL_NONBLOCK)) < 0) {
|
||||
fprintf(stderr, "Error accessing ctl interface on card %s\n.", name);
|
||||
return -1;
|
||||
}
|
||||
|
||||
snd_ctl_elem_id_set_name(elemid, "Output Loopback");
|
||||
snd_ctl_elem_id_set_interface(elemid, SND_CTL_ELEM_IFACE_HWDEP);
|
||||
snd_ctl_elem_id_set_index(elemid, index);
|
||||
snd_ctl_elem_value_set_id(elemval, elemid);
|
||||
if ((err = snd_ctl_elem_read(handle, elemval)) < 0)
|
||||
fprintf(stderr, "cannot read loopback: %d\n", err);
|
||||
else
|
||||
_loopback = snd_ctl_elem_value_get_integer(elemval, 0);
|
||||
|
||||
snd_ctl_close(handle);
|
||||
|
||||
return _loopback;
|
||||
}
|
||||
|
||||
void HDSPMixerLoopback::set(int l)
|
||||
{
|
||||
auto const card { basew->cards[basew->current_card] };
|
||||
|
||||
if (card->supportsLoopback() != 0)
|
||||
return;
|
||||
|
||||
if (index >= card->max_channels)
|
||||
return;
|
||||
|
||||
if (l != _loopback) {
|
||||
int err;
|
||||
|
||||
snd_ctl_elem_id_t *id;
|
||||
snd_ctl_elem_value_t *ctl;
|
||||
snd_ctl_t *handle;
|
||||
|
||||
snd_ctl_elem_value_alloca(&ctl);
|
||||
snd_ctl_elem_id_alloca(&id);
|
||||
snd_ctl_elem_id_set_name(id, "Output Loopback");
|
||||
snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_HWDEP);
|
||||
snd_ctl_elem_id_set_device(id, 0);
|
||||
snd_ctl_elem_id_set_index(id, index);
|
||||
snd_ctl_elem_value_set_id(ctl, id);
|
||||
|
||||
if ((err = snd_ctl_open(
|
||||
&handle, basew->cards[basew->current_card]->name, SND_CTL_NONBLOCK)) < 0) {
|
||||
fprintf(stderr, "Alsa error 1: %s\n", snd_strerror(err));
|
||||
return;
|
||||
}
|
||||
|
||||
snd_ctl_elem_value_set_integer(ctl, 0, l);
|
||||
if ((err = snd_ctl_elem_write(handle, ctl)) < 0) {
|
||||
fprintf(stderr, "Alsa error 2: %s\n", snd_strerror(err));
|
||||
snd_ctl_close(handle);
|
||||
return;
|
||||
}
|
||||
|
||||
_loopback = l;
|
||||
|
||||
snd_ctl_close(handle);
|
||||
|
||||
redraw();
|
||||
}
|
||||
}
|
||||
|
||||
int HDSPMixerLoopback::handle(int e)
|
||||
{
|
||||
int button3 = Fl::event_button3();
|
||||
switch (e) {
|
||||
case FL_PUSH:
|
||||
set(!_loopback);
|
||||
if (button3)
|
||||
relative->set(_loopback);
|
||||
basew->checkState();
|
||||
redraw();
|
||||
return 1;
|
||||
default:
|
||||
return Fl_Widget::handle(e);
|
||||
}
|
||||
}
|
||||
|
||||
48
hdspmixer/src/HDSPMixerLoopback.h
Normal file
48
hdspmixer/src/HDSPMixerLoopback.h
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* HDSPMixer
|
||||
*
|
||||
* Copyright (C) 2003 Thomas Charbonnel (thomas@undata.org)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#pragma interface
|
||||
#ifndef HDSPMixerLoopback_H
|
||||
#define HDSPMixerLoopback_H
|
||||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Widget.H>
|
||||
#include "HDSPMixerWindow.h"
|
||||
#include "pixmaps.h"
|
||||
|
||||
class HDSPMixerWindow;
|
||||
|
||||
class HDSPMixerLoopback:public Fl_Widget
|
||||
{
|
||||
private:
|
||||
HDSPMixerWindow *basew;
|
||||
int _loopback{-1};
|
||||
public:
|
||||
HDSPMixerLoopback *relative;
|
||||
int index;
|
||||
HDSPMixerLoopback(int x, int y, int idx);
|
||||
void draw();
|
||||
int handle(int e);
|
||||
int get();
|
||||
void set(int l);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -204,6 +204,7 @@ HDSPMixerOutput::HDSPMixerOutput(int x, int y, int w, int h, int num):Fl_Group(x
|
|||
peak = new HDSPMixerPeak(x+3, y+4, 0);
|
||||
gain = new HDSPMixerGain(x+3, y+175, 0);
|
||||
meter = new HDSPMixerMeter(x+20, y+27, false, peak);
|
||||
loopback = new HDSPMixerLoopback(x+1, y+208, out_num);
|
||||
end();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include <FL/fl_draw.H>
|
||||
#include <alsa/sound/hdsp.h>
|
||||
#include "HDSPMixerFader.h"
|
||||
#include "HDSPMixerLoopback.h"
|
||||
#include "HDSPMixerPeak.h"
|
||||
#include "HDSPMixerGain.h"
|
||||
#include "HDSPMixerMeter.h"
|
||||
|
|
@ -36,6 +37,7 @@
|
|||
|
||||
class HDSPMixerFader;
|
||||
class HDSPMixerGain;
|
||||
class HDSPMixerLoopback;
|
||||
class HDSPMixerPeak;
|
||||
class HDSPMixerMeter;
|
||||
class HDSPMixerOutputData;
|
||||
|
|
@ -56,6 +58,7 @@ public:
|
|||
HDSPMixerFader *fader;
|
||||
HDSPMixerGain *gain;
|
||||
HDSPMixerMeter *meter;
|
||||
HDSPMixerLoopback *loopback;
|
||||
HDSPMixerOutput(int x, int y, int w, int h, int out);
|
||||
void draw();
|
||||
void draw_background();
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ class HDSPMixerOutputData
|
|||
{
|
||||
public:
|
||||
int fader_pos;
|
||||
int loopback;
|
||||
HDSPMixerOutputData();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -25,13 +25,15 @@ HDSPMixerOutputs::HDSPMixerOutputs(int x, int y, int w, int h, int nchans):Fl_Gr
|
|||
{
|
||||
int i;
|
||||
for (i = 0; i < HDSP_MAX_CHANNELS+2; i += 2) {
|
||||
strips[i] = new HDSPMixerOutput((i*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i);
|
||||
strips[i] = new HDSPMixerOutput((i*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i);
|
||||
strips[i+1] = new HDSPMixerOutput(((i+1)*STRIP_WIDTH), y, STRIP_WIDTH, SMALLSTRIP_HEIGHT, i+1);
|
||||
/* Setup linked stereo channels */
|
||||
strips[i]->fader->relative = strips[i+1]->fader;
|
||||
strips[i+1]->fader->relative = strips[i]->fader;
|
||||
strips[i]->fader->gain = strips[i]->gain;
|
||||
strips[i+1]->fader->gain = strips[i+1]->gain;
|
||||
strips[i]->loopback->relative = strips[i+1]->loopback;
|
||||
strips[i+1]->loopback->relative = strips[i]->loopback;
|
||||
|
||||
}
|
||||
empty_aebo[0] = new HDSPMixerEmpty((nchans-6)*STRIP_WIDTH, y, 2*STRIP_WIDTH, SMALLSTRIP_HEIGHT, 0);
|
||||
|
|
|
|||
|
|
@ -36,5 +36,6 @@ HDSPMixerPresetData::HDSPMixerPresetData()
|
|||
over = 3;
|
||||
level = 0;
|
||||
rate = 1;
|
||||
loopback = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ public:
|
|||
int over;
|
||||
int rate;
|
||||
int rmsplus3;
|
||||
int loopback;
|
||||
HDSPMixerPresetData();
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -143,6 +143,7 @@ void HDSPMixerPresets::save_preset(int prst) {
|
|||
basew->playbacks->strips[i]->data[card][speed][p]->dest = basew->playbacks->strips[i]->targets->selected;
|
||||
|
||||
basew->outputs->strips[i]->data[card][speed][p]->fader_pos = basew->outputs->strips[i]->fader->pos[0];
|
||||
basew->outputs->strips[i]->data[card][speed][p]->loopback = basew->outputs->strips[i]->loopback->get();
|
||||
}
|
||||
/* Line outs */
|
||||
basew->outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][p]->fader_pos = basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0];
|
||||
|
|
@ -188,6 +189,7 @@ void HDSPMixerPresets::restore_preset(int prst) {
|
|||
basew->playbacks->strips[i]->targets->selected = basew->playbacks->strips[i]->data[card][speed][p]->dest;
|
||||
|
||||
basew->outputs->strips[i]->fader->pos[0] = basew->outputs->strips[i]->data[card][speed][p]->fader_pos;
|
||||
basew->outputs->strips[i]->loopback->set(basew->outputs->strips[i]->data[card][speed][p]->loopback);
|
||||
}
|
||||
/* Line outs */
|
||||
basew->outputs->strips[HDSP_MAX_CHANNELS]->fader->pos[0] = basew->outputs->strips[HDSP_MAX_CHANNELS+1]->data[card][speed][p]->fader_pos;
|
||||
|
|
|
|||
|
|
@ -411,7 +411,7 @@ void HDSPMixerWindow::save()
|
|||
if (fwrite((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
||||
goto save_error;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
/* Lineouts */
|
||||
if (fwrite((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
||||
|
|
@ -463,6 +463,20 @@ void HDSPMixerWindow::save()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int speed = 0; speed < 3; ++speed) {
|
||||
for (int card = 0; card < MAX_CARDS; ++card) {
|
||||
for (int preset = 0; preset < 8; ++preset) {
|
||||
for (int channel = 0; channel < HDSP_MAX_CHANNELS; ++channel) {
|
||||
/* output loopbacks */
|
||||
if (fwrite((void *)&(outputs->strips[channel]->data[card][speed][preset]->loopback), sizeof(int), 1, file) != 1) {
|
||||
goto save_error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fclose(file);
|
||||
return;
|
||||
save_error:
|
||||
|
|
@ -562,7 +576,6 @@ void HDSPMixerWindow::load()
|
|||
if (fread((void *)&(outputs->strips[channel]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
||||
goto load_error;
|
||||
}
|
||||
|
||||
}
|
||||
/* Lineouts */
|
||||
if (fread((void *)&(outputs->strips[HDSP_MAX_CHANNELS]->data[card][speed][preset]->fader_pos), sizeof(int), 1, file) != 1) {
|
||||
|
|
@ -617,6 +630,19 @@ void HDSPMixerWindow::load()
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int speed = 0; speed < 3; ++speed) {
|
||||
for (int card = 0; card < MAX_CARDS; ++card) {
|
||||
for (int preset = 0; preset < 8; ++preset) {
|
||||
for (int channel = 0; channel < channels_per_card; ++channel) {
|
||||
/* read additional loopback settings only present in newer mix files */
|
||||
if (fread((void *)&(outputs->strips[channel]->data[card][speed][preset]->loopback), sizeof(int), 1, file) != 1) {
|
||||
goto load_error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fclose(file);
|
||||
setTitleWithFilename();
|
||||
resetMixer();
|
||||
|
|
@ -814,6 +840,8 @@ void HDSPMixerWindow::restoreDefaults(int card)
|
|||
}
|
||||
outputs->strips[i]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
|
||||
outputs->strips[i+1]->data[card][speed][preset]->fader_pos = (preset != 4) ? 137*CF : 0;
|
||||
outputs->strips[i]->data[card][speed][preset]->loopback = 0;
|
||||
outputs->strips[i+1]->data[card][speed][preset]->loopback = 0;
|
||||
if (preset == 3 || preset == 7) {
|
||||
inputs->strips[i]->data[card][speed][preset]->mute = 1;
|
||||
inputs->strips[i+1]->data[card][speed][preset]->mute = 1;
|
||||
|
|
@ -1021,6 +1049,8 @@ void HDSPMixerWindow::checkState()
|
|||
/* Outputs row */
|
||||
if (outputs->strips[i]->data[current_card][speed][p]->fader_pos != outputs->strips[i]->fader->pos[0])
|
||||
corrupt++;
|
||||
if (outputs->strips[i]->data[current_card][speed][p]->loopback != outputs->strips[i]->loopback->get())
|
||||
corrupt++;
|
||||
}
|
||||
|
||||
/* Global settings */
|
||||
|
|
@ -1278,4 +1308,3 @@ muted:
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@ hdspmixer_SOURCES = \
|
|||
HDSPMixerEmpty.h \
|
||||
HDSPMixerOutput.cxx \
|
||||
HDSPMixerOutput.h \
|
||||
HDSPMixerLoopback.cxx \
|
||||
HDSPMixerLoopback.h \
|
||||
HDSPMixerIOMixer.cxx \
|
||||
HDSPMixerIOMixer.h \
|
||||
HDSPMixerSelector.cxx \
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
#define STRIP_WIDTH 36
|
||||
#define FULLSTRIP_HEIGHT 253
|
||||
#define SMALLSTRIP_HEIGHT 208
|
||||
#define SMALLSTRIP_HEIGHT 224
|
||||
#define MENU_HEIGHT 20
|
||||
|
||||
#define MIN_WIDTH 2*STRIP_WIDTH
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@
|
|||
#include "../pixmaps/over.xpm"
|
||||
#include "../pixmaps/peak.xpm"
|
||||
#include "../pixmaps/solo.xpm"
|
||||
#include "../pixmaps/loopback.xpm"
|
||||
#include "../pixmaps/iomixer_r.xpm"
|
||||
#include "../pixmaps/output_r.xpm"
|
||||
#include "../pixmaps/matrix_black.xpm"
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ extern char const * output_xpm[];
|
|||
extern char const * over_xpm[];
|
||||
extern char const * peak_xpm[];
|
||||
extern char const * solo_xpm[];
|
||||
extern char const * loopback_xpm[];
|
||||
extern char const * iomixer_r_xpm[];
|
||||
extern char const * output_r_xpm[];
|
||||
extern char const * matrix_white_xpm[];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue