Commit 896e6cc20e67038af12e1a7711eef32647e62f23
1 parent
687fbc3fec
Exists in
master
and in
39 other branches
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>
Showing 5 changed files with 23 additions and 45 deletions Side-by-side Diff
include/sound/minors.h
include/sound/pcm.h
... | ... | @@ -84,6 +84,8 @@ |
84 | 84 | * |
85 | 85 | */ |
86 | 86 | |
87 | +#define SNDRV_PCM_DEVICES 8 | |
88 | + | |
87 | 89 | #define SNDRV_PCM_IOCTL1_FALSE ((void *)0) |
88 | 90 | #define SNDRV_PCM_IOCTL1_TRUE ((void *)1) |
89 | 91 | |
... | ... | @@ -414,7 +416,7 @@ |
414 | 416 | struct snd_pcm { |
415 | 417 | struct snd_card *card; |
416 | 418 | struct list_head list; |
417 | - int device; /* device number */ | |
419 | + unsigned int device; /* device number */ | |
418 | 420 | unsigned int info_flags; |
419 | 421 | unsigned short dev_class; |
420 | 422 | unsigned short dev_subclass; |
sound/core/oss/pcm_oss.c
... | ... | @@ -2947,7 +2947,7 @@ |
2947 | 2947 | static int snd_pcm_oss_register_minor(struct snd_pcm *pcm) |
2948 | 2948 | { |
2949 | 2949 | pcm->oss.reg = 0; |
2950 | - if (dsp_map[pcm->card->number] == pcm->device) { | |
2950 | + if (dsp_map[pcm->card->number] == (int)pcm->device) { | |
2951 | 2951 | char name[128]; |
2952 | 2952 | int duplex; |
2953 | 2953 | register_oss_dsp(pcm, 0); |
... | ... | @@ -2963,7 +2963,7 @@ |
2963 | 2963 | pcm->oss.reg++; |
2964 | 2964 | pcm->oss.reg_mask |= 1; |
2965 | 2965 | } |
2966 | - if (adsp_map[pcm->card->number] == pcm->device) { | |
2966 | + if (adsp_map[pcm->card->number] == (int)pcm->device) { | |
2967 | 2967 | register_oss_dsp(pcm, 1); |
2968 | 2968 | pcm->oss.reg++; |
2969 | 2969 | pcm->oss.reg_mask |= 2; |
... | ... | @@ -2988,7 +2988,7 @@ |
2988 | 2988 | snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_PCM, |
2989 | 2989 | pcm->card, 1); |
2990 | 2990 | } |
2991 | - if (dsp_map[pcm->card->number] == pcm->device) { | |
2991 | + if (dsp_map[pcm->card->number] == (int)pcm->device) { | |
2992 | 2992 | #ifdef SNDRV_OSS_INFO_DEV_AUDIO |
2993 | 2993 | snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_AUDIO, pcm->card->number); |
2994 | 2994 | #endif |
2995 | 2995 | |
... | ... | @@ -3019,12 +3019,12 @@ |
3019 | 3019 | |
3020 | 3020 | /* check device map table */ |
3021 | 3021 | for (i = 0; i < SNDRV_CARDS; i++) { |
3022 | - if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_OS_MINORS) { | |
3022 | + if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_PCM_DEVICES) { | |
3023 | 3023 | snd_printk(KERN_ERR "invalid dsp_map[%d] = %d\n", |
3024 | 3024 | i, dsp_map[i]); |
3025 | 3025 | dsp_map[i] = 0; |
3026 | 3026 | } |
3027 | - if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_OS_MINORS) { | |
3027 | + if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_PCM_DEVICES) { | |
3028 | 3028 | snd_printk(KERN_ERR "invalid adsp_map[%d] = %d\n", |
3029 | 3029 | i, adsp_map[i]); |
3030 | 3030 | adsp_map[i] = 1; |
sound/core/pcm.c
... | ... | @@ -42,7 +42,7 @@ |
42 | 42 | static int snd_pcm_dev_register(struct snd_device *device); |
43 | 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 | 47 | struct snd_pcm *pcm; |
48 | 48 | |
... | ... | @@ -53,37 +53,6 @@ |
53 | 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 | 56 | static int snd_pcm_control_ioctl(struct snd_card *card, |
88 | 57 | struct snd_ctl_file *control, |
89 | 58 | unsigned int cmd, unsigned long arg) |
... | ... | @@ -96,7 +65,14 @@ |
96 | 65 | if (get_user(device, (int __user *)arg)) |
97 | 66 | return -EFAULT; |
98 | 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 | 76 | mutex_unlock(®ister_mutex); |
101 | 77 | if (put_user(device, (int __user *)arg)) |
102 | 78 | return -EFAULT; |
... | ... | @@ -122,7 +98,7 @@ |
122 | 98 | if (get_user(subdevice, &info->subdevice)) |
123 | 99 | return -EFAULT; |
124 | 100 | mutex_lock(®ister_mutex); |
125 | - pcm = snd_pcm_get(card, device); | |
101 | + pcm = snd_pcm_search(card, device); | |
126 | 102 | if (pcm == NULL) { |
127 | 103 | err = -ENXIO; |
128 | 104 | goto _error; |
129 | 105 | |
130 | 106 | |
... | ... | @@ -955,11 +931,11 @@ |
955 | 931 | |
956 | 932 | snd_assert(pcm != NULL && device != NULL, return -ENXIO); |
957 | 933 | mutex_lock(®ister_mutex); |
958 | - err = snd_pcm_add(pcm); | |
959 | - if (err) { | |
934 | + if (snd_pcm_search(pcm->card, pcm->device)) { | |
960 | 935 | mutex_unlock(®ister_mutex); |
961 | - return err; | |
936 | + return -EBUSY; | |
962 | 937 | } |
938 | + list_add_tail(&pcm->list, &snd_pcm_devices); | |
963 | 939 | for (cidx = 0; cidx < 2; cidx++) { |
964 | 940 | int devtype = -1; |
965 | 941 | if (pcm->streams[cidx].substream == NULL) |