pulseaudio: add a bunch of patches from Fedora, bumprev.

This commit is contained in:
Juan RP 2010-11-23 02:57:43 +01:00
parent 11f9b62b45
commit 3b529f8b20
66 changed files with 5375 additions and 3 deletions

View file

@ -9,7 +9,7 @@ long_desc="
This package provides client libraries used by applications that access a
PulseAudio sound server via PulseAudio's native interface."
revision=1
revision=2
Add_dependency run glibc
Add_dependency run libltdl

View file

@ -0,0 +1,289 @@
From c41ee00893b6b0d5cc48ee041b8e4835eac548f0 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 8 Jan 2010 20:06:21 +0100
Subject: [PATCH 01/62] dbus: remove filter functions only if they were actually set before
This fixes an assert when destructing modules that have not been fully
initialized.
https://bugzilla.redhat.com/show_bug.cgi?id=548525
---
src/modules/bluetooth/bluetooth-util.c | 5 +++-
src/modules/bluetooth/module-bluetooth-device.c | 7 ++++-
src/modules/bluetooth/module-bluetooth-proximity.c | 11 ++++----
src/modules/module-console-kit.c | 9 +++++-
src/modules/module-hal-detect.c | 10 ++++----
src/pulse/context.c | 25 ++++---------------
src/pulse/internal.h | 1 +
7 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 47d6200..795d510 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -37,6 +37,7 @@ struct pa_bluetooth_discovery {
PA_LLIST_HEAD(pa_dbus_pending, pending);
pa_hashmap *devices;
pa_hook hook;
+ pa_bool_t filter_added;
};
static void get_properties_reply(DBusPendingCall *pending, void *userdata);
@@ -788,6 +789,7 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
pa_log_error("Failed to add filter function");
goto fail;
}
+ y->filter_added = TRUE;
if (pa_dbus_add_matches(
pa_dbus_connection_get(y->connection), &err,
@@ -856,7 +858,8 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
"type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'",
"type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL);
- dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y);
+ if (y->filter_added)
+ dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y);
pa_dbus_connection_unref(y->connection);
}
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 0ba1421..19676df 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -179,6 +179,8 @@ struct userdata {
int stream_write_type;
int service_write_type, service_read_type;
+
+ pa_bool_t filter_added;
};
#define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
@@ -2405,6 +2407,7 @@ int pa__init(pa_module* m) {
pa_log_error("Failed to add filter function");
goto fail;
}
+ u->filter_added = TRUE;
speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
@@ -2494,7 +2497,9 @@ void pa__done(pa_module *m) {
pa_xfree(mike);
}
- dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+ if (u->filter_added)
+ dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+
pa_dbus_connection_unref(u->connection);
}
diff --git a/src/modules/bluetooth/module-bluetooth-proximity.c b/src/modules/bluetooth/module-bluetooth-proximity.c
index c4cfd73..3eed9ce 100644
--- a/src/modules/bluetooth/module-bluetooth-proximity.c
+++ b/src/modules/bluetooth/module-bluetooth-proximity.c
@@ -92,7 +92,8 @@ struct userdata {
unsigned n_found;
unsigned n_unknown;
- pa_bool_t muted;
+ pa_bool_t muted:1;
+ pa_bool_t filter_added:1;
};
static void update_volume(struct userdata *u) {
@@ -358,9 +359,10 @@ static int add_matches(struct userdata *u, pa_bool_t add) {
} else
dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e);
- if (add)
+ if (add) {
pa_assert_se(dbus_connection_add_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u, NULL));
- else
+ u->filter_added = TRUE;
+ } else if (u->filter_added)
dbus_connection_remove_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u);
r = 0;
@@ -393,9 +395,6 @@ int pa__init(pa_module*m) {
u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
u->hci = pa_xstrdup(pa_modargs_get_value(ma, "hci", DEFAULT_HCI));
u->hci_path = pa_sprintf_malloc("/org/bluez/%s", u->hci);
- u->n_found = u->n_unknown = 0;
- u->muted = FALSE;
-
u->bondings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
if (!(u->dbus_connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &e))) {
diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c
index 103f5c4..875852f 100644
--- a/src/modules/module-console-kit.c
+++ b/src/modules/module-console-kit.c
@@ -67,6 +67,7 @@ struct userdata {
pa_core *core;
pa_dbus_connection *connection;
pa_hashmap *sessions;
+ pa_bool_t filter_added;
};
static void add_session(struct userdata *u, const char *id) {
@@ -300,7 +301,7 @@ int pa__init(pa_module*m) {
goto fail;
}
- m->userdata = u = pa_xnew(struct userdata, 1);
+ m->userdata = u = pa_xnew0(struct userdata, 1);
u->core = m->core;
u->module = m;
u->connection = connection;
@@ -311,6 +312,8 @@ int pa__init(pa_module*m) {
goto fail;
}
+ u->filter_added = TRUE;
+
if (pa_dbus_add_matches(
pa_dbus_connection_get(connection), &error,
"type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'",
@@ -359,7 +362,9 @@ void pa__done(pa_module *m) {
"type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'",
"type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionRemoved'", NULL);
- dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+ if (u->filter_added)
+ dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+
pa_dbus_connection_unref(u->connection);
}
diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c
index 1851913..23d4010 100644
--- a/src/modules/module-hal-detect.c
+++ b/src/modules/module-hal-detect.c
@@ -87,6 +87,7 @@ struct userdata {
#ifdef HAVE_OSS_OUTPUT
pa_bool_t init_subdevs;
#endif
+ pa_bool_t filter_added:1;
};
#define CAPABILITY_ALSA "alsa"
@@ -733,12 +734,9 @@ int pa__init(pa_module*m) {
goto fail;
}
- m->userdata = u = pa_xnew(struct userdata, 1);
+ m->userdata = u = pa_xnew0(struct userdata, 1);
u->core = m->core;
- u->context = NULL;
- u->connection = NULL;
u->devices = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
- u->capability = NULL;
#ifdef HAVE_ALSA
u->use_tsched = TRUE;
@@ -800,6 +798,7 @@ int pa__init(pa_module*m) {
pa_log_error("Failed to add filter function");
goto fail;
}
+ u->filter_added = TRUE;
if (pa_dbus_add_matches(
pa_dbus_connection_get(u->connection), &error,
@@ -856,7 +855,8 @@ void pa__done(pa_module *m) {
"type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLRemoved'",
"type='signal',interface='org.pulseaudio.Server',member='DirtyGiveUpMessage'", NULL);
- dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+ if (u->filter_added)
+ dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
pa_dbus_connection_unref(u->connection);
}
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 7468d0a..c83230d 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -145,7 +145,7 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
pa_init_i18n();
- c = pa_xnew(pa_context, 1);
+ c = pa_xnew0(pa_context, 1);
PA_REFCNT_INIT(c);
c->proplist = p ? pa_proplist_copy(p) : pa_proplist_new();
@@ -157,9 +157,6 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
c->system_bus = c->session_bus = NULL;
#endif
c->mainloop = mainloop;
- c->client = NULL;
- c->pstream = NULL;
- c->pdispatch = NULL;
c->playback_streams = pa_dynarray_new();
c->record_streams = pa_dynarray_new();
c->client_index = PA_INVALID_INDEX;
@@ -170,22 +167,9 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
c->error = PA_OK;
c->state = PA_CONTEXT_UNCONNECTED;
- c->ctag = 0;
- c->csyncid = 0;
reset_callbacks(c);
- c->is_local = FALSE;
- c->server_list = NULL;
- c->server = NULL;
-
- c->do_shm = FALSE;
-
- c->server_specified = FALSE;
- c->no_fail = FALSE;
- c->do_autospawn = FALSE;
- memset(&c->spawn_api, 0, sizeof(c->spawn_api));
-
#ifndef MSG_NOSIGNAL
#ifdef SIGPIPE
pa_check_signal_is_blocked(SIGPIPE);
@@ -255,12 +239,14 @@ static void context_free(pa_context *c) {
#ifdef HAVE_DBUS
if (c->system_bus) {
- dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->system_bus), filter_cb, c);
+ if (c->filter_added)
+ dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->system_bus), filter_cb, c);
pa_dbus_wrap_connection_free(c->system_bus);
}
if (c->session_bus) {
- dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->session_bus), filter_cb, c);
+ if (c->filter_added)
+ dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->session_bus), filter_cb, c);
pa_dbus_wrap_connection_free(c->session_bus);
}
#endif
@@ -794,6 +780,7 @@ static void track_pulseaudio_on_dbus(pa_context *c, DBusBusType type, pa_dbus_wr
pa_log_warn("Failed to add filter function");
goto fail;
}
+ c->filter_added = TRUE;
if (pa_dbus_add_matches(
pa_dbus_wrap_connection_get(*conn), &error,
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index b371bfc..c3ebf74 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -91,6 +91,7 @@ struct pa_context {
pa_bool_t no_fail:1;
pa_bool_t do_autospawn:1;
pa_bool_t use_rtclock:1;
+ pa_bool_t filter_added:1;
pa_spawn_api spawn_api;
pa_strlist *server_list;
--
1.7.0

View file

@ -0,0 +1,275 @@
From 8d356659e69556fa25d0579a66084f820683e2b8 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 8 Jan 2010 20:07:34 +0100
Subject: [PATCH 02/62] native: fix request counter miscalculations
Do not subtract bytes the client sends us beyond what we requested from
our missing bytes counter.
This was mostly a thinko that caused servers asking for too little data
when the client initially sent more data than requested, because that
data sent too much was accounted for twice.
This commit fixes this miscalculation.
http://bugzilla.redhat.com/show_bug.cgi?id=534130
---
src/pulse/stream.c | 4 ++
src/pulsecore/memblockq.c | 101 ++++++++++++++++++---------------------
src/pulsecore/protocol-native.c | 7 ++-
3 files changed, 55 insertions(+), 57 deletions(-)
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index d01985b..793277a 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -741,6 +741,8 @@ void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tag
s->requested_bytes += bytes;
+ /* pa_log("got request for %lli, now at %lli", (long long) bytes, (long long) s->requested_bytes); */
+
if (s->requested_bytes > 0 && s->write_callback)
s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata);
@@ -1354,6 +1356,8 @@ int pa_stream_write(
* that's OK, the server side applies the same error */
s->requested_bytes -= (seek == PA_SEEK_RELATIVE ? offset : 0) + (int64_t) length;
+ /* pa_log("wrote %lli, now at %lli", (long long) length, (long long) s->requested_bytes); */
+
if (s->direction == PA_STREAM_PLAYBACK) {
/* Update latency request correction */
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index 32758be..4641801 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -55,8 +55,7 @@ struct pa_memblockq {
pa_bool_t in_prebuf;
pa_memchunk silence;
pa_mcalign *mcalign;
- int64_t missing;
- size_t requested;
+ int64_t missing, requested;
};
pa_memblockq* pa_memblockq_new(
@@ -84,8 +83,8 @@ pa_memblockq* pa_memblockq_new(
pa_log_debug("memblockq requested: maxlength=%lu, tlength=%lu, base=%lu, prebuf=%lu, minreq=%lu maxrewind=%lu",
(unsigned long) maxlength, (unsigned long) tlength, (unsigned long) base, (unsigned long) prebuf, (unsigned long) minreq, (unsigned long) maxrewind);
- bq->missing = 0;
- bq->requested = bq->maxlength = bq->tlength = bq->prebuf = bq->minreq = bq->maxrewind = 0;
+ bq->missing = bq->requested = 0;
+ bq->maxlength = bq->tlength = bq->prebuf = bq->minreq = bq->maxrewind = 0;
bq->in_prebuf = TRUE;
pa_memblockq_set_maxlength(bq, maxlength);
@@ -246,10 +245,34 @@ static pa_bool_t can_push(pa_memblockq *bq, size_t l) {
return TRUE;
}
+static void write_index_changed(pa_memblockq *bq, int64_t old_write_index, pa_bool_t account) {
+ int64_t delta;
+
+ pa_assert(bq);
+
+ delta = bq->write_index - old_write_index;
+
+ if (account)
+ bq->requested -= delta;
+
+ /* pa_log("pushed/seeked %lli: requested counter at %lli, account=%i", (long long) delta, (long long) bq->requested, account); */
+}
+
+static void read_index_changed(pa_memblockq *bq, int64_t old_read_index) {
+ int64_t delta;
+
+ pa_assert(bq);
+
+ delta = bq->read_index - old_read_index;
+ bq->missing += delta;
+
+ /* pa_log("popped %lli: missing counter at %lli", (long long) delta, (long long) bq->missing); */
+}
+
int pa_memblockq_push(pa_memblockq* bq, const pa_memchunk *uchunk) {
struct list_item *q, *n;
pa_memchunk chunk;
- int64_t old, delta;
+ int64_t old;
pa_assert(bq);
pa_assert(uchunk);
@@ -409,18 +432,7 @@ int pa_memblockq_push(pa_memblockq* bq, const pa_memchunk *uchunk) {
finish:
- delta = bq->write_index - old;
-
- if (delta >= (int64_t) bq->requested) {
- delta -= (int64_t) bq->requested;
- bq->requested = 0;
- } else {
- bq->requested -= (size_t) delta;
- delta = 0;
- }
-
- bq->missing -= delta;
-
+ write_index_changed(bq, old, TRUE);
return 0;
}
@@ -514,7 +526,7 @@ int pa_memblockq_peek(pa_memblockq* bq, pa_memchunk *chunk) {
}
void pa_memblockq_drop(pa_memblockq *bq, size_t length) {
- int64_t old, delta;
+ int64_t old;
pa_assert(bq);
pa_assert(length % bq->base == 0);
@@ -553,19 +565,21 @@ void pa_memblockq_drop(pa_memblockq *bq, size_t length) {
}
drop_backlog(bq);
-
- delta = bq->read_index - old;
- bq->missing += delta;
+ read_index_changed(bq, old);
}
void pa_memblockq_rewind(pa_memblockq *bq, size_t length) {
+ int64_t old;
pa_assert(bq);
pa_assert(length % bq->base == 0);
+ old = bq->read_index;
+
/* This is kind of the inverse of pa_memblockq_drop() */
bq->read_index -= (int64_t) length;
- bq->missing -= (int64_t) length;
+
+ read_index_changed(bq, old);
}
pa_bool_t pa_memblockq_is_readable(pa_memblockq *bq) {
@@ -602,7 +616,7 @@ size_t pa_memblockq_missing(pa_memblockq *bq) {
}
void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa_bool_t account) {
- int64_t old, delta;
+ int64_t old;
pa_assert(bq);
old = bq->write_index;
@@ -625,24 +639,11 @@ void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa
}
drop_backlog(bq);
-
- delta = bq->write_index - old;
-
- if (account) {
- if (delta >= (int64_t) bq->requested) {
- delta -= (int64_t) bq->requested;
- bq->requested = 0;
- } else if (delta >= 0) {
- bq->requested -= (size_t) delta;
- delta = 0;
- }
- }
-
- bq->missing -= delta;
+ write_index_changed(bq, old, account);
}
void pa_memblockq_flush_write(pa_memblockq *bq) {
- int64_t old, delta;
+ int64_t old;
pa_assert(bq);
pa_memblockq_silence(bq);
@@ -651,22 +652,11 @@ void pa_memblockq_flush_write(pa_memblockq *bq) {
bq->write_index = bq->read_index;
pa_memblockq_prebuf_force(bq);
-
- delta = bq->write_index - old;
-
- if (delta >= (int64_t) bq->requested) {
- delta -= (int64_t) bq->requested;
- bq->requested = 0;
- } else if (delta >= 0) {
- bq->requested -= (size_t) delta;
- delta = 0;
- }
-
- bq->missing -= delta;
+ write_index_changed(bq, old, TRUE);
}
void pa_memblockq_flush_read(pa_memblockq *bq) {
- int64_t old, delta;
+ int64_t old;
pa_assert(bq);
pa_memblockq_silence(bq);
@@ -675,9 +665,7 @@ void pa_memblockq_flush_read(pa_memblockq *bq) {
bq->read_index = bq->write_index;
pa_memblockq_prebuf_force(bq);
-
- delta = bq->read_index - old;
- bq->missing += delta;
+ read_index_changed(bq, old);
}
size_t pa_memblockq_get_tlength(pa_memblockq *bq) {
@@ -774,8 +762,11 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq) {
return 0;
l = (size_t) bq->missing;
+
+ bq->requested += bq->missing;
bq->missing = 0;
- bq->requested += l;
+
+ /* pa_log("sent %lli: request counter is at %lli", (long long) l, (long long) bq->requested); */
return l;
}
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 6e35762..b7b3f59 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1113,6 +1113,8 @@ static playback_stream* playback_stream_new(
*missing = (uint32_t) pa_memblockq_pop_missing(s->memblockq);
+ /* pa_log("missing original: %li", (long int) *missing); */
+
*ss = s->sink_input->sample_spec;
*map = s->sink_input->channel_map;
@@ -1137,11 +1139,12 @@ static void playback_stream_request_bytes(playback_stream *s) {
m = pa_memblockq_pop_missing(s->memblockq);
- /* pa_log("request_bytes(%lu) (tlength=%lu minreq=%lu length=%lu)", */
+ /* pa_log("request_bytes(%lu) (tlength=%lu minreq=%lu length=%lu really missing=%lli)", */
/* (unsigned long) m, */
/* pa_memblockq_get_tlength(s->memblockq), */
/* pa_memblockq_get_minreq(s->memblockq), */
- /* pa_memblockq_get_length(s->memblockq)); */
+ /* pa_memblockq_get_length(s->memblockq), */
+ /* (long long) pa_memblockq_get_tlength(s->memblockq) - (long long) pa_memblockq_get_length(s->memblockq)); */
if (m <= 0)
return;
--
1.7.0

View file

@ -0,0 +1,161 @@
From 3eed219a50c943251b41814e779cc37daf47e8f4 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 8 Jan 2010 21:51:30 +0100
Subject: [PATCH 03/62] core: make sure we always return a valid memblock in sink_input_pop() callbacks
https://bugzilla.redhat.com/show_bug.cgi?id=553607
---
src/modules/module-combine.c | 2 +-
src/modules/module-ladspa-sink.c | 6 +++++-
src/pulsecore/play-memchunk.c | 6 +++++-
src/pulsecore/protocol-esound.c | 5 ++++-
src/pulsecore/protocol-simple.c | 6 +++++-
src/pulsecore/sound-file-stream.c | 5 ++++-
6 files changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c
index a186c89..62e6267 100644
--- a/src/modules/module-combine.c
+++ b/src/modules/module-combine.c
@@ -890,7 +890,7 @@ static struct output *output_new(struct userdata *u, pa_sink *sink) {
1,
0,
0,
- NULL);
+ &u->sink->silence);
pa_assert_se(pa_idxset_put(u->outputs, o, NULL) == 0);
update_description(u);
diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c
index 994c778..185871b 100644
--- a/src/modules/module-ladspa-sink.c
+++ b/src/modules/module-ladspa-sink.c
@@ -476,6 +476,7 @@ int pa__init(pa_module*m) {
unsigned long input_port, output_port, p, j, n_control;
unsigned c;
pa_bool_t *use_default = NULL;
+ pa_memchunk silence;
pa_assert(m);
@@ -514,7 +515,10 @@ int pa__init(pa_module*m) {
u = pa_xnew0(struct userdata, 1);
u->module = m;
m->userdata = u;
- u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+
+ pa_silence_memchunk_get(&m->core->silence_cache, m->core->mempool, &silence, &ss, 0);
+ u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, &silence);
+ pa_memblock_unref(silence.memblock);
if (!(e = getenv("LADSPA_PATH")))
e = LADSPA_PATH;
diff --git a/src/pulsecore/play-memchunk.c b/src/pulsecore/play-memchunk.c
index f127d7a..1a3bd5b 100644
--- a/src/pulsecore/play-memchunk.c
+++ b/src/pulsecore/play-memchunk.c
@@ -47,12 +47,16 @@ int pa_play_memchunk(
pa_memblockq *q;
int r;
+ pa_memchunk silence;
pa_assert(sink);
pa_assert(ss);
pa_assert(chunk);
- q = pa_memblockq_new(0, chunk->length, 0, pa_frame_size(ss), 1, 1, 0, NULL);
+ pa_silence_memchunk_get(&sink->core->silence_cache, sink->core->mempool, &silence, ss, 0);
+ q = pa_memblockq_new(0, chunk->length, 0, pa_frame_size(ss), 1, 1, 0, &silence);
+ pa_memblock_unref(silence.memblock);
+
pa_assert_se(pa_memblockq_push(q, chunk) >= 0);
if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, sink_input_index)) < 0) {
diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index 2326eb3..a89f327 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -389,6 +389,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
size_t l;
pa_sink *sink = NULL;
pa_sink_input_new_data sdata;
+ pa_memchunk silence;
connection_assert_ref(c);
pa_assert(data);
@@ -435,6 +436,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
CHECK_VALIDITY(c->sink_input, "Failed to create sink input.");
l = (size_t) ((double) pa_bytes_per_second(&ss)*PLAYBACK_BUFFER_SECONDS);
+ pa_sink_input_get_silence(c->sink_input, &silence);
c->input_memblockq = pa_memblockq_new(
0,
l,
@@ -443,7 +445,8 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
(size_t) -1,
l/PLAYBACK_BUFFER_FRAGMENTS,
0,
- NULL);
+ &silence);
+ pa_memblock_unref(silence.memblock);
pa_iochannel_socket_set_rcvbuf(c->io, l);
c->sink_input->parent.process_msg = sink_input_process_msg;
diff --git a/src/pulsecore/protocol-simple.c b/src/pulsecore/protocol-simple.c
index a9f7389..fb2e564 100644
--- a/src/pulsecore/protocol-simple.c
+++ b/src/pulsecore/protocol-simple.c
@@ -525,6 +525,7 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
if (o->playback) {
pa_sink_input_new_data data;
+ pa_memchunk silence;
size_t l;
pa_sink *sink;
@@ -559,6 +560,7 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
pa_sink_input_set_requested_latency(c->sink_input, DEFAULT_SINK_LATENCY);
l = (size_t) ((double) pa_bytes_per_second(&o->sample_spec)*PLAYBACK_BUFFER_SECONDS);
+ pa_sink_input_get_silence(c->sink_input, &silence);
c->input_memblockq = pa_memblockq_new(
0,
l,
@@ -567,7 +569,9 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
(size_t) -1,
l/PLAYBACK_BUFFER_FRAGMENTS,
0,
- NULL);
+ &silence);
+ pa_memblock_unref(silence.memblock);
+
pa_iochannel_socket_set_rcvbuf(io, l);
pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
diff --git a/src/pulsecore/sound-file-stream.c b/src/pulsecore/sound-file-stream.c
index 16de492..2025c2a 100644
--- a/src/pulsecore/sound-file-stream.c
+++ b/src/pulsecore/sound-file-stream.c
@@ -239,6 +239,7 @@ int pa_play_file(
pa_sink_input_new_data data;
int fd;
SF_INFO sfi;
+ pa_memchunk silence;
pa_assert(sink);
pa_assert(fname);
@@ -324,7 +325,9 @@ int pa_play_file(
u->sink_input->state_change = sink_input_state_change_cb;
u->sink_input->userdata = u;
- u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+ pa_sink_input_get_silence(u->sink_input, &silence);
+ u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, &silence);
+ pa_memblock_unref(silence.memblock);
pa_sink_input_put(u->sink_input);
--
1.7.0

View file

@ -0,0 +1,56 @@
From 11688eca4b2beb7aa1adcd4aa9a3ee933f7385fb Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 8 Jan 2010 22:18:15 +0100
Subject: [PATCH 04/62] bluetooth: destruct stream only if it is not already destructed
https://bugzilla.redhat.com/show_bug.cgi?id=551842
---
src/modules/bluetooth/module-bluetooth-device.c | 28 ++++++++++++----------
1 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 19676df..2bbae41 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -823,23 +823,25 @@ static int stop_stream_fd(struct userdata *u) {
pa_assert(u);
pa_assert(u->rtpoll);
- pa_assert(u->rtpoll_item);
- pa_assert(u->stream_fd >= 0);
- pa_rtpoll_item_free(u->rtpoll_item);
- u->rtpoll_item = NULL;
+ if (u->rtpoll_item) {
+ pa_rtpoll_item_free(u->rtpoll_item);
+ u->rtpoll_item = NULL;
+ }
- memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
- msg.start_req.h.type = BT_REQUEST;
- msg.start_req.h.name = BT_STOP_STREAM;
- msg.start_req.h.length = sizeof(msg.start_req);
+ if (u->stream_fd >= 0) {
+ memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
+ msg.start_req.h.type = BT_REQUEST;
+ msg.start_req.h.name = BT_STOP_STREAM;
+ msg.start_req.h.length = sizeof(msg.start_req);
- if (service_send(u, &msg.start_req.h) < 0 ||
- service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
- r = -1;
+ if (service_send(u, &msg.start_req.h) < 0 ||
+ service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
+ r = -1;
- pa_close(u->stream_fd);
- u->stream_fd = -1;
+ pa_close(u->stream_fd);
+ u->stream_fd = -1;
+ }
if (u->read_smoother) {
pa_smoother_free(u->read_smoother);
--
1.7.0

View file

@ -0,0 +1,35 @@
From e7d9f891e2a8e6b670098b80315ca1f0010c35ca Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 8 Jan 2010 23:44:42 +0100
Subject: [PATCH 05/62] bluetooth: don't hit an assert if latency is queried for a stooped recording stream
https://bugzilla.redhat.com/show_bug.cgi?id=537422
---
src/modules/bluetooth/module-bluetooth-device.c | 10 +++++++---
1 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 2bbae41..d6868b8 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -972,10 +972,14 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
case PA_SOURCE_MESSAGE_GET_LATENCY: {
pa_usec_t wi, ri;
- wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
- ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
+ if (u->read_smoother) {
+ wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
+ ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
+
+ *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
+ } else
+ *((pa_usec_t*) data) = 0;
- *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
return 0;
}
--
1.7.0

View file

@ -0,0 +1,87 @@
From bf50dc42306857e361267d2ad39b737ad05b8604 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 12 Jan 2010 03:01:14 +0100
Subject: [PATCH 06/62] client: detect forking in sample cache API, too
---
src/pulse/scache.c | 9 +++++++--
src/pulse/stream.c | 1 +
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index 27da688..2a7602f 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -28,15 +28,15 @@
#include <string.h>
#include <pulse/utf8.h>
+#include <pulse/scache.h>
#include <pulsecore/pstream-util.h>
#include <pulsecore/macro.h>
#include <pulsecore/proplist-util.h>
+#include "fork-detect.h"
#include "internal.h"
-#include "scache.h"
-
int pa_stream_connect_upload(pa_stream *s, size_t length) {
pa_tagstruct *t;
uint32_t tag;
@@ -45,6 +45,7 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
pa_assert(s);
pa_assert(PA_REFCNT_VALUE(s) >= 1);
+ PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY(s->context, length > 0, PA_ERR_INVALID);
PA_CHECK_VALIDITY(s->context, length == (size_t) (uint32_t) length, PA_ERR_INVALID);
@@ -85,6 +86,7 @@ int pa_stream_finish_upload(pa_stream *s) {
pa_assert(s);
pa_assert(PA_REFCNT_VALUE(s) >= 1);
+ PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY(s->context, s->channel_valid, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
@@ -174,6 +176,7 @@ pa_operation *pa_context_play_sample(pa_context *c, const char *name, const char
pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1);
+ PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
PA_CHECK_VALIDITY_RETURN_NULL(c, !dev || *dev, PA_ERR_INVALID);
@@ -213,6 +216,7 @@ pa_operation *pa_context_play_sample_with_proplist(pa_context *c, const char *na
pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1);
+ PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
PA_CHECK_VALIDITY_RETURN_NULL(c, !dev || *dev, PA_ERR_INVALID);
@@ -255,6 +259,7 @@ pa_operation* pa_context_remove_sample(pa_context *c, const char *name, pa_conte
pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1);
+ PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 793277a..79b2868 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -29,6 +29,7 @@
#include <string.h>
#include <pulse/def.h>
+#include <pulse/stream.h>
#include <pulse/timeval.h>
#include <pulse/rtclock.h>
#include <pulse/xmalloc.h>
--
1.7.0

View file

@ -0,0 +1,28 @@
From 78811c5653d0ba508b6558ba4578b61da26c60cf Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 12 Jan 2010 03:01:27 +0100
Subject: [PATCH 07/62] client: verify connection state in pa_stream_connect_upload()
Make suer we check the connection state before going on, so that we can
rely that s->context->pstream is properly initialized.
https://bugzilla.redhat.com/show_bug.cgi?id=539500
---
src/pulse/scache.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index 2a7602f..b2169b6 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -49,6 +49,7 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
PA_CHECK_VALIDITY(s->context, length > 0, PA_ERR_INVALID);
PA_CHECK_VALIDITY(s->context, length == (size_t) (uint32_t) length, PA_ERR_INVALID);
+ PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
if (!(name = pa_proplist_gets(s->proplist, PA_PROP_EVENT_ID)))
name = pa_proplist_gets(s->proplist, PA_PROP_MEDIA_NAME);
--
1.7.0

View file

@ -0,0 +1,29 @@
From 15a3018bda8ee92393671ceaf272be418e95a81f Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 12 Jan 2010 23:01:24 +0100
Subject: [PATCH 08/62] udev: don't forget to unref devices we are not interested in
https://bugzilla.redhat.com/show_bug.cgi?id=552932
---
src/modules/module-udev-detect.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 1b1e9c1..7508d9a 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -416,8 +416,10 @@ static void monitor_cb(
goto fail;
}
- if (!path_get_card_id(udev_device_get_devpath(dev)))
+ if (!path_get_card_id(udev_device_get_devpath(dev))) {
+ udev_device_unref(dev);
return;
+ }
process_device(u, dev);
udev_device_unref(dev);
--
1.7.0

View file

@ -0,0 +1,91 @@
From 73ae1fce001253677b7ab633f42d3c3300fe5cf5 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 12 Jan 2010 23:03:04 +0100
Subject: [PATCH 09/62] once: make once related variables volatile
---
src/pulsecore/flist.h | 2 +-
src/pulsecore/once.c | 3 +--
src/pulsecore/thread-posix.c | 8 ++------
src/pulsecore/thread.h | 2 +-
4 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/src/pulsecore/flist.h b/src/pulsecore/flist.h
index e147486..184e599 100644
--- a/src/pulsecore/flist.h
+++ b/src/pulsecore/flist.h
@@ -45,7 +45,7 @@ void* pa_flist_pop(pa_flist*l);
#define PA_STATIC_FLIST_DECLARE(name, size, free_cb) \
static struct { \
- pa_flist *flist; \
+ pa_flist *volatile flist; \
pa_once once; \
} name##_flist = { NULL, PA_ONCE_INIT }; \
static void name##_flist_init(void) { \
diff --git a/src/pulsecore/once.c b/src/pulsecore/once.c
index 05a3ad2..4e509e0 100644
--- a/src/pulsecore/once.c
+++ b/src/pulsecore/once.c
@@ -29,8 +29,6 @@
#include "once.h"
pa_bool_t pa_once_begin(pa_once *control) {
- pa_mutex *m;
-
pa_assert(control);
if (pa_atomic_load(&control->done))
@@ -43,6 +41,7 @@ pa_bool_t pa_once_begin(pa_once *control) {
* executed by us. Hence the awkward locking. */
for (;;) {
+ pa_mutex *m;
if ((m = pa_atomic_ptr_load(&control->mutex))) {
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c
index fdab270..bc0d6e3 100644
--- a/src/pulsecore/thread-posix.c
+++ b/src/pulsecore/thread-posix.c
@@ -80,11 +80,9 @@ pa_thread* pa_thread_new(pa_thread_func_t thread_func, void *userdata) {
pa_assert(thread_func);
- t = pa_xnew(pa_thread, 1);
+ t = pa_xnew0(pa_thread, 1);
t->thread_func = thread_func;
t->userdata = userdata;
- t->joined = FALSE;
- pa_atomic_store(&t->running, 0);
if (pthread_create(&t->id, NULL, internal_thread_func, t) < 0) {
pa_xfree(t);
@@ -135,10 +133,8 @@ pa_thread* pa_thread_self(void) {
/* This is a foreign thread, let's create a pthread structure to
* make sure that we can always return a sensible pointer */
- t = pa_xnew(pa_thread, 1);
+ t = pa_xnew0(pa_thread, 1);
t->id = pthread_self();
- t->thread_func = NULL;
- t->userdata = NULL;
t->joined = TRUE;
pa_atomic_store(&t->running, 2);
diff --git a/src/pulsecore/thread.h b/src/pulsecore/thread.h
index 25eace6..60c1267 100644
--- a/src/pulsecore/thread.h
+++ b/src/pulsecore/thread.h
@@ -55,7 +55,7 @@ void *pa_tls_set(pa_tls *t, void *userdata);
#define PA_STATIC_TLS_DECLARE(name, free_cb) \
static struct { \
pa_once once; \
- pa_tls *tls; \
+ pa_tls *volatile tls; \
} name##_tls = { \
.once = PA_ONCE_INIT, \
.tls = NULL \
--
1.7.0

View file

@ -0,0 +1,36 @@
From 4bcb1a909f936a63628273e7d35726bc64785eeb Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jan 2010 17:24:37 +0100
Subject: [PATCH 10/62] bluetooth: fix invalid memory access
When an GetProperties() reply arrives after we already deleted the
device structure for it make sure we don't accidentaly touch the
invalidated object.
https://bugzilla.redhat.com/show_bug.cgi?id=543205
---
src/modules/bluetooth/bluetooth-util.c | 8 +++++++-
1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 795d510..b2c0429 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -342,7 +342,13 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) {
/* dbus_message_get_interface(p->message), */
/* dbus_message_get_path(p->message)); */
- d = p->call_data;
+ /* We don't use p->call_data here right-away since the device
+ * might already be invalidated at this point */
+
+ if (!(d = pa_hashmap_get(y->devices, dbus_message_get_path(p->message))))
+ return;
+
+ pa_assert(p->call_data == d);
valid = dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR ? -1 : 1;
--
1.7.0

View file

@ -0,0 +1,154 @@
From 21b484e056be445fdaf00f91ce50bc40b1ac9623 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jan 2010 17:35:04 +0100
Subject: [PATCH 11/62] log: add an easy way to disable log rate limiting
Should help with debuggin bugs like:
https://bugzilla.redhat.com/show_bug.cgi?id=554405
---
src/pulsecore/log.c | 88 +++++++++++++++++++++++++++++----------------------
1 files changed, 50 insertions(+), 38 deletions(-)
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 8c21ee6..0c5a317 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -61,6 +61,7 @@
#define ENV_LOG_PRINT_LEVEL "PULSE_LOG_LEVEL"
#define ENV_LOG_BACKTRACE "PULSE_LOG_BACKTRACE"
#define ENV_LOG_BACKTRACE_SKIP "PULSE_LOG_BACKTRACE_SKIP"
+#define ENV_LOG_NO_RATELIMIT "PULSE_LOG_NO_RATE_LIMIT"
static char *ident = NULL; /* in local charset format */
static pa_log_target_t target = PA_LOG_STDERR, target_override;
@@ -68,6 +69,7 @@ static pa_bool_t target_override_set = FALSE;
static pa_log_level_t maximum_level = PA_LOG_ERROR, maximum_level_override = PA_LOG_ERROR;
static unsigned show_backtrace = 0, show_backtrace_override = 0, skip_backtrace = 0;
static pa_log_flags_t flags = 0, flags_override = 0;
+static pa_bool_t no_rate_limit = FALSE;
#ifdef HAVE_SYSLOG_H
static const int level_to_syslog[] = {
@@ -195,54 +197,61 @@ static char* get_backtrace(unsigned show_nframes) {
#endif
static void init_defaults(void) {
- const char *e;
+ PA_ONCE_BEGIN {
- if (!ident) {
- char binary[256];
- if (pa_get_binary_name(binary, sizeof(binary)))
- pa_log_set_ident(binary);
- }
+ const char *e;
- if (getenv(ENV_LOG_SYSLOG)) {
- target_override = PA_LOG_SYSLOG;
- target_override_set = TRUE;
- }
+ if (!ident) {
+ char binary[256];
+ if (pa_get_binary_name(binary, sizeof(binary)))
+ pa_log_set_ident(binary);
+ }
- if ((e = getenv(ENV_LOG_LEVEL))) {
- maximum_level_override = (pa_log_level_t) atoi(e);
+ if (getenv(ENV_LOG_SYSLOG)) {
+ target_override = PA_LOG_SYSLOG;
+ target_override_set = TRUE;
+ }
- if (maximum_level_override >= PA_LOG_LEVEL_MAX)
- maximum_level_override = PA_LOG_LEVEL_MAX-1;
- }
+ if ((e = getenv(ENV_LOG_LEVEL))) {
+ maximum_level_override = (pa_log_level_t) atoi(e);
- if (getenv(ENV_LOG_COLORS))
- flags_override |= PA_LOG_COLORS;
+ if (maximum_level_override >= PA_LOG_LEVEL_MAX)
+ maximum_level_override = PA_LOG_LEVEL_MAX-1;
+ }
- if (getenv(ENV_LOG_PRINT_TIME))
- flags_override |= PA_LOG_PRINT_TIME;
+ if (getenv(ENV_LOG_COLORS))
+ flags_override |= PA_LOG_COLORS;
- if (getenv(ENV_LOG_PRINT_FILE))
- flags_override |= PA_LOG_PRINT_FILE;
+ if (getenv(ENV_LOG_PRINT_TIME))
+ flags_override |= PA_LOG_PRINT_TIME;
- if (getenv(ENV_LOG_PRINT_META))
- flags_override |= PA_LOG_PRINT_META;
+ if (getenv(ENV_LOG_PRINT_FILE))
+ flags_override |= PA_LOG_PRINT_FILE;
- if (getenv(ENV_LOG_PRINT_LEVEL))
- flags_override |= PA_LOG_PRINT_LEVEL;
+ if (getenv(ENV_LOG_PRINT_META))
+ flags_override |= PA_LOG_PRINT_META;
- if ((e = getenv(ENV_LOG_BACKTRACE))) {
- show_backtrace_override = (unsigned) atoi(e);
+ if (getenv(ENV_LOG_PRINT_LEVEL))
+ flags_override |= PA_LOG_PRINT_LEVEL;
- if (show_backtrace_override <= 0)
- show_backtrace_override = 0;
- }
+ if ((e = getenv(ENV_LOG_BACKTRACE))) {
+ show_backtrace_override = (unsigned) atoi(e);
- if ((e = getenv(ENV_LOG_BACKTRACE_SKIP))) {
- skip_backtrace = (unsigned) atoi(e);
+ if (show_backtrace_override <= 0)
+ show_backtrace_override = 0;
+ }
- if (skip_backtrace <= 0)
- skip_backtrace = 0;
- }
+ if ((e = getenv(ENV_LOG_BACKTRACE_SKIP))) {
+ skip_backtrace = (unsigned) atoi(e);
+
+ if (skip_backtrace <= 0)
+ skip_backtrace = 0;
+ }
+
+ if (getenv(ENV_LOG_NO_RATELIMIT))
+ no_rate_limit = TRUE;
+
+ } PA_ONCE_END;
}
void pa_log_levelv_meta(
@@ -268,9 +277,7 @@ void pa_log_levelv_meta(
pa_assert(level < PA_LOG_LEVEL_MAX);
pa_assert(format);
- PA_ONCE_BEGIN {
- init_defaults();
- } PA_ONCE_END;
+ init_defaults();
_target = target_override_set ? target_override : target;
_maximum_level = PA_MAX(maximum_level, maximum_level_override);
@@ -428,5 +435,10 @@ pa_bool_t pa_log_ratelimit(void) {
/* Not more than 10 messages every 5s */
static PA_DEFINE_RATELIMIT(ratelimit, 5 * PA_USEC_PER_SEC, 10);
+ init_defaults();
+
+ if (no_rate_limit)
+ return TRUE;
+
return pa_ratelimit_test(&ratelimit);
}
--
1.7.0

View file

@ -0,0 +1,28 @@
From 9b37dce4223aaf7a5f48b04b52c89b46ad97cf73 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jan 2010 19:41:44 +0100
Subject: [PATCH 12/62] udev: make sure we get events only for sound devices
---
src/modules/module-udev-detect.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 7508d9a..58635a5 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -639,6 +639,11 @@ int pa__init(pa_module *m) {
goto fail;
}
+ if (udev_monitor_filter_add_match_subsystem_devtype(u->monitor, "sound", NULL) < 0) {
+ pa_log("Failed to subscribe to sound devices.");
+ goto fail;
+ }
+
errno = 0;
if (udev_monitor_enable_receiving(u->monitor) < 0) {
pa_log("Failed to enable monitor: %s", pa_cstrerror(errno));
--
1.7.0

View file

@ -0,0 +1,41 @@
From 540ec7b961256d6c7702448ca995f61268064190 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jan 2010 20:30:36 +0100
Subject: [PATCH 13/62] alsa: ignore volume changes from the hw if we are not on the active console
---
src/modules/alsa/alsa-sink.c | 3 +++
src/modules/alsa/alsa-source.c | 3 +++
2 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index ed16c83..690480f 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1103,6 +1103,9 @@ static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
if (mask == SND_CTL_EVENT_MASK_REMOVE)
return 0;
+ if (u->sink->suspend_cause & PA_SUSPEND_SESSION)
+ return 0;
+
if (mask & SND_CTL_EVENT_MASK_VALUE) {
pa_sink_get_volume(u->sink, TRUE);
pa_sink_get_mute(u->sink, TRUE);
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 157698e..f8b583e 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1051,6 +1051,9 @@ static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
if (mask == SND_CTL_EVENT_MASK_REMOVE)
return 0;
+ if (u->source->suspend_cause & PA_SUSPEND_SESSION)
+ return 0;
+
if (mask & SND_CTL_EVENT_MASK_VALUE) {
pa_source_get_volume(u->source, TRUE);
pa_source_get_mute(u->source, TRUE);
--
1.7.0

View file

@ -0,0 +1,80 @@
From 170812755e0ac235ed2b7182ef637eb317d8b2b2 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Wed, 13 Jan 2010 20:31:17 +0100
Subject: [PATCH 14/62] cpu: check for CMOV flag before using this intsruction in assembly
http://pulseaudio.org/ticket/776
---
src/pulsecore/cpu-x86.c | 6 +++++-
src/pulsecore/cpu-x86.h | 6 +++---
src/pulsecore/svolume_mmx.c | 2 +-
3 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/pulsecore/cpu-x86.c b/src/pulsecore/cpu-x86.c
index f194a60..b173072 100644
--- a/src/pulsecore/cpu-x86.c
+++ b/src/pulsecore/cpu-x86.c
@@ -57,6 +57,9 @@ void pa_cpu_init_x86 (void) {
if (level >= 1) {
get_cpuid (0x00000001, &eax, &ebx, &ecx, &edx);
+ if (edx & (1<<15))
+ flags |= PA_CPU_X86_CMOV;
+
if (edx & (1<<23))
flags |= PA_CPU_X86_MMX;
@@ -97,7 +100,8 @@ void pa_cpu_init_x86 (void) {
flags |= PA_CPU_X86_3DNOW;
}
- pa_log_info ("CPU flags: %s%s%s%s%s%s%s%s%s%s",
+ pa_log_info ("CPU flags: %s%s%s%s%s%s%s%s%s%s%s",
+ (flags & PA_CPU_X86_CMOV) ? "CMOV " : "",
(flags & PA_CPU_X86_MMX) ? "MMX " : "",
(flags & PA_CPU_X86_SSE) ? "SSE " : "",
(flags & PA_CPU_X86_SSE2) ? "SSE2 " : "",
diff --git a/src/pulsecore/cpu-x86.h b/src/pulsecore/cpu-x86.h
index b40eb5c..285c203 100644
--- a/src/pulsecore/cpu-x86.h
+++ b/src/pulsecore/cpu-x86.h
@@ -5,7 +5,7 @@
This file is part of PulseAudio.
Copyright 2004-2006 Lennart Poettering
- Copyright 2009 Wim Taymans <wim.taymans@collabora.co.uk>
+ Copyright 2009 Wim Taymans <wim.taymans@collabora.co.uk>
PulseAudio is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
@@ -35,12 +35,12 @@ typedef enum pa_cpu_x86_flag {
PA_CPU_X86_SSE4_1 = (1 << 6),
PA_CPU_X86_SSE4_2 = (1 << 7),
PA_CPU_X86_3DNOW = (1 << 8),
- PA_CPU_X86_3DNOWEXT = (1 << 9)
+ PA_CPU_X86_3DNOWEXT = (1 << 9),
+ PA_CPU_X86_CMOV = (1 << 10)
} pa_cpu_x86_flag_t;
void pa_cpu_init_x86 (void);
-
#if defined (__i386__)
typedef int32_t pa_reg_x86;
#define PA_REG_a "eax"
diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index 46923ed..e50ebee 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -305,7 +305,7 @@ void pa_volume_func_init_mmx (pa_cpu_x86_flag_t flags) {
run_test ();
#endif
- if (flags & PA_CPU_X86_MMX) {
+ if ((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV)) {
pa_log_info("Initialising MMX optimized functions.");
pa_set_volume_func (PA_SAMPLE_S16NE, (pa_do_volume_func_t) pa_volume_s16ne_mmx);
--
1.7.0

View file

@ -0,0 +1,29 @@
From 67c6535222508bd84a122860023a8dc7fd44cd35 Mon Sep 17 00:00:00 2001
From: Colin Guthrie <cguthrie@mandriva.org>
Date: Wed, 13 Jan 2010 23:44:00 +0000
Subject: [PATCH 15/62] alsa: cover Input Source:Int Mic
As seen on some HDA chips (e.g. Fujitsu Siemens S6410)
Refs http://pulseaudio.org/ticket/772
---
.../alsa/mixer/paths/analog-input.conf.common | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index 951e11f..fbdc8fb 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -78,6 +78,10 @@ priority = 19
name = input-microphone
priority = 19
+[Option Input Source:Int Mic]
+name = input-microphone
+priority = 19
+
[Option Input Source:Internal Mic]
name = input-microphone
priority = 19
--
1.7.0

View file

@ -0,0 +1,36 @@
From 291cd096015d540d5064bfae94a66adc3bc3fc64 Mon Sep 17 00:00:00 2001
From: Colin Guthrie <cguthrie@mandriva.org>
Date: Wed, 13 Jan 2010 23:47:21 +0000
Subject: [PATCH 16/62] alsa: Cover the 'Int Mic Boost' element.
This is not 100% ideal as we have not way to tie specific boosts to specific
inputs and this particular chipset (as noted in #772) appears to
support just that.
For the time being incorporate it into the normal boost logic.
See http://pulseaudio.org/ticket/772
---
.../alsa/mixer/paths/analog-input-mic.conf.common | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
index b35e7af..4663305 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
@@ -61,3 +61,12 @@ name = input-boost-on
[Option Front Mic Boost:off]
name = input-boost-off
+
+[Element Int Mic Boost]
+switch = select
+
+[Option Int Mic Boost:on]
+name = input-boost-on
+
+[Option Int Mic Boost:off]
+name = input-boost-off
--
1.7.0

View file

@ -0,0 +1,117 @@
From 63c968bf775ec7e172b89e45ddc4981d79587bc5 Mon Sep 17 00:00:00 2001
From: Daniel T. Chen <crimsun@ubuntu.com>
Date: Thu, 14 Jan 2010 00:57:27 +0100
Subject: [PATCH 17/62] udev: handle sound cards with both modem and audio properly
http://pulseaudio.org/ticket/681
https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/394500
---
src/modules/module-udev-detect.c | 59 ++++++++++++++++++++++++++++++++++++--
1 files changed, 56 insertions(+), 3 deletions(-)
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 58635a5..1fe9fdc 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -103,13 +103,17 @@ static const char *path_get_card_id(const char *path) {
return e + 5;
}
+static const char *pa_udev_get_sysattr(const char *card_idx, const char *name);
+
static pa_bool_t is_card_busy(const char *id) {
- char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL;
+ const char *pcm_class;
+ char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL,
+ *sysfs_path = NULL;
DIR *card_dir = NULL, *pcm_dir = NULL;
FILE *status_file = NULL;
size_t len;
struct dirent *space = NULL, *de;
- pa_bool_t busy = FALSE;
+ pa_bool_t busy = FALSE, is_modem = FALSE;
int r;
pa_assert(id);
@@ -127,6 +131,17 @@ static pa_bool_t is_card_busy(const char *id) {
len = offsetof(struct dirent, d_name) + fpathconf(dirfd(card_dir), _PC_NAME_MAX) + 1;
space = pa_xmalloc(len);
+ /* Also check /sys/class/sound/card.../pcmC...D6p/pcm_class. An HDA
+ * modem can be used simultaneously with generic playback/record. */
+
+ pa_xfree(sysfs_path);
+ sysfs_path = pa_sprintf_malloc("pcmC%sD6p/pcm_class", id);
+
+ pcm_class = pa_udev_get_sysattr(id, sysfs_path);
+
+ if (pcm_class && pa_streq(pcm_class, "modem"))
+ is_modem = TRUE;
+
for (;;) {
de = NULL;
@@ -182,7 +197,7 @@ static pa_bool_t is_card_busy(const char *id) {
continue;
}
- if (!pa_streq(line, "closed\n")) {
+ if (!is_modem && !pa_streq(line, "closed\n")) {
busy = TRUE;
break;
}
@@ -193,6 +208,7 @@ fail:
pa_xfree(card_path);
pa_xfree(pcm_path);
+ pa_xfree(sysfs_path);
pa_xfree(sub_status);
pa_xfree(space);
@@ -594,6 +610,43 @@ static int setup_inotify(struct userdata *u) {
return 0;
}
+static const char *pa_udev_get_sysattr(const char *card_idx, const char *name) {
+ struct udev *udev;
+ struct udev_device *card = NULL;
+ char *t, *r = NULL;
+ const char *v;
+
+ pa_assert(card_idx);
+ pa_assert(name);
+
+ if (!(udev = udev_new())) {
+ pa_log_error("Failed to allocate udev context.");
+ goto finish;
+ }
+
+ t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
+ card = udev_device_new_from_syspath(udev, t);
+ pa_xfree(t);
+
+ if (!card) {
+ pa_log_error("Failed to get card object.");
+ goto finish;
+ }
+
+ if ((v = udev_device_get_sysattr_value(card, name)) && *v)
+ r = pa_xstrdup(v);
+
+finish:
+
+ if (card)
+ udev_device_unref(card);
+
+ if (udev)
+ udev_unref(udev);
+
+ return r;
+}
+
int pa__init(pa_module *m) {
struct userdata *u = NULL;
pa_modargs *ma;
--
1.7.0

View file

@ -0,0 +1,182 @@
From acb4996203f6723d92a9b0df4e60db83c65116fc Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 14 Jan 2010 02:06:52 +0100
Subject: [PATCH 18/62] udev: rework modem detection a bit
Check every single pcm device of a card whether it is a modem.
---
src/modules/module-udev-detect.c | 117 ++++++++++++++++++++------------------
1 files changed, 62 insertions(+), 55 deletions(-)
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 1fe9fdc..b8568b2 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -103,17 +103,70 @@ static const char *path_get_card_id(const char *path) {
return e + 5;
}
-static const char *pa_udev_get_sysattr(const char *card_idx, const char *name);
+static char *card_get_sysattr(const char *card_idx, const char *name) {
+ struct udev *udev;
+ struct udev_device *card = NULL;
+ char *t, *r = NULL;
+ const char *v;
+
+ pa_assert(card_idx);
+ pa_assert(name);
+
+ if (!(udev = udev_new())) {
+ pa_log_error("Failed to allocate udev context.");
+ goto finish;
+ }
+
+ t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
+ card = udev_device_new_from_syspath(udev, t);
+ pa_xfree(t);
+
+ if (!card) {
+ pa_log_error("Failed to get card object.");
+ goto finish;
+ }
+
+ if ((v = udev_device_get_sysattr_value(card, name)) && *v)
+ r = pa_xstrdup(v);
+
+finish:
+
+ if (card)
+ udev_device_unref(card);
+
+ if (udev)
+ udev_unref(udev);
+
+ return r;
+}
+
+static pa_bool_t pcm_is_modem(const char *card_idx, const char *pcm) {
+ char *sysfs_path, *pcm_class;
+ pa_bool_t is_modem;
+
+ pa_assert(card_idx);
+ pa_assert(pcm);
+
+ /* Check /sys/class/sound/card.../pcmC...../pcm_class. An HDA
+ * modem can be used simultaneously with generic
+ * playback/record. */
+
+ sysfs_path = pa_sprintf_malloc("pcmC%sD%s/pcm_class", card_idx, pcm);
+ pcm_class = card_get_sysattr(card_idx, sysfs_path);
+ is_modem = pcm_class && pa_streq(pcm_class, "modem");
+ pa_xfree(pcm_class);
+ pa_xfree(sysfs_path);
+
+ return is_modem;
+}
static pa_bool_t is_card_busy(const char *id) {
- const char *pcm_class;
- char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL,
- *sysfs_path = NULL;
+ char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL;
DIR *card_dir = NULL, *pcm_dir = NULL;
FILE *status_file = NULL;
size_t len;
struct dirent *space = NULL, *de;
- pa_bool_t busy = FALSE, is_modem = FALSE;
+ pa_bool_t busy = FALSE;
int r;
pa_assert(id);
@@ -131,17 +184,6 @@ static pa_bool_t is_card_busy(const char *id) {
len = offsetof(struct dirent, d_name) + fpathconf(dirfd(card_dir), _PC_NAME_MAX) + 1;
space = pa_xmalloc(len);
- /* Also check /sys/class/sound/card.../pcmC...D6p/pcm_class. An HDA
- * modem can be used simultaneously with generic playback/record. */
-
- pa_xfree(sysfs_path);
- sysfs_path = pa_sprintf_malloc("pcmC%sD6p/pcm_class", id);
-
- pcm_class = pa_udev_get_sysattr(id, sysfs_path);
-
- if (pcm_class && pa_streq(pcm_class, "modem"))
- is_modem = TRUE;
-
for (;;) {
de = NULL;
@@ -156,6 +198,9 @@ static pa_bool_t is_card_busy(const char *id) {
if (!pa_startswith(de->d_name, "pcm"))
continue;
+ if (pcm_is_modem(id, de->d_name + 3))
+ continue;
+
pa_xfree(pcm_path);
pcm_path = pa_sprintf_malloc("%s/%s", card_path, de->d_name);
@@ -197,7 +242,7 @@ static pa_bool_t is_card_busy(const char *id) {
continue;
}
- if (!is_modem && !pa_streq(line, "closed\n")) {
+ if (!pa_streq(line, "closed\n")) {
busy = TRUE;
break;
}
@@ -208,7 +253,6 @@ fail:
pa_xfree(card_path);
pa_xfree(pcm_path);
- pa_xfree(sysfs_path);
pa_xfree(sub_status);
pa_xfree(space);
@@ -610,43 +654,6 @@ static int setup_inotify(struct userdata *u) {
return 0;
}
-static const char *pa_udev_get_sysattr(const char *card_idx, const char *name) {
- struct udev *udev;
- struct udev_device *card = NULL;
- char *t, *r = NULL;
- const char *v;
-
- pa_assert(card_idx);
- pa_assert(name);
-
- if (!(udev = udev_new())) {
- pa_log_error("Failed to allocate udev context.");
- goto finish;
- }
-
- t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
- card = udev_device_new_from_syspath(udev, t);
- pa_xfree(t);
-
- if (!card) {
- pa_log_error("Failed to get card object.");
- goto finish;
- }
-
- if ((v = udev_device_get_sysattr_value(card, name)) && *v)
- r = pa_xstrdup(v);
-
-finish:
-
- if (card)
- udev_device_unref(card);
-
- if (udev)
- udev_unref(udev);
-
- return r;
-}
-
int pa__init(pa_module *m) {
struct userdata *u = NULL;
pa_modargs *ma;
--
1.7.0

View file

@ -0,0 +1,39 @@
From 93cb75d78ed82c40e525a8b30f1ead147ad35ead Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 14 Jan 2010 02:33:49 +0100
Subject: [PATCH 19/62] daemon: first take name on the bus, then return in starter process
http://pulseaudio.org/ticket/748
---
src/daemon/main.c | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/daemon/main.c b/src/daemon/main.c
index eafd72a..c7e202a 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -952,6 +952,10 @@ int main(int argc, char *argv[]) {
goto finish;
}
+#ifdef HAVE_DBUS
+ dbus = register_dbus(c);
+#endif
+
#ifdef HAVE_FORK
if (daemon_pipe[1] >= 0) {
int ok = 0;
@@ -961,10 +965,6 @@ int main(int argc, char *argv[]) {
}
#endif
-#ifdef HAVE_DBUS
- dbus = register_dbus(c);
-#endif
-
pa_log_info(_("Daemon startup complete."));
retval = 0;
--
1.7.0

View file

@ -0,0 +1,49 @@
From 48e0f6808bcc8e07622e4a45b3aabfc4679e9966 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 14 Jan 2010 02:53:50 +0100
Subject: [PATCH 20/62] alsa: cover bass boost mixer element
http://pulseaudio.org/ticket/740
---
src/modules/alsa/alsa-mixer.c | 2 ++
.../alsa/mixer/paths/analog-output.conf.common | 11 +++++++++++
2 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 8b13239..8bbd1f5 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1713,6 +1713,8 @@ static int option_verify(pa_alsa_option *o) {
{ "input-boost-off", N_("No Boost") },
{ "output-amplifier-on", N_("Amplifier") },
{ "output-amplifier-off", N_("No Amplifier") },
+ { "output-bass-boost-on", N_("Bass Boost") },
+ { "output-bass-boost-off", N_("No Bass Boost") },
{ "output-speaker", N_("Speaker") },
{ "output-headphones", N_("Headphones") }
};
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common
index fd7f0cf..6131da5 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-output.conf.common
@@ -110,6 +110,17 @@ priority = 10
name = output-amplifier-off
priority = 0
+[Element Bass Boost]
+switch = select
+
+[Option Bass Boost:on]
+name = output-bass-boost-on
+priority = 0
+
+[Option Bass Boost:off]
+name = output-bass-boost-off
+priority = 10
+
;;; 'Analog Output'
[Element Analog Output]
--
1.7.0

View file

@ -0,0 +1,55 @@
From 366e6d7e90d3bebc98a1af3cfb04b4cfc8cff6f5 Mon Sep 17 00:00:00 2001
From: Arun Raghavan <arun.raghavan@collabora.co.uk>
Date: Sun, 6 Dec 2009 12:20:53 +0530
Subject: [PATCH 21/62] Mark shared variables as volatile
'n_waiting' and 'n_waiting_for_accept' may be accessed from mulitple
threads, and thus need to be marked as volatile to suppres certain
compiler optimisations. All uses are protected by a mutex, so we don't
need to worry about cache issues (added documentation for this as well).
This addresses bug #738.
---
src/pulse/thread-mainloop.c | 5 ++++-
1 files changed, 4 insertions(+), 1 deletions(-)
diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index a2b98ce..14ed926 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -51,7 +51,7 @@
struct pa_threaded_mainloop {
pa_mainloop *real_mainloop;
- int n_waiting, n_waiting_for_accept;
+ volatile int n_waiting, n_waiting_for_accept;
pa_thread* thread;
pa_mutex* mutex;
@@ -185,6 +185,7 @@ void pa_threaded_mainloop_unlock(pa_threaded_mainloop *m) {
pa_mutex_unlock(m->mutex);
}
+/* Called with the lock taken */
void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept) {
pa_assert(m);
@@ -198,6 +199,7 @@ void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept) {
}
}
+/* Called with the lock taken */
void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
pa_assert(m);
@@ -212,6 +214,7 @@ void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
m->n_waiting --;
}
+/* Called with the lock taken */
void pa_threaded_mainloop_accept(pa_threaded_mainloop *m) {
pa_assert(m);
--
1.7.0

View file

@ -0,0 +1,153 @@
From e129f8577a405266a5b7d4a7ee75bd56dd43953e Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 14 Jan 2010 20:31:00 +0100
Subject: [PATCH 22/62] udev: use ID_MODEL_ENC instead of ID_MODEL if it is set
That way we should be able to make use of the nicer USB strings the USB
hw provides.
Fixes the issues pointed out in:
https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-January/006248.html
---
src/modules/udev-util.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/src/modules/udev-util.c b/src/modules/udev-util.c
index cc82446..eee5409 100644
--- a/src/modules/udev-util.c
+++ b/src/modules/udev-util.c
@@ -58,6 +58,112 @@ static int read_id(struct udev_device *d, const char *n) {
return u;
}
+static int dehex(char x) {
+ if (x >= '0' && x <= '9')
+ return x - '0';
+
+ if (x >= 'A' && x <= 'F')
+ return x - 'A';
+
+ if (x >= 'a' && x <= 'f')
+ return x - 'a';
+
+ return -1;
+}
+
+static void proplist_sets_unescape(pa_proplist *p, const char *prop, const char *s) {
+ const char *f;
+ char *t, *r;
+ int c;
+
+ enum {
+ TEXT,
+ BACKSLASH,
+ EX,
+ FIRST
+ } state = TEXT;
+
+ /* The resulting string is definitely shorter than the source string */
+ r = pa_xnew(char, strlen(s)+1);
+
+ for (f = s, t = r; *f; f++) {
+
+ switch (state) {
+
+ case TEXT:
+ if (*f == '\\')
+ state = BACKSLASH;
+ else
+ *(t++) = *f;
+ break;
+
+ case BACKSLASH:
+ if (*f == 'x')
+ state = EX;
+ else {
+ *(t++) = '\\';
+ *(t++) = *f;
+ state = TEXT;
+ }
+ break;
+
+ case EX:
+ c = dehex(*f);
+
+ if (c < 0) {
+ *(t++) = '\\';
+ *(t++) = 'x';
+ *(t++) = *f;
+ state = TEXT;
+ } else
+ state = FIRST;
+
+ break;
+
+ case FIRST: {
+ int d = dehex(*f);
+
+ if (d < 0) {
+ *(t++) = '\\';
+ *(t++) = 'x';
+ *(t++) = *(f-1);
+ *(t++) = *f;
+ } else
+ *(t++) = (char) (c << 4) | d;
+
+ state = TEXT;
+ break;
+ }
+ }
+ }
+
+ switch (state) {
+
+ case TEXT:
+ break;
+
+ case BACKSLASH:
+ *(t++) = '\\';
+ break;
+
+ case EX:
+ *(t++) = '\\';
+ *(t++) = 'x';
+ break;
+
+ case FIRST:
+ *(t++) = '\\';
+ *(t++) = 'x';
+ *(t++) = *(f-1);
+ break;
+ }
+
+ *t = 0;
+
+ pa_proplist_sets(p, prop, r);
+ pa_xfree(r);
+}
+
int pa_udev_get_info(int card_idx, pa_proplist *p) {
int r = -1;
struct udev *udev;
@@ -107,6 +213,8 @@ int pa_udev_get_info(int card_idx, pa_proplist *p) {
if (!pa_proplist_contains(p, PA_PROP_DEVICE_VENDOR_NAME)) {
if ((v = udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) && *v)
pa_proplist_sets(p, PA_PROP_DEVICE_VENDOR_NAME, v);
+ else if ((v = udev_device_get_property_value(card, "ID_VENDOR_ENC")) && *v)
+ proplist_sets_unescape(p, PA_PROP_DEVICE_VENDOR_NAME, v);
else if ((v = udev_device_get_property_value(card, "ID_VENDOR")) && *v)
pa_proplist_sets(p, PA_PROP_DEVICE_VENDOR_NAME, v);
}
@@ -118,6 +226,8 @@ int pa_udev_get_info(int card_idx, pa_proplist *p) {
if (!pa_proplist_contains(p, PA_PROP_DEVICE_PRODUCT_NAME)) {
if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) && *v)
pa_proplist_sets(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
+ else if ((v = udev_device_get_property_value(card, "ID_MODEL_ENC")) && *v)
+ proplist_sets_unescape(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
else if ((v = udev_device_get_property_value(card, "ID_MODEL")) && *v)
pa_proplist_sets(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
}
--
1.7.0

View file

@ -0,0 +1,268 @@
From 27df02779a26e0356497a39bee04a28138ba52af Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 15 Jan 2010 01:25:21 +0100
Subject: [PATCH 23/62] pacat: allow configuration of latency in msec
---
man/pacat.1.xml.in | 96 +++++++++++++++++++++++++++++++++++++++++++--------
src/utils/pacat.c | 46 ++++++++++++++++++++-----
2 files changed, 118 insertions(+), 24 deletions(-)
diff --git a/man/pacat.1.xml.in b/man/pacat.1.xml.in
index 68a3a12..2e27450 100644
--- a/man/pacat.1.xml.in
+++ b/man/pacat.1.xml.in
@@ -21,18 +21,22 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.
-->
-<manpage name="pacat" section="1" desc="Play back or record raw audio streams on a PulseAudio sound server">
+<manpage name="pacat" section="1" desc="Play back or record raw or encoded audio streams on a PulseAudio sound server">
<synopsis>
+ <cmd>paplay [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
+ <cmd>parecord [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
<cmd>pacat [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
<cmd>parec [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
- <cmd>paplay <opt>--help</opt></cmd>
- <cmd>paplay <opt>--version</opt></cmd>
+ <cmd>pamon [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
+ <cmd>pacat <opt>--help</opt></cmd>
+ <cmd>pacat <opt>--version</opt></cmd>
</synopsis>
<description>
<p><file>pacat</file> is a simple tool for playing back or
- capturing raw audio files on a PulseAudio sound server.</p>
+ capturing raw or encoded audio files on a PulseAudio sound
+ server.</p>
</description>
<options>
@@ -52,13 +56,13 @@ USA.
<option>
<p><opt>-r | --record</opt></p>
- <optdesc><p>Capture raw audio data and write it to the specified file or to STDOUT if none is specified. If the tool is called under the name <file>parec</file> this is the default.</p></optdesc>
+ <optdesc><p>Capture audio data and write it to the specified file or to STDOUT if none is specified. If the tool is called under the name <file>parec</file> this is the default.</p></optdesc>
</option>
<option>
<p><opt>-p | --playback</opt></p>
- <optdesc><p>Read raw audio data from the specified file or STDIN if none is specified, and play it back. If the tool is called under the name <file>pacat</file> this is the default.</p></optdesc>
+ <optdesc><p>Read audio data from the specified file or STDIN if none is specified, and play it back. If the tool is called under the name <file>pacat</file> this is the default.</p></optdesc>
</option>
<option>
@@ -108,14 +112,17 @@ USA.
<optdesc><p>Capture or play back audio with the specified sample
format. Specify one of <opt>u8</opt>, <opt>s16le</opt>,
- <opt>s16be</opt>, <opt>s32le</opt>,
- <opt>s32be</opt>, <opt>float32le</opt>, <opt>float32be</opt>,
- <opt>ulaw</opt>, <opt>alaw</opt>. Depending on the endianess of
- the CPU the
- formats <opt>s16ne</opt>, <opt>s16re</opt>, <opt>s32ne</opt>, <opt>s32re</opt>,
- <opt>float32ne</opt>, <opt>float32re</opt> (for native,
- resp. reverse endian) are available as aliases. Defaults to
- s16ne.</p></optdesc>
+ <opt>s16be</opt>, <opt>s32le</opt>, <opt>s32be</opt>,
+ <opt>float32le</opt>, <opt>float32be</opt>, <opt>ulaw</opt>,
+ <opt>alaw</opt>, <opt>s32le</opt>, <opt>s32be</opt>,
+ <opt>s24le</opt>, <opt>s24be</opt>, <opt>s24-32le</opt>,
+ <opt>s24-32be</opt>. Depending on the endianess of the CPU the
+ formats <opt>s16ne</opt>, <opt>s16re</opt>, <opt>s32ne</opt>,
+ <opt>s32re</opt>, <opt>float32ne</opt>, <opt>float32re</opt>,
+ <opt>s32ne</opt>, <opt>s32re</opt>, <opt>s24ne</opt>,
+ <opt>s24re</opt>, <opt>s24-32ne</opt>, <opt>s24-32re</opt> (for
+ native, resp. reverse endian) are available as aliases. Defaults
+ to s16ne.</p></optdesc>
</option>
<option>
@@ -170,6 +177,65 @@ USA.
<optdesc><p>Never remap channels. Instead of mapping channels by their name this will match them solely by their index/order.</p></optdesc>
</option>
+ <option>
+ <p><opt>--latency</opt><arg>=BYTES</arg></p>
+ <optdesc><p>Explicitly configure the latency, with a time
+ specified in bytes in the selected sample format. If left out
+ the server will pick the latency, usually relatively high for
+ power saving reasons. Use either this option or
+ <opt>--latency-msec</opt>, but not both.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--latency-msec</opt><arg>=MSEC</arg></p>
+ <optdesc><p>Explicitly configure the latency, with a time
+ specified in miliseconds. If left out the server will pick the
+ latency, usually relatively high for power saving reasons. Use
+ either this option or <opt>--latency</opt>, but not
+ both.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--process-time</opt><arg>=BYTES</arg></p>
+ <optdesc><p>Explicitly configure the process time, with a time
+ specified in bytes in the selected sample format. If left out
+ the server will pick the process time. Use either this option or
+ <opt>--process-time-msec</opt>, but not both.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--process-time-msec</opt><arg>=MSEC</arg></p>
+ <optdesc><p>Explicitly configure the process time, with a time
+ specified in miliseconds. If left out the server will pick the
+ process time. Use either this option or <opt>--process-time</opt>,
+ but not both.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--property</opt><arg>=PROPERTY=VALUE</arg></p>
+ <optdesc><p>Attach a property to the client and stream. May be
+ used multiple times</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--raw</opt></p>
+ <optdesc><p>Play/record raw audio data. This is the default if
+ this program is invoked as <cmd>pacat</cmd>, <cmd>parec</cmd> or
+ <cmd>pamon</cmd>.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--file-format</opt><arg>[=FFORMAT]</arg></p>
+ <optdesc><p>Play/record encoded audio data in the file format
+ specified. This is the default if this program is invoked as
+ <cmd>paplay</cmd> and <cmd>parecord</cmd>.</p></optdesc>
+ </option>
+
+ <option>
+ <p><opt>--list-file-formats</opt></p>
+ <optdesc><p>List supported file formats.</p></optdesc>
+ </option>
+
</options>
<section name="Authors">
@@ -178,7 +244,7 @@ USA.
<section name="See also">
<p>
- <manref name="pulseaudio" section="1"/>, <manref name="paplay" section="1"/>
+ <manref name="pulseaudio" section="1"/>, <manref name="pactl" section="1"/>
</p>
</section>
diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 5f29ba3..a5d2e9a 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -45,6 +45,7 @@
#include <pulsecore/core-util.h>
#include <pulsecore/log.h>
#include <pulsecore/sndfile-util.h>
+#include <pulsecore/core-util.h>
#define TIME_EVENT_USEC 50000
@@ -86,6 +87,7 @@ static sf_count_t (*writef_function)(SNDFILE *_sndfile, const void *ptr, sf_coun
static pa_stream_flags_t flags = 0;
static size_t latency = 0, process_time = 0;
+static int32_t latency_msec = 0, process_time_msec = 0;
static pa_bool_t raw = TRUE;
static int file_format = -1;
@@ -434,19 +436,25 @@ static void context_state_callback(pa_context *c, void *userdata) {
buffer_attr.maxlength = (uint32_t) -1;
buffer_attr.prebuf = (uint32_t) -1;
- if (latency > 0) {
+ if (latency_msec > 0) {
+ buffer_attr.fragsize = buffer_attr.tlength = pa_usec_to_bytes(latency_msec * PA_USEC_PER_MSEC, &sample_spec);
+ flags |= PA_STREAM_ADJUST_LATENCY;
+ } else if (latency > 0) {
buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) latency;
- buffer_attr.minreq = (uint32_t) process_time;
flags |= PA_STREAM_ADJUST_LATENCY;
- } else {
- buffer_attr.tlength = (uint32_t) -1;
+ } else
+ buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) -1;
+
+ if (process_time_msec > 0) {
+ buffer_attr.minreq = pa_usec_to_bytes(process_time_msec * PA_USEC_PER_MSEC, &sample_spec);
+ } else if (process_time > 0)
+ buffer_attr.minreq = (uint32_t) process_time;
+ else
buffer_attr.minreq = (uint32_t) -1;
- buffer_attr.fragsize = (uint32_t) -1;
- }
if (mode == PLAYBACK) {
pa_cvolume cv;
- if (pa_stream_connect_playback(stream, device, latency > 0 ? &buffer_attr : NULL, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
+ if (pa_stream_connect_playback(stream, device, &buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
pa_log(_("pa_stream_connect_playback() failed: %s"), pa_strerror(pa_context_errno(c)));
goto fail;
}
@@ -634,9 +642,11 @@ static void help(const char *argv0) {
" --no-remap Map channels by index instead of name.\n"
" --latency=BYTES Request the specified latency in bytes.\n"
" --process-time=BYTES Request the specified process time per request in bytes.\n"
+ " --latency-msec=MSEC Request the specified latency in msec.\n"
+ " --process-time-msec=MSEC Request the specified process time per request in msec.\n"
" --property=PROPERTY=VALUE Set the specified property to the specified value.\n"
" --raw Record/play raw PCM data.\n"
- " --file-format=FFORMAT Record/play formatted PCM data.\n"
+ " --file-format[=FFORMAT] Record/play formatted PCM data.\n"
" --list-file-formats List available file formats.\n")
, argv0);
}
@@ -659,7 +669,9 @@ enum {
ARG_RAW,
ARG_PROPERTY,
ARG_FILE_FORMAT,
- ARG_LIST_FILE_FORMATS
+ ARG_LIST_FILE_FORMATS,
+ ARG_LATENCY_MSEC,
+ ARG_PROCESS_TIME_MSEC
};
int main(int argc, char *argv[]) {
@@ -695,6 +707,8 @@ int main(int argc, char *argv[]) {
{"raw", 0, NULL, ARG_RAW},
{"file-format", 2, NULL, ARG_FILE_FORMAT},
{"list-file-formats", 0, NULL, ARG_LIST_FILE_FORMATS},
+ {"latency-msec", 1, NULL, ARG_LATENCY_MSEC},
+ {"process-time-msec", 1, NULL, ARG_PROCESS_TIME_MSEC},
{NULL, 0, NULL, 0}
};
@@ -854,6 +868,20 @@ int main(int argc, char *argv[]) {
}
break;
+ case ARG_LATENCY_MSEC:
+ if (((latency_msec = (int32_t) atoi(optarg))) <= 0) {
+ pa_log(_("Invalid latency specification '%s'"), optarg);
+ goto quit;
+ }
+ break;
+
+ case ARG_PROCESS_TIME_MSEC:
+ if (((process_time_msec = (int32_t) atoi(optarg))) <= 0) {
+ pa_log(_("Invalid process time specification '%s'"), optarg);
+ goto quit;
+ }
+ break;
+
case ARG_PROPERTY: {
char *t;
--
1.7.0

View file

@ -0,0 +1,107 @@
From fa64230107bd348ceda271dc9db74765c694d311 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 15 Jan 2010 01:25:42 +0100
Subject: [PATCH 24/62] client: implement $PULSE_LATENCY_MSEC
This allows easy overriding of a clients latency setting for debugging
purposes.
http://pulseaudio.org/ticket/753
---
src/pulse/stream.c | 37 +++++++++++++++++++++++++++++++------
1 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 79b2868..daeb53a 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -39,6 +39,7 @@
#include <pulsecore/hashmap.h>
#include <pulsecore/macro.h>
#include <pulsecore/core-rtclock.h>
+#include <pulsecore/core-util.h>
#include "fork-detect.h"
#include "internal.h"
@@ -855,10 +856,28 @@ static void create_stream_complete(pa_stream *s) {
check_smoother_status(s, TRUE, FALSE, FALSE);
}
-static void automatic_buffer_attr(pa_stream *s, pa_buffer_attr *attr, const pa_sample_spec *ss) {
+static void patch_buffer_attr(pa_stream *s, pa_buffer_attr *attr, pa_stream_flags_t *flags) {
+ const char *e;
+
pa_assert(s);
pa_assert(attr);
- pa_assert(ss);
+
+ if ((e = getenv("PULSE_LATENCY_MSEC"))) {
+ uint32_t ms;
+
+ if (pa_atou(e, &ms) < 0 || ms <= 0)
+ pa_log_debug("Failed to parse $PULSE_LATENCY_MSEC: %s", e);
+ else {
+ attr->maxlength = (uint32_t) -1;
+ attr->tlength = pa_usec_to_bytes(ms * PA_USEC_PER_MSEC, &s->sample_spec);
+ attr->minreq = (uint32_t) -1;
+ attr->prebuf = (uint32_t) -1;
+ attr->fragsize = attr->tlength;
+ }
+
+ if (flags)
+ *flags |= PA_STREAM_ADJUST_LATENCY;
+ }
if (s->context->version >= 13)
return;
@@ -873,7 +892,7 @@ static void automatic_buffer_attr(pa_stream *s, pa_buffer_attr *attr, const pa_s
attr->maxlength = 4*1024*1024; /* 4MB is the maximum queue length PulseAudio <= 0.9.9 supported. */
if (attr->tlength == (uint32_t) -1)
- attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, ss); /* 250ms of buffering */
+ attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, &s->sample_spec); /* 250ms of buffering */
if (attr->minreq == (uint32_t) -1)
attr->minreq = (attr->tlength)/5; /* Ask for more data when there are only 200ms left in the playback buffer */
@@ -1064,15 +1083,16 @@ static int create_stream(
pa_stream_ref(s);
s->direction = direction;
- s->flags = flags;
- s->corked = !!(flags & PA_STREAM_START_CORKED);
if (sync_stream)
s->syncid = sync_stream->syncid;
if (attr)
s->buffer_attr = *attr;
- automatic_buffer_attr(s, &s->buffer_attr, &s->sample_spec);
+ patch_buffer_attr(s, &s->buffer_attr, &flags);
+
+ s->flags = flags;
+ s->corked = !!(flags & PA_STREAM_START_CORKED);
if (flags & PA_STREAM_INTERPOLATE_TIMING) {
pa_usec_t x;
@@ -2412,6 +2432,7 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
pa_operation *o;
pa_tagstruct *t;
uint32_t tag;
+ pa_buffer_attr copy;
pa_assert(s);
pa_assert(PA_REFCNT_VALUE(s) >= 1);
@@ -2435,6 +2456,10 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
&tag);
pa_tagstruct_putu32(t, s->channel);
+ copy = *attr;
+ patch_buffer_attr(s, &copy, NULL);
+ attr = &copy;
+
pa_tagstruct_putu32(t, attr->maxlength);
if (s->direction == PA_STREAM_PLAYBACK)
--
1.7.0

View file

@ -0,0 +1,57 @@
From 86144ee6cb6af54903a8d3d8395751ae26a4d134 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 14 Jan 2010 21:32:26 +0100
Subject: [PATCH 25/62] client: include dolby channel names in comments
---
src/pulse/channelmap.h | 20 ++++++++++----------
1 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/pulse/channelmap.h b/src/pulse/channelmap.h
index 469effc..d1d5c8b 100644
--- a/src/pulse/channelmap.h
+++ b/src/pulse/channelmap.h
@@ -74,9 +74,9 @@ typedef enum pa_channel_position {
PA_CHANNEL_POSITION_INVALID = -1,
PA_CHANNEL_POSITION_MONO = 0,
- PA_CHANNEL_POSITION_FRONT_LEFT, /* Apple calls this 'Left' */
- PA_CHANNEL_POSITION_FRONT_RIGHT, /* Apple calls this 'Right' */
- PA_CHANNEL_POSITION_FRONT_CENTER, /* Apple calls this 'Center' */
+ PA_CHANNEL_POSITION_FRONT_LEFT, /* Apple, Dolby call this 'Left' */
+ PA_CHANNEL_POSITION_FRONT_RIGHT, /* Apple, Dolby call this 'Right' */
+ PA_CHANNEL_POSITION_FRONT_CENTER, /* Apple, Dolby call this 'Center' */
/** \cond fulldocs */
PA_CHANNEL_POSITION_LEFT = PA_CHANNEL_POSITION_FRONT_LEFT,
@@ -84,20 +84,20 @@ typedef enum pa_channel_position {
PA_CHANNEL_POSITION_CENTER = PA_CHANNEL_POSITION_FRONT_CENTER,
/** \endcond */
- PA_CHANNEL_POSITION_REAR_CENTER, /* Microsoft calls this 'Back Center', Apple calls this 'Center Surround' */
- PA_CHANNEL_POSITION_REAR_LEFT, /* Microsoft calls this 'Back Left', Apple calls this 'Left Surround' */
- PA_CHANNEL_POSITION_REAR_RIGHT, /* Microsoft calls this 'Back Right', Apple calls this 'Right Surround' */
+ PA_CHANNEL_POSITION_REAR_CENTER, /* Microsoft calls this 'Back Center', Apple calls this 'Center Surround', Dolby calls this 'Surround Rear Center' */
+ PA_CHANNEL_POSITION_REAR_LEFT, /* Microsoft calls this 'Back Left', Apple calls this 'Left Surround' (!), Dolby calls this 'Surround Rear Left' */
+ PA_CHANNEL_POSITION_REAR_RIGHT, /* Microsoft calls this 'Back Right', Apple calls this 'Right Surround' (!), Dolby calls this 'Surround Rear Right' */
PA_CHANNEL_POSITION_LFE, /* Microsoft calls this 'Low Frequency', Apple calls this 'LFEScreen' */
/** \cond fulldocs */
PA_CHANNEL_POSITION_SUBWOOFER = PA_CHANNEL_POSITION_LFE,
/** \endcond */
- PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, /* Apple calls this 'Left Center' */
- PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, /* Apple calls this 'Right Center */
+ PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER, /* Apple, Dolby call this 'Left Center' */
+ PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER, /* Apple, Dolby call this 'Right Center */
- PA_CHANNEL_POSITION_SIDE_LEFT, /* Apple calls this 'Left Surround Direct' */
- PA_CHANNEL_POSITION_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct' */
+ PA_CHANNEL_POSITION_SIDE_LEFT, /* Apple calls this 'Left Surround Direct', Dolby calls this 'Surround Left' (!) */
+ PA_CHANNEL_POSITION_SIDE_RIGHT, /* Apple calls this 'Right Surround Direct', Dolby calls this 'Surround Right' (!) */
PA_CHANNEL_POSITION_AUX0,
PA_CHANNEL_POSITION_AUX1,
--
1.7.0

View file

@ -0,0 +1,116 @@
From 66e1a2d05139d7968d41d9f1a88c22093cdd04d5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20K=C3=A5gedal?= <davidk@lysator.liu.se>
Date: Tue, 5 Jan 2010 20:14:11 +0100
Subject: [PATCH 26/62] alsa: add profile set for M-Audio FastTrack Pro USB
---
.../alsa/mixer/profile-sets/90-pulseaudio.rules | 1 +
.../mixer/profile-sets/maudio-fasttrack-pro.conf | 85 ++++++++++++++++++++
2 files changed, 86 insertions(+), 0 deletions(-)
create mode 100644 src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf
diff --git a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
index ea1a2fe..b8e88d0 100644
--- a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+++ b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
@@ -22,5 +22,6 @@ KERNEL!="card*", GOTO="pulseaudio_end"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1978", ENV{PULSE_PROFILE_SET}="native-instruments-audio8dj.conf"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="0839", ENV{PULSE_PROFILE_SET}="native-instruments-audio4dj.conf"
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf"
LABEL="pulseaudio_end"
diff --git a/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf
new file mode 100644
index 0000000..75f5112
--- /dev/null
+++ b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf
@@ -0,0 +1,85 @@
+# This file is part of PulseAudio.
+#
+# PulseAudio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# PulseAudio is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with PulseAudio; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+
+; M-Audio FastTrack Pro
+;
+; This card has one duplex stereo channel called A and an additional
+; stereo output channel called B.
+;
+; We knowingly only define a subset of the theoretically possible
+; mapping combinations as profiles here.
+;
+; See default.conf for an explanation on the directives used here.
+
+[General]
+auto-profiles = no
+
+[Mapping analog-stereo-a-output]
+description = Analog Stereo Channel A
+device-strings = hw:%f,0,0
+channel-map = left,right
+direction = output
+
+[Mapping analog-stereo-a-input]
+description = Analog Stereo Channel A
+device-strings = hw:%f,0,0
+channel-map = left,right
+direction = input
+
+[Mapping analog-stereo-b-output]
+description = Analog Stereo Channel B
+device-strings = hw:%f,1,0
+channel-map = left,right
+direction = output
+
+[Profile output:analog-stereo-all+input:analog-stereo-all]
+description = Analog Stereo Duplex Channel A, Analog Stereo output Channel B
+output-mappings = analog-stereo-a-output analog-stereo-b-output
+input-mappings = analog-stereo-a-input
+priority = 100
+skip-probe = yes
+
+[Profile output:analog-stereo-a-output+input:analog-stereo-a-input]
+description = Analog Stereo Duplex Channel A
+output-mappings = analog-stereo-a-output
+input-mappings = analog-stereo-a-input
+priority = 40
+skip-probe = yes
+
+[Profile output:analog-stereo-b+input:analog-stereo-b]
+description = Analog Stereo Output Channel B
+output-mappings = analog-stereo-b-output
+input-mappings =
+priority = 50
+skip-probe = yes
+
+[Profile output:analog-stereo-a]
+description = Analog Stereo Output Channel A
+output-mappings = analog-stereo-a-output
+priority = 5
+skip-probe = yes
+
+[Profile output:analog-stereo-b]
+description = Analog Stereo Output Channel B
+output-mappings = analog-stereo-b-output
+priority = 6
+skip-probe = yes
+
+[Profile input:analog-stereo-a]
+description = Analog Stereo Input Channel A
+input-mappings = analog-stereo-a-input
+priority = 2
+skip-probe = yes
--
1.7.0

View file

@ -0,0 +1,35 @@
From a2418effe7c4bc54390939ccd07dd6227e6cdfa5 Mon Sep 17 00:00:00 2001
From: Daniel T Chen <crimsun@ubuntu.com>
Date: Mon, 4 Jan 2010 21:44:37 -0500
Subject: [PATCH 27/62] threaded-mainloop: Properly initialise m->n_waiting_for_accept to prevent deadlock
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Compiler optimisations have been seen to initialise
m->n_waiting_for_accept to a positive non-zero value, so the while() in
pa_threaded_mainloop_signal() never proceeds. Fix this by properly
initializing m->n_waiting_for_accept in pa_threaded_mainloop_new().
Patch from Iain Bucław.
https://bugs.launchpad.net/bugs/502992
---
src/pulse/thread-mainloop.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index 14ed926..1693404 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -116,6 +116,7 @@ pa_threaded_mainloop *pa_threaded_mainloop_new(void) {
pa_mainloop_set_poll_func(m->real_mainloop, poll_func, m->mutex);
m->n_waiting = 0;
+ m->n_waiting_for_accept = 0;
return m;
}
--
1.7.0

View file

@ -0,0 +1,29 @@
From 8c7148a4eaecd687a004b0611748452fd4b41e92 Mon Sep 17 00:00:00 2001
From: Daniel T Chen <crimsun@ubuntu.com>
Date: Mon, 4 Jan 2010 21:53:36 -0500
Subject: [PATCH 28/62] udev: Use SOUND_CLASS instead of SOUND_FORM_FACTOR when checking for modem
The fact whether an ALSA card is a modem is stored in the SOUND_CLASS,
not the SOUND_FORM_FACTOR property. So read it from there.
Patch from Whoopie.
---
src/modules/module-udev-detect.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index b8568b2..3cf3e58 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -426,7 +426,7 @@ static void process_device(struct userdata *u, struct udev_device *dev) {
return;
}
- if ((ff = udev_device_get_property_value(dev, "SOUND_FORM_FACTOR")) &&
+ if ((ff = udev_device_get_property_value(dev, "SOUND_CLASS")) &&
pa_streq(ff, "modem")) {
pa_log_debug("Ignoring %s, because it is a modem.", udev_device_get_devpath(dev));
return;
--
1.7.0

View file

@ -0,0 +1,39 @@
From 09c416e11fe4f53c468f68ad0a67f4696241050a Mon Sep 17 00:00:00 2001
From: Daniel T Chen <crimsun@ubuntu.com>
Date: Wed, 16 Dec 2009 23:55:05 -0500
Subject: [PATCH 29/62] More src/pulsecore/cpu-arm.c FTBFS fixes
Fix missing argument to pa_read(), and be consistent with declaration of
state variable in pa_cpu_init_arm().
Signed-off-by: Daniel T Chen <crimsun@ubuntu.com>
---
src/pulsecore/cpu-arm.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c
index 453b784..61299cc 100644
--- a/src/pulsecore/cpu-arm.c
+++ b/src/pulsecore/cpu-arm.c
@@ -67,7 +67,7 @@ static char *get_cpuinfo(void) {
return NULL;
}
- if ((n = pa_read(fd, cpuinfo, MAX_BUFFER-1)) < 0) {
+ if ((n = pa_read(fd, cpuinfo, MAX_BUFFER-1, NULL)) < 0) {
pa_xfree(cpuinfo);
pa_close(fd);
return NULL;
@@ -105,7 +105,8 @@ void pa_cpu_init_arm (void) {
}
/* get the CPU features */
if ((line = get_cpuinfo_line (cpuinfo, "Features"))) {
- char *state = NULL, *current;
+ const char *state = NULL;
+ char *current;
while ((current = pa_split_spaces (line, &state))) {
if (!strcmp (current, "vfp"))
--
1.7.0

View file

@ -0,0 +1,33 @@
From fd5c802ecb5ae5ed9b294422410761126a37d1b3 Mon Sep 17 00:00:00 2001
From: Daniel T Chen <crimsun@ubuntu.com>
Date: Wed, 16 Dec 2009 22:53:18 -0500
Subject: [PATCH 30/62] Fix the following warnings (which now cause buildd failures in Ubuntu 10.04):
pulsecore/cpu-arm.c: In function 'get_cpuinfo':
pulsecore/cpu-arm.c:70: warning: implicit declaration of function 'pa_read' [-Wimplicit-function-declaration]
pulsecore/cpu-arm.c:72: warning: implicit declaration of function 'pa_close' [-Wimplicit-function-declaration]
pulsecore/cpu-arm.c: In function 'pa_cpu_init_arm':
pulsecore/cpu-arm.c:110: warning: implicit declaration of function 'pa_split_spaces' [-Wimplicit-function-declaration]
pulsecore/cpu-arm.c:110: warning: assignment makes pointer from integer without a cast
Function `pa_split_spaces' implicitly converted to pointer at pulsecore/cpu-arm.c:110
Signed-off-by: Daniel T Chen <crimsun@ubuntu.com>
---
src/pulsecore/cpu-arm.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c
index 61299cc..56d0bbc 100644
--- a/src/pulsecore/cpu-arm.c
+++ b/src/pulsecore/cpu-arm.c
@@ -30,6 +30,7 @@
#include <fcntl.h>
#include <pulse/xmalloc.h>
+#include <pulsecore/core-util.h>
#include <pulsecore/log.h>
#include "cpu-arm.h"
--
1.7.0

View file

@ -0,0 +1,180 @@
From 52c66b47664d47154b2c8368e32beef27d4b2d03 Mon Sep 17 00:00:00 2001
From: Tanu Kaskinen <ext-tanu.kaskinen@nokia.com>
Date: Thu, 3 Dec 2009 13:22:05 +0200
Subject: [PATCH 31/62] libpulse: Store pa_stream pointers to hashmaps instead of dynarrays.
Since the stream identifiers (channels) are monotonically growing integer, it
isn't a good idea to use them as index to a dynamic array, because the array
will grow all the time. This is not a problem with client connections that
don't create many streams, but, for example, long-running clients that use
libcanberra for playing event sounds, this means that the client connection
effectively leaks memory.
---
src/pulse/context.c | 12 ++++++------
src/pulse/internal.h | 3 +--
src/pulse/stream.c | 20 ++++++++++----------
3 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/src/pulse/context.c b/src/pulse/context.c
index c83230d..91f4817 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -63,7 +63,7 @@
#include <pulsecore/native-common.h>
#include <pulsecore/pdispatch.h>
#include <pulsecore/pstream.h>
-#include <pulsecore/dynarray.h>
+#include <pulsecore/hashmap.h>
#include <pulsecore/socket-client.h>
#include <pulsecore/pstream-util.h>
#include <pulsecore/core-rtclock.h>
@@ -157,8 +157,8 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
c->system_bus = c->session_bus = NULL;
#endif
c->mainloop = mainloop;
- c->playback_streams = pa_dynarray_new();
- c->record_streams = pa_dynarray_new();
+ c->playback_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+ c->record_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
c->client_index = PA_INVALID_INDEX;
c->use_rtclock = pa_mainloop_is_our_api(mainloop);
@@ -252,9 +252,9 @@ static void context_free(pa_context *c) {
#endif
if (c->record_streams)
- pa_dynarray_free(c->record_streams, NULL, NULL);
+ pa_hashmap_free(c->record_streams, NULL, NULL);
if (c->playback_streams)
- pa_dynarray_free(c->playback_streams, NULL, NULL);
+ pa_hashmap_free(c->playback_streams, NULL, NULL);
if (c->mempool)
pa_mempool_free(c->mempool);
@@ -361,7 +361,7 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
pa_context_ref(c);
- if ((s = pa_dynarray_get(c->record_streams, channel))) {
+ if ((s = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(channel)))) {
if (chunk->memblock) {
pa_memblockq_seek(s->record_memblockq, offset, seek, TRUE);
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index c3ebf74..ab702b9 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -34,7 +34,6 @@
#include <pulsecore/socket-client.h>
#include <pulsecore/pstream.h>
#include <pulsecore/pdispatch.h>
-#include <pulsecore/dynarray.h>
#include <pulsecore/llist.h>
#include <pulsecore/native-common.h>
#include <pulsecore/strlist.h>
@@ -66,7 +65,7 @@ struct pa_context {
pa_pstream *pstream;
pa_pdispatch *pdispatch;
- pa_dynarray *record_streams, *playback_streams;
+ pa_hashmap *record_streams, *playback_streams;
PA_LLIST_HEAD(pa_stream, streams);
PA_LLIST_HEAD(pa_operation, operations);
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index daeb53a..ab8f8f4 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -201,7 +201,7 @@ static void stream_unlink(pa_stream *s) {
pa_pdispatch_unregister_reply(s->context->pdispatch, s);
if (s->channel_valid) {
- pa_dynarray_put((s->direction == PA_STREAM_PLAYBACK) ? s->context->playback_streams : s->context->record_streams, s->channel, NULL);
+ pa_hashmap_remove((s->direction == PA_STREAM_PLAYBACK) ? s->context->playback_streams : s->context->record_streams, PA_UINT32_TO_PTR(s->channel));
s->channel = 0;
s->channel_valid = FALSE;
}
@@ -356,7 +356,7 @@ void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, uint32_t tag,
goto finish;
}
- if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->record_streams, channel)))
+ if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -476,7 +476,7 @@ void pa_command_stream_moved(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
goto finish;
}
- if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->record_streams, channel)))
+ if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -559,7 +559,7 @@ void pa_command_stream_buffer_attr(pa_pdispatch *pd, uint32_t command, uint32_t
goto finish;
}
- if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams : c->record_streams, channel)))
+ if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -611,7 +611,7 @@ void pa_command_stream_suspended(pa_pdispatch *pd, uint32_t command, uint32_t ta
goto finish;
}
- if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c->record_streams, channel)))
+ if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -653,7 +653,7 @@ void pa_command_stream_started(pa_pdispatch *pd, uint32_t command, uint32_t tag,
goto finish;
}
- if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+ if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -699,7 +699,7 @@ void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
goto finish;
}
- if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->record_streams, channel)))
+ if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -735,7 +735,7 @@ void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tag
goto finish;
}
- if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+ if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -771,7 +771,7 @@ void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32
goto finish;
}
- if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+ if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
goto finish;
if (s->state != PA_STREAM_READY)
@@ -1019,7 +1019,7 @@ void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag,
}
s->channel_valid = TRUE;
- pa_dynarray_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback_streams, s->channel, s);
+ pa_hashmap_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback_streams, PA_UINT32_TO_PTR(s->channel), s);
create_stream_complete(s);
--
1.7.0

View file

@ -0,0 +1,166 @@
From 84782f24c5f43456430c796bd12f9face24f0573 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 18 Jan 2010 01:33:04 +0100
Subject: [PATCH 32/62] native: rework handling of seeks that depend on variables the client does not know anything about
All seeks/flushes that depend on the playback buffer read pointer cannot
be accounted for properly in the client since it does not know the
actual read pointer. Due to that the clients do not account for it at
all. We need do the same on the server side. And we did, but a little
bit too extreme. While we properly have not applied the changes to the
"request" counter we still do have to apply it to the "missing" counter.
This patch fixes that.
---
src/modules/module-combine.c | 4 ++--
src/modules/module-loopback.c | 4 ++--
src/pulse/stream.c | 5 +++++
src/pulsecore/memblockq.c | 6 ++++--
src/pulsecore/memblockq.h | 2 +-
src/pulsecore/protocol-native.c | 6 +++++-
src/pulsecore/sink-input.c | 2 +-
7 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c
index 62e6267..cffb901 100644
--- a/src/modules/module-combine.c
+++ b/src/modules/module-combine.c
@@ -562,7 +562,7 @@ static int sink_input_process_msg(pa_msgobject *obj, int code, void *data, int64
if (PA_SINK_IS_OPENED(o->sink_input->sink->thread_info.state))
pa_memblockq_push_align(o->memblockq, chunk);
else
- pa_memblockq_flush_write(o->memblockq);
+ pa_memblockq_flush_write(o->memblockq, TRUE);
return 0;
}
@@ -982,7 +982,7 @@ static void output_disable(struct output *o) {
o->sink_input = NULL;
/* Finally, drop all queued data */
- pa_memblockq_flush_write(o->memblockq);
+ pa_memblockq_flush_write(o->memblockq, TRUE);
pa_asyncmsgq_flush(o->inq, FALSE);
pa_asyncmsgq_flush(o->outq, FALSE);
}
diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index bb0182b..15ef96e 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -430,7 +430,7 @@ static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, in
if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
pa_memblockq_push_align(u->memblockq, chunk);
else
- pa_memblockq_flush_write(u->memblockq);
+ pa_memblockq_flush_write(u->memblockq, TRUE);
update_min_memblockq_length(u);
@@ -457,7 +457,7 @@ static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, in
if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
pa_memblockq_seek(u->memblockq, -offset, PA_SEEK_RELATIVE, TRUE);
else
- pa_memblockq_flush_write(u->memblockq);
+ pa_memblockq_flush_write(u->memblockq, TRUE);
u->recv_counter -= offset;
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index ab8f8f4..8da40ec 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -2146,6 +2146,11 @@ pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *use
* index, but the read index might jump. */
invalidate_indexes(s, TRUE, FALSE);
+ /* Note that we do not update requested_bytes here. This is
+ * because we cannot really know how data actually was dropped
+ * from the write index due to this. This 'error' will be applied
+ * by both client and server and hence we should be fine. */
+
return o;
}
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index 4641801..2b063fa 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -254,6 +254,8 @@ static void write_index_changed(pa_memblockq *bq, int64_t old_write_index, pa_bo
if (account)
bq->requested -= delta;
+ else
+ bq->missing -= delta;
/* pa_log("pushed/seeked %lli: requested counter at %lli, account=%i", (long long) delta, (long long) bq->requested, account); */
}
@@ -642,7 +644,7 @@ void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa
write_index_changed(bq, old, account);
}
-void pa_memblockq_flush_write(pa_memblockq *bq) {
+void pa_memblockq_flush_write(pa_memblockq *bq, pa_bool_t account) {
int64_t old;
pa_assert(bq);
@@ -652,7 +654,7 @@ void pa_memblockq_flush_write(pa_memblockq *bq) {
bq->write_index = bq->read_index;
pa_memblockq_prebuf_force(bq);
- write_index_changed(bq, old, TRUE);
+ write_index_changed(bq, old, account);
}
void pa_memblockq_flush_read(pa_memblockq *bq) {
diff --git a/src/pulsecore/memblockq.h b/src/pulsecore/memblockq.h
index 587c364..6132f31 100644
--- a/src/pulsecore/memblockq.h
+++ b/src/pulsecore/memblockq.h
@@ -118,7 +118,7 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq);
int pa_memblockq_splice(pa_memblockq *bq, pa_memblockq *source);
/* Set the queue to silence, set write index to read index */
-void pa_memblockq_flush_write(pa_memblockq *bq);
+void pa_memblockq_flush_write(pa_memblockq *bq, pa_bool_t account);
/* Set the queue to silence, set write read index to write index*/
void pa_memblockq_flush_read(pa_memblockq *bq);
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index b7b3f59..f80b0c2 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1325,6 +1325,10 @@ static void handle_seek(playback_stream *s, int64_t indexw) {
playback_stream_request_bytes(s);
}
+static void flush_write_no_account(pa_memblockq *q) {
+ pa_memblockq_flush_write(q, FALSE);
+}
+
/* Called from thread context */
static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
pa_sink_input *i = PA_SINK_INPUT(o);
@@ -1386,7 +1390,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
switch (code) {
case SINK_INPUT_MESSAGE_FLUSH:
- func = pa_memblockq_flush_write;
+ func = flush_write_no_account;
break;
case SINK_INPUT_MESSAGE_PREBUF_FORCE:
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index aa84ccb..7acb25f 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -801,7 +801,7 @@ void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sam
/* We were asked to drop all buffered data, and rerequest new
* data from implementor the next time push() is called */
- pa_memblockq_flush_write(i->thread_info.render_memblockq);
+ pa_memblockq_flush_write(i->thread_info.render_memblockq, TRUE);
} else if (i->thread_info.rewrite_nbytes > 0) {
size_t max_rewrite, amount;
--
1.7.0

View file

@ -0,0 +1,25 @@
From a631beeafb4729f8bed1c538846d0bb142cee7bf Mon Sep 17 00:00:00 2001
From: Colin Guthrie <cguthrie@mandriva.org>
Date: Tue, 9 Feb 2010 21:37:32 +0000
Subject: [PATCH 33/62] core: Fix macro typo - PA_SINK_IS_LINKED -> PA_SINK_INPUT_IS_LINKED
---
src/pulsecore/sink-input.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 7acb25f..3c957f1 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1086,7 +1086,7 @@ void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_p
if (p)
pa_proplist_update(i->proplist, mode, p);
- if (PA_SINK_IS_LINKED(i->state)) {
+ if (PA_SINK_INPUT_IS_LINKED(i->state)) {
pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
}
--
1.7.0

View file

@ -0,0 +1,292 @@
From e8cb96c0103d5bd23fe945afdc658a5f60b70a9d Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 15 Feb 2010 22:23:39 +0100
Subject: [PATCH 34/62] alsa: cover "Desktop Speaker" mixer elements
As exposed by really old Microsoft USB sound systems
---
src/modules/alsa/alsa-mixer.c | 3 +-
.../mixer/paths/analog-output-desktop-speaker.conf | 98 ++++++++++++++++++++
.../mixer/paths/analog-output-headphones-2.conf | 4 +
.../alsa/mixer/paths/analog-output-headphones.conf | 4 +
.../mixer/paths/analog-output-lfe-on-mono.conf | 4 +
.../alsa/mixer/paths/analog-output-mono.conf | 4 +
.../alsa/mixer/paths/analog-output-speaker.conf | 4 +
src/modules/alsa/mixer/paths/analog-output.conf | 4 +
src/modules/alsa/mixer/profile-sets/default.conf | 14 ++--
9 files changed, 131 insertions(+), 8 deletions(-)
create mode 100644 src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 8bbd1f5..cb814af 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1784,7 +1784,8 @@ static int path_verify(pa_alsa_path *p) {
{ "analog-output-lfe-on-mono", N_("Analog Output (LFE)") },
{ "analog-output-mono", N_("Analog Mono Output") },
{ "analog-output-headphones-2", N_("Analog Headphones 2") },
- { "analog-output-speaker", N_("Analog Speaker") }
+ { "analog-output-speaker", N_("Analog Speakers") }
+ { "analog-output-desktop-speaker", N_("Analog Speakers 2") }
};
pa_alsa_element *e;
diff --git a/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
new file mode 100644
index 0000000..9f18b25
--- /dev/null
+++ b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
@@ -0,0 +1,98 @@
+# This file is part of PulseAudio.
+#
+# PulseAudio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# PulseAudio is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with PulseAudio; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+
+; Path for mixers that have a 'Desktop Speaker' control
+;
+; See analog-output.conf.common for an explanation on the directives
+
+[General]
+priority = 100
+
+[Element Hardware Master]
+switch = mute
+volume = merge
+override-map.1 = all
+override-map.2 = all-left,all-right
+
+[Element Master]
+switch = mute
+volume = merge
+override-map.1 = all
+override-map.2 = all-left,all-right
+
+[Element Master Mono]
+switch = off
+volume = off
+
+; This profile path is intended to control the desktop speaker, not
+; the headphones. But it should not hurt if we leave the headphone
+; jack enabled nonetheless.
+[Element Headphone]
+switch = mute
+volume = zero
+
+[Element Headphone2]
+switch = mute
+volume = zero
+
+[Element Speaker]
+switch = off
+volume = off
+
+[Element Desktop Speaker]
+required = any
+switch = mute
+volume = merge
+override-map.1 = all
+override-map.2 = all-left,all-right
+
+[Element Front]
+switch = mute
+volume = merge
+override-map.1 = all-front
+override-map.2 = front-left,front-right
+
+[Element Rear]
+switch = mute
+volume = merge
+override-map.1 = all-rear
+override-map.2 = rear-left,rear-right
+
+[Element Surround]
+switch = mute
+volume = merge
+override-map.1 = all-rear
+override-map.2 = rear-left,rear-right
+
+[Element Side]
+switch = mute
+volume = merge
+override-map.1 = all-side
+override-map.2 = side-left,side-right
+
+[Element Center]
+switch = mute
+volume = merge
+override-map.1 = all-center
+override-map.2 = all-center,all-center
+
+[Element LFE]
+switch = mute
+volume = merge
+override-map.1 = lfe
+override-map.2 = lfe,lfe
+
+.include analog-output.conf.common
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index f2fd31c..580c798 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -55,6 +55,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Desktop Speaker]
+switch = off
+volume = off
+
[Element Front]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 2131cfe..79ebc7f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -55,6 +55,10 @@ volume = zero
switch = off
volume = off
+[Element Desktop Speaker]
+switch = off
+volume = off
+
[Element Front]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
index 0a43e27..67ee32f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
@@ -58,6 +58,10 @@ volume = merge
override-map.1 = all
override-map.2 = all-left,all-right
+[Element Desktop Speaker]
+switch = off
+volume = off
+
[Element Front]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf
index 542edc4..13a2d6a 100644
--- a/src/modules/alsa/mixer/paths/analog-output-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf
@@ -55,6 +55,10 @@ volume = merge
override-map.1 = all
override-map.2 = all-left,all-right
+[Element Desktop Speaker]
+switch = off
+volume = off
+
[Element Front]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
index aea7853..b133a2e 100644
--- a/src/modules/alsa/mixer/paths/analog-output-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
@@ -55,6 +55,10 @@ volume = merge
override-map.1 = all
override-map.2 = all-left,all-right
+[Element Desktop Speaker]
+switch = off
+volume = off
+
[Element Front]
switch = mute
volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf
index d7c1223..50fc88e 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf
+++ b/src/modules/alsa/mixer/paths/analog-output.conf
@@ -53,6 +53,10 @@ volume = zero
switch = mute
volume = off
+[Element Desktop Speaker]
+switch = mute
+volume = off
+
[Element Front]
switch = mute
volume = merge
diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf
index 046938f..5d352f1 100644
--- a/src/modules/alsa/mixer/profile-sets/default.conf
+++ b/src/modules/alsa/mixer/profile-sets/default.conf
@@ -62,42 +62,42 @@ auto-profiles = yes
[Mapping analog-mono]
device-strings = hw:%f
channel-map = mono
-paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
priority = 1
[Mapping analog-stereo]
device-strings = front:%f hw:%f
channel-map = left,right
-paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
priority = 10
[Mapping analog-surround-40]
device-strings = surround40:%f
channel-map = front-left,front-right,rear-left,rear-right
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
priority = 7
direction = output
[Mapping analog-surround-41]
device-strings = surround41:%f
channel-map = front-left,front-right,rear-left,rear-right,lfe
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
priority = 8
direction = output
[Mapping analog-surround-50]
device-strings = surround50:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
priority = 7
direction = output
[Mapping analog-surround-51]
device-strings = surround51:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
priority = 8
direction = output
@@ -105,7 +105,7 @@ direction = output
device-strings = surround71:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
description = Analog Surround 7.1
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
priority = 7
direction = output
--
1.7.0

View file

@ -0,0 +1,49 @@
From 7d6bab0d003386baba3ff3fad4cc3caa5839b361 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 15 Feb 2010 23:39:12 +0100
Subject: [PATCH 35/62] alsa: cover 'Shared Mic/Line in', 'Analog Source'
https://bugzilla.redhat.com/show_bug.cgi?id=558638
---
.../alsa/mixer/paths/analog-input.conf.common | 25 ++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index fbdc8fb..66c3dda 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -277,6 +277,31 @@ name = input-microphone
[Option Digital Input Source:Digital Mic 2]
name = input-microphone
+;;; 'Analog Source'
+
+[Element Analog Source]
+enumeration = select
+
+[Option Analog Source:Mic]
+name = input-microphone
+
+[Option Analog Source:Line in]
+name = input-linein
+
+[Option Analog Source:Aux]
+name = input
+
+;;; 'Shared Mic/Line in'
+
+[Element Shared Mic/Line in]
+enumeration = select
+
+[Option Shared Mic/Line in:Mic in]
+name = input-microphone
+
+[Option Shared Mic/Line in:Line in]
+name = input-linein
+
;;; Various Boosts
[Element Capture Boost]
--
1.7.0

View file

@ -0,0 +1,214 @@
From 0c836aacd8be34bcb5e02581495f7d30a5fbee05 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 00:58:49 +0100
Subject: [PATCH 36/62] alsa: cover "Internal Mic" elements
https://bugzilla.redhat.com/show_bug.cgi?id=562216
---
src/modules/alsa/mixer/paths/analog-input-aux.conf | 4 +
src/modules/alsa/mixer/paths/analog-input-fm.conf | 4 +
.../mixer/paths/analog-input-internal-mic.conf | 67 ++++++++++++++++++++
.../alsa/mixer/paths/analog-input-linein.conf | 4 +
.../alsa/mixer/paths/analog-input-mic-line.conf | 4 +
src/modules/alsa/mixer/paths/analog-input-mic.conf | 4 +
.../alsa/mixer/paths/analog-input-tvtuner.conf | 4 +
.../alsa/mixer/paths/analog-input-video.conf | 4 +
src/modules/alsa/mixer/paths/analog-input.conf | 3 +
9 files changed, 98 insertions(+), 0 deletions(-)
create mode 100644 src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
diff --git a/src/modules/alsa/mixer/paths/analog-input-aux.conf b/src/modules/alsa/mixer/paths/analog-input-aux.conf
index db78eb4..3a7cb7b 100644
--- a/src/modules/alsa/mixer/paths/analog-input-aux.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-aux.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-fm.conf b/src/modules/alsa/mixer/paths/analog-input-fm.conf
index baf674a..7f150e3 100644
--- a/src/modules/alsa/mixer/paths/analog-input-fm.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-fm.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
new file mode 100644
index 0000000..70cd512
--- /dev/null
+++ b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
@@ -0,0 +1,67 @@
+# This file is part of PulseAudio.
+#
+# PulseAudio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as
+# published by the Free Software Foundation; either version 2.1 of the
+# License, or (at your option) any later version.
+#
+# PulseAudio is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with PulseAudio; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+
+; For devices where a 'Internal Mic' element exists
+;
+; See analog-output.conf.common for an explanation on the directives
+
+[General]
+priority = 90
+name = analog-input-microphone
+
+[Element Capture]
+switch = mute
+volume = merge
+override-map.1 = all
+override-map.2 = all-left,all-right
+
+[Element Mic]
+switch = off
+volume = off
+
+[Element Internal Mic]
+required = any
+switch = mute
+volume = merge
+override-map.1 = all
+override-map.2 = all-left,all-right
+
+[Element Line]
+switch = off
+volume = off
+
+[Element Aux]
+switch = off
+volume = off
+
+[Element Video]
+switch = off
+volume = off
+
+[Element Mic/Line]
+switch = off
+volume = off
+
+[Element TV Tuner]
+switch = off
+volume = off
+
+[Element FM]
+switch = off
+volume = off
+
+.include analog-input.conf.common
+.include analog-input-mic.conf.common
diff --git a/src/modules/alsa/mixer/paths/analog-input-linein.conf b/src/modules/alsa/mixer/paths/analog-input-linein.conf
index 4be5722..57568cc 100644
--- a/src/modules/alsa/mixer/paths/analog-input-linein.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-linein.conf
@@ -31,6 +31,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
required = any
switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
index f7f3085..fa680aa 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-mic.conf
index 2a36f2f..9b8b75a 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf
@@ -35,6 +35,10 @@ volume = merge
override-map.1 = all
override-map.2 = all-left,all-right
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
index 8531ec7..fae3ce8 100644
--- a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-video.conf b/src/modules/alsa/mixer/paths/analog-input-video.conf
index 74c76f0..19f1809 100644
--- a/src/modules/alsa/mixer/paths/analog-input-video.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-video.conf
@@ -31,6 +31,10 @@ override-map.2 = all-left,all-right
switch = off
volume = off
+[Element Internal Mic]
+switch = off
+volume = off
+
[Element Line]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input.conf b/src/modules/alsa/mixer/paths/analog-input.conf
index 5055f90..3050738 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf
+++ b/src/modules/alsa/mixer/paths/analog-input.conf
@@ -32,6 +32,9 @@ override-map.2 = all-left,all-right
[Element Mic]
required-absent = any
+[Element Internal Mic]
+required-absent = any
+
[Element Line]
required-absent = any
--
1.7.0

View file

@ -0,0 +1,82 @@
From 307bd142feef8f42d3adcea354b72f4c076470e4 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 00:59:24 +0100
Subject: [PATCH 37/62] alsa: use default output port names
instead of coming up with pointless aliases, reuse the already established
names, for second headphones, and second speakers.
---
src/modules/alsa/alsa-mixer.c | 2 --
.../mixer/paths/analog-output-desktop-speaker.conf | 3 ++-
.../mixer/paths/analog-output-headphones-2.conf | 1 +
.../alsa/mixer/paths/analog-output-headphones.conf | 1 +
.../alsa/mixer/paths/analog-output-speaker.conf | 1 +
5 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index cb814af..93f2ed0 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1783,9 +1783,7 @@ static int path_verify(pa_alsa_path *p) {
{ "analog-output-headphones", N_("Analog Headphones") },
{ "analog-output-lfe-on-mono", N_("Analog Output (LFE)") },
{ "analog-output-mono", N_("Analog Mono Output") },
- { "analog-output-headphones-2", N_("Analog Headphones 2") },
{ "analog-output-speaker", N_("Analog Speakers") }
- { "analog-output-desktop-speaker", N_("Analog Speakers 2") }
};
pa_alsa_element *e;
diff --git a/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
index 9f18b25..dfdecf4 100644
--- a/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
@@ -19,7 +19,8 @@
; See analog-output.conf.common for an explanation on the directives
[General]
-priority = 100
+priority = 101
+name = analog-output-speaker
[Element Hardware Master]
switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index 580c798..e47543f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -20,6 +20,7 @@
[General]
priority = 89
+name = analog-output-headphones
[Element Hardware Master]
switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 79ebc7f..1d7bb0b 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -20,6 +20,7 @@
[General]
priority = 90
+name = analog-output-headphones
[Element Hardware Master]
switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
index b133a2e..c6916d6 100644
--- a/src/modules/alsa/mixer/paths/analog-output-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
@@ -20,6 +20,7 @@
[General]
priority = 100
+name = analog-output-speaker
[Element Hardware Master]
switch = mute
--
1.7.0

View file

@ -0,0 +1,27 @@
From f9b31fe5443bded4a55b0900f08f04486c3395bd Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 01:43:00 +0100
Subject: [PATCH 38/62] build-sys: add gobject to build dependencies
Since we call g_object_unref() we need to link against gobject in
compliance of the new Fedora implicit DSO linking policy.
---
configure.ac | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/configure.ac b/configure.ac
index c9ec490..1b80788 100644
--- a/configure.ac
+++ b/configure.ac
@@ -893,7 +893,7 @@ AC_ARG_ENABLE([gconf],
[gconf=auto])
if test "x${gconf}" != xno ; then
- PKG_CHECK_MODULES(GCONF, [ gconf-2.0 >= 2.4.0 ],
+ PKG_CHECK_MODULES(GCONF, [ gconf-2.0 >= 2.4.0 gobject-2.0 ],
HAVE_GCONF=1,
[
HAVE_GCONF=0
--
1.7.0

View file

@ -0,0 +1,142 @@
From ff2474e5fc9eaa4c7f687e71a39a5bed4f56c259 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 02:03:45 +0100
Subject: [PATCH 39/62] padsp: emulate /dev/audio, too
https://bugzilla.redhat.com/show_bug.cgi?id=561262
---
src/utils/padsp.c | 55 +++++++++++++++++++---------------------------------
1 files changed, 20 insertions(+), 35 deletions(-)
diff --git a/src/utils/padsp.c b/src/utils/padsp.c
index 2ed0a03..fb756d3 100644
--- a/src/utils/padsp.c
+++ b/src/utils/padsp.c
@@ -1458,11 +1458,11 @@ static int real_open(const char *filename, int flags, mode_t mode) {
return _open(filename, flags, mode);
}
- if (filename && dsp_cloak_enable() && (strcmp(filename, "/dev/dsp") == 0 || strcmp(filename, "/dev/adsp") == 0))
+ if (filename && dsp_cloak_enable() && (pa_streq(filename, "/dev/dsp") || pa_streq(filename, "/dev/adsp") || pa_streq(filename, "/dev/audio")))
r = dsp_open(flags, &_errno);
- else if (filename && mixer_cloak_enable() && strcmp(filename, "/dev/mixer") == 0)
+ else if (filename && mixer_cloak_enable() && pa_streq(filename, "/dev/mixer"))
r = mixer_open(flags, &_errno);
- else if (filename && sndstat_cloak_enable() && strcmp(filename, "/dev/sndstat") == 0)
+ else if (filename && sndstat_cloak_enable() && pa_streq(filename, "/dev/sndstat"))
r = sndstat_open(flags, &_errno);
else {
function_exit();
@@ -2383,15 +2383,21 @@ int close(int fd) {
return 0;
}
+static pa_bool_t is_audio_device_node(const char *path) {
+ return
+ pa_streq(path, "/dev/dsp") ||
+ pa_streq(path, "/dev/adsp") ||
+ pa_streq(path, "/dev/audio") ||
+ pa_streq(path, "/dev/sndstat") ||
+ pa_streq(path, "/dev/mixer");
+}
+
int access(const char *pathname, int mode) {
debug(DEBUG_LEVEL_VERBOSE, __FILE__": access(%s)\n", pathname?pathname:"NULL");
if (!pathname ||
- (strcmp(pathname, "/dev/dsp") != 0 &&
- strcmp(pathname, "/dev/adsp") != 0 &&
- strcmp(pathname, "/dev/sndstat") != 0 &&
- strcmp(pathname, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(pathname)) {
LOAD_ACCESS_FUNC();
return _access(pathname, mode);
}
@@ -2417,10 +2423,7 @@ int stat(const char *pathname, struct stat *buf) {
if (!pathname ||
!buf ||
- ( strcmp(pathname, "/dev/dsp") != 0 &&
- strcmp(pathname, "/dev/adsp") != 0 &&
- strcmp(pathname, "/dev/sndstat") != 0 &&
- strcmp(pathname, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(pathname)) {
debug(DEBUG_LEVEL_VERBOSE, __FILE__": stat(%s)\n", pathname?pathname:"NULL");
LOAD_STAT_FUNC();
return _stat(pathname, buf);
@@ -2474,10 +2477,7 @@ int stat64(const char *pathname, struct stat64 *buf) {
if (!pathname ||
!buf ||
- ( strcmp(pathname, "/dev/dsp") != 0 &&
- strcmp(pathname, "/dev/adsp") != 0 &&
- strcmp(pathname, "/dev/sndstat") != 0 &&
- strcmp(pathname, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(pathname)) {
LOAD_STAT64_FUNC();
return _stat64(pathname, buf);
}
@@ -2519,10 +2519,7 @@ int open64(const char *filename, int flags, ...) {
}
if (!filename ||
- ( strcmp(filename, "/dev/dsp") != 0 &&
- strcmp(filename, "/dev/adsp") != 0 &&
- strcmp(filename, "/dev/sndstat") != 0 &&
- strcmp(filename, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(filename)) {
LOAD_OPEN64_FUNC();
return _open64(filename, flags, mode);
}
@@ -2539,10 +2536,7 @@ int __xstat(int ver, const char *pathname, struct stat *buf) {
if (!pathname ||
!buf ||
- ( strcmp(pathname, "/dev/dsp") != 0 &&
- strcmp(pathname, "/dev/adsp") != 0 &&
- strcmp(pathname, "/dev/sndstat") != 0 &&
- strcmp(pathname, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(pathname)) {
LOAD_XSTAT_FUNC();
return ___xstat(ver, pathname, buf);
}
@@ -2562,10 +2556,7 @@ int __xstat64(int ver, const char *pathname, struct stat64 *buf) {
if (!pathname ||
!buf ||
- ( strcmp(pathname, "/dev/dsp") != 0 &&
- strcmp(pathname, "/dev/adsp") != 0 &&
- strcmp(pathname, "/dev/sndstat") != 0 &&
- strcmp(pathname, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(pathname)) {
LOAD_XSTAT64_FUNC();
return ___xstat64(ver, pathname, buf);
}
@@ -2591,10 +2582,7 @@ FILE* fopen(const char *filename, const char *mode) {
if (!filename ||
!mode ||
- ( strcmp(filename, "/dev/dsp") != 0 &&
- strcmp(filename, "/dev/adsp") != 0 &&
- strcmp(filename, "/dev/sndstat") != 0 &&
- strcmp(filename, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(filename)) {
LOAD_FOPEN_FUNC();
return _fopen(filename, mode);
}
@@ -2634,10 +2622,7 @@ FILE *fopen64(const char *filename, const char *mode) {
if (!filename ||
!mode ||
- ( strcmp(filename, "/dev/dsp") != 0 &&
- strcmp(filename, "/dev/adsp") != 0 &&
- strcmp(filename, "/dev/sndstat") != 0 &&
- strcmp(filename, "/dev/mixer") != 0 )) {
+ !is_audio_device_node(filename)) {
LOAD_FOPEN64_FUNC();
return _fopen64(filename, mode);
}
--
1.7.0

View file

@ -0,0 +1,92 @@
From 96592c21150e789156153dcebd14e201cd41cbeb Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 02:49:44 +0100
Subject: [PATCH 40/62] dbus: first restart timer, then dispatch it
This makes sure that we don't access the timer after it might have been
destroyed already from the dbus timeout callback.
https://bugzilla.redhat.com/attachment.cgi?id=389952
---
src/pulsecore/dbus-util.c | 29 ++++++++++++++++-------------
1 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index 4e6148f..40b64a0 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -44,17 +44,16 @@ struct pa_dbus_wrap_connection {
};
struct timeout_data {
- pa_dbus_wrap_connection *c;
+ pa_dbus_wrap_connection *connection;
DBusTimeout *timeout;
};
static void dispatch_cb(pa_mainloop_api *ea, pa_defer_event *ev, void *userdata) {
DBusConnection *conn = userdata;
- if (dbus_connection_dispatch(conn) == DBUS_DISPATCH_COMPLETE) {
+ if (dbus_connection_dispatch(conn) == DBUS_DISPATCH_COMPLETE)
/* no more data to process, disable the deferred */
ea->defer_enable(ev, 0);
- }
}
/* DBusDispatchStatusFunction callback for the pa mainloop */
@@ -131,13 +130,17 @@ static void handle_time_event(pa_mainloop_api *ea, pa_time_event* e, const struc
struct timeout_data *d = userdata;
pa_assert(d);
- pa_assert(d->c);
+ pa_assert(d->connection);
if (dbus_timeout_get_enabled(d->timeout)) {
- dbus_timeout_handle(d->timeout);
+ /* Restart it for the next scheduled time. We do this before
+ * calling dbus_timeout_handle() to make sure that the time
+ * event is still around. */
+ ea->time_restart(e, pa_timeval_rtstore(&tv,
+ pa_timeval_load(t) + dbus_timeout_get_interval(d->timeout) * PA_USEC_PER_MSEC,
+ d->connection->use_rtclock));
- /* restart it for the next scheduled time */
- ea->time_restart(e, pa_timeval_rtstore(&tv, pa_timeval_load(t) + dbus_timeout_get_interval(d->timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
+ dbus_timeout_handle(d->timeout);
}
}
@@ -207,7 +210,7 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
return FALSE;
d = pa_xnew(struct timeout_data, 1);
- d->c = c;
+ d->connection = c;
d->timeout = timeout;
ev = c->mainloop->time_new(c->mainloop, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, c->use_rtclock), handle_time_event, d);
c->mainloop->time_set_destroy(ev, time_event_destroy_cb);
@@ -236,15 +239,15 @@ static void toggle_timeout(DBusTimeout *timeout, void *data) {
struct timeval tv;
pa_assert(d);
- pa_assert(d->c);
+ pa_assert(d->connection);
pa_assert(timeout);
pa_assert_se(ev = dbus_timeout_get_data(timeout));
- if (dbus_timeout_get_enabled(timeout)) {
- d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
- } else
- d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, PA_USEC_INVALID, d->c->use_rtclock));
+ if (dbus_timeout_get_enabled(timeout))
+ d->connection->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, d->connection->use_rtclock));
+ else
+ d->connection->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, PA_USEC_INVALID, d->connection->use_rtclock));
}
static void wakeup_main(void *userdata) {
--
1.7.0

View file

@ -0,0 +1,111 @@
From 5e2af2d3f3dea473d46b33a5e90a993ac5da3f35 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 16 Feb 2010 03:36:44 +0100
Subject: [PATCH 41/62] fdsem: be more verbose when reading from eventfd fails.
Apperently reading from an eventfd can fail, which results in an assert
to be hit. I am not sure about the reason for the failure, but in
attempt to track down the issue the next time is hit this prints a more
useful log message.
https://bugzilla.redhat.com/attachment.cgi?id=386380
---
src/pulsecore/fdsem.c | 41 +++++++++++++++++++++++++++++++++++------
1 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/src/pulsecore/fdsem.c b/src/pulsecore/fdsem.c
index 380f34f..00836f9 100644
--- a/src/pulsecore/fdsem.c
+++ b/src/pulsecore/fdsem.c
@@ -35,6 +35,7 @@
#include <pulsecore/thread.h>
#include <pulsecore/macro.h>
#include <pulsecore/core-util.h>
+#include <pulsecore/core-error.h>
#include <pulse/xmalloc.h>
#ifndef HAVE_PIPE
@@ -159,7 +160,12 @@ static void flush(pa_fdsem *f) {
uint64_t u;
if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) {
- pa_assert(r < 0 && errno == EINTR);
+
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from eventfd: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
r = (ssize_t) u;
@@ -167,7 +173,12 @@ static void flush(pa_fdsem *f) {
#endif
if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) {
- pa_assert(r < 0 && errno == EINTR);
+
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
@@ -192,14 +203,22 @@ void pa_fdsem_post(pa_fdsem *f) {
uint64_t u = 1;
if ((r = write(f->efd, &u, sizeof(u))) != sizeof(u)) {
- pa_assert(r < 0 && errno == EINTR);
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
} else
#endif
if ((r = write(f->fds[1], &x, 1)) != 1) {
- pa_assert(r < 0 && errno == EINTR);
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
@@ -228,7 +247,12 @@ void pa_fdsem_wait(pa_fdsem *f) {
uint64_t u;
if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) {
- pa_assert(r < 0 && errno == EINTR);
+
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
@@ -237,7 +261,12 @@ void pa_fdsem_wait(pa_fdsem *f) {
#endif
if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) {
- pa_assert(r < 0 && errno == EINTR);
+
+ if (r >= 0 || errno != EINTR) {
+ pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+ pa_assert_not_reached();
+ }
+
continue;
}
--
1.7.0

View file

@ -0,0 +1,79 @@
From 19fa81bf1375032cb1a27c7715a28a52b238d4cb Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 18 Feb 2010 01:54:51 +0100
Subject: [PATCH 42/62] pacat: always fully fulfill write requests
Make sure we always fulfill write requests from the server. If we don't
the server won't ask us again and playback will stay stuck.
https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-February/006611.html
---
src/utils/pacat.c | 47 ++++++++++++++++++++++++++++++-----------------
1 files changed, 30 insertions(+), 17 deletions(-)
diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index a5d2e9a..d136f6b 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -195,28 +195,41 @@ static void stream_write_callback(pa_stream *s, size_t length, void *userdata) {
pa_assert(sndfile);
- if (pa_stream_begin_write(s, &data, &length) < 0) {
- pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context)));
- quit(1);
- return;
- }
+ for (;;) {
+ size_t data_length = length;
- if (readf_function) {
- size_t k = pa_frame_size(&sample_spec);
+ if (pa_stream_begin_write(s, &data, &data_length) < 0) {
+ pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context)));
+ quit(1);
+ return;
+ }
- if ((bytes = readf_function(sndfile, data, (sf_count_t) (length/k))) > 0)
- bytes *= (sf_count_t) k;
+ if (readf_function) {
+ size_t k = pa_frame_size(&sample_spec);
- } else
- bytes = sf_read_raw(sndfile, data, (sf_count_t) length);
+ if ((bytes = readf_function(sndfile, data, (sf_count_t) (data_length/k))) > 0)
+ bytes *= (sf_count_t) k;
- if (bytes > 0)
- pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE);
- else
- pa_stream_cancel_write(s);
+ } else
+ bytes = sf_read_raw(sndfile, data, (sf_count_t) data_length);
- if (bytes < (sf_count_t) length)
- start_drain();
+ if (bytes > 0)
+ pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE);
+ else
+ pa_stream_cancel_write(s);
+
+ /* EOF? */
+ if (bytes < (sf_count_t) data_length) {
+ start_drain();
+ break;
+ }
+
+ /* Request fulfilled */
+ if ((size_t) bytes >= length)
+ break;
+
+ length -= bytes;
+ }
}
}
--
1.7.0

View file

@ -0,0 +1,60 @@
From 96ec29c6b2a40d3851f46587143a4ba6dce29d0d Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 18 Feb 2010 02:32:35 +0100
Subject: [PATCH 43/62] pacmd: store away fd type
---
src/utils/pacmd.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index 5ef57e3..59aae48 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -61,6 +61,7 @@ int main(int argc, char*argv[]) {
char *cli;
pa_bool_t ibuf_eof, obuf_eof, ibuf_closed, obuf_closed;
struct pollfd pollfd[N_WATCH];
+ int stdin_type = 0, stdout_type = 0, fd_type = 0;
setlocale(LC_ALL, "");
bindtextdomain(GETTEXT_PACKAGE, PULSE_LOCALEDIR);
@@ -166,7 +167,7 @@ int main(int argc, char*argv[]) {
ssize_t r;
pa_assert(!ibuf_length);
- if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), NULL)) <= 0) {
+ if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
if (r < 0) {
pa_log(_("read(): %s"), strerror(errno));
goto fail;
@@ -183,7 +184,7 @@ int main(int argc, char*argv[]) {
ssize_t r;
pa_assert(!obuf_length);
- if ((r = pa_read(fd, obuf, sizeof(obuf), NULL)) <= 0) {
+ if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
if (r < 0) {
pa_log(_("read(): %s"), strerror(errno));
goto fail;
@@ -203,7 +204,7 @@ int main(int argc, char*argv[]) {
ssize_t r;
pa_assert(obuf_length);
- if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, NULL)) < 0) {
+ if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
pa_log(_("write(): %s"), strerror(errno));
goto fail;
}
@@ -219,7 +220,7 @@ int main(int argc, char*argv[]) {
ssize_t r;
pa_assert(ibuf_length);
- if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, NULL)) < 0) {
+ if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
pa_log(_("write(): %s"), strerror(errno));
goto fail;
}
--
1.7.0

View file

@ -0,0 +1,257 @@
From 6e064d1d6d0292d230c752b1f41034fd0754487b Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Thu, 18 Feb 2010 03:28:56 +0100
Subject: [PATCH 44/62] pacmd: don't enter busy loop when reading from stdin very early
pointed out in:
https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-January/006365.html
---
src/utils/pacmd.c | 186 ++++++++++++++++++++++++++++------------------------
1 files changed, 100 insertions(+), 86 deletions(-)
diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index 59aae48..87661e3 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -45,13 +45,6 @@
int main(int argc, char*argv[]) {
- enum {
- WATCH_STDIN,
- WATCH_STDOUT,
- WATCH_SOCKET,
- N_WATCH
- };
-
pid_t pid ;
int fd = -1;
int ret = 1, i;
@@ -60,7 +53,9 @@ int main(int argc, char*argv[]) {
size_t ibuf_index, ibuf_length, obuf_index, obuf_length;
char *cli;
pa_bool_t ibuf_eof, obuf_eof, ibuf_closed, obuf_closed;
- struct pollfd pollfd[N_WATCH];
+ struct pollfd pollfd[3];
+ struct pollfd *watch_socket, *watch_stdin, *watch_stdout;
+
int stdin_type = 0, stdout_type = 0, fd_type = 0;
setlocale(LC_ALL, "");
@@ -129,32 +124,53 @@ int main(int argc, char*argv[]) {
ibuf_eof = TRUE;
}
- pa_zero(pollfd);
-
- pollfd[WATCH_STDIN].fd = STDIN_FILENO;
- pollfd[WATCH_STDOUT].fd = STDOUT_FILENO;
- pollfd[WATCH_SOCKET].fd = fd;
-
for (;;) {
+ struct pollfd *p;
+
if (ibuf_eof &&
obuf_eof &&
ibuf_length <= 0 &&
obuf_length <= 0)
break;
- pollfd[WATCH_STDIN].events = pollfd[WATCH_STDOUT].events = pollfd[WATCH_SOCKET].events = 0;
+ if (ibuf_length <= 0 && ibuf_eof && !ibuf_closed) {
+ shutdown(fd, SHUT_WR);
+ ibuf_closed = TRUE;
+ }
- if (obuf_length > 0)
- pollfd[WATCH_STDOUT].events |= POLLOUT;
- else if (!obuf_eof)
- pollfd[WATCH_SOCKET].events |= POLLIN;
+ if (obuf_length <= 0 && obuf_eof && !obuf_closed) {
+ shutdown(fd, SHUT_RD);
+ obuf_closed = TRUE;
+ }
+
+ pa_zero(pollfd);
+
+ p = pollfd;
- if (ibuf_length > 0)
- pollfd[WATCH_SOCKET].events |= POLLOUT;
- else if (!ibuf_eof)
- pollfd[WATCH_STDIN].events |= POLLIN;
+ if (ibuf_length > 0 || (!obuf_eof && obuf_length <= 0)) {
+ watch_socket = p++;
+ watch_socket->fd = fd;
+ watch_socket->events =
+ (ibuf_length > 0 ? POLLOUT : 0) |
+ (!obuf_eof && obuf_length <= 0 ? POLLIN : 0);
+ } else
+ watch_socket = NULL;
- if (poll(pollfd, N_WATCH, -1) < 0) {
+ if (!ibuf_eof && ibuf_length <= 0) {
+ watch_stdin = p++;
+ watch_stdin->fd = STDIN_FILENO;
+ watch_stdin->events = POLLIN;
+ } else
+ watch_stdin = NULL;
+
+ if (obuf_length > 0) {
+ watch_stdout = p++;
+ watch_stdout->fd = STDOUT_FILENO;
+ watch_stdout->events = POLLOUT;
+ } else
+ watch_stdout = NULL;
+
+ if (poll(pollfd, p-pollfd, -1) < 0) {
if (errno == EINTR)
continue;
@@ -163,82 +179,80 @@ int main(int argc, char*argv[]) {
goto fail;
}
- if (pollfd[WATCH_STDIN].revents & POLLIN) {
- ssize_t r;
- pa_assert(!ibuf_length);
-
- if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
- if (r < 0) {
- pa_log(_("read(): %s"), strerror(errno));
- goto fail;
+ if (watch_stdin) {
+ if (watch_stdin->revents & POLLIN) {
+ ssize_t r;
+ pa_assert(ibuf_length <= 0);
+
+ if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
+ if (r < 0) {
+ pa_log(_("read(): %s"), strerror(errno));
+ goto fail;
+ }
+
+ ibuf_eof = TRUE;
+ } else {
+ ibuf_length = (size_t) r;
+ ibuf_index = 0;
}
-
+ } else if (watch_stdin->revents & POLLHUP)
ibuf_eof = TRUE;
- } else {
- ibuf_length = (size_t) r;
- ibuf_index = 0;
- }
}
- if (pollfd[WATCH_SOCKET].revents & POLLIN) {
- ssize_t r;
- pa_assert(!obuf_length);
-
- if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
- if (r < 0) {
- pa_log(_("read(): %s"), strerror(errno));
- goto fail;
+ if (watch_socket) {
+ if (watch_socket->revents & POLLIN) {
+ ssize_t r;
+ pa_assert(obuf_length <= 0);
+
+ if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
+ if (r < 0) {
+ pa_log(_("read(): %s"), strerror(errno));
+ goto fail;
+ }
+
+ obuf_eof = TRUE;
+ } else {
+ obuf_length = (size_t) r;
+ obuf_index = 0;
}
-
+ } else if (watch_socket->revents & POLLHUP)
obuf_eof = TRUE;
- } else {
- obuf_length = (size_t) r;
- obuf_index = 0;
- }
}
- if (pollfd[WATCH_STDOUT].revents & POLLHUP) {
- obuf_eof = TRUE;
- obuf_length = 0;
- } else if (pollfd[WATCH_STDOUT].revents & POLLOUT) {
- ssize_t r;
- pa_assert(obuf_length);
-
- if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
- pa_log(_("write(): %s"), strerror(errno));
- goto fail;
- }
-
- obuf_length -= (size_t) r;
- obuf_index += obuf_index;
- }
+ if (watch_stdout) {
+ if (watch_stdout->revents & POLLHUP) {
+ obuf_eof = TRUE;
+ obuf_length = 0;
+ } else if (watch_stdout->revents & POLLOUT) {
+ ssize_t r;
+ pa_assert(obuf_length > 0);
- if (pollfd[WATCH_SOCKET].revents & POLLHUP) {
- ibuf_eof = TRUE;
- ibuf_length = 0;
- } if (pollfd[WATCH_SOCKET].revents & POLLOUT) {
- ssize_t r;
- pa_assert(ibuf_length);
+ if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
+ pa_log(_("write(): %s"), strerror(errno));
+ goto fail;
+ }
- if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
- pa_log(_("write(): %s"), strerror(errno));
- goto fail;
+ obuf_length -= (size_t) r;
+ obuf_index += obuf_index;
}
-
- ibuf_length -= (size_t) r;
- ibuf_index += obuf_index;
}
- if (ibuf_length <= 0 && ibuf_eof && !ibuf_closed) {
- pa_close(STDIN_FILENO);
- shutdown(fd, SHUT_WR);
- ibuf_closed = TRUE;
- }
+ if (watch_socket) {
+ if (watch_socket->revents & POLLHUP) {
+ ibuf_eof = TRUE;
+ ibuf_length = 0;
+ } if (watch_socket->revents & POLLOUT) {
+ ssize_t r;
+ pa_assert(ibuf_length > 0);
- if (obuf_length <= 0 && obuf_eof && !obuf_closed) {
- shutdown(fd, SHUT_RD);
- pa_close(STDOUT_FILENO);
- obuf_closed = TRUE;
+ if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
+ pa_log(_("write(): %s"), strerror(errno));
+ goto fail;
+ }
+
+ ibuf_length -= (size_t) r;
+ ibuf_index += obuf_index;
+ }
}
}
--
1.7.0

View file

@ -0,0 +1,29 @@
From dfe27f623765b20bdaff2306109f89baca67d0cf Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 19 Feb 2010 03:29:36 +0100
Subject: [PATCH 45/62] shm: don't complain about missing SHM segments
If two clients try to cleanup the SHM directory at the same time, they
might want to open and then delete the same segment at the same time, in
which case one client might win, the other one lose. In this case, don't
warn about ENOENT.
---
src/pulsecore/shm.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index fbf777a..1e31d54 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -286,7 +286,7 @@ int pa_shm_attach_ro(pa_shm *m, unsigned id) {
segment_name(fn, sizeof(fn), m->id = id);
if ((fd = shm_open(fn, O_RDONLY, 0)) < 0) {
- if (errno != EACCES)
+ if (errno != EACCES && errno != ENOENT)
pa_log("shm_open() failed: %s", pa_cstrerror(errno));
goto fail;
}
--
1.7.0

View file

@ -0,0 +1,25 @@
From 5ce18c32f6ba8202c9f17f84aaffbdbbd8df071c Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 19 Feb 2010 03:31:46 +0100
Subject: [PATCH 46/62] vala: fix definition of INVALID_INDEX
---
vala/libpulse.vapi | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index 9e05b14..b02bb56 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -46,7 +46,7 @@ namespace PulseAudio {
[CCode (cname="PA_CHECK_VERSION")]
public bool CHECK_VERSION(int major, int minor, int micro);
- [CCode (cname="INVALID_INDEX")]
+ [CCode (cname="PA_INVALID_INDEX")]
public const uint32 INVALID_INDEX;
[CCode (cname="pa_free_cb_t")]
--
1.7.0

View file

@ -0,0 +1,30 @@
From 6bbdd200e89bdbf180071e5281c0feb9617de81d Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Fri, 19 Feb 2010 03:32:00 +0100
Subject: [PATCH 47/62] vala: fix definition of the GLib mainloop adapter
---
vala/libpulse.vapi | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index b02bb56..d47ef73 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -879,11 +879,11 @@ namespace PulseAudio {
}
[Compact]
- [CCode (cname="pa_glib_mainloop", cprefix="pa_glib_mainloop_", free_function="pa_glib_mainloop_free")]
+ [CCode (cheader_filename="pulse/glib-mainloop.h", cname="pa_glib_mainloop", cprefix="pa_glib_mainloop_", free_function="pa_glib_mainloop_free")]
public class GLibMainLoop {
[CCode (cname="pa_glib_mainloop_new")]
- public GLibMainLoop();
+ public GLibMainLoop(MainContext? c = null);
public unowned MainLoopApi get_api();
}
--
1.7.0

View file

@ -0,0 +1,49 @@
From 047e16f2d18c20ea8d9dbb8a24175e1c4bb34d5e Mon Sep 17 00:00:00 2001
From: Daniel T Chen <crimsun@ubuntu.com>
Date: Fri, 19 Feb 2010 00:23:17 -0500
Subject: [PATCH 48/62] Add missing profile and alsa-mixer/paths to src/Makefile.am
Commits e8cb96c and 0c836aa created mixer paths but did not update
src/Makefile.am. Building a snapshot containing these two commits
therefore results in the user being unable to adjust the volume or
(un)mute through PA. Fix this by adding the two new mixer paths
files to src/Makefile.am.
Likewise, commit 66e1a2d created a profile for the M-Audio FastTrack
Pro USB but did not update src/Makefile.am. Fix this by adding the
profile to src/Makefile.am.
---
src/Makefile.am | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/src/Makefile.am b/src/Makefile.am
index 598e77f..ffe7558 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -109,6 +109,7 @@ MODULE_LDFLAGS = -module -disable-static -avoid-version $(LDFLAGS_NOUNDEFINED)
ALSA_PROFILES = \
modules/alsa/mixer/profile-sets/default.conf \
+ modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf \
modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
@@ -117,6 +118,7 @@ ALSA_PATHS = \
modules/alsa/mixer/paths/analog-input.conf \
modules/alsa/mixer/paths/analog-input.conf.common \
modules/alsa/mixer/paths/analog-input-fm.conf \
+ modules/alsa/mixer/paths/analog-input-internal-mic.conf \
modules/alsa/mixer/paths/analog-input-linein.conf \
modules/alsa/mixer/paths/analog-input-mic.conf \
modules/alsa/mixer/paths/analog-input-mic.conf.common \
@@ -126,6 +128,7 @@ ALSA_PATHS = \
modules/alsa/mixer/paths/analog-output.conf \
modules/alsa/mixer/paths/analog-output-speaker.conf \
modules/alsa/mixer/paths/analog-output.conf.common \
+ modules/alsa/mixer/paths/analog-output-desktop-speaker.conf \
modules/alsa/mixer/paths/analog-output-headphones.conf \
modules/alsa/mixer/paths/analog-output-headphones-2.conf \
modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
--
1.7.0

View file

@ -0,0 +1,28 @@
From 3f44bf0afaba9c227f09a475f4886c14813afc2f Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 16:19:40 +0100
Subject: [PATCH 49/62] channelmap: Use "Subwoofer" as pretty name for LFE
The pretty name is suspposed to be understandable by non-technical
folks, and they are generally more used to the term "Subwoofer" than
"Low Frequency Emitter", so let's change the name here.
---
src/pulse/channelmap.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index 9b51626..83fdb43 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -112,7 +112,7 @@ const char *const pretty_table[PA_CHANNEL_POSITION_MAX] = {
[PA_CHANNEL_POSITION_REAR_LEFT] = N_("Rear Left"),
[PA_CHANNEL_POSITION_REAR_RIGHT] = N_("Rear Right"),
- [PA_CHANNEL_POSITION_LFE] = N_("Low Frequency Emmiter"),
+ [PA_CHANNEL_POSITION_LFE] = N_("Subwoofer"),
[PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = N_("Front Left-of-center"),
[PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = N_("Front Right-of-center"),
--
1.7.0

View file

@ -0,0 +1,34 @@
From 117c99de3af9a19104d946852821f7b2f5646526 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 16:21:13 +0100
Subject: [PATCH 50/62] vala: fix wrapping of port setting calls
---
vala/libpulse.vapi | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index d47ef73..21c0f7c 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -1024,7 +1024,7 @@ namespace PulseAudio {
public Operation? suspend_sink_by_index(uint32 idx, bool suspend, SuccessCb? cb = null);
public Operation? set_sink_port_by_name(string name, string port, SuccessCb? cb = null);
- public Operation? set_sink_port_by_index(string idx, string port, SuccessCb? cb = null);
+ public Operation? set_sink_port_by_index(uint32 idx, string port, SuccessCb? cb = null);
public Operation? get_source_info_by_name(string name, SourceInfoCb cb);
public Operation? get_source_info_by_index(uint32 idx, SourceInfoCb cb);
@@ -1039,7 +1039,7 @@ namespace PulseAudio {
public Operation? suspend_source_by_index(uint32 idx, bool suspend, SuccessCb? cb = null);
public Operation? set_source_port_by_name(string name, string port, SuccessCb? cb = null);
- public Operation? set_source_port_by_index(string idx, string port, SuccessCb? cb = null);
+ public Operation? set_source_port_by_index(uint32 idx, string port, SuccessCb? cb = null);
public Operation? get_server_info(ServerInfoCb cb);
--
1.7.0

View file

@ -0,0 +1,25 @@
From ddabaa3b0f7b95e2cf5279f5be74769905af8496 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 16:21:43 +0100
Subject: [PATCH 51/62] proplist: explicitly mention a role 'test'
---
src/pulse/proplist.h | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index 8dff8df..6283177 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -59,7 +59,7 @@ PA_C_DECL_BEGIN
/** For streams: an XDG icon name for the media. e.g. "audio-x-mp3" */
#define PA_PROP_MEDIA_ICON_NAME "media.icon_name"
-/** For streams: logic role of this media. One of the strings "video", "music", "game", "event", "phone", "animation", "production", "a11y" */
+/** For streams: logic role of this media. One of the strings "video", "music", "game", "event", "phone", "animation", "production", "a11y", "test" */
#define PA_PROP_MEDIA_ROLE "media.role"
/** For event sound streams: XDG event sound name. e.g. "message-new-email" (Event sound streams are those with media.role set to "event") */
--
1.7.0

View file

@ -0,0 +1,25 @@
From 8adf536426a86e986fb5bd4ad31ba2d50054c485 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 16:22:17 +0100
Subject: [PATCH 52/62] stream-restore: be a little bit more verbose why we don't reastore a sink
---
src/modules/module-stream-restore.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 9b6f914..00ce5ab 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -394,7 +394,7 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
return PA_HOOK_OK;
if (new_data->sink)
- pa_log_debug("Not restoring device for stream %s, because already set.", name);
+ pa_log_debug("Not restoring device for stream %s, because already set to '%s'.", name, new_data->sink->name);
else if ((e = read_entry(u, name))) {
pa_sink *s = NULL;
--
1.7.0

View file

@ -0,0 +1,26 @@
From 180589511dab1b5d0388b58b41a0e9843ea1a35a Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 16:23:25 +0100
Subject: [PATCH 53/62] sample-cache: use the sample name as unmodified fallback in the properties when playing a sample from the cache
---
src/pulsecore/core-scache.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/src/pulsecore/core-scache.c b/src/pulsecore/core-scache.c
index 1fb81d0..95aaa10 100644
--- a/src/pulsecore/core-scache.c
+++ b/src/pulsecore/core-scache.c
@@ -310,7 +310,8 @@ int pa_scache_play_item(pa_core *c, const char *name, pa_sink *sink, pa_volume_t
return -1;
merged = pa_proplist_new();
- pa_proplist_setf(merged, PA_PROP_MEDIA_NAME, "Sample %s", name);
+ pa_proplist_sets(merged, PA_PROP_MEDIA_NAME, name);
+ pa_proplist_sets(merged, PA_PROP_EVENT_ID, name);
if (e->lazy && !e->memchunk.memblock) {
pa_channel_map old_channel_map = e->channel_map;
--
1.7.0

View file

@ -0,0 +1,153 @@
From f9b9579cf4fe65d3619629b5bc28ce02ceca305e Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 17:35:05 +0100
Subject: [PATCH 54/62] scache: when playing a sample from the cache make sure not queue them up when the sink is suspended
libcanberra already sets the appropriate flags for uncached sample
streams, we now need to make sure to set them for cached samples too.
---
src/pulsecore/core-scache.c | 7 ++++++-
src/pulsecore/play-memblockq.c | 7 +++++--
src/pulsecore/play-memblockq.h | 18 ++++++++++--------
src/pulsecore/play-memchunk.c | 3 ++-
src/pulsecore/play-memchunk.h | 15 ++++++++-------
5 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/pulsecore/core-scache.c b/src/pulsecore/core-scache.c
index 95aaa10..0172419 100644
--- a/src/pulsecore/core-scache.c
+++ b/src/pulsecore/core-scache.c
@@ -351,7 +351,12 @@ int pa_scache_play_item(pa_core *c, const char *name, pa_sink *sink, pa_volume_t
if (p)
pa_proplist_update(merged, PA_UPDATE_REPLACE, p);
- if (pa_play_memchunk(sink, &e->sample_spec, &e->channel_map, &e->memchunk, pass_volume ? &r : NULL, merged, sink_input_idx) < 0)
+ if (pa_play_memchunk(sink,
+ &e->sample_spec, &e->channel_map,
+ &e->memchunk,
+ pass_volume ? &r : NULL,
+ merged,
+ PA_SINK_INPUT_NO_CREATE_ON_SUSPEND|PA_SINK_INPUT_KILL_ON_SUSPEND, sink_input_idx) < 0)
goto fail;
pa_proplist_free(merged);
diff --git a/src/pulsecore/play-memblockq.c b/src/pulsecore/play-memblockq.c
index f528c49..0d6da3e 100644
--- a/src/pulsecore/play-memblockq.c
+++ b/src/pulsecore/play-memblockq.c
@@ -173,7 +173,8 @@ pa_sink_input* pa_memblockq_sink_input_new(
const pa_channel_map *map,
pa_memblockq *q,
pa_cvolume *volume,
- pa_proplist *p) {
+ pa_proplist *p,
+ pa_sink_input_flags_t flags) {
memblockq_stream *u = NULL;
pa_sink_input_new_data data;
@@ -198,6 +199,7 @@ pa_sink_input* pa_memblockq_sink_input_new(
pa_sink_input_new_data_set_channel_map(&data, map);
pa_sink_input_new_data_set_volume(&data, volume);
pa_proplist_update(data.proplist, PA_UPDATE_REPLACE, p);
+ data.flags |= flags;
pa_sink_input_new(&u->sink_input, sink->core, &data);
pa_sink_input_new_data_done(&data);
@@ -237,6 +239,7 @@ int pa_play_memblockq(
pa_memblockq *q,
pa_cvolume *volume,
pa_proplist *p,
+ pa_sink_input_flags_t flags,
uint32_t *sink_input_index) {
pa_sink_input *i;
@@ -245,7 +248,7 @@ int pa_play_memblockq(
pa_assert(ss);
pa_assert(q);
- if (!(i = pa_memblockq_sink_input_new(sink, ss, map, q, volume, p)))
+ if (!(i = pa_memblockq_sink_input_new(sink, ss, map, q, volume, p, flags)))
return -1;
pa_sink_input_put(i);
diff --git a/src/pulsecore/play-memblockq.h b/src/pulsecore/play-memblockq.h
index 9d5f40f..a55fed0 100644
--- a/src/pulsecore/play-memblockq.h
+++ b/src/pulsecore/play-memblockq.h
@@ -31,17 +31,19 @@ pa_sink_input* pa_memblockq_sink_input_new(
const pa_channel_map *map,
pa_memblockq *q,
pa_cvolume *volume,
- pa_proplist *p);
+ pa_proplist *p,
+ pa_sink_input_flags_t flags);
void pa_memblockq_sink_input_set_queue(pa_sink_input *i, pa_memblockq *q);
int pa_play_memblockq(
- pa_sink *sink,
- const pa_sample_spec *ss,
- const pa_channel_map *map,
- pa_memblockq *q,
- pa_cvolume *cvolume,
- pa_proplist *p,
- uint32_t *sink_input_index);
+ pa_sink *sink,
+ const pa_sample_spec *ss,
+ const pa_channel_map *map,
+ pa_memblockq *q,
+ pa_cvolume *cvolume,
+ pa_proplist *p,
+ pa_sink_input_flags_t flags,
+ uint32_t *sink_input_index);
#endif
diff --git a/src/pulsecore/play-memchunk.c b/src/pulsecore/play-memchunk.c
index 1a3bd5b..6fb8902 100644
--- a/src/pulsecore/play-memchunk.c
+++ b/src/pulsecore/play-memchunk.c
@@ -43,6 +43,7 @@ int pa_play_memchunk(
const pa_memchunk *chunk,
pa_cvolume *volume,
pa_proplist *p,
+ pa_sink_input_flags_t flags,
uint32_t *sink_input_index) {
pa_memblockq *q;
@@ -59,7 +60,7 @@ int pa_play_memchunk(
pa_assert_se(pa_memblockq_push(q, chunk) >= 0);
- if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, sink_input_index)) < 0) {
+ if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, flags, sink_input_index)) < 0) {
pa_memblockq_free(q);
return r;
}
diff --git a/src/pulsecore/play-memchunk.h b/src/pulsecore/play-memchunk.h
index c813611..068add1 100644
--- a/src/pulsecore/play-memchunk.h
+++ b/src/pulsecore/play-memchunk.h
@@ -26,12 +26,13 @@
#include <pulsecore/memchunk.h>
int pa_play_memchunk(
- pa_sink *sink,
- const pa_sample_spec *ss,
- const pa_channel_map *map,
- const pa_memchunk *chunk,
- pa_cvolume *cvolume,
- pa_proplist *p,
- uint32_t *sink_input_index);
+ pa_sink *sink,
+ const pa_sample_spec *ss,
+ const pa_channel_map *map,
+ const pa_memchunk *chunk,
+ pa_cvolume *cvolume,
+ pa_proplist *p,
+ pa_sink_input_flags_t flags,
+ uint32_t *sink_input_index);
#endif
--
1.7.0

View file

@ -0,0 +1,28 @@
From b2e9fb6f6e12a3eab8a41c67017507e60d616e2a Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 21:09:26 +0100
Subject: [PATCH 55/62] pacat: pass buffer_attr to recording streams too
Pointed out by Colin Guthrie.
https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-February/006698.html
---
src/utils/pacat.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index d136f6b..394cfbf 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -473,7 +473,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
}
} else {
- if (pa_stream_connect_record(stream, device, latency > 0 ? &buffer_attr : NULL, flags) < 0) {
+ if (pa_stream_connect_record(stream, device, &buffer_attr, flags) < 0) {
pa_log(_("pa_stream_connect_record() failed: %s"), pa_strerror(pa_context_errno(c)));
goto fail;
}
--
1.7.0

View file

@ -0,0 +1,47 @@
From a469d44e6993c4e9e7a53ac91ed53eacb500e279 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 22 Feb 2010 03:22:28 +0100
Subject: [PATCH 56/62] suspend-on-idle: resume audio device even for initially corked streams
We need to resume audio devices even for streams that are created in
corked stat, so that the latency ranges of the audio device are known
during the initial latency negotiation. If we don't the latency
negotiation will be based on placeholder data and changed later on which
clients do not expect.
This should fix issues with Skype.
https://bugzilla.redhat.com/show_bug.cgi?id=554929
---
src/modules/module-suspend-on-idle.c | 8 +++-----
1 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/src/modules/module-suspend-on-idle.c b/src/modules/module-suspend-on-idle.c
index 7adaa0b..cfb7879 100644
--- a/src/modules/module-suspend-on-idle.c
+++ b/src/modules/module-suspend-on-idle.c
@@ -145,8 +145,9 @@ static pa_hook_result_t sink_input_fixate_hook_cb(pa_core *c, pa_sink_input_new_
pa_assert(data);
pa_assert(u);
- if (data->flags & PA_SINK_INPUT_START_CORKED)
- return PA_HOOK_OK;
+ /* We need to resume the audio device here even for
+ * PA_SINK_INPUT_START_CORKED, since we need the device parameters
+ * to be fully available while the stream is set up. */
if ((d = pa_hashmap_get(u->device_infos, data->sink)))
resume(d);
@@ -161,9 +162,6 @@ static pa_hook_result_t source_output_fixate_hook_cb(pa_core *c, pa_source_outpu
pa_assert(data);
pa_assert(u);
- if (data->flags & PA_SOURCE_OUTPUT_START_CORKED)
- return PA_HOOK_OK;
-
if (data->source->monitor_of)
d = pa_hashmap_get(u->device_infos, data->source->monitor_of);
else
--
1.7.0

View file

@ -0,0 +1,48 @@
From 4a32103d84102ee91368eed1f30613de6da12f6a Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 22 Feb 2010 03:40:29 +0100
Subject: [PATCH 57/62] native: improve logging for buffer_attrs
---
src/pulsecore/protocol-native.c | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index f80b0c2..337869d 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -858,6 +858,18 @@ static void fix_playback_buffer_attr(playback_stream *s) {
pa_assert(s);
+ /* pa_log("Client requested: maxlength=%li bytes tlength=%li bytes minreq=%li bytes prebuf=%li bytes", */
+ /* (long) s->buffer_attr.maxlength, */
+ /* (long) s->buffer_attr.tlength, */
+ /* (long) s->buffer_attr.minreq, */
+ /* (long) s->buffer_attr.prebuf); */
+
+ /* pa_log("Client requested: maxlength=%lu ms tlength=%lu ms minreq=%lu ms prebuf=%lu ms", */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.maxlength, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.tlength, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.minreq, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.prebuf, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC)); */
+
/* This function will be called from the main thread, before as
* well as after the sink input has been activated using
* pa_sink_input_put()! That means it may not touch any
@@ -984,6 +996,12 @@ static void fix_playback_buffer_attr(playback_stream *s) {
if (s->buffer_attr.prebuf == (uint32_t) -1 ||
s->buffer_attr.prebuf > max_prebuf)
s->buffer_attr.prebuf = max_prebuf;
+
+ /* pa_log("Client accepted: maxlength=%lu ms tlength=%lu ms minreq=%lu ms prebuf=%lu ms", */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.maxlength, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.tlength, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.minreq, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC), */
+ /* (unsigned long) (pa_bytes_to_usec(s->buffer_attr.prebuf, &s->sink_input->sample_spec) / PA_USEC_PER_MSEC)); */
}
/* Called from main context */
--
1.7.0

View file

@ -0,0 +1,53 @@
From 522c446ddc2bf2f4467f9de16f8618fc544a94fe Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 22:00:49 +0100
Subject: [PATCH 58/62] alsa-util: strip spaces from ALSA card/pcm names
http://pulseaudio.org/ticket/778
---
src/modules/alsa/alsa-util.c | 12 +++++++-----
1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 52f1259..1cbb3f3 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -874,12 +874,12 @@ void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card) {
pa_proplist_setf(p, "alsa.card", "%i", card);
if (snd_card_get_name(card, &cn) >= 0) {
- pa_proplist_sets(p, "alsa.card_name", cn);
+ pa_proplist_sets(p, "alsa.card_name", pa_strip(cn));
free(cn);
}
if (snd_card_get_longname(card, &lcn) >= 0) {
- pa_proplist_sets(p, "alsa.long_card_name", lcn);
+ pa_proplist_sets(p, "alsa.long_card_name", pa_strip(lcn));
free(lcn);
}
@@ -937,8 +937,11 @@ void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *
if (alsa_subclass_table[subclass])
pa_proplist_sets(p, "alsa.subclass", alsa_subclass_table[subclass]);
- if ((n = snd_pcm_info_get_name(pcm_info)))
- pa_proplist_sets(p, "alsa.name", n);
+ if ((n = snd_pcm_info_get_name(pcm_info))) {
+ char *t = pa_xstrdup(n);
+ pa_proplist_sets(p, "alsa.name", pa_strip(t));
+ pa_xfree(t);
+ }
if ((id = snd_pcm_info_get_id(pcm_info)))
pa_proplist_sets(p, "alsa.id", id);
@@ -1331,6 +1334,5 @@ pa_bool_t pa_alsa_may_tsched(pa_bool_t want) {
return FALSE;
}
-
return TRUE;
}
--
1.7.0

View file

@ -0,0 +1,48 @@
From dd682d6f96fe7133b866c97b72edcb6136a9737c Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Mon, 22 Feb 2010 04:54:24 +0100
Subject: [PATCH 59/62] alsa: reset max_rewind/max_request while suspending
---
src/modules/alsa/alsa-sink.c | 11 ++++++++++-
1 files changed, 10 insertions(+), 1 deletions(-)
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 690480f..60c10c4 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -79,7 +79,7 @@
#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC) /* 4ms -- Wakeup at least this long before the buffer runs empty*/
#define SMOOTHER_MIN_INTERVAL (2*PA_USEC_PER_MSEC) /* 2ms -- min smoother update interval */
-#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms -- max smoother update inteval */
+#define SMOOTHER_MAX_INTERVAL (200*PA_USEC_PER_MSEC) /* 200ms -- max smoother update interval */
#define VOLUME_ACCURACY (PA_VOLUME_NORM/100) /* don't require volume adjustments to be perfectly correct. don't necessarily extend granularity in software unless the differences get greater than this level */
@@ -876,6 +876,14 @@ static int suspend(struct userdata *u) {
u->alsa_rtpoll_item = NULL;
}
+ /* We reset max_rewind/max_request here to make sure that while we
+ * are suspended the old max_request/max_rewind values set before
+ * the suspend can influence the per-stream buffer of newly
+ * created streams, without their requirements having any
+ * influence on them. */
+ pa_sink_set_max_rewind_within_thread(u->sink, 0);
+ pa_sink_set_max_request_within_thread(u->sink, 0);
+
pa_log_info("Device suspended...");
return 0;
@@ -933,6 +941,7 @@ static int update_sw_params(struct userdata *u) {
}
pa_sink_set_max_request_within_thread(u->sink, u->hwbuf_size - u->hwbuf_unused);
+ pa_sink_set_max_rewind_within_thread(u->sink, u->hwbuf_size);
return 0;
}
--
1.7.0

View file

@ -0,0 +1,78 @@
From 195069c1815a1483b2c44f8cc72e2dd25e9b8fb1 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Sun, 21 Feb 2010 21:59:53 +0100
Subject: [PATCH 60/62] core-util: introduce generic function pa_strip()
---
src/pulsecore/core-util.c | 28 ++++++++++++++++++++++++----
src/pulsecore/core-util.h | 1 +
2 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 258e8ee..d6017b9 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -126,6 +126,9 @@
#define MSG_NOSIGNAL 0
#endif
+#define NEWLINE "\r\n"
+#define WHITESPACE "\n\r \t"
+
static pa_strlist *recorded_env = NULL;
#ifdef OS_IS_WIN32
@@ -830,9 +833,6 @@ char *pa_split(const char *c, const char *delimiter, const char**state) {
return pa_xstrndup(current, l);
}
-/* What is interpreted as whitespace? */
-#define WHITESPACE " \t\n"
-
/* Split a string into words. Otherwise similar to pa_split(). */
char *pa_split_spaces(const char *c, const char **state) {
const char *current = *state ? *state : c;
@@ -1189,7 +1189,27 @@ int pa_lock_fd(int fd, int b) {
char* pa_strip_nl(char *s) {
pa_assert(s);
- s[strcspn(s, "\r\n")] = 0;
+ s[strcspn(s, NEWLINE)] = 0;
+ return s;
+}
+
+char *pa_strip(char *s) {
+ char *e, *l = NULL;
+
+ /* Drops trailing whitespace. Modifies the string in
+ * place. Returns pointer to first non-space character */
+
+ s += strspn(s, WHITESPACE);
+
+ for (e = s; *e; e++)
+ if (!strchr(WHITESPACE, *e))
+ l = e;
+
+ if (l)
+ *(l+1) = 0;
+ else
+ *s = 0;
+
return s;
}
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index eba1b40..71be9de 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -102,6 +102,7 @@ char *pa_split(const char *c, const char*delimiters, const char **state);
char *pa_split_spaces(const char *c, const char **state);
char *pa_strip_nl(char *s);
+char *pa_strip(char *s);
const char *pa_sig2str(int sig) PA_GCC_PURE;
--
1.7.0

View file

@ -0,0 +1,46 @@
From 30f28ebf3619a86b49009e8dbce154233f597dbb Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 23 Feb 2010 00:48:35 +0100
Subject: [PATCH 61/62] esd,simple: use pa_memblockq_pop_missing()
We need to use pa_memblockq_pop_missing() for all request handling,
including the initial request, because otherwise the counters will be
stay off during the entire runtime.
This should fix:
https://bugzilla.redhat.com/show_bug.cgi?id=559467
---
src/pulsecore/protocol-esound.c | 2 +-
src/pulsecore/protocol-simple.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index a89f327..1e16334 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -462,7 +462,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
c->protocol->n_player++;
- pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
+ pa_atomic_store(&c->playback.missing, (int) pa_memblockq_pop_missing(c->input_memblockq));
pa_sink_input_put(c->sink_input);
diff --git a/src/pulsecore/protocol-simple.c b/src/pulsecore/protocol-simple.c
index fb2e564..77277e1 100644
--- a/src/pulsecore/protocol-simple.c
+++ b/src/pulsecore/protocol-simple.c
@@ -574,7 +574,7 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
pa_iochannel_socket_set_rcvbuf(io, l);
- pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
+ pa_atomic_store(&c->playback.missing, (int) pa_memblockq_pop_missing(c->input_memblockq));
pa_sink_input_put(c->sink_input);
}
--
1.7.0

View file

@ -0,0 +1,72 @@
From 0d1154d078f8f149e2ab9a67b09835a829416e49 Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lennart@poettering.net>
Date: Tue, 23 Feb 2010 18:41:18 +0100
Subject: [PATCH 62/62] core: rework how stream volumes affect sink volumes
---
src/pulsecore/sink.c | 42 +++++++++++++++++++++++++++++++++++++++++-
1 files changed, 41 insertions(+), 1 deletions(-)
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index e6d718f..3a92f67 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1162,6 +1162,46 @@ pa_usec_t pa_sink_get_latency_within_thread(pa_sink *s) {
return usec;
}
+static pa_cvolume* cvolume_remap_minimal_impact(
+ pa_cvolume *v,
+ const pa_cvolume *template,
+ const pa_channel_map *from,
+ const pa_channel_map *to) {
+
+ pa_cvolume t;
+
+ pa_assert(v);
+ pa_assert(template);
+ pa_assert(from);
+ pa_assert(to);
+
+ pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, from), NULL);
+ pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(template, to), NULL);
+
+ /* Much like pa_cvolume_remap(), but tries to minimize impact when
+ * mapping from sink input to sink volumes:
+ *
+ * If template is a possible remapping from v it is used instead
+ * of remapping anew.
+ *
+ * If the channel maps don't match we set an all-channel volume on
+ * the sink to ensure that changing a volume on one stream has no
+ * effect that cannot be compensated for in another stream that
+ * does not have the same channel map as the sink. */
+
+ if (pa_channel_map_equal(from, to))
+ return v;
+
+ t = *template;
+ if (pa_cvolume_equal(pa_cvolume_remap(&t, to, from), v)) {
+ *v = *template;
+ return v;
+ }
+
+ pa_cvolume_set(v, to->channels, pa_cvolume_max(v));
+ return v;
+}
+
/* Called from main context */
static void compute_reference_ratios(pa_sink *s) {
uint32_t idx;
@@ -1289,7 +1329,7 @@ static void compute_real_volume(pa_sink *s) {
pa_cvolume remapped;
remapped = i->volume;
- pa_cvolume_remap(&remapped, &i->channel_map, &s->channel_map);
+ cvolume_remap_minimal_impact(&remapped, &s->real_volume, &i->channel_map, &s->channel_map);
pa_cvolume_merge(&s->real_volume, &s->real_volume, &remapped);
}
--
1.7.0

View file

@ -0,0 +1,11 @@
--- pulseaudio-0.9.21/src/pulse/context.c-orig 2010-09-29 08:56:41.000000000 +0200
+++ pulseaudio-0.9.21/src/pulse/context.c 2010-09-29 13:04:15.000000000 +0200
@@ -624,7 +624,7 @@ static pa_strlist *prepend_per_user(pa_s
char *ufn;
#ifdef ENABLE_LEGACY_RUNTIME_DIR
- static char *legacy_dir;
+ char *legacy_dir;
/* The very old per-user instance path (< 0.9.11). This is supported only to ease upgrades */
if ((legacy_dir = get_very_old_legacy_runtime_dir())) {

View file

@ -8,7 +8,7 @@ long_desc="
This package contains files for development, headers, static libs, etc."
revision=1
revision=2
Add_dependency run pkg-config
Add_dependency run gettext

View file

@ -1,7 +1,8 @@
# Template file for 'pulseaudio'
pkgname=pulseaudio
version=0.9.21
revision=3
revision=4
patch_args="-Np1"
distfiles="http://0pointer.de/lennart/projects/$pkgname/$pkgname-$version.tar.gz"
build_style=gnu_configure
configure_args="--disable-samplerate --disable-oss-output --disable-oss-wrapper
@ -67,6 +68,7 @@ Add_dependency run GConf
Add_dependency run libpulseaudio
Add_dependency build pkg-config
Add_dependency build automake
Add_dependency build gettext
Add_dependency build GConf-devel
Add_dependency build glib-devel
@ -91,6 +93,11 @@ Add_dependency build zlib-devel
Add_dependency full rtkit
pre_configure()
{
cd ${wrksrc} && autoreconf -fi
}
post_install()
{
install -Dm755 ${FILESDIR}/pulseaudio.xinit \