diff --git a/pph/rate_speexrate.c b/pph/rate_speexrate.c
index 38244b6..48b31a8 100644
--- a/pph/rate_speexrate.c
+++ b/pph/rate_speexrate.c
@@ -116,6 +116,15 @@ static void pcm_src_close(void *obj)
    free(obj);
 }
 
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+static int get_supported_rates(void *obj, unsigned int *rate_min,
+			       unsigned int *rate_max)
+{
+	*rate_min = *rate_max = 0; /* both unlimited */
+	return 0;
+}
+#endif
+
 static snd_pcm_rate_ops_t pcm_src_ops = {
 	.close = pcm_src_close,
 	.init = pcm_src_init,
@@ -125,6 +134,10 @@ static snd_pcm_rate_ops_t pcm_src_ops = {
 	.convert_s16 = pcm_src_convert_s16,
 	.input_frames = input_frames,
 	.output_frames = output_frames,
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	.version = SND_PCM_RATE_PLUGIN_VERSION,
+	.get_supported_rates = get_supported_rates,
+#endif
 };
 
 static int pcm_src_open(unsigned int version, void **objp,
@@ -132,18 +145,24 @@ static int pcm_src_open(unsigned int version, void **objp,
 {
 	struct rate_src *rate;
 
+#if SND_PCM_RATE_PLUGIN_VERSION < 0x010002
 	if (version != SND_PCM_RATE_PLUGIN_VERSION) {
 		fprintf(stderr, "Invalid rate plugin version %x\n", version);
 		return -EINVAL;
 	}
-
+#endif
 	rate = calloc(1, sizeof(*rate));
 	if (! rate)
 		return -ENOMEM;
 	rate->quality = quality;
 
 	*objp = rate;
-	*ops = pcm_src_ops;
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	if (version == 0x010001)
+		memcpy(ops, &pcm_src_ops, sizeof(snd_pcm_rate_old_ops_t));
+	else
+#endif
+		*ops = pcm_src_ops;
 	return 0;
 }
 
diff --git a/rate-lavc/rate_lavcrate.c b/rate-lavc/rate_lavcrate.c
index ea2e2f5..166efc2 100644
--- a/rate-lavc/rate_lavcrate.c
+++ b/rate-lavc/rate_lavcrate.c
@@ -202,6 +202,15 @@ static void pcm_src_close(void *obj)
 	pcm_src_free(obj);
 }
 
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+static int get_supported_rates(void *obj, unsigned int *rate_min,
+			       unsigned int *rate_max)
+{
+	*rate_min = *rate_max = 0; /* both unlimited */
+	return 0;
+}
+#endif
+
 static snd_pcm_rate_ops_t pcm_src_ops = {
 	.close = pcm_src_close,
 	.init = pcm_src_init,
@@ -211,6 +220,10 @@ static snd_pcm_rate_ops_t pcm_src_ops = {
 	.convert_s16 = pcm_src_convert_s16,
 	.input_frames = input_frames,
 	.output_frames = output_frames,
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	.version = SND_PCM_RATE_PLUGIN_VERSION,
+	.get_supported_rates = get_supported_rates,
+#endif
 };
 
 int pcm_src_open(unsigned int version, void **objp, snd_pcm_rate_ops_t *ops)
@@ -218,18 +231,24 @@ int pcm_src_open(unsigned int version, void **objp, snd_pcm_rate_ops_t *ops)
 {
 	struct rate_src *rate;
 
+#if SND_PCM_RATE_PLUGIN_VERSION < 0x010002
 	if (version != SND_PCM_RATE_PLUGIN_VERSION) {
 		fprintf(stderr, "Invalid rate plugin version %x\n", version);
 		return -EINVAL;
 	}
-
+#endif
 	rate = calloc(1, sizeof(*rate));
 	if (!rate)
 		return -ENOMEM;
 
 	*objp = rate;
 	rate->context = NULL;
-	*ops = pcm_src_ops;
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	if (version == 0x010001)
+		memcpy(ops, &pcm_src_ops, sizeof(snd_pcm_rate_old_ops_t));
+	else
+#endif
+		*ops = pcm_src_ops;
 	return 0;
 }
 
diff --git a/rate/rate_samplerate.c b/rate/rate_samplerate.c
index e366db0..545f053 100644
--- a/rate/rate_samplerate.c
+++ b/rate/rate_samplerate.c
@@ -137,6 +137,15 @@ static void pcm_src_close(void *obj)
 	free(obj);
 }
 
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+static int get_supported_rates(void *obj, unsigned int *rate_min,
+			       unsigned int *rate_max)
+{
+	*rate_min = *rate_max = 0; /* both unlimited */
+	return 0;
+}
+#endif
+
 static snd_pcm_rate_ops_t pcm_src_ops = {
 	.close = pcm_src_close,
 	.init = pcm_src_init,
@@ -146,6 +155,10 @@ static snd_pcm_rate_ops_t pcm_src_ops = {
 	.convert_s16 = pcm_src_convert_s16,
 	.input_frames = input_frames,
 	.output_frames = output_frames,
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	.version = SND_PCM_RATE_PLUGIN_VERSION,
+	.get_supported_rates = get_supported_rates,
+#endif
 };
 
 static int pcm_src_open(unsigned int version, void **objp,
@@ -153,18 +166,24 @@ static int pcm_src_open(unsigned int version, void **objp,
 {
 	struct rate_src *rate;
 
+#if SND_PCM_RATE_PLUGIN_VERSION < 0x010002
 	if (version != SND_PCM_RATE_PLUGIN_VERSION) {
 		fprintf(stderr, "Invalid rate plugin version %x\n", version);
 		return -EINVAL;
 	}
-
+#endif
 	rate = calloc(1, sizeof(*rate));
 	if (! rate)
 		return -ENOMEM;
 	rate->converter = type;
 
 	*objp = rate;
-	*ops = pcm_src_ops;
+#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002
+	if (version == 0x010001)
+		memcpy(ops, &pcm_src_ops, sizeof(snd_pcm_rate_old_ops_t));
+	else
+#endif
+		*ops = pcm_src_ops;
 	return 0;
 }
 
