From 455a06756f8e8b785115531121b525f1e492ddad Mon Sep 17 00:00:00 2001 From: Adrian Knoth Date: Mon, 7 Mar 2011 19:03:05 +0100 Subject: [PATCH] hdspmixer: Introduce output channel count for all cards. Some cards (like multiface) have more physical output ports than playback ports, mostly because of additional headphones out. For those cards, the old abstraction model of channels_input and channels_output doesn't fit, so let's introduce channels_output. Of course, channels_output is always 2*max_dest at the given speed_mode (SS/DS/QS), so one could extend this idea, store all destination settings in channels_output[3] (one for each speed mode) and rip off the massive code duplication for setting maxdest or max_dest respectively. Note that dest_map_whatever_speed_mode's array size indirectly defines the right value for channels_output (read: even more unwanted redundancy) Signed-off-by: Adrian Knoth Signed-off-by: Takashi Iwai --- hdspmixer/src/HDSPMixerCard.cxx | 32 ++++++++++++++++++++++++++++--- hdspmixer/src/HDSPMixerCard.h | 1 + hdspmixer/src/HDSPMixerWindow.cxx | 4 ++-- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/hdspmixer/src/HDSPMixerCard.cxx b/hdspmixer/src/HDSPMixerCard.cxx index cd6a922..3ddbf62 100644 --- a/hdspmixer/src/HDSPMixerCard.cxx +++ b/hdspmixer/src/HDSPMixerCard.cxx @@ -212,6 +212,7 @@ void HDSPMixerCard::adjustSettings() { case 0: channels_input = 18; channels_playback = 18; + channels_output = 20; /* SS 8xAnalog+8xADAT+2xSPDIF+2xHeadphone */ channel_map_input = channel_map_playback = channel_map_mf_ss; dest_map = dest_map_mf_ss; meter_map_input = meter_map_playback = channel_map_mf_ss; @@ -219,6 +220,7 @@ void HDSPMixerCard::adjustSettings() { case 1: channels_input = 14; channels_playback = 14; + channels_output = 16; /* DS 8xAnalog+4xADAT(SMUX)+2xSPDIF+2xHeadphone */ channel_map_input = channel_map_playback = meter_map_ds; dest_map = dest_map_ds; meter_map_input = meter_map_playback = meter_map_ds; @@ -231,12 +233,14 @@ void HDSPMixerCard::adjustSettings() { switch (speed_mode) { case 0: channels_input = channels_playback = 26; + channels_output = 28; /* SS 3x8xADAT+2xSPDIF+2xHeadphone */ channel_map_input = channel_map_playback = channel_map_df_ss; dest_map = dest_map_df_ss; meter_map_input = meter_map_playback = channel_map_df_ss; break; case 1: channels_input = channels_playback = 14; + channels_output = 16; /* DS 3x4xADAT(SMUX)+2xSPDIF+2xHeadphone */ channel_map_input = channel_map_playback = meter_map_ds; dest_map = dest_map_ds; meter_map_input = meter_map_playback = meter_map_ds; @@ -249,12 +253,14 @@ void HDSPMixerCard::adjustSettings() { switch (speed_mode) { case 0: channels_input = channels_playback = 26; + channels_output = 26; /* SS like Digiface, but no Headphones */ channel_map_input = channel_map_playback = channel_map_df_ss; dest_map = dest_map_h9652_ss; meter_map_input = meter_map_playback = channel_map_df_ss; break; case 1: channels_input = channels_playback = 14; + channels_output = 14; /* DS like Digiface, but no Headphones */ channel_map_input = channel_map_playback = channel_map_ds; dest_map = dest_map_h9652_ds; meter_map_input = meter_map_playback = meter_map_ds; @@ -267,18 +273,21 @@ void HDSPMixerCard::adjustSettings() { switch (speed_mode) { case 0: channels_input = channels_playback = 12 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0); + channels_output = channels_playback; /* untested, no idea about this card */ channel_map_input = channel_map_playback = channel_map_h9632_ss; dest_map = dest_map_h9632_ss; meter_map_input = meter_map_playback = channel_map_h9632_ss; break; case 1: channels_input = channels_playback = 8 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0); + channels_output = channels_playback; /* untested, no idea about this card */ channel_map_input = channel_map_playback = channel_map_h9632_ds; dest_map = dest_map_h9632_ds; meter_map_input = meter_map_playback = channel_map_h9632_ds; break; case 2: channels_input = channels_playback = 4 + ((h9632_aeb.aebi || h9632_aeb.aebo) ? 4 : 0); + channels_output = channels_playback; /* untested, no idea about this card */ channel_map_input = channel_map_playback = channel_map_h9632_qs; dest_map = dest_map_h9632_qs; meter_map_input = meter_map_playback = channel_map_h9632_qs; @@ -290,18 +299,21 @@ void HDSPMixerCard::adjustSettings() { switch (speed_mode) { case 0: // SS channels_input = channels_playback = 64; + channels_output = channels_input; /* SS headphones missing, at least HDSPe MADI has some, MADIface hasn't */ channel_map_input = channel_map_playback = channel_map_unity_ss; dest_map = dest_map_unity; meter_map_input = meter_map_playback = channel_map_unity_ss; break; case 1: // DS channels_input = channels_playback = 32; + channels_output = channels_input; /* DS headphones missing, at least HDSPe MADI has some, MADIface hasn't */ channel_map_input = channel_map_playback = channel_map_unity_ss; dest_map = dest_map_unity; meter_map_input = meter_map_playback = channel_map_unity_ss; break; case 2: // QS channels_input = channels_playback = 16; + channels_output = channels_input; /* QS headphones missing, at least HDSPe MADI has some, MADIface hasn't */ channel_map_input = channel_map_playback = channel_map_unity_ss; dest_map = dest_map_unity; meter_map_input = meter_map_playback = channel_map_unity_ss; @@ -315,6 +327,7 @@ void HDSPMixerCard::adjustSettings() { case 0: // SS channels_input = 14; channels_playback = 16; + channels_output = 16; /* SS 2xAnalog+2xAES+2xSPDIF+4xADAT+2xHeadphones */ channel_map_input = channel_map_aio_in_ss; channel_map_playback = channel_map_aio_out_ss; dest_map = dest_map_aio_ss; @@ -324,6 +337,7 @@ void HDSPMixerCard::adjustSettings() { case 1: // DS channels_input = 10; channels_playback = 12; + channels_output = 12; /* DS 2xAnalog+2xAES+2xSPDIF+4xADAT(SMUX)+2xHeadphones */ channel_map_input = channel_map_aio_in_ds; channel_map_playback = channel_map_aio_out_ds; dest_map = dest_map_aio_ds; @@ -333,6 +347,7 @@ void HDSPMixerCard::adjustSettings() { case 2: // QS channels_input = 8; channels_playback = 10; + channels_output = 10; /* QS 2xAnalog+2xAES+2xSPDIF+2xADAT(SMUX)+2xHeadphones */ channel_map_input = channel_map_aio_in_qs; channel_map_playback = channel_map_aio_out_qs; dest_map = dest_map_aio_qs; @@ -347,6 +362,7 @@ void HDSPMixerCard::adjustSettings() { /* 16 channels for all modes */ channels_input = 16; channels_playback = 16; + channels_output = 16; channel_map_input = channel_map_aes32; channel_map_playback = channel_map_aes32; dest_map = dest_map_aes32; @@ -360,13 +376,15 @@ void HDSPMixerCard::adjustSettings() { case 0: // SS channels_input = 36; channels_playback = 36; + channels_output = 36; /* SS 4x8xADAT+2xAES/EBU+2xSPDIF */ channel_map_input = channel_map_playback = channel_map_raydat_ss; dest_map = dest_map_raydat_ss; meter_map_input = meter_map_playback = channel_map_raydat_ss; break; case 1: // DS channels_input = 20; - channels_playback = 20; + channels_playback = 20; + channels_output = 20; /* DS 4x4xADAT(SMUX)+2xAES/EBU+2xSPDIF */ channel_map_input = channel_map_playback = channel_map_raydat_ds; dest_map = dest_map_raydat_ds; meter_map_input = meter_map_playback = channel_map_raydat_ds; @@ -374,6 +392,7 @@ void HDSPMixerCard::adjustSettings() { case 2: // QS channels_input = 12; channels_playback = 12; + channels_output = 12; /* QS 4x2xADAT(SMUX)+2xAES/EBU+2xSPDIF */ channel_map_input = channel_map_playback = channel_map_raydat_qs; dest_map = dest_map_raydat_qs; meter_map_input = meter_map_playback = channel_map_raydat_qs; @@ -397,7 +416,9 @@ void HDSPMixerCard::setMode(int mode) } for (int i = 0; i < channels_playback; ++i) { basew->playbacks->strips[i]->targets->setLabels(); - basew->outputs->strips[i]->setLabels(); + } + for (int i = 0; i < channels_output; ++i) { + basew->outputs->strips[i]->setLabels(); } if (h9632_aeb.aebo && !h9632_aeb.aebi) { @@ -435,11 +456,16 @@ void HDSPMixerCard::actualizeStrips() } else { basew->inputs->strips[i]->hide(); } + if (i < channels_playback) { basew->playbacks->strips[i]->show(); - basew->outputs->strips[i]->show(); } else { basew->playbacks->strips[i]->hide(); + } + + if (i < channels_output) { + basew->outputs->strips[i]->show(); + } else { basew->outputs->strips[i]->hide(); } } diff --git a/hdspmixer/src/HDSPMixerCard.h b/hdspmixer/src/HDSPMixerCard.h index cfb2402..b721bd9 100644 --- a/hdspmixer/src/HDSPMixerCard.h +++ b/hdspmixer/src/HDSPMixerCard.h @@ -44,6 +44,7 @@ public: char name[6]; HDSPMixerCard(int cardtype, int id); int channels_input, channels_playback, window_width, window_height, card_id; + int channels_output; int type; char *channel_map_input, *channel_map_playback; char *dest_map; diff --git a/hdspmixer/src/HDSPMixerWindow.cxx b/hdspmixer/src/HDSPMixerWindow.cxx index 8c057e0..8f44c99 100644 --- a/hdspmixer/src/HDSPMixerWindow.cxx +++ b/hdspmixer/src/HDSPMixerWindow.cxx @@ -109,7 +109,7 @@ static void readregisters_cb(void *arg) } if (w->inputs->buttons->output) { - for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++i) { + for (int i = 0; i < w->cards[w->current_card]->channels_output; ++i) { w->outputs->strips[i]->meter->update(output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00, output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf, output_rms[(w->cards[w->current_card]->meter_map_playback[i])]); @@ -738,7 +738,7 @@ HDSPMixerWindow::HDSPMixerWindow(int x, int y, int w, int h, const char *label, inputs->buttons->submix = 1; inputs->buttons->playback = 1; playbacks = new HDSPMixerPlaybacks(0, MENU_HEIGHT+FULLSTRIP_HEIGHT, w, FULLSTRIP_HEIGHT, cards[0]->channels_playback); - outputs = new HDSPMixerOutputs(0, MENU_HEIGHT+FULLSTRIP_HEIGHT*2, w, SMALLSTRIP_HEIGHT, cards[0]->channels_playback); + outputs = new HDSPMixerOutputs(0, MENU_HEIGHT+FULLSTRIP_HEIGHT*2, w, SMALLSTRIP_HEIGHT, cards[0]->channels_output); scroll->end(); end(); setup = new HDSPMixerSetup(400, 260, "Level Meters Setup", this); -- 2.47.1