Dne Mon, 30 Nov 2009 11:12:38 +0100 Michael Schwendt napsal(a):
On Mon, 30 Nov 2009 10:38:15 +0100, Michal wrote:
> Dne Mon, 30 Nov 2009 07:05:28 -0200 Paulo Cavalcanti napsal(a):
> > Thanks for the explanation.
> >
> > At least 3 applications are not restoring the volumes:
> >
> > xmms, mplayer and audacious.
>
> Interesting. Maybe these programs try to be too clever and force the
> volume themselves.
It's not an attempt at being "too clever", but several upstream
developers feel lost in what they have to do or what they have not to
do to get something right. Temporarily, Audacious devlopers have
dropped their "pulse_audio" driver (originally from XMMS) even, since
they were of the impression that "it didn't work anyway". Ubuntu
users currently feel punished with Pulse Audio. With a first bunch of
fixes [for volume issues in Fedora 12 Rawhide, volume decreased for
every new song], the driver was restored again for Audacious 2.2
development. With more recent changes in Pulse Audio, it seems, more
changes are necessary. But Audacious 2.1 cannot reflect external
volume level changes in its UI anyway. Its volume slider cannot move
for volume level changes made with external tools. Only the next
release can do that, and it suffers from new bugs (such as a bug in
alsa-lib that will require an update in Fedora, too).
Thanks for the explanation. Before I saw your reply, I played with
audacious-plugins and made a kludge to prevent it from forcing 100 %
volume on startup. It probably breaks something else, I haven't really
tested it too much.
Notice that the documentation for pa_stream_connect_playback strongly
recommends passing NULL as volume.
Index: audacious-plugins-fedora-2.1/src/pulse_audio/pulse_audio.c
===================================================================
--- audacious-plugins-fedora-2.1.orig/src/pulse_audio/pulse_audio.c
+++ audacious-plugins-fedora-2.1/src/pulse_audio/pulse_audio.c
@@ -666,7 +666,7 @@ static int pulse_open(AFormat fmt, int r
pa_stream_set_write_callback(stream, stream_request_cb, NULL);
pa_stream_set_latency_update_callback(stream, stream_latency_update_cb, NULL);
- if (pa_stream_connect_playback(stream, NULL, NULL,
PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE, &volume, NULL) < 0) {
+ if (pa_stream_connect_playback(stream, NULL, NULL,
PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL) < 0) {
AUDDBG("Failed to connect stream: %s",
pa_strerror(pa_context_errno(context)));
goto unlock_and_fail;
}
@@ -715,6 +715,7 @@ static int pulse_open(AFormat fmt, int r
}
pa_operation_unref(o);
+#if 0
/* set initial volume */
if (!(o = pa_context_set_sink_input_volume(context, pa_stream_get_index(stream),
&volume, NULL, NULL))) {
g_warning("pa_context_set_sink_input_volume() failed: %s",
pa_strerror(pa_context_errno(context)));
@@ -725,6 +726,7 @@ static int pulse_open(AFormat fmt, int r
pa_threaded_mainloop_wait(mainloop);
}
pa_operation_unref(o);
+#endif
do_trigger = 0;
written = 0;