mirror of
https://github.com/alsa-project/alsa-tools.git
synced 2025-10-29 05:40:25 -04:00
hdspmixer: Fix metering for non-MADI cards
Currently, hdsp and hdspm use different ioctls. Consequently, the metering is wrong. To avoid code duplication, use pointers to the corresponding struct members. Signed-off-by: Adrian Knoth <adi@drcomp.erfurt.thur.de> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
97e96addff
commit
646eacb626
1 changed files with 44 additions and 19 deletions
|
|
@ -31,6 +31,9 @@ static void readregisters_cb(void *arg)
|
|||
snd_hwdep_t *hw;
|
||||
hdsp_peak_rms_t hdsp_peak_rms;
|
||||
struct hdspm_peak_rms hdspm_peak_rms;
|
||||
bool isMADI = false;
|
||||
uint32_t *input_peaks, *playback_peaks, *output_peaks;
|
||||
uint64_t *input_rms, *playback_rms, *output_rms;
|
||||
|
||||
HDSPMixerWindow *w = (HDSPMixerWindow *)arg;
|
||||
|
||||
|
|
@ -48,6 +51,7 @@ static void readregisters_cb(void *arg)
|
|||
(HDSPeAIO == w->cards[w->current_card]->type) ||
|
||||
(HDSP_AES == w->cards[w->current_card]->type) ||
|
||||
(HDSPeRayDAT == w->cards[w->current_card]->type)) {
|
||||
isMADI = true;
|
||||
if ((err = snd_hwdep_ioctl(hw, SNDRV_HDSPM_IOCTL_GET_PEAK_RMS, (void *)&hdspm_peak_rms)) < 0) {
|
||||
fprintf(stderr, "HwDep ioctl failed. Metering stopped\n");
|
||||
snd_hwdep_close(hw);
|
||||
|
|
@ -62,33 +66,54 @@ static void readregisters_cb(void *arg)
|
|||
}
|
||||
snd_hwdep_close(hw);
|
||||
|
||||
// check for speed change
|
||||
if (hdspm_peak_rms.speed != w->cards[w->current_card]->speed_mode) {
|
||||
w->cards[w->current_card]->setMode(hdspm_peak_rms.speed);
|
||||
if (isMADI) {
|
||||
// check for speed change
|
||||
if (hdspm_peak_rms.speed != w->cards[w->current_card]->speed_mode) {
|
||||
w->cards[w->current_card]->setMode(hdspm_peak_rms.speed);
|
||||
}
|
||||
input_peaks = hdspm_peak_rms.input_peaks;
|
||||
playback_peaks = hdspm_peak_rms.playback_peaks;
|
||||
output_peaks = hdspm_peak_rms.output_peaks;
|
||||
|
||||
input_rms = hdspm_peak_rms.input_rms;
|
||||
playback_rms = hdspm_peak_rms.playback_rms;
|
||||
output_rms = hdspm_peak_rms.output_rms;
|
||||
} else {
|
||||
/* speed changes on non-MADI are already handled via alsactl_cb and
|
||||
* getSpeed(), but the metering structs differ.
|
||||
*/
|
||||
input_peaks = hdsp_peak_rms.input_peaks;
|
||||
playback_peaks = hdsp_peak_rms.playback_peaks;
|
||||
output_peaks = hdsp_peak_rms.output_peaks;
|
||||
|
||||
input_rms = hdsp_peak_rms.input_rms;
|
||||
playback_rms = hdsp_peak_rms.playback_rms;
|
||||
output_rms = hdsp_peak_rms.output_rms;
|
||||
}
|
||||
|
||||
/* update the meter */
|
||||
if (w->inputs->buttons->input) {
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_input; ++i) {
|
||||
w->inputs->strips[i]->meter->update(hdspm_peak_rms.input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xffffff00,
|
||||
hdspm_peak_rms.input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xf,
|
||||
hdspm_peak_rms.input_rms[(w->cards[w->current_card]->meter_map_input[i])]);
|
||||
}
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_input; ++i) {
|
||||
w->inputs->strips[i]->meter->update(input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xffffff00,
|
||||
input_peaks[(w->cards[w->current_card]->meter_map_input[i])] & 0xf,
|
||||
input_rms[(w->cards[w->current_card]->meter_map_input[i])]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (w->inputs->buttons->playback) {
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++i) {
|
||||
w->playbacks->strips[i]->meter->update(hdspm_peak_rms.playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00,
|
||||
hdspm_peak_rms.playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf,
|
||||
hdspm_peak_rms.playback_rms[(w->cards[w->current_card]->meter_map_playback[i])]);
|
||||
}
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++i) {
|
||||
w->playbacks->strips[i]->meter->update(playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00,
|
||||
playback_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf,
|
||||
playback_rms[(w->cards[w->current_card]->meter_map_playback[i])]);
|
||||
}
|
||||
}
|
||||
|
||||
if (w->inputs->buttons->output) {
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++i) {
|
||||
w->outputs->strips[i]->meter->update(hdspm_peak_rms.output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xffffff00,
|
||||
hdspm_peak_rms.output_peaks[(w->cards[w->current_card]->meter_map_playback[i])] & 0xf,
|
||||
hdspm_peak_rms.output_rms[(w->cards[w->current_card]->meter_map_playback[i])]);
|
||||
}
|
||||
for (int i = 0; i < w->cards[w->current_card]->channels_playback; ++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])]);
|
||||
}
|
||||
}
|
||||
|
||||
Fl::add_timeout(0.03, readregisters_cb, w);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue