pw-cat: support some more formats

So that you can give an .oga extension and --format=opus to get an
opus ogg file.
This commit is contained in:
Wim Taymans 2026-01-22 16:31:01 +01:00
parent f2c4452e8d
commit 35817c0d85

View File

@ -211,6 +211,12 @@ static const struct format_info {
{ "s32", SF_FORMAT_PCM_32, SPA_AUDIO_FORMAT_S32, 4 },
{ "f32", SF_FORMAT_FLOAT, SPA_AUDIO_FORMAT_F32, 4 },
{ "f64", SF_FORMAT_DOUBLE, SPA_AUDIO_FORMAT_F32, 8 },
{ "mp1", SF_FORMAT_MPEG_LAYER_I, SPA_AUDIO_FORMAT_F32, 1 },
{ "mp2", SF_FORMAT_MPEG_LAYER_II, SPA_AUDIO_FORMAT_F32, 1 },
{ "mp3", SF_FORMAT_MPEG_LAYER_III, SPA_AUDIO_FORMAT_F32, 1 },
{ "vorbis", SF_FORMAT_VORBIS, SPA_AUDIO_FORMAT_F32, 1 },
{ "opus", SF_FORMAT_OPUS, SPA_AUDIO_FORMAT_F32, 1 },
};
static const struct format_info *format_info_by_name(const char *str)
@ -1678,12 +1684,6 @@ 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;
@ -1724,12 +1724,18 @@ static void format_from_filename(SF_INFO *info, const char *filename)
if (format == SF_FORMAT_WAV && info->channels > 2)
format = SF_FORMAT_WAVEX;
switch (format & SF_FORMAT_TYPEMASK) {
case SF_FORMAT_OGG:
case SF_FORMAT_FLAC:
case SF_FORMAT_MPEG:
case SF_FORMAT_AIFF:
info->format |= SF_ENDIAN_FILE;
break;
default:
info->format |= SF_ENDIAN_CPU;
break;
}
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;
}
#ifdef HAVE_PW_CAT_FFMPEG_INTEGRATION