mirror of
https://gitlab.xiph.org/xiph/ezstream.git
synced 2024-11-03 04:17:18 -05:00
Add <language_tag />
This commit is contained in:
parent
8d882cacff
commit
9bb5b8d252
2
NEWS
2
NEWS
@ -1,5 +1,7 @@
|
||||
Changes in 1.0.2, released on XXXX-XX-XX:
|
||||
|
||||
* Add support for setting an RFC 5646 language tag on streams via the
|
||||
<language_tag/> option
|
||||
* Fix a crash, if metadata placeholders are configured for input files
|
||||
that do not contain the respective values. From gui-lux on Github (#16).
|
||||
* Fix a crash in one instance of querying the metadata program. From taku0220
|
||||
|
@ -359,6 +359,15 @@ stream input media files as-is.
|
||||
The configured encoder's output stream format must match what is configured
|
||||
in
|
||||
.Sy \&<format\ /\&> .
|
||||
.It Sy \&<language_tag\ /\&>
|
||||
RFC 5646 language tag, such as
|
||||
.Em en-US ,
|
||||
describing the target audience
|
||||
.Pq not necessarily the actual content
|
||||
language(s) of the stream.
|
||||
.Pp
|
||||
Default:
|
||||
.Em none
|
||||
.It Sy \&<stream_name\ /\&>
|
||||
Informational name of the broadcast.
|
||||
.Pp
|
||||
|
@ -114,6 +114,9 @@
|
||||
<!-- Encoder name (defined below) to use for (re)encoding -->
|
||||
<encoder>OggEnc-Q1.5</encoder>
|
||||
|
||||
<!-- RFC 5646 language tag describing target audience language(s) -->
|
||||
<language_tag>en-US, i-klingon</language_tag>
|
||||
|
||||
<!-- Various other informational settings -->
|
||||
<stream_name>Test Stream</stream_name>
|
||||
<stream_url>http://localhost:8000/</stream_url>
|
||||
|
@ -43,6 +43,7 @@ struct cfg_stream {
|
||||
char *stream_bitrate;
|
||||
char *stream_samplerate;
|
||||
char *stream_channels;
|
||||
char *language_tag;
|
||||
};
|
||||
|
||||
TAILQ_HEAD(cfg_stream_list, cfg_stream);
|
||||
@ -162,6 +163,7 @@ cfg_stream_destroy(struct cfg_stream **s_p)
|
||||
xfree(s->stream_bitrate);
|
||||
xfree(s->stream_samplerate);
|
||||
xfree(s->stream_channels);
|
||||
xfree(s->language_tag);
|
||||
xfree(s);
|
||||
*s_p = NULL;
|
||||
}
|
||||
@ -383,6 +385,16 @@ cfg_stream_set_stream_channels(struct cfg_stream *s,
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
cfg_stream_set_language_tag(struct cfg_stream *s,
|
||||
struct cfg_stream_list *not_used, const char *language_tag,
|
||||
const char **errstrp)
|
||||
{
|
||||
(void)not_used;
|
||||
SET_XSTRDUP(s->language_tag, language_tag, errstrp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
cfg_stream_validate(struct cfg_stream *s, const char **errstrp)
|
||||
{
|
||||
@ -490,3 +502,9 @@ cfg_stream_get_stream_channels(struct cfg_stream *s)
|
||||
{
|
||||
return (s->stream_channels);
|
||||
}
|
||||
|
||||
const char *
|
||||
cfg_stream_get_language_tag(struct cfg_stream *s)
|
||||
{
|
||||
return (s->language_tag);
|
||||
}
|
||||
|
@ -86,6 +86,8 @@ int cfg_stream_set_stream_samplerate(cfg_stream_t, cfg_stream_list_t,
|
||||
const char *, const char **);
|
||||
int cfg_stream_set_stream_channels(cfg_stream_t, cfg_stream_list_t,
|
||||
const char *, const char **);
|
||||
int cfg_stream_set_language_tag(cfg_stream_t, cfg_stream_list_t,
|
||||
const char *, const char **);
|
||||
|
||||
int cfg_stream_validate(cfg_stream_t, const char **);
|
||||
|
||||
@ -120,5 +122,7 @@ const char *
|
||||
cfg_stream_get_stream_samplerate(cfg_stream_t);
|
||||
const char *
|
||||
cfg_stream_get_stream_channels(cfg_stream_t);
|
||||
const char *
|
||||
cfg_stream_get_language_tag(cfg_stream_t);
|
||||
|
||||
#endif /* __CFG_STREAM_H__ */
|
||||
|
@ -163,6 +163,7 @@ _cfgfile_xml_parse_stream(xmlDocPtr doc, xmlNodePtr cur)
|
||||
XML_STREAM_SET(s, sl, cfg_stream_set_stream_bitrate, "stream_bitrate");
|
||||
XML_STREAM_SET(s, sl, cfg_stream_set_stream_samplerate, "stream_samplerate");
|
||||
XML_STREAM_SET(s, sl, cfg_stream_set_stream_channels, "stream_channels");
|
||||
XML_STREAM_SET(s, sl, cfg_stream_set_language_tag, "language_tag");
|
||||
}
|
||||
|
||||
if (0 > cfg_stream_validate(s, &errstr)) {
|
||||
|
@ -257,6 +257,13 @@ _stream_cfg_stream(struct stream *s, cfg_stream_t cfg_stream)
|
||||
s->name, cfg_stream_get_format_str(cfg_stream));
|
||||
return (-1);
|
||||
}
|
||||
if (cfg_stream_get_language_tag(cfg_stream) &&
|
||||
SHOUTERR_SUCCESS !=
|
||||
shout_set_content_language(s->shout, cfg_stream_get_language_tag(cfg_stream))) {
|
||||
log_error("stream: %s: language: %s",
|
||||
s->name, shout_get_error(s->shout));
|
||||
return (-1);
|
||||
}
|
||||
if (SHOUTERR_SUCCESS !=
|
||||
shout_set_public(s->shout, (unsigned int)cfg_stream_get_public(cfg_stream))) {
|
||||
log_error("stream: %s: public: %s",
|
||||
|
@ -200,6 +200,13 @@ START_TEST(test_stream_stream_channels)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_stream_language_tag)
|
||||
{
|
||||
TEST_XSTRDUP_T(cfg_stream_t, cfg_stream_list_get, streams,
|
||||
cfg_stream_set_language_tag, cfg_stream_get_language_tag);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_stream_validate)
|
||||
{
|
||||
cfg_stream_t str = cfg_stream_list_get(streams, "test_stream_validate");
|
||||
@ -244,6 +251,7 @@ cfg_suite(void)
|
||||
tcase_add_test(tc_stream, test_stream_stream_bitrate);
|
||||
tcase_add_test(tc_stream, test_stream_stream_samplerate);
|
||||
tcase_add_test(tc_stream, test_stream_stream_channels);
|
||||
tcase_add_test(tc_stream, test_stream_language_tag);
|
||||
tcase_add_test(tc_stream, test_stream_validate);
|
||||
suite_add_tcase(s, tc_stream);
|
||||
|
||||
|
@ -72,6 +72,7 @@ START_TEST(test_stream)
|
||||
ck_assert_int_eq(cfg_stream_set_stream_bitrate(str_cfg, streams, "test", NULL), 0);
|
||||
ck_assert_int_eq(cfg_stream_set_stream_samplerate(str_cfg, streams, "test", NULL), 0);
|
||||
ck_assert_int_eq(cfg_stream_set_stream_channels(str_cfg, streams, "test", NULL), 0);
|
||||
ck_assert_int_eq(cfg_stream_set_language_tag(str_cfg, streams, "test", NULL), 0);
|
||||
ck_assert_int_eq(cfg_stream_set_public(str_cfg, streams, "true", NULL), 0);
|
||||
ck_assert_int_eq(stream_configure(s), 0);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user