Loading include/sound/pcm.h +3 −2 Original line number Original line Diff line number Diff line Loading @@ -311,8 +311,9 @@ struct snd_pcm_runtime { struct snd_pcm_mmap_control *control; struct snd_pcm_mmap_control *control; /* -- locking / scheduling -- */ /* -- locking / scheduling -- */ unsigned int nowake: 1; /* no wakeup (data-copy in progress) */ unsigned int twake: 1; /* do transfer (!poll) wakeup */ wait_queue_head_t sleep; wait_queue_head_t sleep; /* poll sleep */ wait_queue_head_t tsleep; /* transfer sleep */ struct fasync_struct *fasync; struct fasync_struct *fasync; /* -- private section -- */ /* -- private section -- */ Loading sound/core/pcm.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -894,6 +894,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, memset((void*)runtime->control, 0, size); memset((void*)runtime->control, 0, size); init_waitqueue_head(&runtime->sleep); init_waitqueue_head(&runtime->sleep); init_waitqueue_head(&runtime->tsleep); runtime->status->state = SNDRV_PCM_STATE_OPEN; runtime->status->state = SNDRV_PCM_STATE_OPEN; Loading sound/core/pcm_lib.c +10 −10 Original line number Original line Diff line number Diff line Loading @@ -285,8 +285,8 @@ int snd_pcm_update_state(struct snd_pcm_substream *substream, return -EPIPE; return -EPIPE; } } } } if (!runtime->nowake && avail >= runtime->control->avail_min) if (avail >= runtime->control->avail_min) wake_up(&runtime->sleep); wake_up(runtime->twake ? &runtime->tsleep : &runtime->sleep); return 0; return 0; } } Loading Loading @@ -1706,7 +1706,7 @@ static int wait_for_avail_min(struct snd_pcm_substream *substream, long tout; long tout; init_waitqueue_entry(&wait, current); init_waitqueue_entry(&wait, current); add_wait_queue(&runtime->sleep, &wait); add_wait_queue(&runtime->tsleep, &wait); for (;;) { for (;;) { if (signal_pending(current)) { if (signal_pending(current)) { err = -ERESTARTSYS; err = -ERESTARTSYS; Loading Loading @@ -1749,7 +1749,7 @@ static int wait_for_avail_min(struct snd_pcm_substream *substream, break; break; } } _endloop: _endloop: remove_wait_queue(&runtime->sleep, &wait); remove_wait_queue(&runtime->tsleep, &wait); *availp = avail; *availp = avail; return err; return err; } } Loading Loading @@ -1808,7 +1808,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, goto _end_unlock; goto _end_unlock; } } runtime->nowake = 1; runtime->twake = 1; while (size > 0) { while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; snd_pcm_uframes_t avail; Loading @@ -1830,7 +1830,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, if (frames > cont) if (frames > cont) frames = cont; frames = cont; if (snd_BUG_ON(!frames)) { if (snd_BUG_ON(!frames)) { runtime->nowake = 0; runtime->twake = 0; snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); return -EINVAL; return -EINVAL; } } Loading Loading @@ -1869,7 +1869,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, } } } } _end_unlock: _end_unlock: runtime->nowake = 0; runtime->twake = 0; if (xfer > 0 && err >= 0) if (xfer > 0 && err >= 0) snd_pcm_update_state(substream, runtime); snd_pcm_update_state(substream, runtime); snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); Loading Loading @@ -2030,7 +2030,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, goto _end_unlock; goto _end_unlock; } } runtime->nowake = 1; runtime->twake = 1; while (size > 0) { while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; snd_pcm_uframes_t avail; Loading Loading @@ -2059,7 +2059,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, if (frames > cont) if (frames > cont) frames = cont; frames = cont; if (snd_BUG_ON(!frames)) { if (snd_BUG_ON(!frames)) { runtime->nowake = 0; runtime->twake = 0; snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); return -EINVAL; return -EINVAL; } } Loading Loading @@ -2092,7 +2092,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, xfer += frames; xfer += frames; } } _end_unlock: _end_unlock: runtime->nowake = 0; runtime->twake = 0; if (xfer > 0 && err >= 0) if (xfer > 0 && err >= 0) snd_pcm_update_state(substream, runtime); snd_pcm_update_state(substream, runtime); snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); Loading sound/core/pcm_native.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -919,6 +919,7 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream, int state) runtime->status->state = state; runtime->status->state = state; } } wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } } static struct action_ops snd_pcm_action_stop = { static struct action_ops snd_pcm_action_stop = { Loading Loading @@ -1004,6 +1005,7 @@ static void snd_pcm_post_pause(struct snd_pcm_substream *substream, int push) SNDRV_TIMER_EVENT_MPAUSE, SNDRV_TIMER_EVENT_MPAUSE, &runtime->trigger_tstamp); &runtime->trigger_tstamp); wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } else { } else { runtime->status->state = SNDRV_PCM_STATE_RUNNING; runtime->status->state = SNDRV_PCM_STATE_RUNNING; if (substream->timer) if (substream->timer) Loading Loading @@ -1061,6 +1063,7 @@ static void snd_pcm_post_suspend(struct snd_pcm_substream *substream, int state) runtime->status->suspended_state = runtime->status->state; runtime->status->suspended_state = runtime->status->state; runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } } static struct action_ops snd_pcm_action_suspend = { static struct action_ops snd_pcm_action_suspend = { Loading Loading
include/sound/pcm.h +3 −2 Original line number Original line Diff line number Diff line Loading @@ -311,8 +311,9 @@ struct snd_pcm_runtime { struct snd_pcm_mmap_control *control; struct snd_pcm_mmap_control *control; /* -- locking / scheduling -- */ /* -- locking / scheduling -- */ unsigned int nowake: 1; /* no wakeup (data-copy in progress) */ unsigned int twake: 1; /* do transfer (!poll) wakeup */ wait_queue_head_t sleep; wait_queue_head_t sleep; /* poll sleep */ wait_queue_head_t tsleep; /* transfer sleep */ struct fasync_struct *fasync; struct fasync_struct *fasync; /* -- private section -- */ /* -- private section -- */ Loading
sound/core/pcm.c +1 −0 Original line number Original line Diff line number Diff line Loading @@ -894,6 +894,7 @@ int snd_pcm_attach_substream(struct snd_pcm *pcm, int stream, memset((void*)runtime->control, 0, size); memset((void*)runtime->control, 0, size); init_waitqueue_head(&runtime->sleep); init_waitqueue_head(&runtime->sleep); init_waitqueue_head(&runtime->tsleep); runtime->status->state = SNDRV_PCM_STATE_OPEN; runtime->status->state = SNDRV_PCM_STATE_OPEN; Loading
sound/core/pcm_lib.c +10 −10 Original line number Original line Diff line number Diff line Loading @@ -285,8 +285,8 @@ int snd_pcm_update_state(struct snd_pcm_substream *substream, return -EPIPE; return -EPIPE; } } } } if (!runtime->nowake && avail >= runtime->control->avail_min) if (avail >= runtime->control->avail_min) wake_up(&runtime->sleep); wake_up(runtime->twake ? &runtime->tsleep : &runtime->sleep); return 0; return 0; } } Loading Loading @@ -1706,7 +1706,7 @@ static int wait_for_avail_min(struct snd_pcm_substream *substream, long tout; long tout; init_waitqueue_entry(&wait, current); init_waitqueue_entry(&wait, current); add_wait_queue(&runtime->sleep, &wait); add_wait_queue(&runtime->tsleep, &wait); for (;;) { for (;;) { if (signal_pending(current)) { if (signal_pending(current)) { err = -ERESTARTSYS; err = -ERESTARTSYS; Loading Loading @@ -1749,7 +1749,7 @@ static int wait_for_avail_min(struct snd_pcm_substream *substream, break; break; } } _endloop: _endloop: remove_wait_queue(&runtime->sleep, &wait); remove_wait_queue(&runtime->tsleep, &wait); *availp = avail; *availp = avail; return err; return err; } } Loading Loading @@ -1808,7 +1808,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, goto _end_unlock; goto _end_unlock; } } runtime->nowake = 1; runtime->twake = 1; while (size > 0) { while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; snd_pcm_uframes_t avail; Loading @@ -1830,7 +1830,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, if (frames > cont) if (frames > cont) frames = cont; frames = cont; if (snd_BUG_ON(!frames)) { if (snd_BUG_ON(!frames)) { runtime->nowake = 0; runtime->twake = 0; snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); return -EINVAL; return -EINVAL; } } Loading Loading @@ -1869,7 +1869,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(struct snd_pcm_substream *substream, } } } } _end_unlock: _end_unlock: runtime->nowake = 0; runtime->twake = 0; if (xfer > 0 && err >= 0) if (xfer > 0 && err >= 0) snd_pcm_update_state(substream, runtime); snd_pcm_update_state(substream, runtime); snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); Loading Loading @@ -2030,7 +2030,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, goto _end_unlock; goto _end_unlock; } } runtime->nowake = 1; runtime->twake = 1; while (size > 0) { while (size > 0) { snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t frames, appl_ptr, appl_ofs; snd_pcm_uframes_t avail; snd_pcm_uframes_t avail; Loading Loading @@ -2059,7 +2059,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, if (frames > cont) if (frames > cont) frames = cont; frames = cont; if (snd_BUG_ON(!frames)) { if (snd_BUG_ON(!frames)) { runtime->nowake = 0; runtime->twake = 0; snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); return -EINVAL; return -EINVAL; } } Loading Loading @@ -2092,7 +2092,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(struct snd_pcm_substream *substream, xfer += frames; xfer += frames; } } _end_unlock: _end_unlock: runtime->nowake = 0; runtime->twake = 0; if (xfer > 0 && err >= 0) if (xfer > 0 && err >= 0) snd_pcm_update_state(substream, runtime); snd_pcm_update_state(substream, runtime); snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream); Loading
sound/core/pcm_native.c +3 −0 Original line number Original line Diff line number Diff line Loading @@ -919,6 +919,7 @@ static void snd_pcm_post_stop(struct snd_pcm_substream *substream, int state) runtime->status->state = state; runtime->status->state = state; } } wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } } static struct action_ops snd_pcm_action_stop = { static struct action_ops snd_pcm_action_stop = { Loading Loading @@ -1004,6 +1005,7 @@ static void snd_pcm_post_pause(struct snd_pcm_substream *substream, int push) SNDRV_TIMER_EVENT_MPAUSE, SNDRV_TIMER_EVENT_MPAUSE, &runtime->trigger_tstamp); &runtime->trigger_tstamp); wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } else { } else { runtime->status->state = SNDRV_PCM_STATE_RUNNING; runtime->status->state = SNDRV_PCM_STATE_RUNNING; if (substream->timer) if (substream->timer) Loading Loading @@ -1061,6 +1063,7 @@ static void snd_pcm_post_suspend(struct snd_pcm_substream *substream, int state) runtime->status->suspended_state = runtime->status->state; runtime->status->suspended_state = runtime->status->state; runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; runtime->status->state = SNDRV_PCM_STATE_SUSPENDED; wake_up(&runtime->sleep); wake_up(&runtime->sleep); wake_up(&runtime->tsleep); } } static struct action_ops snd_pcm_action_suspend = { static struct action_ops snd_pcm_action_suspend = { Loading