Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 110857
b: refs/heads/master
c: f90c06a
h: refs/heads/master
i:
  110855: d85a556
v: v3
  • Loading branch information
Pawel MOLL authored and Jaroslav Kysela committed Aug 1, 2008
1 parent 9c9c1c3 commit ee62ac7
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 030a07e441296c372f946cd4065b5d831d8dc40c
refs/heads/master: f90c06a2b613eea24a77d56f24b084745c43713d
2 changes: 2 additions & 0 deletions trunk/include/sound/minors.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
*
*/

#define SNDRV_OS_MINORS 256

#define SNDRV_MINOR_DEVICES 32
#define SNDRV_MINOR_CARD(minor) ((minor) >> 5)
#define SNDRV_MINOR_DEVICE(minor) ((minor) & 0x001f)
Expand Down
9 changes: 7 additions & 2 deletions trunk/include/sound/pcm.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

#include <sound/asound.h>
#include <sound/memalloc.h>
#include <sound/minors.h>
#include <linux/poll.h>
#include <linux/mm.h>
#include <linux/bitops.h>
Expand Down Expand Up @@ -84,7 +85,11 @@ struct snd_pcm_ops {
*
*/

#define SNDRV_PCM_DEVICES 8
#if defined(CONFIG_SND_DYNAMIC_MINORS)
#define SNDRV_PCM_DEVICES (SNDRV_OS_MINORS-2)
#else
#define SNDRV_PCM_DEVICES 8
#endif

#define SNDRV_PCM_IOCTL1_FALSE ((void *)0)
#define SNDRV_PCM_IOCTL1_TRUE ((void *)1)
Expand Down Expand Up @@ -416,7 +421,7 @@ struct snd_pcm_str {
struct snd_pcm {
struct snd_card *card;
struct list_head list;
unsigned int device; /* device number */
int device; /* device number */
unsigned int info_flags;
unsigned short dev_class;
unsigned short dev_subclass;
Expand Down
50 changes: 37 additions & 13 deletions trunk/sound/core/pcm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_disconnect(struct snd_device *device);

static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device)
static struct snd_pcm *snd_pcm_get(struct snd_card *card, int device)
{
struct snd_pcm *pcm;

Expand All @@ -53,6 +53,37 @@ static struct snd_pcm *snd_pcm_search(struct snd_card *card, int device)
return NULL;
}

static 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 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,
struct snd_ctl_file *control,
unsigned int cmd, unsigned long arg)
Expand All @@ -65,14 +96,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
if (get_user(device, (int __user *)arg))
return -EFAULT;
mutex_lock(&register_mutex);
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;
device = snd_pcm_next(card, device);
mutex_unlock(&register_mutex);
if (put_user(device, (int __user *)arg))
return -EFAULT;
Expand All @@ -98,7 +122,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card,
if (get_user(subdevice, &info->subdevice))
return -EFAULT;
mutex_lock(&register_mutex);
pcm = snd_pcm_search(card, device);
pcm = snd_pcm_get(card, device);
if (pcm == NULL) {
err = -ENXIO;
goto _error;
Expand Down Expand Up @@ -931,11 +955,11 @@ static int snd_pcm_dev_register(struct snd_device *device)

snd_assert(pcm != NULL && device != NULL, return -ENXIO);
mutex_lock(&register_mutex);
if (snd_pcm_search(pcm->card, pcm->device)) {
err = snd_pcm_add(pcm);
if (err) {
mutex_unlock(&register_mutex);
return -EBUSY;
return err;
}
list_add_tail(&pcm->list, &snd_pcm_devices);
for (cidx = 0; cidx < 2; cidx++) {
int devtype = -1;
if (pcm->streams[cidx].substream == NULL)
Expand Down
2 changes: 0 additions & 2 deletions trunk/sound/core/sound.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@
#include <linux/kmod.h>
#include <linux/mutex.h>

#define SNDRV_OS_MINORS 256

static int major = CONFIG_SND_MAJOR;
int snd_major;
EXPORT_SYMBOL(snd_major);
Expand Down

0 comments on commit ee62ac7

Please sign in to comment.