mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-29 05:40:27 -04:00
pw-cat: support stdin/stdout for input/output
A - filename will read or write from the stdin/out. Fixes #2387
This commit is contained in:
parent
b81b7febee
commit
81eee88dd8
1 changed files with 75 additions and 15 deletions
|
|
@ -869,7 +869,7 @@ static void show_usage(const char *name, bool is_error)
|
||||||
fp = is_error ? stderr : stdout;
|
fp = is_error ? stderr : stdout;
|
||||||
|
|
||||||
fprintf(fp,
|
fprintf(fp,
|
||||||
_("%s [options] <file>\n"
|
_("%s [options] [<file>|-]\n"
|
||||||
" -h, --help Show this help\n"
|
" -h, --help Show this help\n"
|
||||||
" --version Show version\n"
|
" --version Show version\n"
|
||||||
" -v, --verbose Enable verbose operations\n"
|
" -v, --verbose Enable verbose operations\n"
|
||||||
|
|
@ -1076,6 +1076,62 @@ static int setup_dsffile(struct data *data)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct format_info {
|
||||||
|
const char *name;
|
||||||
|
uint32_t spa_format;
|
||||||
|
uint32_t width;
|
||||||
|
} format_info[] = {
|
||||||
|
{ "s8", SPA_AUDIO_FORMAT_S8, 1 },
|
||||||
|
{ "u8", SPA_AUDIO_FORMAT_U8, 1 },
|
||||||
|
{ "s16", SPA_AUDIO_FORMAT_S16, 2 },
|
||||||
|
{ "s24", SPA_AUDIO_FORMAT_S24, 3 },
|
||||||
|
{ "s32", SPA_AUDIO_FORMAT_S32, 4 },
|
||||||
|
{ "f32", SPA_AUDIO_FORMAT_F32, 4 },
|
||||||
|
{ "f64", SPA_AUDIO_FORMAT_F32, 8 },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct format_info *format_info_by_name(const char *str)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0; i < SPA_N_ELEMENTS(format_info); i++)
|
||||||
|
if (spa_streq(str, format_info[i].name))
|
||||||
|
return &format_info[i];
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stdout_record(struct data *d, void *src, unsigned int n_frames)
|
||||||
|
{
|
||||||
|
return fwrite(src, d->stride, n_frames, stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int stdin_play(struct data *d, void *src, unsigned int n_frames)
|
||||||
|
{
|
||||||
|
return fread(src, d->stride, n_frames, stdin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int setup_pipe(struct data *data)
|
||||||
|
{
|
||||||
|
struct format_info *info;
|
||||||
|
|
||||||
|
if (data->format == NULL)
|
||||||
|
data->format = DEFAULT_FORMAT;
|
||||||
|
if (data->channels == 0)
|
||||||
|
data->channels = DEFAULT_CHANNELS;
|
||||||
|
if (data->rate == 0)
|
||||||
|
data->rate = DEFAULT_RATE;
|
||||||
|
if (data->channelmap.n_channels == 0)
|
||||||
|
channelmap_default(&data->channelmap, data->channels);
|
||||||
|
|
||||||
|
info = format_info_by_name(data->format);
|
||||||
|
if (info == NULL)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
data->spa_format = info->spa_format;
|
||||||
|
data->stride = info->width * data->channels;
|
||||||
|
data->fill = data->mode == mode_playback ? stdin_play : stdout_record;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int fill_properties(struct data *data)
|
static int fill_properties(struct data *data)
|
||||||
{
|
{
|
||||||
static const char * const table[] = {
|
static const char * const table[] = {
|
||||||
|
|
@ -1515,7 +1571,7 @@ int main(int argc, char *argv[])
|
||||||
data.volume = DEFAULT_VOLUME;
|
data.volume = DEFAULT_VOLUME;
|
||||||
|
|
||||||
if (optind >= argc) {
|
if (optind >= argc) {
|
||||||
fprintf(stderr, "error: filename argument missing\n");
|
fprintf(stderr, "error: filename or - argument missing\n");
|
||||||
goto error_usage;
|
goto error_usage;
|
||||||
}
|
}
|
||||||
data.filename = argv[optind++];
|
data.filename = argv[optind++];
|
||||||
|
|
@ -1560,19 +1616,23 @@ int main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
pw_core_add_listener(data.core, &data.core_listener, &core_events, &data);
|
pw_core_add_listener(data.core, &data.core_listener, &core_events, &data);
|
||||||
|
|
||||||
switch (data.data_type) {
|
if (spa_streq(data.filename, "-")) {
|
||||||
case TYPE_PCM:
|
ret = setup_pipe(&data);
|
||||||
ret = setup_sndfile(&data);
|
} else {
|
||||||
break;
|
switch (data.data_type) {
|
||||||
case TYPE_MIDI:
|
case TYPE_PCM:
|
||||||
ret = setup_midifile(&data);
|
ret = setup_sndfile(&data);
|
||||||
break;
|
break;
|
||||||
case TYPE_DSD:
|
case TYPE_MIDI:
|
||||||
ret = setup_dsffile(&data);
|
ret = setup_midifile(&data);
|
||||||
break;
|
break;
|
||||||
default:
|
case TYPE_DSD:
|
||||||
ret = -ENOTSUP;
|
ret = setup_dsffile(&data);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
ret = -ENOTSUP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue