Loading sound/drivers/opl3/opl3_midi.c +20 −8 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4]; extern int use_internal_drums; extern int use_internal_drums; static void snd_opl3_note_off_unsafe(void *p, int note, int vel, struct snd_midi_channel *chan); /* /* * The next table looks magical, but it certainly is not. Its values have * The next table looks magical, but it certainly is not. Its values have * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception Loading Loading @@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data) int again = 0; int again = 0; int i; int i; spin_lock_irqsave(&opl3->sys_timer_lock, flags); spin_lock_irqsave(&opl3->voice_lock, flags); for (i = 0; i < opl3->max_voices; i++) { for (i = 0; i < opl3->max_voices; i++) { struct snd_opl3_voice *vp = &opl3->voices[i]; struct snd_opl3_voice *vp = &opl3->voices[i]; if (vp->state > 0 && vp->note_off_check) { if (vp->state > 0 && vp->note_off_check) { if (vp->note_off == jiffies) if (vp->note_off == jiffies) snd_opl3_note_off(opl3, vp->note, 0, vp->chan); snd_opl3_note_off_unsafe(opl3, vp->note, 0, vp->chan); else else again++; again++; } } } } spin_unlock_irqrestore(&opl3->voice_lock, flags); spin_lock_irqsave(&opl3->sys_timer_lock, flags); if (again) { if (again) { opl3->tlist.expires = jiffies + 1; /* invoke again */ opl3->tlist.expires = jiffies + 1; /* invoke again */ add_timer(&opl3->tlist); add_timer(&opl3->tlist); Loading Loading @@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice) /* /* * Release a note in response to a midi note off. * Release a note in response to a midi note off. */ */ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) static void snd_opl3_note_off_unsafe(void *p, int note, int vel, struct snd_midi_channel *chan) { { struct snd_opl3 *opl3; struct snd_opl3 *opl3; int voice; int voice; struct snd_opl3_voice *vp; struct snd_opl3_voice *vp; unsigned long flags; opl3 = p; opl3 = p; #ifdef DEBUG_MIDI #ifdef DEBUG_MIDI Loading @@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan chan->number, chan->midi_program, note); chan->number, chan->midi_program, note); #endif #endif spin_lock_irqsave(&opl3->voice_lock, flags); if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { if (chan->drum_channel && use_internal_drums) { if (chan->drum_channel && use_internal_drums) { snd_opl3_drum_switch(opl3, note, vel, 0, chan); snd_opl3_drum_switch(opl3, note, vel, 0, chan); spin_unlock_irqrestore(&opl3->voice_lock, flags); return; return; } } /* this loop will hopefully kill all extra voices, because /* this loop will hopefully kill all extra voices, because Loading @@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan snd_opl3_kill_voice(opl3, voice); snd_opl3_kill_voice(opl3, voice); } } } } } void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) { struct snd_opl3 *opl3 = p; unsigned long flags; spin_lock_irqsave(&opl3->voice_lock, flags); snd_opl3_note_off_unsafe(p, note, vel, chan); spin_unlock_irqrestore(&opl3->voice_lock, flags); spin_unlock_irqrestore(&opl3->voice_lock, flags); } } Loading sound/pci/ice1712/ice1712.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol, } } static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = "Multi Track Peak", .name = "Multi Track Peak", .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .info = snd_ice1712_pro_peak_info, .info = snd_ice1712_pro_peak_info, Loading sound/pci/ice1712/ice1724.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(ice->pci), snd_dma_pci_data(ice->pci), 64*1024, 64*1024); 256*1024, 256*1024); ice->pcm = pcm; ice->pcm = pcm; Loading Loading @@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(ice->pci), snd_dma_pci_data(ice->pci), 64*1024, 64*1024); 256*1024, 256*1024); ice->pcm_ds = pcm; ice->pcm_ds = pcm; Loading Loading @@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol, } } static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = "Multi Track Peak", .name = "Multi Track Peak", .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .info = snd_vt1724_pro_peak_info, .info = snd_vt1724_pro_peak_info, Loading sound/pci/via82xx.c +18 −9 Original line number Original line Diff line number Diff line Loading @@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol) { { struct via82xx *chip = snd_kcontrol_chip(kcontrol); struct via82xx *chip = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); unsigned int idx = kcontrol->id.subdevice; ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; Loading @@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol) { { struct via82xx *chip = snd_kcontrol_chip(kcontrol); struct via82xx *chip = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); unsigned int idx = kcontrol->id.subdevice; unsigned long port = chip->port + 0x10 * idx; unsigned long port = chip->port + 0x10 * idx; unsigned char val; unsigned char val; int i, change = 0; int i, change = 0; Loading Loading @@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = }; }; static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { .name = "VIA DXS Playback Volume", .iface = SNDRV_CTL_ELEM_IFACE_PCM, .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .device = 0, /* .subdevice set later */ .name = "PCM Playback Volume", .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ), SNDRV_CTL_ELEM_ACCESS_TLV_READ), .count = 4, .info = snd_via8233_dxs_volume_info, .info = snd_via8233_dxs_volume_info, .get = snd_via8233_dxs_volume_get, .get = snd_via8233_dxs_volume_get, .put = snd_via8233_dxs_volume_put, .put = snd_via8233_dxs_volume_put, Loading Loading @@ -1936,12 +1937,20 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) } } else /* Using DXS when PCM emulation is enabled is really weird */ else /* Using DXS when PCM emulation is enabled is really weird */ { { /* Standalone DXS controls */ for (i = 0; i < 4; ++i) { err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); struct snd_kcontrol *kctl; kctl = snd_ctl_new1( &snd_via8233_dxs_volume_control, chip); if (!kctl) return -ENOMEM; kctl->id.subdevice = i; err = snd_ctl_add(chip->card, kctl); if (err < 0) if (err < 0) return err; return err; } } } } } /* select spdif data slot 10/11 */ /* select spdif data slot 10/11 */ pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val); pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val); val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011; val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011; Loading Loading
sound/drivers/opl3/opl3_midi.c +20 −8 Original line number Original line Diff line number Diff line Loading @@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4]; extern int use_internal_drums; extern int use_internal_drums; static void snd_opl3_note_off_unsafe(void *p, int note, int vel, struct snd_midi_channel *chan); /* /* * The next table looks magical, but it certainly is not. Its values have * The next table looks magical, but it certainly is not. Its values have * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception Loading Loading @@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data) int again = 0; int again = 0; int i; int i; spin_lock_irqsave(&opl3->sys_timer_lock, flags); spin_lock_irqsave(&opl3->voice_lock, flags); for (i = 0; i < opl3->max_voices; i++) { for (i = 0; i < opl3->max_voices; i++) { struct snd_opl3_voice *vp = &opl3->voices[i]; struct snd_opl3_voice *vp = &opl3->voices[i]; if (vp->state > 0 && vp->note_off_check) { if (vp->state > 0 && vp->note_off_check) { if (vp->note_off == jiffies) if (vp->note_off == jiffies) snd_opl3_note_off(opl3, vp->note, 0, vp->chan); snd_opl3_note_off_unsafe(opl3, vp->note, 0, vp->chan); else else again++; again++; } } } } spin_unlock_irqrestore(&opl3->voice_lock, flags); spin_lock_irqsave(&opl3->sys_timer_lock, flags); if (again) { if (again) { opl3->tlist.expires = jiffies + 1; /* invoke again */ opl3->tlist.expires = jiffies + 1; /* invoke again */ add_timer(&opl3->tlist); add_timer(&opl3->tlist); Loading Loading @@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice) /* /* * Release a note in response to a midi note off. * Release a note in response to a midi note off. */ */ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) static void snd_opl3_note_off_unsafe(void *p, int note, int vel, struct snd_midi_channel *chan) { { struct snd_opl3 *opl3; struct snd_opl3 *opl3; int voice; int voice; struct snd_opl3_voice *vp; struct snd_opl3_voice *vp; unsigned long flags; opl3 = p; opl3 = p; #ifdef DEBUG_MIDI #ifdef DEBUG_MIDI Loading @@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan chan->number, chan->midi_program, note); chan->number, chan->midi_program, note); #endif #endif spin_lock_irqsave(&opl3->voice_lock, flags); if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { if (chan->drum_channel && use_internal_drums) { if (chan->drum_channel && use_internal_drums) { snd_opl3_drum_switch(opl3, note, vel, 0, chan); snd_opl3_drum_switch(opl3, note, vel, 0, chan); spin_unlock_irqrestore(&opl3->voice_lock, flags); return; return; } } /* this loop will hopefully kill all extra voices, because /* this loop will hopefully kill all extra voices, because Loading @@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan snd_opl3_kill_voice(opl3, voice); snd_opl3_kill_voice(opl3, voice); } } } } } void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) { struct snd_opl3 *opl3 = p; unsigned long flags; spin_lock_irqsave(&opl3->voice_lock, flags); snd_opl3_note_off_unsafe(p, note, vel, chan); spin_unlock_irqrestore(&opl3->voice_lock, flags); spin_unlock_irqrestore(&opl3->voice_lock, flags); } } Loading
sound/pci/ice1712/ice1712.c +1 −1 Original line number Original line Diff line number Diff line Loading @@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol, } } static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = "Multi Track Peak", .name = "Multi Track Peak", .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .info = snd_ice1712_pro_peak_info, .info = snd_ice1712_pro_peak_info, Loading
sound/pci/ice1712/ice1724.c +3 −3 Original line number Original line Diff line number Diff line Loading @@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(ice->pci), snd_dma_pci_data(ice->pci), 64*1024, 64*1024); 256*1024, 256*1024); ice->pcm = pcm; ice->pcm = pcm; Loading Loading @@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(ice->pci), snd_dma_pci_data(ice->pci), 64*1024, 64*1024); 256*1024, 256*1024); ice->pcm_ds = pcm; ice->pcm_ds = pcm; Loading Loading @@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol, } } static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .iface = SNDRV_CTL_ELEM_IFACE_PCM, .name = "Multi Track Peak", .name = "Multi Track Peak", .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, .info = snd_vt1724_pro_peak_info, .info = snd_vt1724_pro_peak_info, Loading
sound/pci/via82xx.c +18 −9 Original line number Original line Diff line number Diff line Loading @@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol) { { struct via82xx *chip = snd_kcontrol_chip(kcontrol); struct via82xx *chip = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); unsigned int idx = kcontrol->id.subdevice; ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; Loading @@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) struct snd_ctl_elem_value *ucontrol) { { struct via82xx *chip = snd_kcontrol_chip(kcontrol); struct via82xx *chip = snd_kcontrol_chip(kcontrol); unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); unsigned int idx = kcontrol->id.subdevice; unsigned long port = chip->port + 0x10 * idx; unsigned long port = chip->port + 0x10 * idx; unsigned char val; unsigned char val; int i, change = 0; int i, change = 0; Loading Loading @@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = }; }; static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { .name = "VIA DXS Playback Volume", .iface = SNDRV_CTL_ELEM_IFACE_PCM, .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .device = 0, /* .subdevice set later */ .name = "PCM Playback Volume", .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ), SNDRV_CTL_ELEM_ACCESS_TLV_READ), .count = 4, .info = snd_via8233_dxs_volume_info, .info = snd_via8233_dxs_volume_info, .get = snd_via8233_dxs_volume_get, .get = snd_via8233_dxs_volume_get, .put = snd_via8233_dxs_volume_put, .put = snd_via8233_dxs_volume_put, Loading Loading @@ -1936,12 +1937,20 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) } } else /* Using DXS when PCM emulation is enabled is really weird */ else /* Using DXS when PCM emulation is enabled is really weird */ { { /* Standalone DXS controls */ for (i = 0; i < 4; ++i) { err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); struct snd_kcontrol *kctl; kctl = snd_ctl_new1( &snd_via8233_dxs_volume_control, chip); if (!kctl) return -ENOMEM; kctl->id.subdevice = i; err = snd_ctl_add(chip->card, kctl); if (err < 0) if (err < 0) return err; return err; } } } } } /* select spdif data slot 10/11 */ /* select spdif data slot 10/11 */ pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val); pci_read_config_byte(chip->pci, VIA8233_SPDIF_CTRL, &val); val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011; val = (val & ~VIA8233_SPDIF_SLOT_MASK) | VIA8233_SPDIF_SLOT_1011; Loading