Skip to content

Commit

Permalink
[ALSA] oxygen: use an array of snd_kcontrol pointers
Browse files Browse the repository at this point in the history
Use an array for the pointers to known controls so that it is easier to
add more.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
  • Loading branch information
Clemens Ladisch authored and Jaroslav Kysela committed Jan 31, 2008
1 parent 7113e95 commit 01a3aff
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 20 deletions.
9 changes: 7 additions & 2 deletions sound/pci/oxygen/oxygen.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@
#define PCM_AC97 5
#define PCM_COUNT 6

enum {
CONTROL_SPDIF_PCM,
CONTROL_SPDIF_INPUT_BITS,
CONTROL_COUNT
};

#define OXYGEN_PCI_SUBID(sv, sd) \
.vendor = PCI_VENDOR_ID_CMEDIA, \
.device = 0x8788, \
Expand Down Expand Up @@ -50,8 +56,7 @@ struct oxygen {
u32 spdif_bits;
u32 spdif_pcm_bits;
struct snd_pcm_substream *streams[PCM_COUNT];
struct snd_kcontrol *spdif_pcm_ctl;
struct snd_kcontrol *spdif_input_bits_ctl;
struct snd_kcontrol *controls[CONTROL_COUNT];
struct work_struct spdif_input_bits_work;
};

Expand Down
4 changes: 2 additions & 2 deletions sound/pci/oxygen/oxygen_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,15 +114,15 @@ static void oxygen_spdif_input_bits_changed(struct work_struct *work)
}
}

if (chip->spdif_input_bits_ctl) {
if (chip->controls[CONTROL_SPDIF_INPUT_BITS]) {
spin_lock_irq(&chip->reg_lock);
chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_CHANGE;
oxygen_write16(chip, OXYGEN_INTERRUPT_MASK,
chip->interrupt_mask);
spin_unlock_irq(&chip->reg_lock);

snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&chip->spdif_input_bits_ctl->id);
&chip->controls[CONTROL_SPDIF_INPUT_BITS]->id);
}
}

Expand Down
27 changes: 15 additions & 12 deletions sound/pci/oxygen/oxygen_mixer.c
Original file line number Diff line number Diff line change
Expand Up @@ -586,15 +586,22 @@ static const struct snd_kcontrol_new controls[] = {
static void oxygen_any_ctl_free(struct snd_kcontrol *ctl)
{
struct oxygen *chip = ctl->private_data;
unsigned int i;

/* I'm too lazy to write a function for each control :-) */
chip->spdif_pcm_ctl = NULL;
chip->spdif_input_bits_ctl = NULL;
for (i = 0; i < ARRAY_SIZE(chip->controls); ++i)
chip->controls[i] = NULL;
}

int oxygen_mixer_init(struct oxygen *chip)
{
unsigned int i;
static const char *const known_ctl_names[CONTROL_COUNT] = {
[CONTROL_SPDIF_PCM] =
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM),
[CONTROL_SPDIF_INPUT_BITS] =
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT),
};
unsigned int i, j;
struct snd_kcontrol *ctl;
int err;

Expand All @@ -610,15 +617,11 @@ int oxygen_mixer_init(struct oxygen *chip)
err = snd_ctl_add(chip->card, ctl);
if (err < 0)
return err;
if (!strcmp(ctl->id.name,
SNDRV_CTL_NAME_IEC958("", PLAYBACK, PCM_STREAM))) {
chip->spdif_pcm_ctl = ctl;
ctl->private_free = oxygen_any_ctl_free;
} else if (!strcmp(ctl->id.name,
SNDRV_CTL_NAME_IEC958("", CAPTURE, DEFAULT))) {
chip->spdif_input_bits_ctl = ctl;
ctl->private_free = oxygen_any_ctl_free;
}
for (j = 0; j < CONTROL_COUNT; ++j)
if (!strcmp(ctl->id.name, known_ctl_names[j])) {
chip->controls[j] = ctl;
ctl->private_free = oxygen_any_ctl_free;
}
}
return chip->model->mixer_init ? chip->model->mixer_init(chip) : 0;
}
8 changes: 4 additions & 4 deletions sound/pci/oxygen/oxygen_pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -209,11 +209,11 @@ static int oxygen_open(struct snd_pcm_substream *substream,
chip->pcm_active |= 1 << channel;
if (channel == PCM_SPDIF) {
chip->spdif_pcm_bits = chip->spdif_bits;
chip->spdif_pcm_ctl->vd[0].access &=
chip->controls[CONTROL_SPDIF_PCM]->vd[0].access &=
~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
SNDRV_CTL_EVENT_MASK_INFO,
&chip->spdif_pcm_ctl->id);
&chip->controls[CONTROL_SPDIF_PCM]->id);
}
mutex_unlock(&chip->mutex);

Expand Down Expand Up @@ -258,11 +258,11 @@ static int oxygen_close(struct snd_pcm_substream *substream)
mutex_lock(&chip->mutex);
chip->pcm_active &= ~(1 << channel);
if (channel == PCM_SPDIF) {
chip->spdif_pcm_ctl->vd[0].access |=
chip->controls[CONTROL_SPDIF_PCM]->vd[0].access |=
SNDRV_CTL_ELEM_ACCESS_INACTIVE;
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE |
SNDRV_CTL_EVENT_MASK_INFO,
&chip->spdif_pcm_ctl->id);
&chip->controls[CONTROL_SPDIF_PCM]->id);
}
if (channel == PCM_SPDIF || channel == PCM_MULTICH)
oxygen_update_spdif_source(chip);
Expand Down

0 comments on commit 01a3aff

Please sign in to comment.