pw-cat: parse metadata and make a nice media.name if possible

This commit is contained in:
Wim Taymans 2020-10-20 17:11:00 +02:00
parent ff99a48acf
commit 74eaf5a2ca
2 changed files with 50 additions and 0 deletions

View file

@ -254,6 +254,9 @@ extern "C" {
* PNG image data */ * PNG image data */
#define PW_KEY_MEDIA_ICON_NAME "media.icon-name" /**< an XDG icon name for the media. #define PW_KEY_MEDIA_ICON_NAME "media.icon-name" /**< an XDG icon name for the media.
* Ex: "audio-x-mp3" */ * Ex: "audio-x-mp3" */
#define PW_KEY_MEDIA_COMMENT "media.comment" /**< extra comment */
#define PW_KEY_MEDIA_DATE "media.date" /**< date of the media */
#define PW_KEY_MEDIA_FORMAT "media.format" /**< format of the media */
/** format related properties */ /** format related properties */
#define PW_KEY_FORMAT_DSP "format.dsp" /**< a dsp format. #define PW_KEY_FORMAT_DSP "format.dsp" /**< a dsp format.

View file

@ -1103,6 +1103,52 @@ static int setup_midifile(struct data *data)
return 0; return 0;
} }
static int fill_properties(struct data *data)
{
static const char* table[] = {
[SF_STR_TITLE] = PW_KEY_MEDIA_TITLE,
[SF_STR_COPYRIGHT] = PW_KEY_MEDIA_COPYRIGHT,
[SF_STR_SOFTWARE] = PW_KEY_MEDIA_SOFTWARE,
[SF_STR_ARTIST] = PW_KEY_MEDIA_ARTIST,
[SF_STR_COMMENT] = PW_KEY_MEDIA_COMMENT,
[SF_STR_DATE] = PW_KEY_MEDIA_DATE
};
SF_INFO sfi;
SF_FORMAT_INFO fi;
int res;
unsigned c;
const char *s, *t;
for (c = 0; c < SPA_N_ELEMENTS(table); c++) {
if (table[c] == NULL)
continue;
if ((s = sf_get_string(data->file, c)) == NULL)
continue;
pw_properties_set(data->props, table[c], s);
}
spa_zero(sfi);
if ((res = sf_command(data->file, SFC_GET_CURRENT_SF_INFO, &sfi, sizeof(sfi)))) {
pw_log_error("sndfile: %s", sf_error_number(res));
return -EIO;
}
spa_zero(fi);
fi.format = sfi.format;
if (sf_command(data->file, SFC_GET_FORMAT_INFO, &fi, sizeof(fi)) == 0 && fi.name)
pw_properties_set(data->props, PW_KEY_MEDIA_FORMAT, fi.name);
s = pw_properties_get(data->props, PW_KEY_MEDIA_TITLE);
t = pw_properties_get(data->props, PW_KEY_MEDIA_ARTIST);
if (s && t)
pw_properties_setf(data->props, PW_KEY_MEDIA_NAME,
"'%s' / '%s'", s, t);
return 0;
}
static int setup_sndfile(struct data *data) static int setup_sndfile(struct data *data)
{ {
SF_INFO info; SF_INFO info;
@ -1179,6 +1225,7 @@ static int setup_sndfile(struct data *data)
printf("\n"); printf("\n");
} }
} }
fill_properties(data);
} }
data->samplesize = sf_format_samplesize(info.format); data->samplesize = sf_format_samplesize(info.format);
data->stride = data->samplesize * data->channels; data->stride = data->samplesize * data->channels;