mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
libpulse: introduce PA_STREAM_RELATIVE_VOLUME
This commit is contained in:
parent
546bcf3f2f
commit
f27a50691c
5 changed files with 39 additions and 6 deletions
6
PROTOCOL
6
PROTOCOL
|
|
@ -188,3 +188,9 @@ new messages:
|
||||||
|
|
||||||
PA_COMMAND_SET_SINK_PORT
|
PA_COMMAND_SET_SINK_PORT
|
||||||
PA_COMMAND_SET_SOURCE_PORT
|
PA_COMMAND_SET_SOURCE_PORT
|
||||||
|
|
||||||
|
## v17, implemented by >= 0.9.20
|
||||||
|
|
||||||
|
new flag at end of CREATE_PLAYBACK_STREAM:
|
||||||
|
|
||||||
|
bool relative_volume
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ AC_SUBST(PA_MAJORMINORMICRO, pa_major.pa_minor.pa_micro)
|
||||||
AC_SUBST(PACKAGE_URL, [http://pulseaudio.org/])
|
AC_SUBST(PACKAGE_URL, [http://pulseaudio.org/])
|
||||||
|
|
||||||
AC_SUBST(PA_API_VERSION, 12)
|
AC_SUBST(PA_API_VERSION, 12)
|
||||||
AC_SUBST(PA_PROTOCOL_VERSION, 16)
|
AC_SUBST(PA_PROTOCOL_VERSION, 17)
|
||||||
|
|
||||||
# The stable ABI for client applications, for the version info x:y:z
|
# The stable ABI for client applications, for the version info x:y:z
|
||||||
# always will hold y=z
|
# always will hold y=z
|
||||||
|
|
|
||||||
|
|
@ -276,11 +276,18 @@ typedef enum pa_stream_flags {
|
||||||
* whether to create the stream in muted or in unmuted
|
* whether to create the stream in muted or in unmuted
|
||||||
* state. \since 0.9.15 */
|
* state. \since 0.9.15 */
|
||||||
|
|
||||||
PA_STREAM_FAIL_ON_SUSPEND = 0x20000U
|
PA_STREAM_FAIL_ON_SUSPEND = 0x20000U,
|
||||||
/**< If the sink/source this stream is connected to is suspended
|
/**< If the sink/source this stream is connected to is suspended
|
||||||
* during the creation of this stream, cause it to fail. If the
|
* during the creation of this stream, cause it to fail. If the
|
||||||
* sink/source is being suspended during creation of this stream,
|
* sink/source is being suspended during creation of this stream,
|
||||||
* make sure this stream is terminated. \since 0.9.15 */
|
* make sure this stream is terminated. \since 0.9.15 */
|
||||||
|
|
||||||
|
PA_STREAM_RELATIVE_VOLUME = 0x40000U,
|
||||||
|
/**< If a volume is passed when this stream is created, consider
|
||||||
|
* it relative to the sink's current volume, never as absolute
|
||||||
|
* device volume. If this is not specified the volume will be
|
||||||
|
* consider absolute when the sink is in flat volume mode,
|
||||||
|
* relative otherwise. \since 0.9.20 */
|
||||||
} pa_stream_flags_t;
|
} pa_stream_flags_t;
|
||||||
|
|
||||||
/** \cond fulldocs */
|
/** \cond fulldocs */
|
||||||
|
|
@ -307,6 +314,7 @@ typedef enum pa_stream_flags {
|
||||||
#define PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND
|
#define PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND
|
||||||
#define PA_STREAM_START_UNMUTED PA_STREAM_START_UNMUTED
|
#define PA_STREAM_START_UNMUTED PA_STREAM_START_UNMUTED
|
||||||
#define PA_STREAM_FAIL_ON_SUSPEND PA_STREAM_FAIL_ON_SUSPEND
|
#define PA_STREAM_FAIL_ON_SUSPEND PA_STREAM_FAIL_ON_SUSPEND
|
||||||
|
#define PA_STREAM_RELATIVE_VOLUME PA_STREAM_RELATIVE_VOLUME
|
||||||
|
|
||||||
/** \endcond */
|
/** \endcond */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1025,7 +1025,8 @@ static int create_stream(
|
||||||
PA_STREAM_EARLY_REQUESTS|
|
PA_STREAM_EARLY_REQUESTS|
|
||||||
PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND|
|
PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND|
|
||||||
PA_STREAM_START_UNMUTED|
|
PA_STREAM_START_UNMUTED|
|
||||||
PA_STREAM_FAIL_ON_SUSPEND)), PA_ERR_INVALID);
|
PA_STREAM_FAIL_ON_SUSPEND|
|
||||||
|
PA_STREAM_RELATIVE_VOLUME)), PA_ERR_INVALID);
|
||||||
|
|
||||||
PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_ERR_NOTSUPPORTED);
|
PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_ERR_NOTSUPPORTED);
|
||||||
PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ERR_NOTSUPPORTED);
|
PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ERR_NOTSUPPORTED);
|
||||||
|
|
@ -1158,6 +1159,13 @@ static int create_stream(
|
||||||
pa_tagstruct_put_boolean(t, flags & PA_STREAM_FAIL_ON_SUSPEND);
|
pa_tagstruct_put_boolean(t, flags & PA_STREAM_FAIL_ON_SUSPEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s->context->version >= 17) {
|
||||||
|
|
||||||
|
if (s->direction == PA_STREAM_PLAYBACK)
|
||||||
|
pa_tagstruct_put_boolean(t, flags & PA_STREAM_RELATIVE_VOLUME);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
pa_pstream_send_tagstruct(s->context->pstream, t);
|
pa_pstream_send_tagstruct(s->context->pstream, t);
|
||||||
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);
|
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1002,6 +1002,7 @@ static playback_stream* playback_stream_new(
|
||||||
pa_proplist *p,
|
pa_proplist *p,
|
||||||
pa_bool_t adjust_latency,
|
pa_bool_t adjust_latency,
|
||||||
pa_bool_t early_requests,
|
pa_bool_t early_requests,
|
||||||
|
pa_bool_t relative_volume,
|
||||||
int *ret) {
|
int *ret) {
|
||||||
|
|
||||||
playback_stream *s, *ssync;
|
playback_stream *s, *ssync;
|
||||||
|
|
@ -1052,7 +1053,7 @@ static playback_stream* playback_stream_new(
|
||||||
pa_sink_input_new_data_set_channel_map(&data, map);
|
pa_sink_input_new_data_set_channel_map(&data, map);
|
||||||
if (volume) {
|
if (volume) {
|
||||||
pa_sink_input_new_data_set_volume(&data, volume);
|
pa_sink_input_new_data_set_volume(&data, volume);
|
||||||
data.volume_is_absolute = TRUE;
|
data.volume_is_absolute = !relative_volume;
|
||||||
data.save_volume = TRUE;
|
data.save_volume = TRUE;
|
||||||
}
|
}
|
||||||
if (muted_set) {
|
if (muted_set) {
|
||||||
|
|
@ -1846,7 +1847,8 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
|
||||||
early_requests = FALSE,
|
early_requests = FALSE,
|
||||||
dont_inhibit_auto_suspend = FALSE,
|
dont_inhibit_auto_suspend = FALSE,
|
||||||
muted_set = FALSE,
|
muted_set = FALSE,
|
||||||
fail_on_suspend = FALSE;
|
fail_on_suspend = FALSE,
|
||||||
|
relative_volume = FALSE;
|
||||||
pa_sink_input_flags_t flags = 0;
|
pa_sink_input_flags_t flags = 0;
|
||||||
pa_proplist *p;
|
pa_proplist *p;
|
||||||
pa_bool_t volume_set = TRUE;
|
pa_bool_t volume_set = TRUE;
|
||||||
|
|
@ -1939,6 +1941,15 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c->version >= 17) {
|
||||||
|
|
||||||
|
if (pa_tagstruct_get_boolean(t, &relative_volume) < 0) {
|
||||||
|
protocol_error(c);
|
||||||
|
pa_proplist_free(p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!pa_tagstruct_eof(t)) {
|
if (!pa_tagstruct_eof(t)) {
|
||||||
protocol_error(c);
|
protocol_error(c);
|
||||||
pa_proplist_free(p);
|
pa_proplist_free(p);
|
||||||
|
|
@ -1978,7 +1989,7 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
|
||||||
* flag. For older versions we synthesize it here */
|
* flag. For older versions we synthesize it here */
|
||||||
muted_set = muted_set || muted;
|
muted_set = muted_set || muted;
|
||||||
|
|
||||||
s = playback_stream_new(c, sink, &ss, &map, &attr, volume_set ? &volume : NULL, muted, muted_set, syncid, &missing, flags, p, adjust_latency, early_requests, &ret);
|
s = playback_stream_new(c, sink, &ss, &map, &attr, volume_set ? &volume : NULL, muted, muted_set, syncid, &missing, flags, p, adjust_latency, early_requests, relative_volume, &ret);
|
||||||
pa_proplist_free(p);
|
pa_proplist_free(p);
|
||||||
|
|
||||||
CHECK_VALIDITY(c->pstream, s, tag, ret);
|
CHECK_VALIDITY(c->pstream, s, tag, ret);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue