|
@@ -381,7 +381,7 @@ struct azx_dev {
|
|
|
*/
|
|
|
unsigned char stream_tag; /* assigned stream */
|
|
|
unsigned char index; /* stream index */
|
|
|
- int device; /* last device number assigned to */
|
|
|
+ int assigned_key; /* last device# key assigned to */
|
|
|
|
|
|
unsigned int opened :1;
|
|
|
unsigned int running :1;
|
|
@@ -1613,6 +1613,9 @@ azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
|
|
|
{
|
|
|
int dev, i, nums;
|
|
|
struct azx_dev *res = NULL;
|
|
|
+ /* make a non-zero unique key for the substream */
|
|
|
+ int key = (substream->pcm->device << 16) | (substream->number << 2) |
|
|
|
+ (substream->stream + 1);
|
|
|
|
|
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
|
|
dev = chip->playback_index_offset;
|
|
@@ -1624,12 +1627,12 @@ azx_assign_device(struct azx *chip, struct snd_pcm_substream *substream)
|
|
|
for (i = 0; i < nums; i++, dev++)
|
|
|
if (!chip->azx_dev[dev].opened) {
|
|
|
res = &chip->azx_dev[dev];
|
|
|
- if (res->device == substream->pcm->device)
|
|
|
+ if (res->assigned_key == key)
|
|
|
break;
|
|
|
}
|
|
|
if (res) {
|
|
|
res->opened = 1;
|
|
|
- res->device = substream->pcm->device;
|
|
|
+ res->assigned_key = key;
|
|
|
}
|
|
|
return res;
|
|
|
}
|