mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-11 08:18:47 +00:00
Merge branch 'topic/oss' into for-linus
* topic/oss: ALSA: allocation may fail in snd_pcm_oss_change_params() sound: vwsnd: Fix setting of cfgval and ctlval in li_setup_dma() sound: fix OSS MIDI output data loss
This commit is contained in:
commit
fa28519002
@ -1043,10 +1043,15 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)
|
|||||||
runtime->oss.channels = params_channels(params);
|
runtime->oss.channels = params_channels(params);
|
||||||
runtime->oss.rate = params_rate(params);
|
runtime->oss.rate = params_rate(params);
|
||||||
|
|
||||||
runtime->oss.params = 0;
|
|
||||||
runtime->oss.prepare = 1;
|
|
||||||
vfree(runtime->oss.buffer);
|
vfree(runtime->oss.buffer);
|
||||||
runtime->oss.buffer = vmalloc(runtime->oss.period_bytes);
|
runtime->oss.buffer = vmalloc(runtime->oss.period_bytes);
|
||||||
|
if (!runtime->oss.buffer) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
runtime->oss.params = 0;
|
||||||
|
runtime->oss.prepare = 1;
|
||||||
runtime->oss.buffer_used = 0;
|
runtime->oss.buffer_used = 0;
|
||||||
if (runtime->dma_area)
|
if (runtime->dma_area)
|
||||||
snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes));
|
snd_pcm_format_set_silence(runtime->format, runtime->dma_area, bytes_to_samples(runtime, runtime->dma_bytes));
|
||||||
|
@ -127,15 +127,16 @@ static void midi_poll(unsigned long dummy)
|
|||||||
for (dev = 0; dev < num_midis; dev++)
|
for (dev = 0; dev < num_midis; dev++)
|
||||||
if (midi_devs[dev] != NULL && midi_out_buf[dev] != NULL)
|
if (midi_devs[dev] != NULL && midi_out_buf[dev] != NULL)
|
||||||
{
|
{
|
||||||
int ok = 1;
|
while (DATA_AVAIL(midi_out_buf[dev]))
|
||||||
|
|
||||||
while (DATA_AVAIL(midi_out_buf[dev]) && ok)
|
|
||||||
{
|
{
|
||||||
|
int ok;
|
||||||
int c = midi_out_buf[dev]->queue[midi_out_buf[dev]->head];
|
int c = midi_out_buf[dev]->queue[midi_out_buf[dev]->head];
|
||||||
|
|
||||||
spin_unlock_irqrestore(&lock,flags);/* Give some time to others */
|
spin_unlock_irqrestore(&lock,flags);/* Give some time to others */
|
||||||
ok = midi_devs[dev]->outputc(dev, c);
|
ok = midi_devs[dev]->outputc(dev, c);
|
||||||
spin_lock_irqsave(&lock, flags);
|
spin_lock_irqsave(&lock, flags);
|
||||||
|
if (!ok)
|
||||||
|
break;
|
||||||
midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE;
|
midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE;
|
||||||
midi_out_buf[dev]->len--;
|
midi_out_buf[dev]->len--;
|
||||||
}
|
}
|
||||||
|
@ -628,7 +628,7 @@ static void li_setup_dma(dma_chan_t *chan,
|
|||||||
ASSERT(!(buffer_paddr & 0xFF));
|
ASSERT(!(buffer_paddr & 0xFF));
|
||||||
chan->baseval = (buffer_paddr >> 8) | 1 << (37 - 8);
|
chan->baseval = (buffer_paddr >> 8) | 1 << (37 - 8);
|
||||||
|
|
||||||
chan->cfgval = (!LI_CCFG_LOCK |
|
chan->cfgval = ((chan->cfgval & ~LI_CCFG_LOCK) |
|
||||||
SHIFT_FIELD(desc->ad1843_slot, LI_CCFG_SLOT) |
|
SHIFT_FIELD(desc->ad1843_slot, LI_CCFG_SLOT) |
|
||||||
desc->direction |
|
desc->direction |
|
||||||
mode |
|
mode |
|
||||||
@ -638,9 +638,9 @@ static void li_setup_dma(dma_chan_t *chan,
|
|||||||
tmask = 13 - fragshift; /* See Lithium DMA Notes above. */
|
tmask = 13 - fragshift; /* See Lithium DMA Notes above. */
|
||||||
ASSERT(size >= 2 && size <= 7);
|
ASSERT(size >= 2 && size <= 7);
|
||||||
ASSERT(tmask >= 1 && tmask <= 7);
|
ASSERT(tmask >= 1 && tmask <= 7);
|
||||||
chan->ctlval = (!LI_CCTL_RESET |
|
chan->ctlval = ((chan->ctlval & ~LI_CCTL_RESET) |
|
||||||
SHIFT_FIELD(size, LI_CCTL_SIZE) |
|
SHIFT_FIELD(size, LI_CCTL_SIZE) |
|
||||||
!LI_CCTL_DMA_ENABLE |
|
(chan->ctlval & ~LI_CCTL_DMA_ENABLE) |
|
||||||
SHIFT_FIELD(tmask, LI_CCTL_TMASK) |
|
SHIFT_FIELD(tmask, LI_CCTL_TMASK) |
|
||||||
SHIFT_FIELD(0, LI_CCTL_TPTR));
|
SHIFT_FIELD(0, LI_CCTL_TPTR));
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user