pw-cat: add support for streaming

sndfile actually supports reading and writing from/to stdin/out with the -
filename, so allow that.

Add support for streaming in dsf, dff and midifile as well.

Add a -a option to pw-cat use a pipe with raw bytes, otherwise try to
use the parsers and sndfile to read/write from/to stdin/stdout.

You can then do things like:

 sox 2L-053_04_stereo-DSD64.dff -t dsf -  | pw-cat -pdv -

 pw-cat 07.Joe.Satriani.Clouds.race.across.the.sky.wav | pw-cat -pv -

 pw-cat -rmv --target=0 - | pw-mididump -

Fixes: #4204
This commit is contained in:
Wim Taymans 2024-08-23 15:36:34 +02:00
parent d9bd2628d9
commit 19f4fac1e1
4 changed files with 343 additions and 233 deletions

View file

@ -103,6 +103,7 @@ struct data {
#define TYPE_ENCODED 3
#endif
int data_type;
bool raw;
const char *remote_name;
const char *media_type;
const char *media_category;
@ -980,6 +981,7 @@ static const struct option long_options[] = {
{ "format", required_argument, NULL, OPT_FORMAT },
{ "volume", required_argument, NULL, OPT_VOLUME },
{ "quality", required_argument, NULL, 'q' },
{ "raw", no_argument, NULL, 'a' },
{ NULL, 0, NULL, 0 }
};
@ -1024,6 +1026,7 @@ static void show_usage(const char *name, bool is_error)
" --format Sample format %s (req. for rec) (default %s)\n"
" --volume Stream volume 0-1.0 (default %.3f)\n"
" -q --quality Resampler quality (0 - 15) (default %d)\n"
" -a, --raw RAW mode\n"
"\n"),
DEFAULT_RATE,
DEFAULT_CHANNELS,
@ -1691,9 +1694,9 @@ int main(int argc, char *argv[])
}
#ifdef HAVE_PW_CAT_FFMPEG_INTEGRATION
while ((c = getopt_long(argc, argv, "hvprmdoR:q:P:", long_options, NULL)) != -1) {
while ((c = getopt_long(argc, argv, "hvprmdoR:q:P:a", long_options, NULL)) != -1) {
#else
while ((c = getopt_long(argc, argv, "hvprmdR:q:P:", long_options, NULL)) != -1) {
while ((c = getopt_long(argc, argv, "hvprmdR:q:P:a", long_options, NULL)) != -1) {
#endif
switch (c) {
@ -1745,6 +1748,10 @@ int main(int argc, char *argv[])
data.quality = atoi(optarg);
break;
case 'a':
data.raw = true;
break;
case OPT_MEDIA_TYPE:
data.media_type = optarg;
break;
@ -1893,7 +1900,7 @@ int main(int argc, char *argv[])
}
pw_core_add_listener(data.core, &data.core_listener, &core_events, &data);
if (spa_streq(data.filename, "-")) {
if (data.raw) {
ret = setup_pipe(&data);
} else {
switch (data.data_type) {