diff options
| -rw-r--r-- | sound/drivers/opl3/opl3_midi.c | 28 | ||||
| -rw-r--r-- | sound/pci/ice1712/ice1712.c | 2 | ||||
| -rw-r--r-- | sound/pci/ice1712/ice1724.c | 6 | ||||
| -rw-r--r-- | sound/pci/via82xx.c | 27 |
4 files changed, 42 insertions, 21 deletions
diff --git a/sound/drivers/opl3/opl3_midi.c b/sound/drivers/opl3/opl3_midi.c index 6e7d09ae0e82..7d722a025d0d 100644 --- a/sound/drivers/opl3/opl3_midi.c +++ b/sound/drivers/opl3/opl3_midi.c | |||
| @@ -29,6 +29,8 @@ extern char snd_opl3_regmap[MAX_OPL2_VOICES][4]; | |||
| 29 | 29 | ||
| 30 | extern int use_internal_drums; | 30 | extern int use_internal_drums; |
| 31 | 31 | ||
| 32 | static void snd_opl3_note_off_unsafe(void *p, int note, int vel, | ||
| 33 | struct snd_midi_channel *chan); | ||
| 32 | /* | 34 | /* |
| 33 | * The next table looks magical, but it certainly is not. Its values have | 35 | * The next table looks magical, but it certainly is not. Its values have |
| 34 | * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception | 36 | * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception |
| @@ -242,16 +244,20 @@ void snd_opl3_timer_func(unsigned long data) | |||
| 242 | int again = 0; | 244 | int again = 0; |
| 243 | int i; | 245 | int i; |
| 244 | 246 | ||
| 245 | spin_lock_irqsave(&opl3->sys_timer_lock, flags); | 247 | spin_lock_irqsave(&opl3->voice_lock, flags); |
| 246 | for (i = 0; i < opl3->max_voices; i++) { | 248 | for (i = 0; i < opl3->max_voices; i++) { |
| 247 | struct snd_opl3_voice *vp = &opl3->voices[i]; | 249 | struct snd_opl3_voice *vp = &opl3->voices[i]; |
| 248 | if (vp->state > 0 && vp->note_off_check) { | 250 | if (vp->state > 0 && vp->note_off_check) { |
| 249 | if (vp->note_off == jiffies) | 251 | if (vp->note_off == jiffies) |
| 250 | snd_opl3_note_off(opl3, vp->note, 0, vp->chan); | 252 | snd_opl3_note_off_unsafe(opl3, vp->note, 0, |
| 253 | vp->chan); | ||
| 251 | else | 254 | else |
| 252 | again++; | 255 | again++; |
| 253 | } | 256 | } |
| 254 | } | 257 | } |
| 258 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | ||
| 259 | |||
| 260 | spin_lock_irqsave(&opl3->sys_timer_lock, flags); | ||
| 255 | if (again) { | 261 | if (again) { |
| 256 | opl3->tlist.expires = jiffies + 1; /* invoke again */ | 262 | opl3->tlist.expires = jiffies + 1; /* invoke again */ |
| 257 | add_timer(&opl3->tlist); | 263 | add_timer(&opl3->tlist); |
| @@ -658,15 +664,14 @@ static void snd_opl3_kill_voice(struct snd_opl3 *opl3, int voice) | |||
| 658 | /* | 664 | /* |
| 659 | * Release a note in response to a midi note off. | 665 | * Release a note in response to a midi note off. |
| 660 | */ | 666 | */ |
| 661 | void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan) | 667 | static void snd_opl3_note_off_unsafe(void *p, int note, int vel, |
| 668 | struct snd_midi_channel *chan) | ||
| 662 | { | 669 | { |
| 663 | struct snd_opl3 *opl3; | 670 | struct snd_opl3 *opl3; |
| 664 | 671 | ||
| 665 | int voice; | 672 | int voice; |
| 666 | struct snd_opl3_voice *vp; | 673 | struct snd_opl3_voice *vp; |
| 667 | 674 | ||
| 668 | unsigned long flags; | ||
| 669 | |||
| 670 | opl3 = p; | 675 | opl3 = p; |
| 671 | 676 | ||
| 672 | #ifdef DEBUG_MIDI | 677 | #ifdef DEBUG_MIDI |
| @@ -674,12 +679,9 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan | |||
| 674 | chan->number, chan->midi_program, note); | 679 | chan->number, chan->midi_program, note); |
| 675 | #endif | 680 | #endif |
| 676 | 681 | ||
| 677 | spin_lock_irqsave(&opl3->voice_lock, flags); | ||
| 678 | |||
| 679 | if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { | 682 | if (opl3->synth_mode == SNDRV_OPL3_MODE_SEQ) { |
| 680 | if (chan->drum_channel && use_internal_drums) { | 683 | if (chan->drum_channel && use_internal_drums) { |
| 681 | snd_opl3_drum_switch(opl3, note, vel, 0, chan); | 684 | snd_opl3_drum_switch(opl3, note, vel, 0, chan); |
| 682 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | ||
| 683 | return; | 685 | return; |
| 684 | } | 686 | } |
| 685 | /* this loop will hopefully kill all extra voices, because | 687 | /* this loop will hopefully kill all extra voices, because |
| @@ -697,6 +699,16 @@ void snd_opl3_note_off(void *p, int note, int vel, struct snd_midi_channel *chan | |||
| 697 | snd_opl3_kill_voice(opl3, voice); | 699 | snd_opl3_kill_voice(opl3, voice); |
| 698 | } | 700 | } |
| 699 | } | 701 | } |
| 702 | } | ||
| 703 | |||
| 704 | void snd_opl3_note_off(void *p, int note, int vel, | ||
| 705 | struct snd_midi_channel *chan) | ||
| 706 | { | ||
| 707 | struct snd_opl3 *opl3 = p; | ||
| 708 | unsigned long flags; | ||
| 709 | |||
| 710 | spin_lock_irqsave(&opl3->voice_lock, flags); | ||
| 711 | snd_opl3_note_off_unsafe(p, note, vel, chan); | ||
| 700 | spin_unlock_irqrestore(&opl3->voice_lock, flags); | 712 | spin_unlock_irqrestore(&opl3->voice_lock, flags); |
| 701 | } | 713 | } |
| 702 | 714 | ||
diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c index cecf1ffeeaaa..d74033a2cfbe 100644 --- a/sound/pci/ice1712/ice1712.c +++ b/sound/pci/ice1712/ice1712.c | |||
| @@ -2259,7 +2259,7 @@ static int snd_ice1712_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
| 2259 | } | 2259 | } |
| 2260 | 2260 | ||
| 2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { | 2261 | static struct snd_kcontrol_new snd_ice1712_mixer_pro_peak __devinitdata = { |
| 2262 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2262 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 2263 | .name = "Multi Track Peak", | 2263 | .name = "Multi Track Peak", |
| 2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2264 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
| 2265 | .info = snd_ice1712_pro_peak_info, | 2265 | .info = snd_ice1712_pro_peak_info, |
diff --git a/sound/pci/ice1712/ice1724.c b/sound/pci/ice1712/ice1724.c index af6e00148621..76b717dae4b6 100644 --- a/sound/pci/ice1712/ice1724.c +++ b/sound/pci/ice1712/ice1724.c | |||
| @@ -1294,7 +1294,7 @@ static int __devinit snd_vt1724_pcm_spdif(struct snd_ice1712 *ice, int device) | |||
| 1294 | 1294 | ||
| 1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1295 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
| 1296 | snd_dma_pci_data(ice->pci), | 1296 | snd_dma_pci_data(ice->pci), |
| 1297 | 64*1024, 64*1024); | 1297 | 256*1024, 256*1024); |
| 1298 | 1298 | ||
| 1299 | ice->pcm = pcm; | 1299 | ice->pcm = pcm; |
| 1300 | 1300 | ||
| @@ -1408,7 +1408,7 @@ static int __devinit snd_vt1724_pcm_indep(struct snd_ice1712 *ice, int device) | |||
| 1408 | 1408 | ||
| 1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, | 1409 | snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV, |
| 1410 | snd_dma_pci_data(ice->pci), | 1410 | snd_dma_pci_data(ice->pci), |
| 1411 | 64*1024, 64*1024); | 1411 | 256*1024, 256*1024); |
| 1412 | 1412 | ||
| 1413 | ice->pcm_ds = pcm; | 1413 | ice->pcm_ds = pcm; |
| 1414 | 1414 | ||
| @@ -2110,7 +2110,7 @@ static int snd_vt1724_pro_peak_get(struct snd_kcontrol *kcontrol, | |||
| 2110 | } | 2110 | } |
| 2111 | 2111 | ||
| 2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { | 2112 | static struct snd_kcontrol_new snd_vt1724_mixer_pro_peak __devinitdata = { |
| 2113 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 2113 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 2114 | .name = "Multi Track Peak", | 2114 | .name = "Multi Track Peak", |
| 2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, | 2115 | .access = SNDRV_CTL_ELEM_ACCESS_READ | SNDRV_CTL_ELEM_ACCESS_VOLATILE, |
| 2116 | .info = snd_vt1724_pro_peak_info, | 2116 | .info = snd_vt1724_pro_peak_info, |
diff --git a/sound/pci/via82xx.c b/sound/pci/via82xx.c index acfa4760da49..91683a349035 100644 --- a/sound/pci/via82xx.c +++ b/sound/pci/via82xx.c | |||
| @@ -1626,7 +1626,7 @@ static int snd_via8233_dxs_volume_get(struct snd_kcontrol *kcontrol, | |||
| 1626 | struct snd_ctl_elem_value *ucontrol) | 1626 | struct snd_ctl_elem_value *ucontrol) |
| 1627 | { | 1627 | { |
| 1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1628 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
| 1629 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1629 | unsigned int idx = kcontrol->id.subdevice; |
| 1630 | 1630 | ||
| 1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; | 1631 | ucontrol->value.integer.value[0] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][0]; |
| 1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; | 1632 | ucontrol->value.integer.value[1] = VIA_DXS_MAX_VOLUME - chip->playback_volume[idx][1]; |
| @@ -1646,7 +1646,7 @@ static int snd_via8233_dxs_volume_put(struct snd_kcontrol *kcontrol, | |||
| 1646 | struct snd_ctl_elem_value *ucontrol) | 1646 | struct snd_ctl_elem_value *ucontrol) |
| 1647 | { | 1647 | { |
| 1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); | 1648 | struct via82xx *chip = snd_kcontrol_chip(kcontrol); |
| 1649 | unsigned int idx = snd_ctl_get_ioff(kcontrol, &ucontrol->id); | 1649 | unsigned int idx = kcontrol->id.subdevice; |
| 1650 | unsigned long port = chip->port + 0x10 * idx; | 1650 | unsigned long port = chip->port + 0x10 * idx; |
| 1651 | unsigned char val; | 1651 | unsigned char val; |
| 1652 | int i, change = 0; | 1652 | int i, change = 0; |
| @@ -1705,11 +1705,12 @@ static struct snd_kcontrol_new snd_via8233_pcmdxs_volume_control __devinitdata = | |||
| 1705 | }; | 1705 | }; |
| 1706 | 1706 | ||
| 1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { | 1707 | static struct snd_kcontrol_new snd_via8233_dxs_volume_control __devinitdata = { |
| 1708 | .name = "VIA DXS Playback Volume", | 1708 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
| 1709 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | 1709 | .device = 0, |
| 1710 | /* .subdevice set later */ | ||
| 1711 | .name = "PCM Playback Volume", | ||
| 1710 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | | 1712 | .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | |
| 1711 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), | 1713 | SNDRV_CTL_ELEM_ACCESS_TLV_READ), |
| 1712 | .count = 4, | ||
| 1713 | .info = snd_via8233_dxs_volume_info, | 1714 | .info = snd_via8233_dxs_volume_info, |
| 1714 | .get = snd_via8233_dxs_volume_get, | 1715 | .get = snd_via8233_dxs_volume_get, |
| 1715 | .put = snd_via8233_dxs_volume_put, | 1716 | .put = snd_via8233_dxs_volume_put, |
| @@ -1936,10 +1937,18 @@ static int __devinit snd_via8233_init_misc(struct via82xx *chip) | |||
| 1936 | } | 1937 | } |
| 1937 | else /* Using DXS when PCM emulation is enabled is really weird */ | 1938 | else /* Using DXS when PCM emulation is enabled is really weird */ |
| 1938 | { | 1939 | { |
| 1939 | /* Standalone DXS controls */ | 1940 | for (i = 0; i < 4; ++i) { |
| 1940 | err = snd_ctl_add(chip->card, snd_ctl_new1(&snd_via8233_dxs_volume_control, chip)); | 1941 | struct snd_kcontrol *kctl; |
| 1941 | if (err < 0) | 1942 | |
| 1942 | return err; | 1943 | kctl = snd_ctl_new1( |
| 1944 | &snd_via8233_dxs_volume_control, chip); | ||
| 1945 | if (!kctl) | ||
| 1946 | return -ENOMEM; | ||
| 1947 | kctl->id.subdevice = i; | ||
| 1948 | err = snd_ctl_add(chip->card, kctl); | ||
| 1949 | if (err < 0) | ||
| 1950 | return err; | ||
| 1951 | } | ||
| 1943 | } | 1952 | } |
| 1944 | } | 1953 | } |
| 1945 | /* select spdif data slot 10/11 */ | 1954 | /* select spdif data slot 10/11 */ |
