mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 19:56:18 +00:00
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>
This commit is contained in:
parent
687fbc3fec
commit
896e6cc20e
5 changed files with 23 additions and 45 deletions
|
@ -21,8 +21,6 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define SNDRV_OS_MINORS 256
|
|
||||||
|
|
||||||
#define SNDRV_MINOR_DEVICES 32
|
#define SNDRV_MINOR_DEVICES 32
|
||||||
#define SNDRV_MINOR_CARD(minor) ((minor) >> 5)
|
#define SNDRV_MINOR_CARD(minor) ((minor) >> 5)
|
||||||
#define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
|
#define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
|
||||||
|
|
|
@ -84,6 +84,8 @@ struct snd_pcm_ops {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define SNDRV_PCM_DEVICES 8
|
||||||
|
|
||||||
#define SNDRV_PCM_IOCTL1_FALSE ((void *)0)
|
#define SNDRV_PCM_IOCTL1_FALSE ((void *)0)
|
||||||
#define SNDRV_PCM_IOCTL1_TRUE ((void *)1)
|
#define SNDRV_PCM_IOCTL1_TRUE ((void *)1)
|
||||||
|
|
||||||
|
@ -414,7 +416,7 @@ struct snd_pcm_str {
|
||||||
struct snd_pcm {
|
struct snd_pcm {
|
||||||
struct snd_card *card;
|
struct snd_card *card;
|
||||||
struct list_head list;
|
struct list_head list;
|
||||||
int device; /* device number */
|
unsigned int device; /* device number */
|
||||||
unsigned int info_flags;
|
unsigned int info_flags;
|
||||||
unsigned short dev_class;
|
unsigned short dev_class;
|
||||||
unsigned short dev_subclass;
|
unsigned short dev_subclass;
|
||||||
|
|
|
@ -2947,7 +2947,7 @@ static void register_oss_dsp(struct snd_pcm *pcm, int index)
|
||||||
static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
|
static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
|
||||||
{
|
{
|
||||||
pcm->oss.reg = 0;
|
pcm->oss.reg = 0;
|
||||||
if (dsp_map[pcm->card->number] == pcm->device) {
|
if (dsp_map[pcm->card->number] == (int)pcm->device) {
|
||||||
char name[128];
|
char name[128];
|
||||||
int duplex;
|
int duplex;
|
||||||
register_oss_dsp(pcm, 0);
|
register_oss_dsp(pcm, 0);
|
||||||
|
@ -2963,7 +2963,7 @@ static int snd_pcm_oss_register_minor(struct snd_pcm *pcm)
|
||||||
pcm->oss.reg++;
|
pcm->oss.reg++;
|
||||||
pcm->oss.reg_mask |= 1;
|
pcm->oss.reg_mask |= 1;
|
||||||
}
|
}
|
||||||
if (adsp_map[pcm->card->number] == pcm->device) {
|
if (adsp_map[pcm->card->number] == (int)pcm->device) {
|
||||||
register_oss_dsp(pcm, 1);
|
register_oss_dsp(pcm, 1);
|
||||||
pcm->oss.reg++;
|
pcm->oss.reg++;
|
||||||
pcm->oss.reg_mask |= 2;
|
pcm->oss.reg_mask |= 2;
|
||||||
|
@ -2988,7 +2988,7 @@ static int snd_pcm_oss_disconnect_minor(struct snd_pcm *pcm)
|
||||||
snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_PCM,
|
snd_unregister_oss_device(SNDRV_OSS_DEVICE_TYPE_PCM,
|
||||||
pcm->card, 1);
|
pcm->card, 1);
|
||||||
}
|
}
|
||||||
if (dsp_map[pcm->card->number] == pcm->device) {
|
if (dsp_map[pcm->card->number] == (int)pcm->device) {
|
||||||
#ifdef SNDRV_OSS_INFO_DEV_AUDIO
|
#ifdef SNDRV_OSS_INFO_DEV_AUDIO
|
||||||
snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_AUDIO, pcm->card->number);
|
snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_AUDIO, pcm->card->number);
|
||||||
#endif
|
#endif
|
||||||
|
@ -3019,12 +3019,12 @@ static int __init alsa_pcm_oss_init(void)
|
||||||
|
|
||||||
/* check device map table */
|
/* check device map table */
|
||||||
for (i = 0; i < SNDRV_CARDS; i++) {
|
for (i = 0; i < SNDRV_CARDS; i++) {
|
||||||
if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_OS_MINORS) {
|
if (dsp_map[i] < 0 || dsp_map[i] >= SNDRV_PCM_DEVICES) {
|
||||||
snd_printk(KERN_ERR "invalid dsp_map[%d] = %d\n",
|
snd_printk(KERN_ERR "invalid dsp_map[%d] = %d\n",
|
||||||
i, dsp_map[i]);
|
i, dsp_map[i]);
|
||||||
dsp_map[i] = 0;
|
dsp_map[i] = 0;
|
||||||
}
|
}
|
||||||
if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_OS_MINORS) {
|
if (adsp_map[i] < 0 || adsp_map[i] >= SNDRV_PCM_DEVICES) {
|
||||||
snd_printk(KERN_ERR "invalid adsp_map[%d] = %d\n",
|
snd_printk(KERN_ERR "invalid adsp_map[%d] = %d\n",
|
||||||
i, adsp_map[i]);
|
i, adsp_map[i]);
|
||||||
adsp_map[i] = 1;
|
adsp_map[i] = 1;
|
||||||
|
|
|
@ -42,7 +42,7 @@ static int snd_pcm_dev_free(struct snd_device *device);
|
||||||
static int snd_pcm_dev_register(struct snd_device *device);
|
static int snd_pcm_dev_register(struct snd_device *device);
|
||||||
static int snd_pcm_dev_disconnect(struct snd_device *device);
|
static int snd_pcm_dev_disconnect(struct snd_device *device);
|
||||||
|
|
||||||
static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
|
static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device)
|
||||||
{
|
{
|
||||||
struct snd_pcm *pcm;
|
struct snd_pcm *pcm;
|
||||||
|
|
||||||
|
@ -53,37 +53,6 @@ static inline struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int snd_pcm_next(struct snd_card *card, int device)
|
|
||||||
{
|
|
||||||
struct snd_pcm *pcm;
|
|
||||||
|
|
||||||
list_for_each_entry(pcm, &snd_pcm_devices, list) {
|
|
||||||
if (pcm->card == card && pcm->device > device)
|
|
||||||
return pcm->device;
|
|
||||||
else if (pcm->card->number > card->number)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int snd_pcm_add(struct snd_pcm *newpcm)
|
|
||||||
{
|
|
||||||
struct snd_pcm *pcm;
|
|
||||||
|
|
||||||
list_for_each_entry(pcm, &snd_pcm_devices, list) {
|
|
||||||
if (pcm->card == newpcm->card && pcm->device == newpcm->device)
|
|
||||||
return -EBUSY;
|
|
||||||
if (pcm->card->number > newpcm->card->number ||
|
|
||||||
(pcm->card == newpcm->card &&
|
|
||||||
pcm->device > newpcm->device)) {
|
|
||||||
list_add(&newpcm->list, pcm->list.prev);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
list_add_tail(&newpcm->list, &snd_pcm_devices);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int snd_pcm_control_ioctl(struct snd_card *card,
|
static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||||
struct snd_ctl_file *control,
|
struct snd_ctl_file *control,
|
||||||
unsigned int cmd, unsigned long arg)
|
unsigned int cmd, unsigned long arg)
|
||||||
|
@ -96,7 +65,14 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||||
if (get_user(device, (int __user *)arg))
|
if (get_user(device, (int __user *)arg))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mutex_lock(®ister_mutex);
|
mutex_lock(®ister_mutex);
|
||||||
device = snd_pcm_next(card, device);
|
device = device < 0 ? 0 : device + 1;
|
||||||
|
while (device < SNDRV_PCM_DEVICES) {
|
||||||
|
if (snd_pcm_search(card, device))
|
||||||
|
break;
|
||||||
|
device++;
|
||||||
|
}
|
||||||
|
if (device == SNDRV_PCM_DEVICES)
|
||||||
|
device = -1;
|
||||||
mutex_unlock(®ister_mutex);
|
mutex_unlock(®ister_mutex);
|
||||||
if (put_user(device, (int __user *)arg))
|
if (put_user(device, (int __user *)arg))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -122,7 +98,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
|
||||||
if (get_user(subdevice, &info->subdevice))
|
if (get_user(subdevice, &info->subdevice))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
mutex_lock(®ister_mutex);
|
mutex_lock(®ister_mutex);
|
||||||
pcm = snd_pcm_get(card, device);
|
pcm = snd_pcm_search(card, device);
|
||||||
if (pcm == NULL) {
|
if (pcm == NULL) {
|
||||||
err = -ENXIO;
|
err = -ENXIO;
|
||||||
goto _error;
|
goto _error;
|
||||||
|
@ -955,11 +931,11 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
||||||
|
|
||||||
snd_assert(pcm != NULL && device != NULL, return -ENXIO);
|
snd_assert(pcm != NULL && device != NULL, return -ENXIO);
|
||||||
mutex_lock(®ister_mutex);
|
mutex_lock(®ister_mutex);
|
||||||
err = snd_pcm_add(pcm);
|
if (snd_pcm_search(pcm->card, pcm->device)) {
|
||||||
if (err) {
|
|
||||||
mutex_unlock(®ister_mutex);
|
mutex_unlock(®ister_mutex);
|
||||||
return err;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
list_add_tail(&pcm->list, &snd_pcm_devices);
|
||||||
for (cidx = 0; cidx < 2; cidx++) {
|
for (cidx = 0; cidx < 2; cidx++) {
|
||||||
int devtype = -1;
|
int devtype = -1;
|
||||||
if (pcm->streams[cidx].substream == NULL)
|
if (pcm->streams[cidx].substream == NULL)
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
#define SNDRV_OS_MINORS 256
|
||||||
|
|
||||||
static int major = CONFIG_SND_MAJOR;
|
static int major = CONFIG_SND_MAJOR;
|
||||||
int snd_major;
|
int snd_major;
|
||||||
EXPORT_SYMBOL(snd_major);
|
EXPORT_SYMBOL(snd_major);
|
||||||
|
|
Loading…
Reference in a new issue