Merge branch 'fix/misc' into for-linus
This commit is contained in:
commit
378e869fd0
@ -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
|
||||||
@ -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);
|
||||||
@ -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
|
||||||
@ -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
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
|
||||||
@ -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;
|
||||||
|
|
||||||
@ -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,
|
||||||
|
@ -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];
|
||||||
@ -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;
|
||||||
@ -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,
|
||||||
@ -1936,10 +1937,18 @@ 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;
|
||||||
if (err < 0)
|
|
||||||
return err;
|
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)
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* select spdif data slot 10/11 */
|
/* select spdif data slot 10/11 */
|
||||||
|
Loading…
Reference in New Issue
Block a user