From d9871f36c19b91f4fa80bed3fe4feea38e17e41b Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 25 Apr 2022 20:43:18 +0200 Subject: [PATCH] pw-cat: support saving to other file formats Use the extension to find the file format and save to it instead of forcing wav. See #2328 --- src/tools/pw-cat.c | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/src/tools/pw-cat.c b/src/tools/pw-cat.c index e9bdd8c19..a1b022880 100644 --- a/src/tools/pw-cat.c +++ b/src/tools/pw-cat.c @@ -1120,6 +1120,45 @@ static int fill_properties(struct data *data) return 0; } +static void format_from_filename(SF_INFO *info, const char *filename) +{ + int i, count = 0; + int format = -1; + +#if __BYTE_ORDER == __BIG_ENDIAN + info->format |= SF_ENDIAN_BIG; +#else + info->format |= SF_ENDIAN_LITTLE; +#endif + + if (sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof(int)) != 0) + count = 0; + + for (i = 0; i < count; i++) { + SF_FORMAT_INFO fi; + + spa_zero(fi); + fi.format = i; + if (sf_command(NULL, SFC_GET_FORMAT_MAJOR, &fi, sizeof(fi)) != 0) + continue; + + if (spa_strendswith(filename, fi.extension)) { + format = fi.format; + break; + } + } + if (format == -1) + format = SF_FORMAT_WAV; + if (format == SF_FORMAT_WAV && info->channels > 2) + format = SF_FORMAT_WAVEX; + + info->format |= format; + + if (format == SF_FORMAT_OGG || format == SF_FORMAT_FLAC) + info->format = (info->format & ~SF_FORMAT_ENDMASK) | SF_ENDIAN_FILE; + if (format == SF_FORMAT_OGG) + info->format = (info->format & ~SF_FORMAT_SUBMASK) | SF_FORMAT_VORBIS; +} static int setup_sndfile(struct data *data) { @@ -1147,12 +1186,7 @@ static int setup_sndfile(struct data *data) fprintf(stderr, "error: unknown format \"%s\"\n", data->format); return -EINVAL; } - info.format |= SF_FORMAT_WAV; -#if __BYTE_ORDER == __BIG_ENDIAN - info.format |= SF_ENDIAN_BIG; -#else - info.format |= SF_ENDIAN_LITTLE; -#endif + format_from_filename(&info, data->filename); } data->file = sf_open(data->filename,