|
@@ -36,8 +36,10 @@ MODULE_DESCRIPTION("Midlevel PCM code for ALSA.");
|
|
MODULE_LICENSE("GPL");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
|
|
static LIST_HEAD(snd_pcm_devices);
|
|
static LIST_HEAD(snd_pcm_devices);
|
|
-static LIST_HEAD(snd_pcm_notify_list);
|
|
|
|
static DEFINE_MUTEX(register_mutex);
|
|
static DEFINE_MUTEX(register_mutex);
|
|
|
|
+#if IS_ENABLED(CONFIG_SND_PCM_OSS)
|
|
|
|
+static LIST_HEAD(snd_pcm_notify_list);
|
|
|
|
+#endif
|
|
|
|
|
|
static int snd_pcm_free(struct snd_pcm *pcm);
|
|
static int snd_pcm_free(struct snd_pcm *pcm);
|
|
static int snd_pcm_dev_free(struct snd_device *device);
|
|
static int snd_pcm_dev_free(struct snd_device *device);
|
|
@@ -884,16 +886,23 @@ static void snd_pcm_free_stream(struct snd_pcm_str * pstr)
|
|
put_device(&pstr->dev);
|
|
put_device(&pstr->dev);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#if IS_ENABLED(CONFIG_SND_PCM_OSS)
|
|
|
|
+#define pcm_call_notify(pcm, call) \
|
|
|
|
+ do { \
|
|
|
|
+ struct snd_pcm_notify *_notify; \
|
|
|
|
+ list_for_each_entry(_notify, &snd_pcm_notify_list, list) \
|
|
|
|
+ _notify->call(pcm); \
|
|
|
|
+ } while (0)
|
|
|
|
+#else
|
|
|
|
+#define pcm_call_notify(pcm, call) /* NOP */
|
|
|
|
+#endif
|
|
|
|
+
|
|
static int snd_pcm_free(struct snd_pcm *pcm)
|
|
static int snd_pcm_free(struct snd_pcm *pcm)
|
|
{
|
|
{
|
|
- struct snd_pcm_notify *notify;
|
|
|
|
-
|
|
|
|
if (!pcm)
|
|
if (!pcm)
|
|
return 0;
|
|
return 0;
|
|
- if (!pcm->internal) {
|
|
|
|
- list_for_each_entry(notify, &snd_pcm_notify_list, list)
|
|
|
|
- notify->n_unregister(pcm);
|
|
|
|
- }
|
|
|
|
|
|
+ if (!pcm->internal)
|
|
|
|
+ pcm_call_notify(pcm, n_unregister);
|
|
if (pcm->private_free)
|
|
if (pcm->private_free)
|
|
pcm->private_free(pcm);
|
|
pcm->private_free(pcm);
|
|
snd_pcm_lib_preallocate_free_for_all(pcm);
|
|
snd_pcm_lib_preallocate_free_for_all(pcm);
|
|
@@ -1069,7 +1078,6 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
|
{
|
|
{
|
|
int cidx, err;
|
|
int cidx, err;
|
|
struct snd_pcm_substream *substream;
|
|
struct snd_pcm_substream *substream;
|
|
- struct snd_pcm_notify *notify;
|
|
|
|
struct snd_pcm *pcm;
|
|
struct snd_pcm *pcm;
|
|
|
|
|
|
if (snd_BUG_ON(!device || !device->device_data))
|
|
if (snd_BUG_ON(!device || !device->device_data))
|
|
@@ -1107,8 +1115,7 @@ static int snd_pcm_dev_register(struct snd_device *device)
|
|
snd_pcm_timer_init(substream);
|
|
snd_pcm_timer_init(substream);
|
|
}
|
|
}
|
|
|
|
|
|
- list_for_each_entry(notify, &snd_pcm_notify_list, list)
|
|
|
|
- notify->n_register(pcm);
|
|
|
|
|
|
+ pcm_call_notify(pcm, n_register);
|
|
|
|
|
|
unlock:
|
|
unlock:
|
|
mutex_unlock(®ister_mutex);
|
|
mutex_unlock(®ister_mutex);
|
|
@@ -1118,7 +1125,6 @@ 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)
|
|
{
|
|
{
|
|
struct snd_pcm *pcm = device->device_data;
|
|
struct snd_pcm *pcm = device->device_data;
|
|
- struct snd_pcm_notify *notify;
|
|
|
|
struct snd_pcm_substream *substream;
|
|
struct snd_pcm_substream *substream;
|
|
int cidx;
|
|
int cidx;
|
|
|
|
|
|
@@ -1138,8 +1144,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!pcm->internal) {
|
|
if (!pcm->internal) {
|
|
- list_for_each_entry(notify, &snd_pcm_notify_list, list)
|
|
|
|
- notify->n_disconnect(pcm);
|
|
|
|
|
|
+ pcm_call_notify(pcm, n_disconnect);
|
|
}
|
|
}
|
|
for (cidx = 0; cidx < 2; cidx++) {
|
|
for (cidx = 0; cidx < 2; cidx++) {
|
|
if (!pcm->internal)
|
|
if (!pcm->internal)
|
|
@@ -1151,6 +1156,7 @@ static int snd_pcm_dev_disconnect(struct snd_device *device)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#if IS_ENABLED(CONFIG_SND_PCM_OSS)
|
|
/**
|
|
/**
|
|
* snd_pcm_notify - Add/remove the notify list
|
|
* snd_pcm_notify - Add/remove the notify list
|
|
* @notify: PCM notify list
|
|
* @notify: PCM notify list
|
|
@@ -1183,6 +1189,7 @@ int snd_pcm_notify(struct snd_pcm_notify *notify, int nfree)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(snd_pcm_notify);
|
|
EXPORT_SYMBOL(snd_pcm_notify);
|
|
|
|
+#endif /* CONFIG_SND_PCM_OSS */
|
|
|
|
|
|
#ifdef CONFIG_SND_PROC_FS
|
|
#ifdef CONFIG_SND_PROC_FS
|
|
/*
|
|
/*
|