diff options
Diffstat (limited to 'sound/core')
-rw-r--r-- | sound/core/pcm_native.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 905234817c89..42a039cc50a8 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c | |||
@@ -712,26 +712,22 @@ static int snd_pcm_action_group(struct action_ops *ops, | |||
712 | struct snd_pcm_substream *substream, | 712 | struct snd_pcm_substream *substream, |
713 | int state, int do_lock) | 713 | int state, int do_lock) |
714 | { | 714 | { |
715 | struct list_head *pos; | ||
716 | struct snd_pcm_substream *s = NULL; | 715 | struct snd_pcm_substream *s = NULL; |
717 | struct snd_pcm_substream *s1; | 716 | struct snd_pcm_substream *s1; |
718 | int res = 0; | 717 | int res = 0; |
719 | 718 | ||
720 | snd_pcm_group_for_each(pos, substream) { | 719 | snd_pcm_group_for_each_entry(s, substream) { |
721 | s = snd_pcm_group_substream_entry(pos); | ||
722 | if (do_lock && s != substream) | 720 | if (do_lock && s != substream) |
723 | spin_lock(&s->self_group.lock); | 721 | spin_lock(&s->self_group.lock); |
724 | res = ops->pre_action(s, state); | 722 | res = ops->pre_action(s, state); |
725 | if (res < 0) | 723 | if (res < 0) |
726 | goto _unlock; | 724 | goto _unlock; |
727 | } | 725 | } |
728 | snd_pcm_group_for_each(pos, substream) { | 726 | snd_pcm_group_for_each_entry(s, substream) { |
729 | s = snd_pcm_group_substream_entry(pos); | ||
730 | res = ops->do_action(s, state); | 727 | res = ops->do_action(s, state); |
731 | if (res < 0) { | 728 | if (res < 0) { |
732 | if (ops->undo_action) { | 729 | if (ops->undo_action) { |
733 | snd_pcm_group_for_each(pos, substream) { | 730 | snd_pcm_group_for_each_entry(s1, substream) { |
734 | s1 = snd_pcm_group_substream_entry(pos); | ||
735 | if (s1 == s) /* failed stream */ | 731 | if (s1 == s) /* failed stream */ |
736 | break; | 732 | break; |
737 | ops->undo_action(s1, state); | 733 | ops->undo_action(s1, state); |
@@ -741,15 +737,13 @@ static int snd_pcm_action_group(struct action_ops *ops, | |||
741 | goto _unlock; | 737 | goto _unlock; |
742 | } | 738 | } |
743 | } | 739 | } |
744 | snd_pcm_group_for_each(pos, substream) { | 740 | snd_pcm_group_for_each_entry(s, substream) { |
745 | s = snd_pcm_group_substream_entry(pos); | ||
746 | ops->post_action(s, state); | 741 | ops->post_action(s, state); |
747 | } | 742 | } |
748 | _unlock: | 743 | _unlock: |
749 | if (do_lock) { | 744 | if (do_lock) { |
750 | /* unlock streams */ | 745 | /* unlock streams */ |
751 | snd_pcm_group_for_each(pos, substream) { | 746 | snd_pcm_group_for_each_entry(s1, substream) { |
752 | s1 = snd_pcm_group_substream_entry(pos); | ||
753 | if (s1 != substream) | 747 | if (s1 != substream) |
754 | spin_unlock(&s1->self_group.lock); | 748 | spin_unlock(&s1->self_group.lock); |
755 | if (s1 == s) /* end */ | 749 | if (s1 == s) /* end */ |
@@ -1438,7 +1432,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream) | |||
1438 | { | 1432 | { |
1439 | struct snd_card *card; | 1433 | struct snd_card *card; |
1440 | struct snd_pcm_runtime *runtime; | 1434 | struct snd_pcm_runtime *runtime; |
1441 | struct list_head *pos; | 1435 | struct snd_pcm_substream *s; |
1442 | int result = 0; | 1436 | int result = 0; |
1443 | int i, num_drecs; | 1437 | int i, num_drecs; |
1444 | struct drain_rec *drec, drec_tmp, *d; | 1438 | struct drain_rec *drec, drec_tmp, *d; |
@@ -1473,8 +1467,7 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream) | |||
1473 | 1467 | ||
1474 | /* count only playback streams */ | 1468 | /* count only playback streams */ |
1475 | num_drecs = 0; | 1469 | num_drecs = 0; |
1476 | snd_pcm_group_for_each(pos, substream) { | 1470 | snd_pcm_group_for_each_entry(s, substream) { |
1477 | struct snd_pcm_substream *s = snd_pcm_group_substream_entry(pos); | ||
1478 | runtime = s->runtime; | 1471 | runtime = s->runtime; |
1479 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 1472 | if (s->stream == SNDRV_PCM_STREAM_PLAYBACK) { |
1480 | d = &drec[num_drecs++]; | 1473 | d = &drec[num_drecs++]; |
@@ -1674,7 +1667,7 @@ static void relink_to_local(struct snd_pcm_substream *substream) | |||
1674 | 1667 | ||
1675 | static int snd_pcm_unlink(struct snd_pcm_substream *substream) | 1668 | static int snd_pcm_unlink(struct snd_pcm_substream *substream) |
1676 | { | 1669 | { |
1677 | struct list_head *pos; | 1670 | struct snd_pcm_substream *s; |
1678 | int res = 0; | 1671 | int res = 0; |
1679 | 1672 | ||
1680 | down_write(&snd_pcm_link_rwsem); | 1673 | down_write(&snd_pcm_link_rwsem); |
@@ -1686,8 +1679,8 @@ static int snd_pcm_unlink(struct snd_pcm_substream *substream) | |||
1686 | list_del(&substream->link_list); | 1679 | list_del(&substream->link_list); |
1687 | substream->group->count--; | 1680 | substream->group->count--; |
1688 | if (substream->group->count == 1) { /* detach the last stream, too */ | 1681 | if (substream->group->count == 1) { /* detach the last stream, too */ |
1689 | snd_pcm_group_for_each(pos, substream) { | 1682 | snd_pcm_group_for_each_entry(s, substream) { |
1690 | relink_to_local(snd_pcm_group_substream_entry(pos)); | 1683 | relink_to_local(s); |
1691 | break; | 1684 | break; |
1692 | } | 1685 | } |
1693 | kfree(substream->group); | 1686 | kfree(substream->group); |