diff options
author | Jaroslav Kysela <perex@perex.cz> | 2008-08-01 07:36:04 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-08-01 07:36:04 -0400 |
commit | 896e6cc20e67038af12e1a7711eef32647e62f23 (patch) | |
tree | 54fc5c48570c75aa2f0a5bbecf0d159006c69638 /sound/core/pcm.c | |
parent | 687fbc3fece34e7e1c2ac529348ad897095a0bde (diff) |
sound: Revert "ALSA: Fix limit of 8 PCM devices in SNDRV_CTL_IOCTL_PCM_NEXT_DEVICE"
This reverts commit fb3d6f2b77bdec75d45aa9d4464287ed87927866.
New, updated patch with same subject replaces this commit.
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/core/pcm.c')
-rw-r--r-- | sound/core/pcm.c | 50 |
1 files changed, 13 insertions, 37 deletions
diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 24271a3bd90..ece25c718e9 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c | |||
@@ -42,7 +42,7 @@ static int snd_pcm_dev_free(struct snd_device *device); | |||
42 | static int snd_pcm_dev_register(struct snd_device *device); | 42 | static int snd_pcm_dev_register(struct snd_device *device); |
43 | static int snd_pcm_dev_disconnect(struct snd_device *device); | 43 | static int snd_pcm_dev_disconnect(struct snd_device *device); |
44 | 44 | ||
45 | static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device) | 45 | static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device) |
46 | { | 46 | { |
47 | struct snd_pcm *pcm; | 47 | struct snd_pcm *pcm; |
48 | 48 | ||
@@ -53,37 +53,6 @@ static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device) | |||
53 | return NULL; | 53 | return NULL; |
54 | } | 54 | } |
55 | 55 | ||
56 | static inline int snd_pcm_next(struct snd_card *card, int device) | ||
57 | { | ||
58 | struct snd_pcm *pcm; | ||
59 | |||
60 | list_for_each_entry(pcm, &snd_pcm_devices, list) { | ||
61 | if (pcm->card == card && pcm->device > device) | ||
62 | return pcm->device; | ||
63 | else if (pcm->card->number > card->number) | ||
64 | return -1; | ||
65 | } | ||
66 | return -1; | ||
67 | } | ||
68 | |||
69 | static inline int snd_pcm_add(struct snd_pcm *newpcm) | ||
70 | { | ||
71 | struct snd_pcm *pcm; | ||
72 | |||
73 | list_for_each_entry(pcm, &snd_pcm_devices, list) { | ||
74 | if (pcm->card == newpcm->card && pcm->device == newpcm->device) | ||
75 | return -EBUSY; | ||
76 | if (pcm->card->number > newpcm->card->number || | ||
77 | (pcm->card == newpcm->card && | ||
78 | pcm->device > newpcm->device)) { | ||
79 | list_add(&newpcm->list, pcm->list.prev); | ||
80 | return 0; | ||
81 | } | ||
82 | } | ||
83 | list_add_tail(&newpcm->list, &snd_pcm_devices); | ||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | static int snd_pcm_control_ioctl(struct snd_card *card, | 56 | static int snd_pcm_control_ioctl(struct snd_card *card, |
88 | struct snd_ctl_file *control, | 57 | struct snd_ctl_file *control, |
89 | unsigned int cmd, unsigned long arg) | 58 | unsigned int cmd, unsigned long arg) |
@@ -96,7 +65,14 @@ static int snd_pcm_control_ioctl(struct snd_card *card, | |||
96 | if (get_user(device, (int __user *)arg)) | 65 | if (get_user(device, (int __user *)arg)) |
97 | return -EFAULT; | 66 | return -EFAULT; |
98 | mutex_lock(®ister_mutex); | 67 | mutex_lock(®ister_mutex); |
99 | device = snd_pcm_next(card, device); | 68 | device = device < 0 ? 0 : device + 1; |
69 | while (device < SNDRV_PCM_DEVICES) { | ||
70 | if (snd_pcm_search(card, device)) | ||
71 | break; | ||
72 | device++; | ||
73 | } | ||
74 | if (device == SNDRV_PCM_DEVICES) | ||
75 | device = -1; | ||
100 | mutex_unlock(®ister_mutex); | 76 | mutex_unlock(®ister_mutex); |
101 | if (put_user(device, (int __user *)arg)) | 77 | if (put_user(device, (int __user *)arg)) |
102 | return -EFAULT; | 78 | return -EFAULT; |
@@ -122,7 +98,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, | |||
122 | if (get_user(subdevice, &info->subdevice)) | 98 | if (get_user(subdevice, &info->subdevice)) |
123 | return -EFAULT; | 99 | return -EFAULT; |
124 | mutex_lock(®ister_mutex); | 100 | mutex_lock(®ister_mutex); |
125 | pcm = snd_pcm_get(card, device); | 101 | pcm = snd_pcm_search(card, device); |
126 | if (pcm == NULL) { | 102 | if (pcm == NULL) { |
127 | err = -ENXIO; | 103 | err = -ENXIO; |
128 | goto _error; | 104 | goto _error; |
@@ -955,11 +931,11 @@ static int snd_pcm_dev_register(struct snd_device *device) | |||
955 | 931 | ||
956 | snd_assert(pcm != NULL && device != NULL, return -ENXIO); | 932 | snd_assert(pcm != NULL && device != NULL, return -ENXIO); |
957 | mutex_lock(®ister_mutex); | 933 | mutex_lock(®ister_mutex); |
958 | err = snd_pcm_add(pcm); | 934 | if (snd_pcm_search(pcm->card, pcm->device)) { |
959 | if (err) { | ||
960 | mutex_unlock(®ister_mutex); | 935 | mutex_unlock(®ister_mutex); |
961 | return err; | 936 | return -EBUSY; |
962 | } | 937 | } |
938 | list_add_tail(&pcm->list, &snd_pcm_devices); | ||
963 | for (cidx = 0; cidx < 2; cidx++) { | 939 | for (cidx = 0; cidx < 2; cidx++) { |
964 | int devtype = -1; | 940 | int devtype = -1; |
965 | if (pcm->streams[cidx].substream == NULL) | 941 | if (pcm->streams[cidx].substream == NULL) |