提交 443feb88 编写于 作者: K Karsten Wiese 提交者: Jaroslav Kysela

[ALSA] ALSA's struct _snd_pcm_substream: Obsolete open_flag

PCM Midlevel,ALSA<-OSS emulation,USB USX2Y
This patch removes open_flag from struct _snd_pcm_substream.
All of its uses are substituted by querying struct _snd_pcm_substream's
member ffile instead.
Signed-off-by: NKarsten Wiese <annabellesgarden@yahoo.de>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 9bcf6551
...@@ -379,7 +379,6 @@ struct _snd_pcm_substream { ...@@ -379,7 +379,6 @@ struct _snd_pcm_substream {
unsigned int dma_buf_id; unsigned int dma_buf_id;
size_t dma_max; size_t dma_max;
/* -- hardware operations -- */ /* -- hardware operations -- */
unsigned int open_flag: 1; /* lowlevel device has been opened */
snd_pcm_ops_t *ops; snd_pcm_ops_t *ops;
/* -- runtime information -- */ /* -- runtime information -- */
snd_pcm_runtime_t *runtime; snd_pcm_runtime_t *runtime;
......
...@@ -1705,13 +1705,12 @@ static int snd_pcm_oss_release_file(snd_pcm_oss_file_t *pcm_oss_file) ...@@ -1705,13 +1705,12 @@ static int snd_pcm_oss_release_file(snd_pcm_oss_file_t *pcm_oss_file)
if (snd_pcm_running(substream)) if (snd_pcm_running(substream))
snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP); snd_pcm_stop(substream, SNDRV_PCM_STATE_SETUP);
snd_pcm_stream_unlock_irq(substream); snd_pcm_stream_unlock_irq(substream);
if (substream->open_flag) { if (substream->ffile != NULL) {
if (substream->ops->hw_free != NULL) if (substream->ops->hw_free != NULL)
substream->ops->hw_free(substream); substream->ops->hw_free(substream);
substream->ops->close(substream); substream->ops->close(substream);
substream->open_flag = 0; substream->ffile = NULL;
} }
substream->ffile = NULL;
snd_pcm_oss_release_substream(substream); snd_pcm_oss_release_substream(substream);
snd_pcm_release_substream(substream); snd_pcm_release_substream(substream);
} }
...@@ -1778,14 +1777,13 @@ static int snd_pcm_oss_open_file(struct file *file, ...@@ -1778,14 +1777,13 @@ static int snd_pcm_oss_open_file(struct file *file,
snd_pcm_oss_release_file(pcm_oss_file); snd_pcm_oss_release_file(pcm_oss_file);
return err; return err;
} }
psubstream->open_flag = 1; psubstream->ffile = file;
err = snd_pcm_hw_constraints_complete(psubstream); err = snd_pcm_hw_constraints_complete(psubstream);
if (err < 0) { if (err < 0) {
snd_printd("snd_pcm_hw_constraint_complete failed\n"); snd_printd("snd_pcm_hw_constraint_complete failed\n");
snd_pcm_oss_release_file(pcm_oss_file); snd_pcm_oss_release_file(pcm_oss_file);
return err; return err;
} }
psubstream->ffile = file;
snd_pcm_oss_init_substream(psubstream, psetup, minor); snd_pcm_oss_init_substream(psubstream, psetup, minor);
} }
if (csubstream != NULL) { if (csubstream != NULL) {
...@@ -1800,14 +1798,13 @@ static int snd_pcm_oss_open_file(struct file *file, ...@@ -1800,14 +1798,13 @@ static int snd_pcm_oss_open_file(struct file *file,
snd_pcm_oss_release_file(pcm_oss_file); snd_pcm_oss_release_file(pcm_oss_file);
return err; return err;
} }
csubstream->open_flag = 1; csubstream->ffile = file;
err = snd_pcm_hw_constraints_complete(csubstream); err = snd_pcm_hw_constraints_complete(csubstream);
if (err < 0) { if (err < 0) {
snd_printd("snd_pcm_hw_constraint_complete failed\n"); snd_printd("snd_pcm_hw_constraint_complete failed\n");
snd_pcm_oss_release_file(pcm_oss_file); snd_pcm_oss_release_file(pcm_oss_file);
return err; return err;
} }
csubstream->ffile = file;
snd_pcm_oss_init_substream(csubstream, csetup, minor); snd_pcm_oss_init_substream(csubstream, csetup, minor);
} }
......
...@@ -2063,7 +2063,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream, ...@@ -2063,7 +2063,7 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream,
if (((avail < runtime->control->avail_min && size > avail) || if (((avail < runtime->control->avail_min && size > avail) ||
(size >= runtime->xfer_align && avail < runtime->xfer_align))) { (size >= runtime->xfer_align && avail < runtime->xfer_align))) {
wait_queue_t wait; wait_queue_t wait;
enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED } state; enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state;
long tout; long tout;
if (nonblock) { if (nonblock) {
...@@ -2097,6 +2097,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream, ...@@ -2097,6 +2097,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream,
case SNDRV_PCM_STATE_SUSPENDED: case SNDRV_PCM_STATE_SUSPENDED:
state = SUSPENDED; state = SUSPENDED;
goto _end_loop; goto _end_loop;
case SNDRV_PCM_STATE_SETUP:
state = DROPPED;
goto _end_loop;
default: default:
break; break;
} }
...@@ -2123,6 +2126,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream, ...@@ -2123,6 +2126,9 @@ static snd_pcm_sframes_t snd_pcm_lib_write1(snd_pcm_substream_t *substream,
snd_printd("playback write error (DMA or IRQ trouble?)\n"); snd_printd("playback write error (DMA or IRQ trouble?)\n");
err = -EIO; err = -EIO;
goto _end_unlock; goto _end_unlock;
case DROPPED:
err = -EBADFD;
goto _end_unlock;
default: default:
break; break;
} }
...@@ -2359,7 +2365,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream, ...@@ -2359,7 +2365,7 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream,
} else if ((avail < runtime->control->avail_min && size > avail) || } else if ((avail < runtime->control->avail_min && size > avail) ||
(size >= runtime->xfer_align && avail < runtime->xfer_align)) { (size >= runtime->xfer_align && avail < runtime->xfer_align)) {
wait_queue_t wait; wait_queue_t wait;
enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED } state; enum { READY, SIGNALED, ERROR, SUSPENDED, EXPIRED, DROPPED } state;
long tout; long tout;
if (nonblock) { if (nonblock) {
...@@ -2394,6 +2400,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream, ...@@ -2394,6 +2400,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream,
goto _end_loop; goto _end_loop;
case SNDRV_PCM_STATE_DRAINING: case SNDRV_PCM_STATE_DRAINING:
goto __draining; goto __draining;
case SNDRV_PCM_STATE_SETUP:
state = DROPPED;
goto _end_loop;
default: default:
break; break;
} }
...@@ -2420,6 +2429,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream, ...@@ -2420,6 +2429,9 @@ static snd_pcm_sframes_t snd_pcm_lib_read1(snd_pcm_substream_t *substream,
snd_printd("capture read error (DMA or IRQ trouble?)\n"); snd_printd("capture read error (DMA or IRQ trouble?)\n");
err = -EIO; err = -EIO;
goto _end_unlock; goto _end_unlock;
case DROPPED:
err = -EBADFD;
goto _end_unlock;
default: default:
break; break;
} }
......
...@@ -1967,13 +1967,12 @@ static int snd_pcm_release_file(snd_pcm_file_t * pcm_file) ...@@ -1967,13 +1967,12 @@ static int snd_pcm_release_file(snd_pcm_file_t * pcm_file)
runtime = substream->runtime; runtime = substream->runtime;
str = substream->pstr; str = substream->pstr;
snd_pcm_unlink(substream); snd_pcm_unlink(substream);
if (substream->open_flag) { if (substream->ffile != NULL) {
if (substream->ops->hw_free != NULL) if (substream->ops->hw_free != NULL)
substream->ops->hw_free(substream); substream->ops->hw_free(substream);
substream->ops->close(substream); substream->ops->close(substream);
substream->open_flag = 0; substream->ffile = NULL;
} }
substream->ffile = NULL;
snd_pcm_remove_file(str, pcm_file); snd_pcm_remove_file(str, pcm_file);
snd_pcm_release_substream(substream); snd_pcm_release_substream(substream);
kfree(pcm_file); kfree(pcm_file);
...@@ -2022,18 +2021,15 @@ static int snd_pcm_open_file(struct file *file, ...@@ -2022,18 +2021,15 @@ static int snd_pcm_open_file(struct file *file,
snd_pcm_release_file(pcm_file); snd_pcm_release_file(pcm_file);
return err; return err;
} }
substream->open_flag = 1; substream->ffile = file;
err = snd_pcm_hw_constraints_complete(substream); err = snd_pcm_hw_constraints_complete(substream);
if (err < 0) { if (err < 0) {
snd_printd("snd_pcm_hw_constraints_complete failed\n"); snd_printd("snd_pcm_hw_constraints_complete failed\n");
substream->ops->close(substream);
snd_pcm_release_file(pcm_file); snd_pcm_release_file(pcm_file);
return err; return err;
} }
substream->ffile = file;
file->private_data = pcm_file; file->private_data = pcm_file;
*rpcm_file = pcm_file; *rpcm_file = pcm_file;
return 0; return 0;
......
...@@ -624,7 +624,7 @@ static int usX2Y_pcms_lock_check(snd_card_t *card) ...@@ -624,7 +624,7 @@ static int usX2Y_pcms_lock_check(snd_card_t *card)
for (s = 0; s < 2; ++s) { for (s = 0; s < 2; ++s) {
snd_pcm_substream_t *substream; snd_pcm_substream_t *substream;
substream = pcm->streams[s].substream; substream = pcm->streams[s].substream;
if (substream && substream->open_flag) if (substream && substream->ffile != NULL)
err = -EBUSY; err = -EBUSY;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册