summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2009-06-02 16:30:06 +0200
committerTakashi Iwai <tiwai@suse.de>2009-06-02 16:30:06 +0200
commit76e0c15ce430e4ae04d4cb14760be0bf20365500 (patch)
tree04996b4025879c192f9be5611d331d156591b31f
parente79761b9a0a7e877e4abe772cefbafbed6cf115f (diff)
Add PCM rates query support for PCM rate plugins
Follow the new PCM rate-plugin protocol to support the rate range queries, etc. Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--pph/rate_speexrate.c35
-rw-r--r--rate-lavc/rate_lavcrate.c29
-rw-r--r--rate/rate_samplerate.c29
3 files changed, 87 insertions, 6 deletions
diff --git a/pph/rate_speexrate.c b/pph/rate_speexrate.c
index 38244b6..0a1325c 100644
--- a/pph/rate_speexrate.c
+++ b/pph/rate_speexrate.c
@@ -116,6 +116,26 @@ 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;
+}
+
+static void dump(void *obj, snd_output_t *out)
+{
+ snd_output_printf(out, "Converter: libspeex "
+#ifdef USE_LIBSPEEX
+ "(external)"
+#else
+ "(builtin)"
+#endif
+ "\n");
+}
+#endif
+
static snd_pcm_rate_ops_t pcm_src_ops = {
.close = pcm_src_close,
.init = pcm_src_init,
@@ -125,6 +145,11 @@ 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,
+ .dump = dump,
+#endif
};
static int pcm_src_open(unsigned int version, void **objp,
@@ -132,18 +157,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..14a2198 100644
--- a/rate-lavc/rate_lavcrate.c
+++ b/rate-lavc/rate_lavcrate.c
@@ -202,6 +202,20 @@ 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;
+}
+
+static void dump(void *obj, snd_output_t *out)
+{
+ snd_output_printf(out, "Converter: liblavc\n");
+}
+#endif
+
static snd_pcm_rate_ops_t pcm_src_ops = {
.close = pcm_src_close,
.init = pcm_src_init,
@@ -211,6 +225,11 @@ 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,
+ .dump = dump,
+#endif
};
int pcm_src_open(unsigned int version, void **objp, snd_pcm_rate_ops_t *ops)
@@ -218,18 +237,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..53a0627 100644
--- a/rate/rate_samplerate.c
+++ b/rate/rate_samplerate.c
@@ -137,6 +137,20 @@ 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;
+}
+
+static void dump(void *obj, snd_output_t *out)
+{
+ snd_output_printf(out, "Converter: libsamplerate\n");
+}
+#endif
+
static snd_pcm_rate_ops_t pcm_src_ops = {
.close = pcm_src_close,
.init = pcm_src_init,
@@ -146,6 +160,11 @@ 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,
+ .dump = dump,
+#endif
};
static int pcm_src_open(unsigned int version, void **objp,
@@ -153,18 +172,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;
}