mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-08 13:29:59 -05:00
Huge trailing whitespace cleanup. Let's keep the tree pure from here on,
mmmkay? git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1418 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
1a460ee40a
commit
521daf6f0a
283 changed files with 3742 additions and 3742 deletions
|
|
@ -2,26 +2,26 @@
|
|||
|
||||
/***
|
||||
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 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.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
|
@ -53,10 +53,10 @@ struct pa_browser {
|
|||
|
||||
pa_browser_error_cb_t error_callback;
|
||||
void *error_userdata;
|
||||
|
||||
|
||||
AvahiClient *client;
|
||||
AvahiServiceBrowser *server_browser, *sink_browser, *source_browser;
|
||||
|
||||
|
||||
};
|
||||
|
||||
static int map_to_opcode(const char *type, int new) {
|
||||
|
|
@ -84,7 +84,7 @@ static void resolve_callback(
|
|||
AvahiStringList *txt,
|
||||
AvahiLookupResultFlags flags,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_browser *b = userdata;
|
||||
pa_browse_info i;
|
||||
char ip[256], a[256];
|
||||
|
|
@ -94,7 +94,7 @@ static void resolve_callback(
|
|||
pa_sample_spec ss;
|
||||
int ss_valid = 0;
|
||||
char *key = NULL, *value = NULL;
|
||||
|
||||
|
||||
assert(b);
|
||||
|
||||
memset(&i, 0, sizeof(i));
|
||||
|
|
@ -102,7 +102,7 @@ static void resolve_callback(
|
|||
|
||||
if (event != AVAHI_RESOLVER_FOUND)
|
||||
goto fail;
|
||||
|
||||
|
||||
if (!b->callback)
|
||||
goto fail;
|
||||
|
||||
|
|
@ -119,10 +119,10 @@ static void resolve_callback(
|
|||
|
||||
|
||||
while (txt) {
|
||||
|
||||
|
||||
if (avahi_string_list_get_pair(txt, &key, &value, NULL) < 0)
|
||||
break;
|
||||
|
||||
|
||||
if (!strcmp(key, "device")) {
|
||||
device_found = 1;
|
||||
pa_xfree((char*) i.device);
|
||||
|
|
@ -138,11 +138,11 @@ static void resolve_callback(
|
|||
value = NULL;
|
||||
} else if (!strcmp(key, "fqdn")) {
|
||||
size_t l;
|
||||
|
||||
|
||||
pa_xfree((char*) i.fqdn);
|
||||
i.fqdn = value;
|
||||
value = NULL;
|
||||
|
||||
|
||||
l = strlen(a);
|
||||
assert(l+1 <= sizeof(a));
|
||||
strncat(a, " ", sizeof(a)-l-1);
|
||||
|
|
@ -151,7 +151,7 @@ static void resolve_callback(
|
|||
|
||||
if (pa_atou(value, &cookie) < 0)
|
||||
goto fail;
|
||||
|
||||
|
||||
i.cookie = &cookie;
|
||||
} else if (!strcmp(key, "description")) {
|
||||
pa_xfree((char*) i.description);
|
||||
|
|
@ -159,13 +159,13 @@ static void resolve_callback(
|
|||
value = NULL;
|
||||
} else if (!strcmp(key, "channels")) {
|
||||
uint32_t ch;
|
||||
|
||||
|
||||
if (pa_atou(value, &ch) < 0 || ch <= 0 || ch > 255)
|
||||
goto fail;
|
||||
|
||||
|
||||
ss.channels = (uint8_t) ch;
|
||||
ss_valid |= 1;
|
||||
|
||||
|
||||
} else if (!strcmp(key, "rate")) {
|
||||
if (pa_atou(value, &ss.rate) < 0)
|
||||
goto fail;
|
||||
|
|
@ -174,7 +174,7 @@ static void resolve_callback(
|
|||
|
||||
if ((ss.format = pa_parse_sample_format(value)) == PA_SAMPLE_INVALID)
|
||||
goto fail;
|
||||
|
||||
|
||||
ss_valid |= 4;
|
||||
}
|
||||
|
||||
|
|
@ -186,7 +186,7 @@ static void resolve_callback(
|
|||
}
|
||||
|
||||
/* No device txt record was sent for a sink or source service */
|
||||
if (opcode != PA_BROWSE_NEW_SERVER && !device_found)
|
||||
if (opcode != PA_BROWSE_NEW_SERVER && !device_found)
|
||||
goto fail;
|
||||
|
||||
if (ss_valid == 7)
|
||||
|
|
@ -203,7 +203,7 @@ fail:
|
|||
|
||||
pa_xfree(key);
|
||||
pa_xfree(value);
|
||||
|
||||
|
||||
avahi_service_resolver_free(r);
|
||||
}
|
||||
|
||||
|
|
@ -263,19 +263,19 @@ static void browse_callback(
|
|||
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
case AVAHI_BROWSER_REMOVE: {
|
||||
|
||||
if (b->callback) {
|
||||
pa_browse_info i;
|
||||
int opcode;
|
||||
|
||||
|
||||
memset(&i, 0, sizeof(i));
|
||||
i.name = name;
|
||||
|
||||
opcode = map_to_opcode(type, 0);
|
||||
assert(opcode >= 0);
|
||||
|
||||
|
||||
b->callback(b, opcode, &i, b->userdata);
|
||||
}
|
||||
break;
|
||||
|
|
@ -285,7 +285,7 @@ static void browse_callback(
|
|||
handle_failure(b);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
|
@ -313,7 +313,7 @@ pa_browser *pa_browser_new_full(pa_mainloop_api *mainloop, pa_browse_flags_t fla
|
|||
|
||||
if (flags & ~(PA_BROWSE_FOR_SERVERS|PA_BROWSE_FOR_SINKS|PA_BROWSE_FOR_SOURCES) || flags == 0)
|
||||
return NULL;
|
||||
|
||||
|
||||
b = pa_xnew(pa_browser, 1);
|
||||
b->mainloop = mainloop;
|
||||
b->ref = 1;
|
||||
|
|
@ -346,7 +346,7 @@ pa_browser *pa_browser_new_full(pa_mainloop_api *mainloop, pa_browse_flags_t fla
|
|||
*error_string = avahi_strerror(avahi_client_errno(b->client));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
if ((flags & PA_BROWSE_FOR_SINKS) &&
|
||||
!(b->sink_browser = avahi_service_browser_new(
|
||||
b->client,
|
||||
|
|
@ -378,13 +378,13 @@ pa_browser *pa_browser_new_full(pa_mainloop_api *mainloop, pa_browse_flags_t fla
|
|||
*error_string = avahi_strerror(avahi_client_errno(b->client));
|
||||
goto fail;
|
||||
}
|
||||
|
||||
|
||||
return b;
|
||||
|
||||
fail:
|
||||
if (b)
|
||||
browser_free(b);
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -403,7 +403,7 @@ static void browser_free(pa_browser *b) {
|
|||
|
||||
if (b->avahi_poll)
|
||||
pa_avahi_poll_free(b->avahi_poll);
|
||||
|
||||
|
||||
pa_xfree(b);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -41,7 +41,7 @@ typedef enum pa_browse_opcode {
|
|||
PA_BROWSE_NEW_SINK, /**< New sink found */
|
||||
PA_BROWSE_NEW_SOURCE, /**< New source found */
|
||||
PA_BROWSE_REMOVE_SERVER, /**< Server disappeared */
|
||||
PA_BROWSE_REMOVE_SINK, /**< Sink disappeared */
|
||||
PA_BROWSE_REMOVE_SINK, /**< Sink disappeared */
|
||||
PA_BROWSE_REMOVE_SOURCE /**< Source disappeared */
|
||||
} pa_browse_opcode_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -35,23 +35,23 @@
|
|||
|
||||
const char *const table[] = {
|
||||
[PA_CHANNEL_POSITION_MONO] = "mono",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_FRONT_CENTER] = "front-center",
|
||||
[PA_CHANNEL_POSITION_FRONT_LEFT] = "front-left",
|
||||
[PA_CHANNEL_POSITION_FRONT_RIGHT] = "front-right",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_REAR_CENTER] = "rear-center",
|
||||
[PA_CHANNEL_POSITION_REAR_LEFT] = "rear-left",
|
||||
[PA_CHANNEL_POSITION_REAR_RIGHT] = "rear-right",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_LFE] = "lfe",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = "front-left-of-center",
|
||||
[PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = "front-right-of-center",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_SIDE_LEFT] = "side-left",
|
||||
[PA_CHANNEL_POSITION_SIDE_RIGHT] = "side-right",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_AUX0] = "aux0",
|
||||
[PA_CHANNEL_POSITION_AUX1] = "aux1",
|
||||
[PA_CHANNEL_POSITION_AUX2] = "aux2",
|
||||
|
|
@ -86,7 +86,7 @@ const char *const table[] = {
|
|||
[PA_CHANNEL_POSITION_AUX31] = "aux31",
|
||||
|
||||
[PA_CHANNEL_POSITION_TOP_CENTER] = "top-center",
|
||||
|
||||
|
||||
[PA_CHANNEL_POSITION_TOP_FRONT_LEFT] = "top-front-left",
|
||||
[PA_CHANNEL_POSITION_TOP_FRONT_RIGHT] = "top-front-right",
|
||||
[PA_CHANNEL_POSITION_TOP_FRONT_CENTER] = "top-front-center",
|
||||
|
|
@ -140,14 +140,14 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
|
||||
switch (def) {
|
||||
case PA_CHANNEL_MAP_AIFF:
|
||||
|
||||
|
||||
/* This is somewhat compatible with RFC3551 */
|
||||
|
||||
|
||||
switch (channels) {
|
||||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
|
||||
case 6:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
|
|
@ -156,31 +156,31 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
m->map[4] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
m->map[5] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
|
||||
|
||||
case 5:
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
m->map[3] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[4] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 2:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
return m;
|
||||
|
||||
|
||||
case 3:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[2] = PA_CHANNEL_POSITION_CENTER;
|
||||
return m;
|
||||
|
||||
|
||||
case 4:
|
||||
m->map[0] = PA_CHANNEL_POSITION_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_CENTER;
|
||||
m->map[2] = PA_CHANNEL_POSITION_RIGHT;
|
||||
m->map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
return m;
|
||||
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -191,43 +191,43 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
|
||||
case 8:
|
||||
m->map[6] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
m->map[7] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 6:
|
||||
m->map[5] = PA_CHANNEL_POSITION_LFE;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 5:
|
||||
m->map[4] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 4:
|
||||
m->map[2] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[3] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 2:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
return m;
|
||||
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
case PA_CHANNEL_MAP_AUX: {
|
||||
unsigned i;
|
||||
|
||||
|
||||
if (channels >= PA_CHANNELS_MAX)
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < channels; i++)
|
||||
m->map[i] = PA_CHANNEL_POSITION_AUX0 + i;
|
||||
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
|
|
@ -237,55 +237,55 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
|
||||
case 18:
|
||||
m->map[15] = PA_CHANNEL_POSITION_TOP_REAR_LEFT;
|
||||
m->map[16] = PA_CHANNEL_POSITION_TOP_REAR_CENTER;
|
||||
m->map[17] = PA_CHANNEL_POSITION_TOP_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 15:
|
||||
m->map[12] = PA_CHANNEL_POSITION_TOP_FRONT_LEFT;
|
||||
m->map[13] = PA_CHANNEL_POSITION_TOP_FRONT_CENTER;
|
||||
m->map[14] = PA_CHANNEL_POSITION_TOP_FRONT_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 12:
|
||||
m->map[11] = PA_CHANNEL_POSITION_TOP_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 11:
|
||||
m->map[9] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
m->map[10] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 9:
|
||||
m->map[8] = PA_CHANNEL_POSITION_REAR_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 8:
|
||||
m->map[6] = PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;
|
||||
m->map[7] = PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 6:
|
||||
m->map[4] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[5] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 4:
|
||||
m->map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 3:
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 2:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
return m;
|
||||
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -296,12 +296,12 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
case 1:
|
||||
m->map[0] = PA_CHANNEL_POSITION_MONO;
|
||||
return m;
|
||||
|
||||
|
||||
case 8:
|
||||
m->map[6] = PA_CHANNEL_POSITION_REAR_LEFT;
|
||||
m->map[7] = PA_CHANNEL_POSITION_REAR_RIGHT;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 6:
|
||||
m->map[4] = PA_CHANNEL_POSITION_SIDE_LEFT;
|
||||
m->map[5] = PA_CHANNEL_POSITION_SIDE_RIGHT;
|
||||
|
|
@ -310,20 +310,20 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
|
|||
case 4:
|
||||
m->map[3] = PA_CHANNEL_POSITION_LFE;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 3:
|
||||
m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
|
||||
/* Fall through */
|
||||
|
||||
|
||||
case 2:
|
||||
m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
|
||||
m->map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
|
||||
return m;
|
||||
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
|
|
@ -341,13 +341,13 @@ const char* pa_channel_position_to_string(pa_channel_position_t pos) {
|
|||
|
||||
int pa_channel_map_equal(const pa_channel_map *a, const pa_channel_map *b) {
|
||||
unsigned c;
|
||||
|
||||
|
||||
assert(a);
|
||||
assert(b);
|
||||
|
||||
if (a->channels != b->channels)
|
||||
return 0;
|
||||
|
||||
|
||||
for (c = 0; c < a->channels; c++)
|
||||
if (a->map[c] != b->map[c])
|
||||
return 0;
|
||||
|
|
@ -359,7 +359,7 @@ char* pa_channel_map_snprint(char *s, size_t l, const pa_channel_map *map) {
|
|||
unsigned channel;
|
||||
int first = 1;
|
||||
char *e;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(l > 0);
|
||||
assert(map);
|
||||
|
|
@ -382,7 +382,7 @@ pa_channel_map *pa_channel_map_parse(pa_channel_map *rmap, const char *s) {
|
|||
const char *state;
|
||||
pa_channel_map map;
|
||||
char *p;
|
||||
|
||||
|
||||
assert(rmap);
|
||||
assert(s);
|
||||
|
||||
|
|
@ -397,14 +397,14 @@ pa_channel_map *pa_channel_map_parse(pa_channel_map *rmap, const char *s) {
|
|||
|
||||
state = NULL;
|
||||
map.channels = 0;
|
||||
|
||||
|
||||
while ((p = pa_split(s, ",", &state))) {
|
||||
|
||||
if (map.channels >= PA_CHANNELS_MAX) {
|
||||
pa_xfree(p);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* Some special aliases */
|
||||
if (strcmp(p, "left") == 0)
|
||||
map.map[map.channels++] = PA_CHANNEL_POSITION_LEFT;
|
||||
|
|
@ -416,13 +416,13 @@ pa_channel_map *pa_channel_map_parse(pa_channel_map *rmap, const char *s) {
|
|||
map.map[map.channels++] = PA_CHANNEL_POSITION_SUBWOOFER;
|
||||
else {
|
||||
pa_channel_position_t i;
|
||||
|
||||
|
||||
for (i = 0; i < PA_CHANNEL_POSITION_MAX; i++)
|
||||
if (strcmp(p, table[i]) == 0) {
|
||||
map.map[map.channels++] = i;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
if (i >= PA_CHANNEL_POSITION_MAX) {
|
||||
pa_xfree(p);
|
||||
return NULL;
|
||||
|
|
@ -433,24 +433,24 @@ pa_channel_map *pa_channel_map_parse(pa_channel_map *rmap, const char *s) {
|
|||
}
|
||||
|
||||
finish:
|
||||
|
||||
|
||||
if (!pa_channel_map_valid(&map))
|
||||
return NULL;
|
||||
|
||||
|
||||
*rmap = map;
|
||||
return rmap;
|
||||
}
|
||||
|
||||
int pa_channel_map_valid(const pa_channel_map *map) {
|
||||
unsigned c;
|
||||
|
||||
|
||||
assert(map);
|
||||
|
||||
if (map->channels <= 0 || map->channels > PA_CHANNELS_MAX)
|
||||
return 0;
|
||||
|
||||
for (c = 0; c < map->channels; c++) {
|
||||
|
||||
|
||||
if (map->map[c] < 0 ||map->map[c] >= PA_CHANNEL_POSITION_MAX)
|
||||
return 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -72,7 +72,7 @@ typedef enum pa_channel_position {
|
|||
PA_CHANNEL_POSITION_LEFT,
|
||||
PA_CHANNEL_POSITION_RIGHT,
|
||||
PA_CHANNEL_POSITION_CENTER,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_FRONT_LEFT = PA_CHANNEL_POSITION_LEFT,
|
||||
PA_CHANNEL_POSITION_FRONT_RIGHT = PA_CHANNEL_POSITION_RIGHT,
|
||||
PA_CHANNEL_POSITION_FRONT_CENTER = PA_CHANNEL_POSITION_CENTER,
|
||||
|
|
@ -80,13 +80,13 @@ typedef enum pa_channel_position {
|
|||
PA_CHANNEL_POSITION_REAR_CENTER,
|
||||
PA_CHANNEL_POSITION_REAR_LEFT,
|
||||
PA_CHANNEL_POSITION_REAR_RIGHT,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_LFE,
|
||||
PA_CHANNEL_POSITION_SUBWOOFER = PA_CHANNEL_POSITION_LFE,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,
|
||||
PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_SIDE_LEFT,
|
||||
PA_CHANNEL_POSITION_SIDE_RIGHT,
|
||||
|
||||
|
|
@ -124,7 +124,7 @@ typedef enum pa_channel_position {
|
|||
PA_CHANNEL_POSITION_AUX31,
|
||||
|
||||
PA_CHANNEL_POSITION_TOP_CENTER,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_TOP_FRONT_LEFT,
|
||||
PA_CHANNEL_POSITION_TOP_FRONT_RIGHT,
|
||||
PA_CHANNEL_POSITION_TOP_FRONT_CENTER,
|
||||
|
|
@ -132,7 +132,7 @@ typedef enum pa_channel_position {
|
|||
PA_CHANNEL_POSITION_TOP_REAR_LEFT,
|
||||
PA_CHANNEL_POSITION_TOP_REAR_RIGHT,
|
||||
PA_CHANNEL_POSITION_TOP_REAR_CENTER,
|
||||
|
||||
|
||||
PA_CHANNEL_POSITION_MAX
|
||||
} pa_channel_position_t;
|
||||
|
||||
|
|
@ -143,7 +143,7 @@ typedef enum pa_channel_map_def {
|
|||
PA_CHANNEL_MAP_AUX, /**< Only aux channels */
|
||||
PA_CHANNEL_MAP_WAVEEX, /**< Microsoft's WAVEFORMATEXTENSIBLE mapping */
|
||||
PA_CHANNEL_MAP_OSS, /**< The default channel mapping used by OSS as defined in the OSS 4.0 API specs */
|
||||
|
||||
|
||||
PA_CHANNEL_MAP_DEFAULT = PA_CHANNEL_MAP_AIFF /**< The default channel map */
|
||||
} pa_channel_map_def_t;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ int pa_client_conf_from_x11(pa_client_conf *c, const char *dname) {
|
|||
|
||||
if (!dname && !getenv("DISPLAY"))
|
||||
goto finish;
|
||||
|
||||
|
||||
if (!(d = XOpenDisplay(dname))) {
|
||||
pa_log("XOpenDisplay() failed");
|
||||
goto finish;
|
||||
|
|
@ -89,5 +89,5 @@ finish:
|
|||
XCloseDisplay(d);
|
||||
|
||||
return ret;
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,11 +69,11 @@ static const pa_client_conf default_conf = {
|
|||
|
||||
pa_client_conf *pa_client_conf_new(void) {
|
||||
pa_client_conf *c = pa_xmemdup(&default_conf, sizeof(default_conf));
|
||||
|
||||
|
||||
c->daemon_binary = pa_xstrdup(PA_BINARY);
|
||||
c->extra_arguments = pa_xstrdup("--log-target=syslog --exit-idle-time=5");
|
||||
c->cookie_file = pa_xstrdup(PA_NATIVE_COOKIE_FILE);
|
||||
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
|
@ -122,25 +122,25 @@ int pa_client_conf_load(pa_client_conf *c, const char *filename) {
|
|||
pa_log("WARNING: failed to open configuration file '%s': %s", fn, pa_cstrerror(errno));
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
||||
r = f ? pa_config_parse(fn, f, table, NULL) : 0;
|
||||
|
||||
if (!r)
|
||||
r = pa_client_conf_load_cookie(c);
|
||||
|
||||
|
||||
|
||||
finish:
|
||||
pa_xfree(fn);
|
||||
|
||||
if (f)
|
||||
fclose(f);
|
||||
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
int pa_client_conf_env(pa_client_conf *c) {
|
||||
char *e;
|
||||
|
||||
|
||||
if ((e = getenv(ENV_DEFAULT_SINK))) {
|
||||
pa_xfree(c->default_sink);
|
||||
c->default_sink = pa_xstrdup(e);
|
||||
|
|
@ -155,7 +155,7 @@ int pa_client_conf_env(pa_client_conf *c) {
|
|||
pa_xfree(c->default_server);
|
||||
c->default_server = pa_xstrdup(e);
|
||||
}
|
||||
|
||||
|
||||
if ((e = getenv(ENV_DAEMON_BINARY))) {
|
||||
pa_xfree(c->daemon_binary);
|
||||
c->daemon_binary = pa_xstrdup(e);
|
||||
|
|
@ -167,7 +167,7 @@ int pa_client_conf_env(pa_client_conf *c) {
|
|||
|
||||
return pa_client_conf_load_cookie(c);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -88,11 +88,11 @@ static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
|
|||
|
||||
static void unlock_autospawn_lock_file(pa_context *c) {
|
||||
assert(c);
|
||||
|
||||
|
||||
if (c->autospawn_lock_fd >= 0) {
|
||||
char lf[PATH_MAX];
|
||||
pa_runtime_path(AUTOSPAWN_LOCK, lf, sizeof(lf));
|
||||
|
||||
|
||||
pa_unlock_lockfile(lf, c->autospawn_lock_fd);
|
||||
c->autospawn_lock_fd = -1;
|
||||
}
|
||||
|
|
@ -102,10 +102,10 @@ static void context_free(pa_context *c);
|
|||
|
||||
pa_context *pa_context_new(pa_mainloop_api *mainloop, const char *name) {
|
||||
pa_context *c;
|
||||
|
||||
|
||||
assert(mainloop);
|
||||
assert(name);
|
||||
|
||||
|
||||
c = pa_xnew(pa_context, 1);
|
||||
c->ref = 1;
|
||||
c->name = pa_xstrdup(name);
|
||||
|
|
@ -118,7 +118,7 @@ pa_context *pa_context_new(pa_mainloop_api *mainloop, const char *name) {
|
|||
|
||||
PA_LLIST_HEAD_INIT(pa_stream, c->streams);
|
||||
PA_LLIST_HEAD_INIT(pa_operation, c->operations);
|
||||
|
||||
|
||||
c->error = PA_OK;
|
||||
c->state = PA_CONTEXT_UNCONNECTED;
|
||||
c->ctag = 0;
|
||||
|
|
@ -138,7 +138,7 @@ pa_context *pa_context_new(pa_mainloop_api *mainloop, const char *name) {
|
|||
c->do_autospawn = 0;
|
||||
|
||||
#ifndef MSG_NOSIGNAL
|
||||
#ifdef SIGPIPE
|
||||
#ifdef SIGPIPE
|
||||
pa_check_signal_is_blocked(SIGPIPE);
|
||||
#endif
|
||||
#endif
|
||||
|
|
@ -183,7 +183,7 @@ static void context_free(pa_context *c) {
|
|||
pa_pstream_close(c->pstream);
|
||||
pa_pstream_unref(c->pstream);
|
||||
}
|
||||
|
||||
|
||||
if (c->record_streams)
|
||||
pa_dynarray_free(c->record_streams, NULL, NULL);
|
||||
if (c->playback_streams)
|
||||
|
|
@ -196,7 +196,7 @@ static void context_free(pa_context *c) {
|
|||
pa_client_conf_free(c->conf);
|
||||
|
||||
pa_strlist_free(c->server_list);
|
||||
|
||||
|
||||
pa_xfree(c->name);
|
||||
pa_xfree(c->server);
|
||||
pa_xfree(c);
|
||||
|
|
@ -205,7 +205,7 @@ static void context_free(pa_context *c) {
|
|||
pa_context* pa_context_ref(pa_context *c) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
c->ref++;
|
||||
return c;
|
||||
}
|
||||
|
|
@ -221,7 +221,7 @@ void pa_context_unref(pa_context *c) {
|
|||
void pa_context_set_state(pa_context *c, pa_context_state_t st) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
if (c->state == st)
|
||||
return;
|
||||
|
||||
|
|
@ -233,7 +233,7 @@ void pa_context_set_state(pa_context *c, pa_context_state_t st) {
|
|||
|
||||
if (st == PA_CONTEXT_FAILED || st == PA_CONTEXT_TERMINATED) {
|
||||
pa_stream *s;
|
||||
|
||||
|
||||
s = c->streams ? pa_stream_ref(c->streams) : NULL;
|
||||
while (s) {
|
||||
pa_stream *n = s->next ? pa_stream_ref(s->next) : NULL;
|
||||
|
|
@ -245,13 +245,13 @@ void pa_context_set_state(pa_context *c, pa_context_state_t st) {
|
|||
if (c->pdispatch)
|
||||
pa_pdispatch_unref(c->pdispatch);
|
||||
c->pdispatch = NULL;
|
||||
|
||||
|
||||
if (c->pstream) {
|
||||
pa_pstream_close(c->pstream);
|
||||
pa_pstream_unref(c->pstream);
|
||||
}
|
||||
c->pstream = NULL;
|
||||
|
||||
|
||||
if (c->client)
|
||||
pa_socket_client_unref(c->client);
|
||||
c->client = NULL;
|
||||
|
|
@ -263,7 +263,7 @@ void pa_context_set_state(pa_context *c, pa_context_state_t st) {
|
|||
void pa_context_fail(pa_context *c, int error) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
pa_context_set_error(c, error);
|
||||
pa_context_set_state(c, PA_CONTEXT_FAILED);
|
||||
}
|
||||
|
|
@ -283,19 +283,19 @@ static void pstream_die_callback(pa_pstream *p, void *userdata) {
|
|||
|
||||
assert(p);
|
||||
assert(c);
|
||||
|
||||
|
||||
pa_context_fail(c, PA_ERR_CONNECTIONTERMINATED);
|
||||
}
|
||||
|
||||
static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_creds *creds, void *userdata) {
|
||||
pa_context *c = userdata;
|
||||
|
||||
|
||||
assert(p);
|
||||
assert(packet);
|
||||
assert(c);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (pa_pdispatch_run(c->pdispatch, packet, creds, c) < 0)
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
|
||||
|
|
@ -305,7 +305,7 @@ static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_c
|
|||
static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk, void *userdata) {
|
||||
pa_context *c = userdata;
|
||||
pa_stream *s;
|
||||
|
||||
|
||||
assert(p);
|
||||
assert(chunk);
|
||||
assert(chunk->memblock);
|
||||
|
|
@ -321,7 +321,7 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
|
|||
|
||||
pa_memblockq_seek(s->record_memblockq, offset, seek);
|
||||
pa_memblockq_push_align(s->record_memblockq, chunk);
|
||||
|
||||
|
||||
if (s->read_callback) {
|
||||
size_t l;
|
||||
|
||||
|
|
@ -339,11 +339,11 @@ int pa_context_handle_error(pa_context *c, uint32_t command, pa_tagstruct *t) {
|
|||
|
||||
if (command == PA_COMMAND_ERROR) {
|
||||
assert(t);
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &c->error) < 0) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
return -1;
|
||||
|
||||
|
||||
}
|
||||
} else if (command == PA_COMMAND_TIMEOUT)
|
||||
c->error = PA_ERR_TIMEOUT;
|
||||
|
|
@ -357,15 +357,15 @@ int pa_context_handle_error(pa_context *c, uint32_t command, pa_tagstruct *t) {
|
|||
|
||||
static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_context *c = userdata;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(c);
|
||||
assert(c->state == PA_CONTEXT_AUTHORIZING || c->state == PA_CONTEXT_SETTING_NAME);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
|
||||
|
||||
if (pa_context_handle_error(c, command, t) < 0)
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
|
||||
|
|
@ -398,7 +398,7 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
|
|||
* user. This is a security measure because otherwise
|
||||
* data private to the user might leak. */
|
||||
|
||||
#ifdef HAVE_CREDS
|
||||
#ifdef HAVE_CREDS
|
||||
const pa_creds *creds;
|
||||
if ((creds = pa_pdispatch_creds(pd)))
|
||||
if (getuid() == creds->uid)
|
||||
|
|
@ -418,7 +418,7 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
|
|||
case PA_CONTEXT_SETTING_NAME :
|
||||
pa_context_set_state(c, PA_CONTEXT_READY);
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
assert(0);
|
||||
}
|
||||
|
|
@ -430,12 +430,12 @@ finish:
|
|||
static void setup_context(pa_context *c, pa_iochannel *io) {
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(io);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
assert(!c->pstream);
|
||||
c->pstream = pa_pstream_new(c->mainloop, io, c->mempool);
|
||||
|
||||
|
|
@ -462,13 +462,13 @@ static void setup_context(pa_context *c, pa_iochannel *io) {
|
|||
|
||||
ucred.uid = getuid();
|
||||
ucred.gid = getgid();
|
||||
|
||||
|
||||
pa_pstream_send_tagstruct_with_creds(c->pstream, t, &ucred);
|
||||
}
|
||||
#else
|
||||
pa_pstream_send_tagstruct(c->pstream, t);
|
||||
#endif
|
||||
|
||||
|
||||
pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, setup_complete_callback, c, NULL);
|
||||
|
||||
pa_context_set_state(c, PA_CONTEXT_AUTHORIZING);
|
||||
|
|
@ -487,7 +487,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
pa_iochannel *io;
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0) {
|
||||
pa_log("socketpair(): %s", pa_cstrerror(errno));
|
||||
pa_context_fail(c, PA_ERR_INTERNAL);
|
||||
|
|
@ -495,7 +495,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
}
|
||||
|
||||
pa_fd_set_cloexec(fds[0], 1);
|
||||
|
||||
|
||||
pa_socket_low_delay(fds[0]);
|
||||
pa_socket_low_delay(fds[1]);
|
||||
|
||||
|
|
@ -508,7 +508,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
|
||||
if (c->spawn_api.postfork)
|
||||
c->spawn_api.postfork();
|
||||
|
||||
|
||||
goto fail;
|
||||
} else if (!pid) {
|
||||
/* Child */
|
||||
|
|
@ -521,17 +521,17 @@ static int context_connect_spawn(pa_context *c) {
|
|||
|
||||
/* Not required, since fds[0] has CLOEXEC enabled anyway */
|
||||
close(fds[0]);
|
||||
|
||||
|
||||
if (c->spawn_api.atfork)
|
||||
c->spawn_api.atfork();
|
||||
|
||||
/* Setup argv */
|
||||
|
||||
n = 0;
|
||||
|
||||
|
||||
argv[n++] = c->conf->daemon_binary;
|
||||
argv[n++] = "--daemonize=yes";
|
||||
|
||||
|
||||
snprintf(t, sizeof(t), "-Lmodule-native-protocol-fd fd=%i", fds[1]);
|
||||
argv[n++] = strdup(t);
|
||||
|
||||
|
|
@ -540,7 +540,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
|
||||
if (!(a = pa_split_spaces(c->conf->extra_arguments, &state)))
|
||||
break;
|
||||
|
||||
|
||||
argv[n++] = a;
|
||||
}
|
||||
|
||||
|
|
@ -549,7 +549,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
execv(argv[0], (char * const *) argv);
|
||||
_exit(1);
|
||||
#undef MAX_ARGS
|
||||
}
|
||||
}
|
||||
|
||||
/* Parent */
|
||||
|
||||
|
|
@ -557,7 +557,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
|
||||
if (c->spawn_api.postfork)
|
||||
c->spawn_api.postfork();
|
||||
|
||||
|
||||
if (r < 0) {
|
||||
pa_log("waitpid(): %s", pa_cstrerror(errno));
|
||||
pa_context_fail(c, PA_ERR_INTERNAL);
|
||||
|
|
@ -570,7 +570,7 @@ static int context_connect_spawn(pa_context *c) {
|
|||
close(fds[1]);
|
||||
|
||||
c->is_local = 1;
|
||||
|
||||
|
||||
io = pa_iochannel_new(c->mainloop, fds[0], fds[0]);
|
||||
|
||||
setup_context(c, io);
|
||||
|
|
@ -598,16 +598,16 @@ fail:
|
|||
static int try_next_connection(pa_context *c) {
|
||||
char *u = NULL;
|
||||
int r = -1;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(!c->client);
|
||||
|
||||
for (;;) {
|
||||
pa_xfree(u);
|
||||
u = NULL;
|
||||
|
||||
|
||||
c->server_list = pa_strlist_pop(c->server_list, &u);
|
||||
|
||||
|
||||
if (!u) {
|
||||
|
||||
#ifndef OS_IS_WIN32
|
||||
|
|
@ -616,19 +616,19 @@ static int try_next_connection(pa_context *c) {
|
|||
goto finish;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
pa_context_fail(c, PA_ERR_CONNECTIONREFUSED);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
pa_log_debug("Trying to connect to %s...", u);
|
||||
|
||||
pa_log_debug("Trying to connect to %s...", u);
|
||||
|
||||
pa_xfree(c->server);
|
||||
c->server = pa_xstrdup(u);
|
||||
|
||||
if (!(c->client = pa_socket_client_new_string(c->mainloop, u, PA_NATIVE_DEFAULT_PORT)))
|
||||
continue;
|
||||
|
||||
|
||||
c->is_local = pa_socket_client_is_local(c->client);
|
||||
pa_socket_client_set_callback(c->client, on_connection, c);
|
||||
break;
|
||||
|
|
@ -638,13 +638,13 @@ static int try_next_connection(pa_context *c) {
|
|||
|
||||
finish:
|
||||
pa_xfree(u);
|
||||
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void on_connection(pa_socket_client *client, pa_iochannel*io, void *userdata) {
|
||||
pa_context *c = userdata;
|
||||
|
||||
|
||||
assert(client);
|
||||
assert(c);
|
||||
assert(c->state == PA_CONTEXT_CONNECTING);
|
||||
|
|
@ -677,9 +677,9 @@ int pa_context_connect(
|
|||
const char *server,
|
||||
pa_context_flags_t flags,
|
||||
const pa_spawn_api *api) {
|
||||
|
||||
|
||||
int r = -1;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
|
@ -693,7 +693,7 @@ int pa_context_connect(
|
|||
pa_context_ref(c);
|
||||
|
||||
assert(!c->server_list);
|
||||
|
||||
|
||||
if (server) {
|
||||
if (!(c->server_list = pa_strlist_parse(server))) {
|
||||
pa_context_fail(c, PA_ERR_INVALIDSERVER);
|
||||
|
|
@ -704,7 +704,7 @@ int pa_context_connect(
|
|||
char ufn[PATH_MAX];
|
||||
|
||||
/* Prepend in reverse order */
|
||||
|
||||
|
||||
if ((d = getenv("DISPLAY"))) {
|
||||
char *e;
|
||||
d = pa_xstrdup(d);
|
||||
|
|
@ -716,7 +716,7 @@ int pa_context_connect(
|
|||
|
||||
pa_xfree(d);
|
||||
}
|
||||
|
||||
|
||||
c->server_list = pa_strlist_prepend(c->server_list, "tcp6:localhost");
|
||||
c->server_list = pa_strlist_prepend(c->server_list, "tcp4:localhost");
|
||||
|
||||
|
|
@ -744,38 +744,38 @@ int pa_context_connect(
|
|||
|
||||
pa_context_set_state(c, PA_CONTEXT_CONNECTING);
|
||||
r = try_next_connection(c);
|
||||
|
||||
|
||||
finish:
|
||||
pa_context_unref(c);
|
||||
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void pa_context_disconnect(pa_context *c) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
pa_context_set_state(c, PA_CONTEXT_TERMINATED);
|
||||
}
|
||||
|
||||
pa_context_state_t pa_context_get_state(pa_context *c) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
return c->state;
|
||||
}
|
||||
|
||||
int pa_context_errno(pa_context *c) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
return c->error;
|
||||
}
|
||||
|
||||
void pa_context_set_state_callback(pa_context *c, pa_context_notify_cb_t cb, void *userdata) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
c->state_callback = cb;
|
||||
c->state_userdata = userdata;
|
||||
}
|
||||
|
|
@ -807,7 +807,7 @@ static void pstream_drain_callback(PA_GCC_UNUSED pa_pstream *s, void *userdata)
|
|||
|
||||
static void set_dispatch_callbacks(pa_operation *o) {
|
||||
int done = 1;
|
||||
|
||||
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
assert(o->context);
|
||||
|
|
@ -816,7 +816,7 @@ static void set_dispatch_callbacks(pa_operation *o) {
|
|||
|
||||
pa_pstream_set_drain_callback(o->context->pstream, NULL, NULL);
|
||||
pa_pdispatch_set_drain_callback(o->context->pdispatch, NULL, NULL);
|
||||
|
||||
|
||||
if (pa_pdispatch_is_pending(o->context->pdispatch)) {
|
||||
pa_pdispatch_set_drain_callback(o->context->pdispatch, pdispatch_drain_callback, o);
|
||||
done = 0;
|
||||
|
|
@ -832,7 +832,7 @@ static void set_dispatch_callbacks(pa_operation *o) {
|
|||
pa_context_notify_cb_t cb = (pa_context_notify_cb_t) o->callback;
|
||||
cb(o->context, o->userdata);
|
||||
}
|
||||
|
||||
|
||||
pa_operation_done(o);
|
||||
pa_operation_unref(o);
|
||||
}
|
||||
|
|
@ -840,13 +840,13 @@ static void set_dispatch_callbacks(pa_operation *o) {
|
|||
|
||||
pa_operation* pa_context_drain(pa_context *c, pa_context_notify_cb_t cb, void *userdata) {
|
||||
pa_operation *o;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, pa_context_is_pending(c), PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
set_dispatch_callbacks(pa_operation_ref(o));
|
||||
|
||||
|
|
@ -856,7 +856,7 @@ pa_operation* pa_context_drain(pa_context *c, pa_context_notify_cb_t cb, void *u
|
|||
void pa_context_simple_ack_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_operation *o = userdata;
|
||||
int success = 1;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
|
@ -907,12 +907,12 @@ pa_operation* pa_context_send_simple_command(pa_context *c, uint32_t command, pa
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, command, &tag);
|
||||
|
|
@ -926,7 +926,7 @@ pa_operation* pa_context_set_default_sink(pa_context *c, const char *name, pa_co
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
|
@ -951,7 +951,7 @@ pa_operation* pa_context_set_default_source(pa_context *c, const char *name, pa_
|
|||
assert(c->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_DEFAULT_SOURCE, &tag);
|
||||
|
|
@ -964,7 +964,7 @@ pa_operation* pa_context_set_default_source(pa_context *c, const char *name, pa_
|
|||
|
||||
int pa_context_is_local(pa_context *c) {
|
||||
assert(c);
|
||||
|
||||
|
||||
return c->is_local;
|
||||
}
|
||||
|
||||
|
|
@ -978,7 +978,7 @@ pa_operation* pa_context_set_name(pa_context *c, const char *name, pa_context_su
|
|||
assert(name);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_CLIENT_NAME, &tag);
|
||||
|
|
@ -999,12 +999,12 @@ const char* pa_context_get_server(pa_context *c) {
|
|||
|
||||
if (!c->server)
|
||||
return NULL;
|
||||
|
||||
|
||||
if (*c->server == '{') {
|
||||
char *e = strchr(c->server+1, '}');
|
||||
return e ? e+1 : c->server;
|
||||
}
|
||||
|
||||
|
||||
return c->server;
|
||||
}
|
||||
|
||||
|
|
@ -1024,7 +1024,7 @@ pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *ta
|
|||
|
||||
assert(c);
|
||||
assert(tag);
|
||||
|
||||
|
||||
t = pa_tagstruct_new(NULL, 0);
|
||||
pa_tagstruct_putu32(t, command);
|
||||
pa_tagstruct_putu32(t, *tag = c->ctag++);
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -50,7 +50,7 @@
|
|||
* The abstraction is represented as a number of function pointers in the
|
||||
* pa_mainloop_api structure.
|
||||
*
|
||||
* To actually be able to use these functions, an implementation needs to
|
||||
* To actually be able to use these functions, an implementation needs to
|
||||
* be coupled to the abstraction. There are three of these shipped with
|
||||
* PulseAudio, but any other can be used with a minimal ammount of work,
|
||||
* provided it supports the three basic events listed above.
|
||||
|
|
@ -76,7 +76,7 @@
|
|||
* and decrease their reference counts. Whenever an object's reference
|
||||
* count reaches zero, that object gets destroy and any resources it uses
|
||||
* get freed.
|
||||
*
|
||||
*
|
||||
* The benefit of this design is that an application need not worry about
|
||||
* whether or not it needs to keep an object around in case the library is
|
||||
* using it internally. If it is, then it has made sure it has its own
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
@ -69,7 +69,7 @@ typedef enum pa_context_flags {
|
|||
PA_CONTEXT_NOAUTOSPAWN = 1 /**< Disabled autospawning of the PulseAudio daemon if required */
|
||||
} pa_context_flags_t;
|
||||
|
||||
/** The direction of a pa_stream object */
|
||||
/** The direction of a pa_stream object */
|
||||
typedef enum pa_stream_direction {
|
||||
PA_STREAM_NODIRECTION, /**< Invalid direction */
|
||||
PA_STREAM_PLAYBACK, /**< Playback stream */
|
||||
|
|
@ -149,7 +149,7 @@ enum {
|
|||
PA_ERR_EXIST, /**< Entity exists */
|
||||
PA_ERR_NOENTITY, /**< No such entity */
|
||||
PA_ERR_CONNECTIONREFUSED, /**< Connection refused */
|
||||
PA_ERR_PROTOCOL, /**< Protocol error */
|
||||
PA_ERR_PROTOCOL, /**< Protocol error */
|
||||
PA_ERR_TIMEOUT, /**< Timeout */
|
||||
PA_ERR_AUTHKEY, /**< No authorization key */
|
||||
PA_ERR_INTERNAL, /**< Internal error */
|
||||
|
|
@ -207,7 +207,7 @@ typedef enum pa_subscription_event_type {
|
|||
* total output latency a sample that is written with
|
||||
* pa_stream_write() takes to be played may be estimated by
|
||||
* sink_usec+buffer_usec+transport_usec. (where buffer_usec is defined
|
||||
* as pa_bytes_to_usec(write_index-read_index)) The output buffer
|
||||
* as pa_bytes_to_usec(write_index-read_index)) The output buffer
|
||||
* which buffer_usec relates to may be manipulated freely (with
|
||||
* pa_stream_write()'s seek argument, pa_stream_flush() and friends),
|
||||
* the buffers sink_usec and source_usec relate to are first-in
|
||||
|
|
@ -256,7 +256,7 @@ typedef struct pa_timing_info {
|
|||
* flush request that corrupted it has
|
||||
* been issued in the time since this
|
||||
* latency info was current. \since 0.8 */
|
||||
|
||||
|
||||
int64_t read_index; /**< Current read index into the
|
||||
* playback buffer in bytes. Think twice before
|
||||
* using this for seeking purposes: it
|
||||
|
|
@ -288,7 +288,7 @@ typedef struct pa_spawn_api {
|
|||
/** Seek type for pa_stream_write(). \since 0.8*/
|
||||
typedef enum pa_seek_mode {
|
||||
PA_SEEK_RELATIVE = 0, /**< Seek relatively to the write index */
|
||||
PA_SEEK_ABSOLUTE = 1, /**< Seek relatively to the start of the buffer queue */
|
||||
PA_SEEK_ABSOLUTE = 1, /**< Seek relatively to the start of the buffer queue */
|
||||
PA_SEEK_RELATIVE_ON_READ = 2, /**< Seek relatively to the read index. */
|
||||
PA_SEEK_RELATIVE_END = 3 /**< Seek relatively to the current end of the buffer queue. */
|
||||
} pa_seek_mode_t;
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -69,7 +69,7 @@ struct pa_defer_event {
|
|||
int dead;
|
||||
|
||||
int enabled;
|
||||
|
||||
|
||||
pa_defer_event_cb_t callback;
|
||||
void *userdata;
|
||||
pa_defer_event_destroy_cb_t destroy_callback;
|
||||
|
|
@ -79,7 +79,7 @@ struct pa_defer_event {
|
|||
|
||||
struct pa_glib_mainloop {
|
||||
GSource source;
|
||||
|
||||
|
||||
pa_mainloop_api api;
|
||||
GMainContext *context;
|
||||
|
||||
|
|
@ -102,7 +102,7 @@ static void cleanup_io_events(pa_glib_mainloop *g, int force) {
|
|||
|
||||
if (!force && g->io_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_io_event, g->io_events, e);
|
||||
|
||||
|
|
@ -110,13 +110,13 @@ static void cleanup_io_events(pa_glib_mainloop *g, int force) {
|
|||
g_assert(g->io_events_please_scan > 0);
|
||||
g->io_events_please_scan--;
|
||||
}
|
||||
|
||||
|
||||
if (e->poll_fd_added)
|
||||
g_source_remove_poll(&g->source, &e->poll_fd);
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&g->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
@ -135,7 +135,7 @@ static void cleanup_time_events(pa_glib_mainloop *g, int force) {
|
|||
|
||||
if (!force && g->time_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_time_event, g->time_events, e);
|
||||
|
||||
|
|
@ -148,10 +148,10 @@ static void cleanup_time_events(pa_glib_mainloop *g, int force) {
|
|||
g_assert(g->n_enabled_time_events > 0);
|
||||
g->n_enabled_time_events--;
|
||||
}
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&g->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
@ -170,7 +170,7 @@ static void cleanup_defer_events(pa_glib_mainloop *g, int force) {
|
|||
|
||||
if (!force && g->defer_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_defer_event, g->defer_events, e);
|
||||
|
||||
|
|
@ -183,10 +183,10 @@ static void cleanup_defer_events(pa_glib_mainloop *g, int force) {
|
|||
g_assert(g->n_enabled_defer_events > 0);
|
||||
g->n_enabled_defer_events--;
|
||||
}
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&g->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
@ -218,7 +218,7 @@ static pa_io_event* glib_io_new(
|
|||
pa_io_event_flags_t f,
|
||||
pa_io_event_cb_t cb,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_io_event *e;
|
||||
pa_glib_mainloop *g;
|
||||
|
||||
|
|
@ -226,7 +226,7 @@ static pa_io_event* glib_io_new(
|
|||
g_assert(m->userdata);
|
||||
g_assert(fd >= 0);
|
||||
g_assert(cb);
|
||||
|
||||
|
||||
g = m->userdata;
|
||||
|
||||
e = pa_xnew(pa_io_event, 1);
|
||||
|
|
@ -236,7 +236,7 @@ static pa_io_event* glib_io_new(
|
|||
e->poll_fd.fd = fd;
|
||||
e->poll_fd.events = map_flags_to_glib(f);
|
||||
e->poll_fd.revents = 0;
|
||||
|
||||
|
||||
e->callback = cb;
|
||||
e->userdata = userdata;
|
||||
e->destroy_callback = NULL;
|
||||
|
|
@ -245,7 +245,7 @@ static pa_io_event* glib_io_new(
|
|||
|
||||
g_source_add_poll(&g->source, &e->poll_fd);
|
||||
e->poll_fd_added = 1;
|
||||
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
|
|
@ -272,7 +272,7 @@ static void glib_io_free(pa_io_event*e) {
|
|||
static void glib_io_set_destroy(pa_io_event*e, pa_io_event_destroy_cb_t cb) {
|
||||
g_assert(e);
|
||||
g_assert(!e->dead);
|
||||
|
||||
|
||||
e->destroy_callback = cb;
|
||||
}
|
||||
|
||||
|
|
@ -283,14 +283,14 @@ static pa_time_event* glib_time_new(
|
|||
const struct timeval *tv,
|
||||
pa_time_event_cb_t cb,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_glib_mainloop *g;
|
||||
pa_time_event *e;
|
||||
|
||||
|
||||
g_assert(m);
|
||||
g_assert(m->userdata);
|
||||
g_assert(cb);
|
||||
|
||||
|
||||
g = m->userdata;
|
||||
|
||||
e = pa_xnew(pa_time_event, 1);
|
||||
|
|
@ -308,13 +308,13 @@ static pa_time_event* glib_time_new(
|
|||
g->cached_next_time_event = e;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
e->callback = cb;
|
||||
e->userdata = userdata;
|
||||
e->destroy_callback = NULL;
|
||||
|
||||
PA_LLIST_PREPEND(pa_time_event, g->time_events, e);
|
||||
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
|
|
@ -328,12 +328,12 @@ static void glib_time_restart(pa_time_event*e, const struct timeval *tv) {
|
|||
} else if (!e->enabled && tv)
|
||||
e->mainloop->n_enabled_time_events++;
|
||||
|
||||
if ((e->enabled = !!tv))
|
||||
if ((e->enabled = !!tv))
|
||||
e->timeval = *tv;
|
||||
|
||||
if (e->mainloop->cached_next_time_event && e->enabled) {
|
||||
g_assert(e->mainloop->cached_next_time_event->enabled);
|
||||
|
||||
|
||||
if (pa_timeval_cmp(tv, &e->mainloop->cached_next_time_event->timeval) < 0)
|
||||
e->mainloop->cached_next_time_event = e;
|
||||
} else if (e->mainloop->cached_next_time_event == e)
|
||||
|
|
@ -357,7 +357,7 @@ static void glib_time_free(pa_time_event *e) {
|
|||
static void glib_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb_t cb) {
|
||||
g_assert(e);
|
||||
g_assert(!e->dead);
|
||||
|
||||
|
||||
e->destroy_callback = cb;
|
||||
}
|
||||
|
||||
|
|
@ -367,27 +367,27 @@ static pa_defer_event* glib_defer_new(
|
|||
pa_mainloop_api*m,
|
||||
pa_defer_event_cb_t cb,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_defer_event *e;
|
||||
pa_glib_mainloop *g;
|
||||
|
||||
g_assert(m);
|
||||
g_assert(m->userdata);
|
||||
g_assert(cb);
|
||||
|
||||
|
||||
g = m->userdata;
|
||||
|
||||
|
||||
e = pa_xnew(pa_defer_event, 1);
|
||||
e->mainloop = g;
|
||||
e->dead = 0;
|
||||
|
||||
e->enabled = 1;
|
||||
g->n_enabled_defer_events++;
|
||||
|
||||
|
||||
e->callback = cb;
|
||||
e->userdata = userdata;
|
||||
e->destroy_callback = NULL;
|
||||
|
||||
|
||||
PA_LLIST_PREPEND(pa_defer_event, g->defer_events, e);
|
||||
return e;
|
||||
}
|
||||
|
|
@ -430,7 +430,7 @@ static void glib_defer_set_destroy(pa_defer_event *e, pa_defer_event_destroy_cb_
|
|||
static void glib_quit(pa_mainloop_api*a, PA_GCC_UNUSED int retval) {
|
||||
|
||||
g_warning("quit() ignored");
|
||||
|
||||
|
||||
/* NOOP */
|
||||
}
|
||||
|
||||
|
|
@ -440,7 +440,7 @@ static pa_time_event* find_next_time_event(pa_glib_mainloop *g) {
|
|||
|
||||
if (g->cached_next_time_event)
|
||||
return g->cached_next_time_event;
|
||||
|
||||
|
||||
for (t = g->time_events; t; t = t->next) {
|
||||
|
||||
if (t->dead || !t->enabled)
|
||||
|
|
@ -461,7 +461,7 @@ static pa_time_event* find_next_time_event(pa_glib_mainloop *g) {
|
|||
|
||||
static void scan_dead(pa_glib_mainloop *g) {
|
||||
g_assert(g);
|
||||
|
||||
|
||||
if (g->io_events_please_scan)
|
||||
cleanup_io_events(g, 0);
|
||||
|
||||
|
|
@ -499,7 +499,7 @@ static gboolean prepare_func(GSource *source, gint *timeout) {
|
|||
if (pa_timeval_cmp(&t->timeval, &tvnow) <= 0) {
|
||||
*timeout = 0;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
usec = pa_timeval_diff(&t->timeval, &tvnow);
|
||||
*timeout = (gint) (usec / 1000);
|
||||
} else
|
||||
|
|
@ -519,10 +519,10 @@ static gboolean check_func(GSource *source) {
|
|||
pa_time_event *t;
|
||||
GTimeVal now;
|
||||
struct timeval tvnow;
|
||||
|
||||
|
||||
t = find_next_time_event(g);
|
||||
g_assert(t);
|
||||
|
||||
|
||||
g_source_get_current_time(source, &now);
|
||||
tvnow.tv_sec = now.tv_sec;
|
||||
tvnow.tv_usec = now.tv_usec;
|
||||
|
|
@ -555,7 +555,7 @@ static gboolean dispatch_func(GSource *source, PA_GCC_UNUSED GSourceFunc callbac
|
|||
}
|
||||
|
||||
g_assert(d);
|
||||
|
||||
|
||||
d->callback(&g->api, d, d->userdata);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -567,7 +567,7 @@ static gboolean dispatch_func(GSource *source, PA_GCC_UNUSED GSourceFunc callbac
|
|||
|
||||
t = find_next_time_event(g);
|
||||
g_assert(t);
|
||||
|
||||
|
||||
g_source_get_current_time(source, &now);
|
||||
tvnow.tv_sec = now.tv_sec;
|
||||
tvnow.tv_usec = now.tv_usec;
|
||||
|
|
@ -576,7 +576,7 @@ static gboolean dispatch_func(GSource *source, PA_GCC_UNUSED GSourceFunc callbac
|
|||
|
||||
/* Disable time event */
|
||||
glib_time_restart(t, NULL);
|
||||
|
||||
|
||||
t->callback(&g->api, t, &t->timeval, t->userdata);
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -604,12 +604,12 @@ static const pa_mainloop_api vtable = {
|
|||
.time_restart = glib_time_restart,
|
||||
.time_free = glib_time_free,
|
||||
.time_set_destroy = glib_time_set_destroy,
|
||||
|
||||
|
||||
.defer_new = glib_defer_new,
|
||||
.defer_enable = glib_defer_enable,
|
||||
.defer_free = glib_defer_free,
|
||||
.defer_set_destroy = glib_defer_set_destroy,
|
||||
|
||||
|
||||
.quit = glib_quit,
|
||||
};
|
||||
|
||||
|
|
@ -624,10 +624,10 @@ pa_glib_mainloop *pa_glib_mainloop_new(GMainContext *c) {
|
|||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
g = (pa_glib_mainloop*) g_source_new(&source_funcs, sizeof(pa_glib_mainloop));
|
||||
g_main_context_ref(g->context = c ? c : g_main_context_default());
|
||||
|
||||
|
||||
g->api = vtable;
|
||||
g->api.userdata = g;
|
||||
|
||||
|
|
@ -639,10 +639,10 @@ pa_glib_mainloop *pa_glib_mainloop_new(GMainContext *c) {
|
|||
g->io_events_please_scan = g->time_events_please_scan = g->defer_events_please_scan = 0;
|
||||
|
||||
g->cached_next_time_event = NULL;
|
||||
|
||||
|
||||
g_source_attach(&g->source, g->context);
|
||||
g_source_set_can_recurse(&g->source, FALSE);
|
||||
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
|
|
@ -660,6 +660,6 @@ void pa_glib_mainloop_free(pa_glib_mainloop* g) {
|
|||
|
||||
pa_mainloop_api* pa_glib_mainloop_get_api(pa_glib_mainloop *g) {
|
||||
g_assert(g);
|
||||
|
||||
|
||||
return &g->api;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -45,7 +45,7 @@
|
|||
|
||||
struct pa_context {
|
||||
int ref;
|
||||
|
||||
|
||||
char *name;
|
||||
pa_mainloop_api* mainloop;
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ struct pa_context {
|
|||
int do_autospawn;
|
||||
int autospawn_lock_fd;
|
||||
pa_spawn_api spawn_api;
|
||||
|
||||
|
||||
pa_strlist *server_list;
|
||||
|
||||
char *server;
|
||||
|
|
@ -109,7 +109,7 @@ struct pa_stream {
|
|||
uint32_t device_index;
|
||||
pa_stream_direction_t direction;
|
||||
pa_stream_state_t state;
|
||||
|
||||
|
||||
uint32_t requested_bytes;
|
||||
|
||||
pa_memchunk peek_memchunk;
|
||||
|
|
@ -120,10 +120,10 @@ struct pa_stream {
|
|||
/* Store latest latency info */
|
||||
pa_timing_info timing_info;
|
||||
int timing_info_valid;
|
||||
|
||||
|
||||
/* Use to make sure that time advances monotonically */
|
||||
pa_usec_t previous_time;
|
||||
|
||||
|
||||
/* time updates with tags older than these are invalid */
|
||||
uint32_t write_index_not_before;
|
||||
uint32_t read_index_not_before;
|
||||
|
|
@ -135,7 +135,7 @@ struct pa_stream {
|
|||
/* Latency interpolation stuff */
|
||||
pa_time_event *auto_timing_update_event;
|
||||
int auto_timing_update_requested;
|
||||
|
||||
|
||||
pa_usec_t cached_time;
|
||||
int cached_time_valid;
|
||||
|
||||
|
|
@ -160,7 +160,7 @@ struct pa_operation {
|
|||
int ref;
|
||||
pa_context *context;
|
||||
pa_stream *stream;
|
||||
|
||||
|
||||
PA_LLIST_FIELDS(pa_operation);
|
||||
|
||||
pa_operation_state_t state;
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -39,7 +39,7 @@
|
|||
static void context_stat_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_operation *o = userdata;
|
||||
pa_stat_info i, *p = &i;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
|
@ -81,11 +81,11 @@ pa_operation* pa_context_stat(pa_context *c, pa_stat_info_cb_t cb, void *userdat
|
|||
static void context_get_server_info_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_operation *o = userdata;
|
||||
pa_server_info i, *p = &i;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ static void context_get_server_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_server_info_cb_t cb = (pa_server_info_cb_t) o->callback;
|
||||
cb(o->context, p, o->userdata);
|
||||
|
|
@ -127,14 +127,14 @@ pa_operation* pa_context_get_server_info(pa_context *c, pa_server_info_cb_t cb,
|
|||
static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_operation *o = userdata;
|
||||
int eol = 1;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
|
@ -142,10 +142,10 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, P
|
|||
eol = -1;
|
||||
} else {
|
||||
uint32_t flags;
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_sink_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.description) < 0 ||
|
||||
|
|
@ -159,7 +159,7 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, P
|
|||
pa_tagstruct_get_usec(t, &i.latency) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.driver) < 0 ||
|
||||
pa_tagstruct_getu32(t, &flags) < 0) {
|
||||
|
||||
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -172,7 +172,7 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, P
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_sink_info_cb_t cb = (pa_sink_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -191,7 +191,7 @@ pa_operation* pa_context_get_sink_info_by_index(pa_context *c, uint32_t idx, pa_
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
assert(cb);
|
||||
|
|
@ -213,7 +213,7 @@ pa_operation* pa_context_get_sink_info_by_name(pa_context *c, const char *name,
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
assert(cb);
|
||||
|
|
@ -251,11 +251,11 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_source_info i;
|
||||
uint32_t flags;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.description) < 0 ||
|
||||
|
|
@ -269,7 +269,7 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
pa_tagstruct_get_usec(t, &i.latency) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.driver) < 0 ||
|
||||
pa_tagstruct_getu32(t, &flags) < 0) {
|
||||
|
||||
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -282,7 +282,7 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_source_info_cb_t cb = (pa_source_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -309,7 +309,7 @@ pa_operation* pa_context_get_source_info_by_index(pa_context *c, uint32_t idx, p
|
|||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_GET_SOURCE_INFO, &tag);
|
||||
pa_tagstruct_putu32(t, idx);
|
||||
pa_tagstruct_puts(t, NULL);
|
||||
|
|
@ -361,10 +361,10 @@ static void context_get_client_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_client_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
|
||||
|
|
@ -379,7 +379,7 @@ static void context_get_client_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_client_info_cb_t cb = (pa_client_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -428,17 +428,17 @@ static void context_get_module_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_module_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.argument) < 0 ||
|
||||
|
|
@ -454,7 +454,7 @@ static void context_get_module_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_module_info_cb_t cb = (pa_module_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -476,7 +476,7 @@ pa_operation* pa_context_get_module_info(pa_context *c, uint32_t idx, pa_module_
|
|||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_GET_MODULE_INFO, &tag);
|
||||
|
|
@ -503,17 +503,17 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
|
|||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_sink_input_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
|
||||
|
|
@ -526,7 +526,7 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
|
|||
pa_tagstruct_get_usec(t, &i.sink_usec) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.resample_method) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.driver) < 0) {
|
||||
|
||||
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -537,7 +537,7 @@ static void context_get_sink_input_info_callback(pa_pdispatch *pd, uint32_t comm
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_sink_input_info_cb_t cb = (pa_sink_input_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -559,7 +559,7 @@ pa_operation* pa_context_get_sink_input_info(pa_context *c, uint32_t idx, pa_sin
|
|||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_GET_SINK_INPUT_INFO, &tag);
|
||||
|
|
@ -593,10 +593,10 @@ static void context_get_source_output_info_callback(pa_pdispatch *pd, uint32_t c
|
|||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_source_output_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_getu32(t, &i.owner_module) < 0 ||
|
||||
|
|
@ -608,7 +608,7 @@ static void context_get_source_output_info_callback(pa_pdispatch *pd, uint32_t c
|
|||
pa_tagstruct_get_usec(t, &i.source_usec) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.resample_method) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.driver) < 0) {
|
||||
|
||||
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -619,7 +619,7 @@ static void context_get_source_output_info_callback(pa_pdispatch *pd, uint32_t c
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_source_output_info_cb_t cb = (pa_source_output_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -641,7 +641,7 @@ pa_operation* pa_context_get_source_output_info(pa_context *c, uint32_t idx, pa_
|
|||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_GET_SOURCE_OUTPUT_INFO, &tag);
|
||||
|
|
@ -695,7 +695,7 @@ pa_operation* pa_context_set_sink_volume_by_name(pa_context *c, const char *name
|
|||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_VOLUME, &tag);
|
||||
|
|
@ -741,7 +741,7 @@ pa_operation* pa_context_set_sink_mute_by_name(pa_context *c, const char *name,
|
|||
|
||||
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);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_MUTE, &tag);
|
||||
|
|
@ -766,7 +766,7 @@ pa_operation* pa_context_set_sink_input_volume(pa_context *c, uint32_t idx, cons
|
|||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, idx != PA_INVALID_INDEX, PA_ERR_INVALID);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_SINK_INPUT_VOLUME, &tag);
|
||||
|
|
@ -815,7 +815,7 @@ pa_operation* pa_context_set_source_volume_by_name(pa_context *c, const char *na
|
|||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, pa_cvolume_valid(volume), PA_ERR_INVALID);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, !name || *name, PA_ERR_INVALID);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_VOLUME, &tag);
|
||||
|
|
@ -861,7 +861,7 @@ pa_operation* pa_context_set_source_mute_by_name(pa_context *c, const char *name
|
|||
|
||||
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);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SET_SOURCE_MUTE, &tag);
|
||||
|
|
@ -886,17 +886,17 @@ static void context_get_sample_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_sample_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_get_cvolume(t, &i.volume) < 0 ||
|
||||
|
|
@ -906,7 +906,7 @@ static void context_get_sample_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
pa_tagstruct_getu32(t, &i.bytes) < 0 ||
|
||||
pa_tagstruct_get_boolean(t, &i.lazy) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.filename) < 0) {
|
||||
|
||||
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -917,7 +917,7 @@ static void context_get_sample_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_sample_info_cb_t cb = (pa_sample_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -932,7 +932,7 @@ pa_operation* pa_context_get_sample_info_by_name(pa_context *c, const char *name
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
assert(cb);
|
||||
|
|
@ -1002,7 +1002,7 @@ static pa_operation* command_kill(pa_context *c, uint32_t command, uint32_t idx,
|
|||
pa_operation* pa_context_kill_client(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
|
||||
return command_kill(c, PA_COMMAND_KILL_CLIENT, idx, cb, userdata);
|
||||
}
|
||||
|
||||
|
||||
pa_operation* pa_context_kill_sink_input(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata) {
|
||||
return command_kill(c, PA_COMMAND_KILL_SINK_INPUT, idx, cb, userdata);
|
||||
}
|
||||
|
|
@ -1021,7 +1021,7 @@ static void context_index_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UN
|
|||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
|
@ -1048,7 +1048,7 @@ pa_operation* pa_context_load_module(pa_context *c, const char*name, const char
|
|||
pa_operation *o;
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
|
@ -1089,10 +1089,10 @@ static void context_get_autoload_info_callback(pa_pdispatch *pd, uint32_t comman
|
|||
|
||||
eol = -1;
|
||||
} else {
|
||||
|
||||
|
||||
while (!pa_tagstruct_eof(t)) {
|
||||
pa_autoload_info i;
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &i.index) < 0 ||
|
||||
pa_tagstruct_gets(t, &i.name) < 0 ||
|
||||
pa_tagstruct_getu32(t, &i.type) < 0 ||
|
||||
|
|
@ -1108,7 +1108,7 @@ static void context_get_autoload_info_callback(pa_pdispatch *pd, uint32_t comman
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (o->callback) {
|
||||
pa_autoload_info_cb_t cb = (pa_autoload_info_cb_t) o->callback;
|
||||
cb(o->context, NULL, eol, o->userdata);
|
||||
|
|
@ -1147,7 +1147,7 @@ pa_operation* pa_context_get_autoload_info_by_index(pa_context *c, uint32_t idx,
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
assert(cb);
|
||||
|
|
@ -1176,7 +1176,7 @@ pa_operation* pa_context_add_autoload(pa_context *c, const char *name, pa_autolo
|
|||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
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, type == PA_AUTOLOAD_SINK || type == PA_AUTOLOAD_SOURCE, PA_ERR_INVALID);
|
||||
|
|
@ -1202,7 +1202,7 @@ pa_operation* pa_context_remove_autoload_by_name(pa_context *c, const char *name
|
|||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
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, type == PA_AUTOLOAD_SINK || type == PA_AUTOLOAD_SOURCE, PA_ERR_INVALID);
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -206,7 +206,7 @@ PA_C_DECL_BEGIN
|
|||
/** Stores information about sinks */
|
||||
typedef struct pa_sink_info {
|
||||
const char *name; /**< Name of the sink */
|
||||
uint32_t index; /**< Index of the sink */
|
||||
uint32_t index; /**< Index of the sink */
|
||||
const char *description; /**< Description of this sink */
|
||||
pa_sample_spec sample_spec; /**< Sample spec of this sink */
|
||||
pa_channel_map channel_map; /**< Channel map \since 0.8 */
|
||||
|
|
@ -233,7 +233,7 @@ pa_operation* pa_context_get_sink_info_by_index(pa_context *c, uint32_t id, pa_s
|
|||
pa_operation* pa_context_get_sink_info_list(pa_context *c, pa_sink_info_cb_t cb, void *userdata);
|
||||
|
||||
/** Stores information about sources */
|
||||
typedef struct pa_source_info {
|
||||
typedef struct pa_source_info {
|
||||
const char *name ; /**< Name of the source */
|
||||
uint32_t index; /**< Index of the source */
|
||||
const char *description; /**< Description of this source */
|
||||
|
|
@ -316,7 +316,7 @@ pa_operation* pa_context_get_client_info_list(pa_context *c, pa_client_info_cb_t
|
|||
|
||||
/** Stores information about sink inputs */
|
||||
typedef struct pa_sink_input_info {
|
||||
uint32_t index; /**< Index of the sink input */
|
||||
uint32_t index; /**< Index of the sink input */
|
||||
const char *name; /**< Name of the sink input */
|
||||
uint32_t owner_module; /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module */
|
||||
uint32_t client; /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client */
|
||||
|
|
@ -341,11 +341,11 @@ pa_operation* pa_context_get_sink_input_info_list(pa_context *c, pa_sink_input_i
|
|||
|
||||
/** Stores information about source outputs */
|
||||
typedef struct pa_source_output_info {
|
||||
uint32_t index; /**< Index of the sink input */
|
||||
uint32_t index; /**< Index of the sink input */
|
||||
const char *name; /**< Name of the sink input */
|
||||
uint32_t owner_module; /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module */
|
||||
uint32_t client; /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client */
|
||||
uint32_t source; /**< Index of the connected source */
|
||||
uint32_t owner_module; /**< Index of the module this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any module */
|
||||
uint32_t client; /**< Index of the client this sink input belongs to, or PA_INVALID_INDEX when it does not belong to any client */
|
||||
uint32_t source; /**< Index of the connected source */
|
||||
pa_sample_spec sample_spec; /**< The sample specification of the source output */
|
||||
pa_channel_map channel_map; /**< Channel map */
|
||||
pa_usec_t buffer_usec; /**< Latency due to buffering in the source output, see pa_latency_info for details. \since 0.5 */
|
||||
|
|
@ -396,7 +396,7 @@ typedef struct pa_stat_info {
|
|||
uint32_t memblock_total_size; /**< Currentl total size of allocated memory blocks */
|
||||
uint32_t memblock_allocated; /**< Allocated memory blocks during the whole lifetime of the daemon */
|
||||
uint32_t memblock_allocated_size; /**< Total size of all memory blocks allocated during the whole lifetime of the daemon */
|
||||
uint32_t scache_size; /**< Total size of all sample cache entries. \since 0.4 */
|
||||
uint32_t scache_size; /**< Total size of all sample cache entries. \since 0.4 */
|
||||
} pa_stat_info;
|
||||
|
||||
/** Callback prototype for pa_context_stat() */
|
||||
|
|
@ -432,7 +432,7 @@ pa_operation* pa_context_get_sample_info_list(pa_context *c, pa_sample_info_cb_t
|
|||
|
||||
/** Kill a client. \since 0.5 */
|
||||
pa_operation* pa_context_kill_client(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
|
||||
|
||||
|
||||
/** Kill a sink input. \since 0.5 */
|
||||
pa_operation* pa_context_kill_sink_input(pa_context *c, uint32_t idx, pa_context_success_cb_t cb, void *userdata);
|
||||
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
@ -28,7 +28,7 @@
|
|||
#include <pulse/cdecl.h>
|
||||
|
||||
/** \file
|
||||
*
|
||||
*
|
||||
* Main loop abstraction layer. Both the PulseAudio core and the
|
||||
* PulseAudio client library use a main loop abstraction layer. Due to
|
||||
* this it is possible to embed PulseAudio into other
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -73,7 +73,7 @@ static void signal_handler(int sig) {
|
|||
static void dispatch(pa_mainloop_api*a, int sig) {
|
||||
pa_signal_event*s;
|
||||
|
||||
for (s = signals; s; s = s->next)
|
||||
for (s = signals; s; s = s->next)
|
||||
if (s->sig == sig) {
|
||||
assert(s->callback);
|
||||
s->callback(a, s, sig, s->userdata);
|
||||
|
|
@ -93,7 +93,7 @@ static void callback(pa_mainloop_api*a, pa_io_event*e, int fd, pa_io_event_flags
|
|||
pa_log("read(): %s", pa_cstrerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (r != sizeof(sig)) {
|
||||
pa_log("short read()");
|
||||
return;
|
||||
|
|
@ -129,7 +129,7 @@ void pa_signal_done(void) {
|
|||
|
||||
while (signals)
|
||||
pa_signal_free(signals);
|
||||
|
||||
|
||||
api->io_free(io_event);
|
||||
io_event = NULL;
|
||||
|
||||
|
|
@ -148,11 +148,11 @@ pa_signal_event* pa_signal_new(int sig, void (*_callback) (pa_mainloop_api *api,
|
|||
#endif
|
||||
|
||||
assert(sig > 0 && _callback);
|
||||
|
||||
|
||||
for (e = signals; e; e = e->next)
|
||||
if (e->sig == sig)
|
||||
goto fail;
|
||||
|
||||
|
||||
e = pa_xmalloc(sizeof(pa_signal_event));
|
||||
e->sig = sig;
|
||||
e->callback = _callback;
|
||||
|
|
@ -164,7 +164,7 @@ pa_signal_event* pa_signal_new(int sig, void (*_callback) (pa_mainloop_api *api,
|
|||
sa.sa_handler = signal_handler;
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = SA_RESTART;
|
||||
|
||||
|
||||
if (sigaction(sig, &sa, &e->saved_sigaction) < 0)
|
||||
#else
|
||||
if ((e->saved_handler = signal(sig, signal_handler)) == SIG_ERR)
|
||||
|
|
@ -200,7 +200,7 @@ void pa_signal_free(pa_signal_event *e) {
|
|||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -57,11 +57,11 @@
|
|||
struct pa_io_event {
|
||||
pa_mainloop *mainloop;
|
||||
int dead;
|
||||
|
||||
|
||||
int fd;
|
||||
pa_io_event_flags_t events;
|
||||
struct pollfd *pollfd;
|
||||
|
||||
|
||||
pa_io_event_cb_t callback;
|
||||
void *userdata;
|
||||
pa_io_event_destroy_cb_t destroy_callback;
|
||||
|
|
@ -154,7 +154,7 @@ static pa_io_event* mainloop_io_new(
|
|||
pa_io_event_flags_t events,
|
||||
pa_io_event_cb_t callback,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_mainloop *m;
|
||||
pa_io_event *e;
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ static pa_io_event* mainloop_io_new(
|
|||
assert(a->userdata);
|
||||
assert(fd >= 0);
|
||||
assert(callback);
|
||||
|
||||
|
||||
m = a->userdata;
|
||||
assert(a == &m->api);
|
||||
|
||||
|
|
@ -173,7 +173,7 @@ static pa_io_event* mainloop_io_new(
|
|||
e->fd = fd;
|
||||
e->events = events;
|
||||
e->pollfd = NULL;
|
||||
|
||||
|
||||
e->callback = callback;
|
||||
e->userdata = userdata;
|
||||
e->destroy_callback = NULL;
|
||||
|
|
@ -213,7 +213,7 @@ static void mainloop_io_enable(pa_io_event *e, pa_io_event_flags_t events) {
|
|||
|
||||
if (e->events == events)
|
||||
return;
|
||||
|
||||
|
||||
e->events = events;
|
||||
|
||||
if (e->pollfd)
|
||||
|
|
@ -239,7 +239,7 @@ static void mainloop_io_free(pa_io_event *e) {
|
|||
|
||||
static void mainloop_io_set_destroy(pa_io_event *e, pa_io_event_destroy_cb_t callback) {
|
||||
assert(e);
|
||||
|
||||
|
||||
e->destroy_callback = callback;
|
||||
}
|
||||
|
||||
|
|
@ -255,7 +255,7 @@ static pa_defer_event* mainloop_defer_new(
|
|||
assert(a);
|
||||
assert(a->userdata);
|
||||
assert(callback);
|
||||
|
||||
|
||||
m = a->userdata;
|
||||
assert(a == &m->api);
|
||||
|
||||
|
|
@ -265,7 +265,7 @@ static pa_defer_event* mainloop_defer_new(
|
|||
|
||||
e->enabled = 1;
|
||||
m->n_enabled_defer_events++;
|
||||
|
||||
|
||||
e->callback = callback;
|
||||
e->userdata = userdata;
|
||||
e->destroy_callback = NULL;
|
||||
|
|
@ -288,7 +288,7 @@ static void mainloop_defer_enable(pa_defer_event *e, int b) {
|
|||
e->mainloop->n_enabled_defer_events++;
|
||||
pa_mainloop_wakeup(e->mainloop);
|
||||
}
|
||||
|
||||
|
||||
e->enabled = b;
|
||||
}
|
||||
|
||||
|
|
@ -318,14 +318,14 @@ static pa_time_event* mainloop_time_new(
|
|||
const struct timeval *tv,
|
||||
pa_time_event_cb_t callback,
|
||||
void *userdata) {
|
||||
|
||||
|
||||
pa_mainloop *m;
|
||||
pa_time_event *e;
|
||||
|
||||
assert(a);
|
||||
assert(a->userdata);
|
||||
assert(callback);
|
||||
|
||||
|
||||
m = a->userdata;
|
||||
assert(a == &m->api);
|
||||
|
||||
|
|
@ -354,7 +354,7 @@ static pa_time_event* mainloop_time_new(
|
|||
|
||||
if (e->enabled)
|
||||
pa_mainloop_wakeup(m);
|
||||
|
||||
|
||||
return e;
|
||||
}
|
||||
|
||||
|
|
@ -375,7 +375,7 @@ static void mainloop_time_restart(pa_time_event *e, const struct timeval *tv) {
|
|||
|
||||
if (e->mainloop->cached_next_time_event && e->enabled) {
|
||||
assert(e->mainloop->cached_next_time_event->enabled);
|
||||
|
||||
|
||||
if (pa_timeval_cmp(tv, &e->mainloop->cached_next_time_event->timeval) < 0)
|
||||
e->mainloop->cached_next_time_event = e;
|
||||
} else if (e->mainloop->cached_next_time_event == e)
|
||||
|
|
@ -396,7 +396,7 @@ static void mainloop_time_free(pa_time_event *e) {
|
|||
|
||||
if (e->mainloop->cached_next_time_event == e)
|
||||
e->mainloop->cached_next_time_event = NULL;
|
||||
|
||||
|
||||
/* no wakeup needed here. Think about it! */
|
||||
}
|
||||
|
||||
|
|
@ -411,7 +411,7 @@ static void mainloop_time_set_destroy(pa_time_event *e, pa_time_event_destroy_cb
|
|||
|
||||
static void mainloop_quit(pa_mainloop_api*a, int retval) {
|
||||
pa_mainloop *m;
|
||||
|
||||
|
||||
assert(a);
|
||||
assert(a->userdata);
|
||||
m = a->userdata;
|
||||
|
|
@ -419,7 +419,7 @@ static void mainloop_quit(pa_mainloop_api*a, int retval) {
|
|||
|
||||
pa_mainloop_quit(m, retval);
|
||||
}
|
||||
|
||||
|
||||
static const pa_mainloop_api vtable = {
|
||||
.userdata = NULL,
|
||||
|
||||
|
|
@ -432,12 +432,12 @@ static const pa_mainloop_api vtable = {
|
|||
.time_restart = mainloop_time_restart,
|
||||
.time_free = mainloop_time_free,
|
||||
.time_set_destroy = mainloop_time_set_destroy,
|
||||
|
||||
|
||||
.defer_new = mainloop_defer_new,
|
||||
.defer_enable = mainloop_defer_enable,
|
||||
.defer_free = mainloop_defer_free,
|
||||
.defer_set_destroy = mainloop_defer_set_destroy,
|
||||
|
||||
|
||||
.quit = mainloop_quit,
|
||||
};
|
||||
|
||||
|
|
@ -466,7 +466,7 @@ pa_mainloop *pa_mainloop_new(void) {
|
|||
|
||||
m->cached_next_time_event = NULL;
|
||||
m->prepared_timeout = 0;
|
||||
|
||||
|
||||
m->pollfds = NULL;
|
||||
m->max_pollfds = m->n_pollfds = 0;
|
||||
m->rebuild_pollfds = 1;
|
||||
|
|
@ -481,7 +481,7 @@ pa_mainloop *pa_mainloop_new(void) {
|
|||
m->poll_func = NULL;
|
||||
m->poll_func_userdata = NULL;
|
||||
m->poll_func_ret = -1;
|
||||
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
|
|
@ -494,7 +494,7 @@ static void cleanup_io_events(pa_mainloop *m, int force) {
|
|||
|
||||
if (!force && m->io_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_io_event, m->io_events, e);
|
||||
|
||||
|
|
@ -502,10 +502,10 @@ static void cleanup_io_events(pa_mainloop *m, int force) {
|
|||
assert(m->io_events_please_scan > 0);
|
||||
m->io_events_please_scan--;
|
||||
}
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&m->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
|
||||
m->rebuild_pollfds = 1;
|
||||
|
|
@ -526,7 +526,7 @@ static void cleanup_time_events(pa_mainloop *m, int force) {
|
|||
|
||||
if (!force && m->time_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_time_event, m->time_events, e);
|
||||
|
||||
|
|
@ -539,10 +539,10 @@ static void cleanup_time_events(pa_mainloop *m, int force) {
|
|||
assert(m->n_enabled_time_events > 0);
|
||||
m->n_enabled_time_events--;
|
||||
}
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&m->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
@ -561,7 +561,7 @@ static void cleanup_defer_events(pa_mainloop *m, int force) {
|
|||
|
||||
if (!force && m->defer_events_please_scan <= 0)
|
||||
break;
|
||||
|
||||
|
||||
if (force || e->dead) {
|
||||
PA_LLIST_REMOVE(pa_defer_event, m->defer_events, e);
|
||||
|
||||
|
|
@ -574,10 +574,10 @@ static void cleanup_defer_events(pa_mainloop *m, int force) {
|
|||
assert(m->n_enabled_defer_events > 0);
|
||||
m->n_enabled_defer_events--;
|
||||
}
|
||||
|
||||
|
||||
if (e->destroy_callback)
|
||||
e->destroy_callback(&m->api, e, e->userdata);
|
||||
|
||||
|
||||
pa_xfree(e);
|
||||
}
|
||||
|
||||
|
|
@ -664,11 +664,11 @@ static int dispatch_pollfds(pa_mainloop *m) {
|
|||
int r = 0, k;
|
||||
|
||||
assert(m->poll_func_ret > 0);
|
||||
|
||||
|
||||
for (e = m->io_events, k = m->poll_func_ret; e && !m->quit && k > 0; e = e->next) {
|
||||
if (e->dead || !e->pollfd || !e->pollfd->revents)
|
||||
continue;
|
||||
|
||||
|
||||
assert(e->pollfd->fd == e->fd && e->callback);
|
||||
e->callback(&m->api, e, e->fd, map_flags_from_libc(e->pollfd->revents), e->userdata);
|
||||
e->pollfd->revents = 0;
|
||||
|
|
@ -690,7 +690,7 @@ static int dispatch_defer(pa_mainloop *m) {
|
|||
for (e = m->defer_events; e && !m->quit; e = e->next) {
|
||||
if (e->dead || !e->enabled)
|
||||
continue;
|
||||
|
||||
|
||||
assert(e->callback);
|
||||
e->callback(&m->api, e, e->userdata);
|
||||
r++;
|
||||
|
|
@ -705,7 +705,7 @@ static pa_time_event* find_next_time_event(pa_mainloop *m) {
|
|||
|
||||
if (m->cached_next_time_event)
|
||||
return m->cached_next_time_event;
|
||||
|
||||
|
||||
for (t = m->time_events; t; t = t->next) {
|
||||
|
||||
if (t->dead || !t->enabled)
|
||||
|
|
@ -737,7 +737,7 @@ static int calc_next_timeout(pa_mainloop *m) {
|
|||
|
||||
if (t->timeval.tv_sec <= 0)
|
||||
return 0;
|
||||
|
||||
|
||||
pa_gettimeofday(&now);
|
||||
|
||||
if (pa_timeval_cmp(&t->timeval, &now) <= 0)
|
||||
|
|
@ -759,7 +759,7 @@ static int dispatch_timeout(pa_mainloop *m) {
|
|||
pa_gettimeofday(&now);
|
||||
|
||||
for (e = m->time_events; e && !m->quit; e = e->next) {
|
||||
|
||||
|
||||
if (e->dead || !e->enabled)
|
||||
continue;
|
||||
|
||||
|
|
@ -815,7 +815,7 @@ int pa_mainloop_prepare(pa_mainloop *m, int timeout) {
|
|||
if (m->n_enabled_defer_events <= 0) {
|
||||
if (m->rebuild_pollfds)
|
||||
rebuild_pollfds(m);
|
||||
|
||||
|
||||
m->prepared_timeout = calc_next_timeout(m);
|
||||
if (timeout >= 0 && (timeout < m->prepared_timeout || m->prepared_timeout < 0))
|
||||
m->prepared_timeout = timeout;
|
||||
|
|
@ -842,7 +842,7 @@ int pa_mainloop_poll(pa_mainloop *m) {
|
|||
m->poll_func_ret = 0;
|
||||
else {
|
||||
assert(!m->rebuild_pollfds);
|
||||
|
||||
|
||||
if (m->poll_func)
|
||||
m->poll_func_ret = m->poll_func(m->pollfds, m->n_pollfds, m->prepared_timeout, m->poll_func_userdata);
|
||||
else
|
||||
|
|
@ -872,23 +872,23 @@ int pa_mainloop_dispatch(pa_mainloop *m) {
|
|||
|
||||
if (m->quit)
|
||||
goto quit;
|
||||
|
||||
|
||||
if (m->n_enabled_defer_events)
|
||||
dispatched += dispatch_defer(m);
|
||||
else {
|
||||
if (m->n_enabled_time_events)
|
||||
if (m->n_enabled_time_events)
|
||||
dispatched += dispatch_timeout(m);
|
||||
|
||||
|
||||
if (m->quit)
|
||||
goto quit;
|
||||
|
||||
if (m->poll_func_ret > 0)
|
||||
dispatched += dispatch_pollfds(m);
|
||||
}
|
||||
|
||||
|
||||
if (m->quit)
|
||||
goto quit;
|
||||
|
||||
|
||||
m->state = STATE_PASSIVE;
|
||||
|
||||
return dispatched;
|
||||
|
|
@ -919,7 +919,7 @@ int pa_mainloop_iterate(pa_mainloop *m, int block, int *retval) {
|
|||
return r;
|
||||
|
||||
quit:
|
||||
|
||||
|
||||
if ((r == -2) && retval)
|
||||
*retval = pa_mainloop_get_retval(m);
|
||||
return r;
|
||||
|
|
@ -927,7 +927,7 @@ quit:
|
|||
|
||||
int pa_mainloop_run(pa_mainloop *m, int *retval) {
|
||||
int r;
|
||||
|
||||
|
||||
while ((r = pa_mainloop_iterate(m, 1, retval)) >= 0);
|
||||
|
||||
if (r == -2)
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -65,7 +65,7 @@ struct pollfd;
|
|||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
*
|
||||
* A minimal main loop implementation based on the C library's poll()
|
||||
* function. Using the routines defined herein you may create a simple
|
||||
* main loop supporting the generic main loop abstraction layer as
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -46,14 +46,14 @@ pa_operation *pa_operation_new(pa_context *c, pa_stream *s, pa_operation_cb_t cb
|
|||
/* Refcounting is strictly one-way: from the "bigger" to the "smaller" object. */
|
||||
PA_LLIST_PREPEND(pa_operation, c->operations, o);
|
||||
pa_operation_ref(o);
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
pa_operation *pa_operation_ref(pa_operation *o) {
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
|
||||
o->ref++;
|
||||
return o;
|
||||
}
|
||||
|
|
@ -81,14 +81,14 @@ static void operation_set_state(pa_operation *o, pa_operation_state_t st) {
|
|||
o->state = st;
|
||||
|
||||
if ((o->state == PA_OPERATION_DONE) || (o->state == PA_OPERATION_CANCELED)) {
|
||||
|
||||
|
||||
if (o->context) {
|
||||
assert(o->ref >= 2);
|
||||
|
||||
|
||||
PA_LLIST_REMOVE(pa_operation, o->context->operations, o);
|
||||
pa_operation_unref(o);
|
||||
}
|
||||
|
||||
|
||||
o->context = NULL;
|
||||
o->stream = NULL;
|
||||
o->callback = NULL;
|
||||
|
|
@ -101,14 +101,14 @@ static void operation_set_state(pa_operation *o, pa_operation_state_t st) {
|
|||
void pa_operation_cancel(pa_operation *o) {
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
|
||||
operation_set_state(o, PA_OPERATION_CANCELED);
|
||||
}
|
||||
|
||||
void pa_operation_done(pa_operation *o) {
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
|
||||
operation_set_state(o, PA_OPERATION_DONE);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
@ -55,11 +55,11 @@
|
|||
/** \mainpage
|
||||
*
|
||||
* \section intro_sec Introduction
|
||||
*
|
||||
*
|
||||
* This document describes the client API for the PulseAudio sound
|
||||
* server. The API comes in two flavours to accomodate different styles
|
||||
* of applications and different needs in complexity:
|
||||
*
|
||||
*
|
||||
* \li The complete but somewhat complicated to use asynchronous API
|
||||
* \li The simplified, easy to use, but limited synchronous API
|
||||
*
|
||||
|
|
@ -67,7 +67,7 @@
|
|||
* locale. Some functions will filter invalid sequences from the string, some
|
||||
* will simply fail. To ensure reliable behaviour, make sure everything you
|
||||
* pass to the API is already in UTF-8.
|
||||
|
||||
|
||||
* \section simple_sec Simple API
|
||||
*
|
||||
* Use this if you develop your program in synchronous style and just
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -70,7 +70,7 @@ pa_usec_t pa_bytes_to_usec(uint64_t length, const pa_sample_spec *spec) {
|
|||
size_t pa_usec_to_bytes(pa_usec_t t, const pa_sample_spec *spec) {
|
||||
assert(spec);
|
||||
|
||||
return (size_t) (((double) t * spec->rate / 1000000))*pa_frame_size(spec);
|
||||
return (size_t) (((double) t * spec->rate / 1000000))*pa_frame_size(spec);
|
||||
}
|
||||
|
||||
int pa_sample_spec_valid(const pa_sample_spec *spec) {
|
||||
|
|
@ -111,7 +111,7 @@ const char *pa_sample_format_to_string(pa_sample_format_t f) {
|
|||
|
||||
char *pa_sample_spec_snprint(char *s, size_t l, const pa_sample_spec *spec) {
|
||||
assert(s && l && spec);
|
||||
|
||||
|
||||
if (!pa_sample_spec_valid(spec))
|
||||
snprintf(s, l, "Invalid");
|
||||
else
|
||||
|
|
@ -134,7 +134,7 @@ char* pa_bytes_snprint(char *s, size_t l, unsigned v) {
|
|||
}
|
||||
|
||||
pa_sample_format_t pa_parse_sample_format(const char *format) {
|
||||
|
||||
|
||||
if (strcasecmp(format, "s16le") == 0)
|
||||
return PA_SAMPLE_S16LE;
|
||||
else if (strcasecmp(format, "s16be") == 0)
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -37,14 +37,14 @@
|
|||
int pa_stream_connect_upload(pa_stream *s, size_t length) {
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
|
||||
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY(s->context, length > 0, PA_ERR_INVALID);
|
||||
|
||||
|
||||
pa_stream_ref(s);
|
||||
|
||||
|
||||
s->direction = PA_STREAM_UPLOAD;
|
||||
|
||||
t = pa_tagstruct_command(s->context, PA_COMMAND_CREATE_UPLOAD_STREAM, &tag);
|
||||
|
|
@ -56,7 +56,7 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
|
|||
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);
|
||||
|
||||
pa_stream_set_state(s, PA_STREAM_CREATING);
|
||||
|
||||
|
||||
pa_stream_unref(s);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -87,16 +87,16 @@ pa_operation *pa_context_play_sample(pa_context *c, const char *name, const char
|
|||
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
if (!dev)
|
||||
dev = c->conf->default_sink;
|
||||
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_PLAY_SAMPLE, &tag);
|
||||
pa_tagstruct_putu32(t, PA_INVALID_INDEX);
|
||||
pa_tagstruct_puts(t, dev);
|
||||
|
|
@ -118,9 +118,9 @@ pa_operation* pa_context_remove_sample(pa_context *c, const char *name, pa_conte
|
|||
|
||||
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);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_REMOVE_SAMPLE, &tag);
|
||||
pa_tagstruct_puts(t, name);
|
||||
pa_pstream_send_tagstruct(c->pstream, t);
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -64,7 +64,7 @@ if (!(expression)) { \
|
|||
goto label; \
|
||||
} \
|
||||
} while(0);
|
||||
|
||||
|
||||
#define CHECK_DEAD_GOTO(p, rerror, label) do { \
|
||||
if (!(p)->context || pa_context_get_state((p)->context) != PA_CONTEXT_READY || \
|
||||
!(p)->stream || pa_stream_get_state((p)->stream) != PA_STREAM_READY) { \
|
||||
|
|
@ -143,7 +143,7 @@ pa_simple* pa_simple_new(
|
|||
const pa_channel_map *map,
|
||||
const pa_buffer_attr *attr,
|
||||
int *rerror) {
|
||||
|
||||
|
||||
pa_simple *p;
|
||||
int error = PA_ERR_INTERNAL, r;
|
||||
|
||||
|
|
@ -162,12 +162,12 @@ pa_simple* pa_simple_new(
|
|||
|
||||
if (!(p->mainloop = pa_threaded_mainloop_new()))
|
||||
goto fail;
|
||||
|
||||
|
||||
if (!(p->context = pa_context_new(pa_threaded_mainloop_get_api(p->mainloop), name)))
|
||||
goto fail;
|
||||
|
||||
pa_context_set_state_callback(p->context, context_state_cb, p);
|
||||
|
||||
|
||||
if (pa_context_connect(p->context, server, 0, NULL) < 0) {
|
||||
error = pa_context_errno(p->context);
|
||||
goto fail;
|
||||
|
|
@ -180,7 +180,7 @@ pa_simple* pa_simple_new(
|
|||
|
||||
/* Wait until the context is ready */
|
||||
pa_threaded_mainloop_wait(p->mainloop);
|
||||
|
||||
|
||||
if (pa_context_get_state(p->context) != PA_CONTEXT_READY) {
|
||||
error = pa_context_errno(p->context);
|
||||
goto unlock_and_fail;
|
||||
|
|
@ -216,12 +216,12 @@ pa_simple* pa_simple_new(
|
|||
}
|
||||
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
|
||||
|
||||
return p;
|
||||
|
||||
unlock_and_fail:
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
|
||||
|
||||
fail:
|
||||
if (rerror)
|
||||
*rerror = error;
|
||||
|
|
@ -234,10 +234,10 @@ void pa_simple_free(pa_simple *s) {
|
|||
|
||||
if (s->mainloop)
|
||||
pa_threaded_mainloop_stop(s->mainloop);
|
||||
|
||||
|
||||
if (s->stream)
|
||||
pa_stream_unref(s->stream);
|
||||
|
||||
|
||||
if (s->context)
|
||||
pa_context_unref(s->context);
|
||||
|
||||
|
|
@ -249,38 +249,38 @@ void pa_simple_free(pa_simple *s) {
|
|||
|
||||
int pa_simple_write(pa_simple *p, const void*data, size_t length, int *rerror) {
|
||||
assert(p);
|
||||
|
||||
|
||||
CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
|
||||
CHECK_VALIDITY_RETURN_ANY(rerror, data && length, PA_ERR_INVALID, -1);
|
||||
|
||||
pa_threaded_mainloop_lock(p->mainloop);
|
||||
|
||||
|
||||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
||||
|
||||
while (length > 0) {
|
||||
size_t l;
|
||||
int r;
|
||||
|
||||
|
||||
while (!(l = pa_stream_writable_size(p->stream))) {
|
||||
pa_threaded_mainloop_wait(p->mainloop);
|
||||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
||||
}
|
||||
|
||||
CHECK_SUCCESS_GOTO(p, rerror, l != (size_t) -1, unlock_and_fail);
|
||||
|
||||
|
||||
if (l > length)
|
||||
l = length;
|
||||
|
||||
r = pa_stream_write(p->stream, data, l, NULL, 0, PA_SEEK_RELATIVE);
|
||||
CHECK_SUCCESS_GOTO(p, rerror, r >= 0, unlock_and_fail);
|
||||
|
||||
|
||||
data = (const uint8_t*) data + l;
|
||||
length -= l;
|
||||
}
|
||||
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
return 0;
|
||||
|
||||
|
||||
unlock_and_fail:
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
return -1;
|
||||
|
|
@ -293,15 +293,15 @@ int pa_simple_read(pa_simple *p, void*data, size_t length, int *rerror) {
|
|||
CHECK_VALIDITY_RETURN_ANY(rerror, data && length, PA_ERR_INVALID, -1);
|
||||
|
||||
pa_threaded_mainloop_lock(p->mainloop);
|
||||
|
||||
|
||||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
||||
|
||||
while (length > 0) {
|
||||
size_t l;
|
||||
|
||||
|
||||
while (!p->read_data) {
|
||||
int r;
|
||||
|
||||
|
||||
r = pa_stream_peek(p->stream, &p->read_data, &p->read_length);
|
||||
CHECK_SUCCESS_GOTO(p, rerror, r == 0, unlock_and_fail);
|
||||
|
||||
|
|
@ -311,31 +311,31 @@ int pa_simple_read(pa_simple *p, void*data, size_t length, int *rerror) {
|
|||
} else
|
||||
p->read_index = 0;
|
||||
}
|
||||
|
||||
|
||||
l = p->read_length < length ? p->read_length : length;
|
||||
memcpy(data, (const uint8_t*) p->read_data+p->read_index, l);
|
||||
|
||||
data = (uint8_t*) data + l;
|
||||
length -= l;
|
||||
|
||||
|
||||
p->read_index += l;
|
||||
p->read_length -= l;
|
||||
|
||||
if (!p->read_length) {
|
||||
int r;
|
||||
|
||||
|
||||
r = pa_stream_drop(p->stream);
|
||||
p->read_data = NULL;
|
||||
p->read_length = 0;
|
||||
p->read_index = 0;
|
||||
|
||||
|
||||
CHECK_SUCCESS_GOTO(p, rerror, r == 0, unlock_and_fail);
|
||||
}
|
||||
}
|
||||
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
return 0;
|
||||
|
||||
|
||||
unlock_and_fail:
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
return -1;
|
||||
|
|
@ -353,7 +353,7 @@ static void success_cb(pa_stream *s, int success, void *userdata) {
|
|||
|
||||
int pa_simple_drain(pa_simple *p, int *rerror) {
|
||||
pa_operation *o = NULL;
|
||||
|
||||
|
||||
assert(p);
|
||||
|
||||
CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
|
||||
|
|
@ -370,7 +370,7 @@ int pa_simple_drain(pa_simple *p, int *rerror) {
|
|||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
||||
}
|
||||
CHECK_SUCCESS_GOTO(p, rerror, p->operation_success, unlock_and_fail);
|
||||
|
||||
|
||||
pa_operation_unref(o);
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
|
||||
|
|
@ -389,7 +389,7 @@ unlock_and_fail:
|
|||
|
||||
int pa_simple_flush(pa_simple *p, int *rerror) {
|
||||
pa_operation *o = NULL;
|
||||
|
||||
|
||||
assert(p);
|
||||
|
||||
CHECK_VALIDITY_RETURN_ANY(rerror, p->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE, -1);
|
||||
|
|
@ -399,7 +399,7 @@ int pa_simple_flush(pa_simple *p, int *rerror) {
|
|||
|
||||
o = pa_stream_flush(p->stream, success_cb, p);
|
||||
CHECK_SUCCESS_GOTO(p, rerror, o, unlock_and_fail);
|
||||
|
||||
|
||||
p->operation_success = 0;
|
||||
while (pa_operation_get_state(o) != PA_OPERATION_DONE) {
|
||||
pa_threaded_mainloop_wait(p->mainloop);
|
||||
|
|
@ -426,14 +426,14 @@ unlock_and_fail:
|
|||
pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) {
|
||||
pa_usec_t t;
|
||||
int negative;
|
||||
|
||||
|
||||
assert(p);
|
||||
|
||||
|
||||
pa_threaded_mainloop_lock(p->mainloop);
|
||||
|
||||
for (;;) {
|
||||
CHECK_DEAD_GOTO(p, rerror, unlock_and_fail);
|
||||
|
||||
|
||||
if (pa_stream_get_latency(p->stream, &t, &negative) >= 0)
|
||||
break;
|
||||
|
||||
|
|
@ -442,7 +442,7 @@ pa_usec_t pa_simple_get_latency(pa_simple *p, int *rerror) {
|
|||
/* Wait until latency data is available again */
|
||||
pa_threaded_mainloop_wait(p->mainloop);
|
||||
}
|
||||
|
||||
|
||||
pa_threaded_mainloop_unlock(p->mainloop);
|
||||
|
||||
return negative ? 0 : t;
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -43,7 +43,7 @@
|
|||
pa_stream *pa_stream_new(pa_context *c, const char *name, const pa_sample_spec *ss, const pa_channel_map *map) {
|
||||
pa_stream *s;
|
||||
int i;
|
||||
|
||||
|
||||
assert(c);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, ss && pa_sample_spec_valid(ss), PA_ERR_INVALID);
|
||||
|
|
@ -76,7 +76,7 @@ pa_stream *pa_stream_new(pa_context *c, const char *name, const pa_sample_spec *
|
|||
s->channel_map = *map;
|
||||
else
|
||||
pa_channel_map_init_auto(&s->channel_map, ss->channels, PA_CHANNEL_MAP_DEFAULT);
|
||||
|
||||
|
||||
s->channel = 0;
|
||||
s->channel_valid = 0;
|
||||
s->syncid = c->csyncid++;
|
||||
|
|
@ -99,11 +99,11 @@ pa_stream *pa_stream_new(pa_context *c, const char *name, const pa_sample_spec *
|
|||
for (i = 0; i < PA_MAX_WRITE_INDEX_CORRECTIONS; i++)
|
||||
s->write_index_corrections[i].valid = 0;
|
||||
s->current_write_index_correction = 0;
|
||||
|
||||
|
||||
s->corked = 0;
|
||||
|
||||
s->cached_time_valid = 0;
|
||||
|
||||
|
||||
s->auto_timing_update_event = NULL;
|
||||
s->auto_timing_update_requested = 0;
|
||||
|
||||
|
|
@ -143,7 +143,7 @@ void pa_stream_unref(pa_stream *s) {
|
|||
pa_stream* pa_stream_ref(pa_stream *s) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
s->ref++;
|
||||
return s;
|
||||
}
|
||||
|
|
@ -151,14 +151,14 @@ pa_stream* pa_stream_ref(pa_stream *s) {
|
|||
pa_stream_state_t pa_stream_get_state(pa_stream *s) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
return s->state;
|
||||
}
|
||||
|
||||
pa_context* pa_stream_get_context(pa_stream *s) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
return s->context;
|
||||
}
|
||||
|
||||
|
|
@ -167,17 +167,17 @@ uint32_t pa_stream_get_index(pa_stream *s) {
|
|||
assert(s->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, PA_INVALID_INDEX);
|
||||
|
||||
|
||||
return s->device_index;
|
||||
}
|
||||
|
||||
|
||||
void pa_stream_set_state(pa_stream *s, pa_stream_state_t st) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
if (s->state == st)
|
||||
return;
|
||||
|
||||
|
||||
pa_stream_ref(s);
|
||||
|
||||
s->state = st;
|
||||
|
|
@ -192,24 +192,24 @@ void pa_stream_set_state(pa_stream *s, pa_stream_state_t st) {
|
|||
/* Unref all operatio object that point to us */
|
||||
for (o = s->context->operations; o; o = n) {
|
||||
n = o->next;
|
||||
|
||||
|
||||
if (o->stream == s)
|
||||
pa_operation_cancel(o);
|
||||
}
|
||||
|
||||
|
||||
/* Drop all outstanding replies for this stream */
|
||||
if (s->context->pdispatch)
|
||||
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_LLIST_REMOVE(pa_stream, s->context->streams, s);
|
||||
pa_stream_unref(s);
|
||||
|
||||
s->channel = 0;
|
||||
s->channel_valid = 0;
|
||||
|
||||
|
||||
s->context = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -220,20 +220,20 @@ void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED
|
|||
pa_context *c = userdata;
|
||||
pa_stream *s;
|
||||
uint32_t channel;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(command == PA_COMMAND_PLAYBACK_STREAM_KILLED || command == PA_COMMAND_RECORD_STREAM_KILLED);
|
||||
assert(t);
|
||||
assert(c);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &channel) < 0 ||
|
||||
!pa_tagstruct_eof(t)) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
||||
if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->record_streams, channel)))
|
||||
goto finish;
|
||||
|
||||
|
|
@ -248,27 +248,27 @@ void pa_command_request(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32
|
|||
pa_stream *s;
|
||||
pa_context *c = userdata;
|
||||
uint32_t bytes, channel;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(command == PA_COMMAND_REQUEST);
|
||||
assert(t);
|
||||
assert(c);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &channel) < 0 ||
|
||||
pa_tagstruct_getu32(t, &bytes) < 0 ||
|
||||
!pa_tagstruct_eof(t)) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
||||
if (!(s = pa_dynarray_get(c->playback_streams, channel)))
|
||||
goto finish;
|
||||
|
||||
if (s->state == PA_STREAM_READY) {
|
||||
s->requested_bytes += bytes;
|
||||
|
||||
|
||||
if (s->requested_bytes > 0 && s->write_callback)
|
||||
s->write_callback(s, s->requested_bytes, s->write_userdata);
|
||||
}
|
||||
|
|
@ -288,13 +288,13 @@ void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, PA_GCC
|
|||
assert(c);
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
||||
if (pa_tagstruct_getu32(t, &channel) < 0 ||
|
||||
!pa_tagstruct_eof(t)) {
|
||||
pa_context_fail(c, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
|
||||
if (!(s = pa_dynarray_get(c->playback_streams, channel)))
|
||||
goto finish;
|
||||
|
||||
|
|
@ -319,11 +319,11 @@ static void request_auto_timing_update(pa_stream *s, int force) {
|
|||
|
||||
if (!(s->flags & PA_STREAM_AUTO_TIMING_UPDATE))
|
||||
return;
|
||||
|
||||
|
||||
if (s->state == PA_STREAM_READY &&
|
||||
(force || !s->auto_timing_update_requested)) {
|
||||
pa_operation *o;
|
||||
|
||||
|
||||
/* pa_log("automatically requesting new timing data"); */
|
||||
|
||||
if ((o = pa_stream_update_timing_info(s, NULL, NULL))) {
|
||||
|
|
@ -341,32 +341,32 @@ static void invalidate_indexes(pa_stream *s, int r, int w) {
|
|||
assert(s);
|
||||
|
||||
/* pa_log("invalidate r:%u w:%u tag:%u", r, w, s->context->ctag); */
|
||||
|
||||
|
||||
if (s->state != PA_STREAM_READY)
|
||||
return;
|
||||
|
||||
if (w) {
|
||||
s->write_index_not_before = s->context->ctag;
|
||||
|
||||
|
||||
if (s->timing_info_valid)
|
||||
s->timing_info.write_index_corrupt = 1;
|
||||
|
||||
|
||||
/* pa_log("write_index invalidated"); */
|
||||
}
|
||||
|
||||
|
||||
if (r) {
|
||||
s->read_index_not_before = s->context->ctag;
|
||||
|
||||
|
||||
if (s->timing_info_valid)
|
||||
s->timing_info.read_index_corrupt = 1;
|
||||
|
||||
|
||||
/* pa_log("read_index invalidated"); */
|
||||
}
|
||||
|
||||
|
||||
if ((s->direction == PA_STREAM_PLAYBACK && r) ||
|
||||
(s->direction == PA_STREAM_RECORD && w))
|
||||
s->cached_time_valid = 0;
|
||||
|
||||
|
||||
request_auto_timing_update(s, 1);
|
||||
}
|
||||
|
||||
|
|
@ -382,17 +382,17 @@ static void auto_timing_update_callback(PA_GCC_UNUSED pa_mainloop_api *m, PA_GCC
|
|||
|
||||
void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_stream *s = userdata;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(s);
|
||||
assert(s->state == PA_STREAM_CREATING);
|
||||
|
||||
|
||||
pa_stream_ref(s);
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(s->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
||||
|
||||
pa_stream_set_state(s, PA_STREAM_FAILED);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -429,9 +429,9 @@ void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED
|
|||
|
||||
if (s->direction == PA_STREAM_RECORD) {
|
||||
assert(!s->record_memblockq);
|
||||
|
||||
|
||||
s->record_memblockq = pa_memblockq_new(
|
||||
0,
|
||||
0,
|
||||
s->buffer_attr.maxlength,
|
||||
0,
|
||||
pa_frame_size(&s->sample_spec),
|
||||
|
|
@ -444,7 +444,7 @@ void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED
|
|||
pa_dynarray_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback_streams, s->channel, s);
|
||||
|
||||
pa_stream_set_state(s, PA_STREAM_READY);
|
||||
|
||||
|
||||
if (s->direction != PA_STREAM_UPLOAD &&
|
||||
s->flags & PA_STREAM_AUTO_TIMING_UPDATE) {
|
||||
struct timeval tv;
|
||||
|
|
@ -473,13 +473,13 @@ static int create_stream(
|
|||
pa_stream_flags_t flags,
|
||||
const pa_cvolume *volume,
|
||||
pa_stream *sync_stream) {
|
||||
|
||||
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY(s->context, !(flags & ~((direction != PA_STREAM_UPLOAD ?
|
||||
PA_STREAM_START_CORKED|
|
||||
|
|
@ -493,10 +493,10 @@ static int create_stream(
|
|||
|
||||
s->direction = direction;
|
||||
s->flags = flags;
|
||||
|
||||
|
||||
if (sync_stream)
|
||||
s->syncid = sync_stream->syncid;
|
||||
|
||||
|
||||
if (attr)
|
||||
s->buffer_attr = *attr;
|
||||
else {
|
||||
|
|
@ -515,7 +515,7 @@ static int create_stream(
|
|||
s->context,
|
||||
s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_CREATE_PLAYBACK_STREAM : PA_COMMAND_CREATE_RECORD_STREAM,
|
||||
&tag);
|
||||
|
||||
|
||||
pa_tagstruct_put(
|
||||
t,
|
||||
PA_TAG_STRING, s->name,
|
||||
|
|
@ -526,7 +526,7 @@ static int create_stream(
|
|||
PA_TAG_U32, s->buffer_attr.maxlength,
|
||||
PA_TAG_BOOLEAN, !!(flags & PA_STREAM_START_CORKED),
|
||||
PA_TAG_INVALID);
|
||||
|
||||
|
||||
if (s->direction == PA_STREAM_PLAYBACK) {
|
||||
pa_cvolume cv;
|
||||
|
||||
|
|
@ -540,7 +540,7 @@ static int create_stream(
|
|||
|
||||
if (!volume)
|
||||
volume = pa_cvolume_reset(&cv, s->sample_spec.channels);
|
||||
|
||||
|
||||
pa_tagstruct_put_cvolume(t, volume);
|
||||
} else
|
||||
pa_tagstruct_putu32(t, s->buffer_attr.fragsize);
|
||||
|
|
@ -549,7 +549,7 @@ static int create_stream(
|
|||
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);
|
||||
|
||||
pa_stream_set_state(s, PA_STREAM_CREATING);
|
||||
|
||||
|
||||
pa_stream_unref(s);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -561,10 +561,10 @@ int pa_stream_connect_playback(
|
|||
pa_stream_flags_t flags,
|
||||
pa_cvolume *volume,
|
||||
pa_stream *sync_stream) {
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
return create_stream(PA_STREAM_PLAYBACK, s, dev, attr, flags, volume, sync_stream);
|
||||
}
|
||||
|
||||
|
|
@ -573,7 +573,7 @@ int pa_stream_connect_record(
|
|||
const char *dev,
|
||||
const pa_buffer_attr *attr,
|
||||
pa_stream_flags_t flags) {
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
|
@ -587,9 +587,9 @@ int pa_stream_write(
|
|||
void (*free_cb)(void *p),
|
||||
int64_t offset,
|
||||
pa_seek_mode_t seek) {
|
||||
|
||||
|
||||
pa_memchunk chunk;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
assert(data);
|
||||
|
|
@ -602,29 +602,29 @@ int pa_stream_write(
|
|||
if (length <= 0)
|
||||
return 0;
|
||||
|
||||
if (free_cb)
|
||||
if (free_cb)
|
||||
chunk.memblock = pa_memblock_new_user(s->context->mempool, (void*) data, length, free_cb, 1);
|
||||
else {
|
||||
chunk.memblock = pa_memblock_new(s->context->mempool, length);
|
||||
memcpy(chunk.memblock->data, data, length);
|
||||
}
|
||||
|
||||
|
||||
chunk.index = 0;
|
||||
chunk.length = length;
|
||||
|
||||
pa_pstream_send_memblock(s->context->pstream, s->channel, offset, seek, &chunk);
|
||||
pa_memblock_unref(chunk.memblock);
|
||||
|
||||
|
||||
if (length < s->requested_bytes)
|
||||
s->requested_bytes -= length;
|
||||
else
|
||||
s->requested_bytes = 0;
|
||||
|
||||
if (s->direction == PA_STREAM_PLAYBACK) {
|
||||
|
||||
|
||||
/* Update latency request correction */
|
||||
if (s->write_index_corrections[s->current_write_index_correction].valid) {
|
||||
|
||||
|
||||
if (seek == PA_SEEK_ABSOLUTE) {
|
||||
s->write_index_corrections[s->current_write_index_correction].corrupt = 0;
|
||||
s->write_index_corrections[s->current_write_index_correction].absolute = 1;
|
||||
|
|
@ -635,10 +635,10 @@ int pa_stream_write(
|
|||
} else
|
||||
s->write_index_corrections[s->current_write_index_correction].corrupt = 1;
|
||||
}
|
||||
|
||||
|
||||
/* Update the write index in the already available latency data */
|
||||
if (s->timing_info_valid) {
|
||||
|
||||
|
||||
if (seek == PA_SEEK_ABSOLUTE) {
|
||||
s->timing_info.write_index_corrupt = 0;
|
||||
s->timing_info.write_index = offset + length;
|
||||
|
|
@ -652,7 +652,7 @@ int pa_stream_write(
|
|||
if (!s->timing_info_valid || s->timing_info.write_index_corrupt)
|
||||
request_auto_timing_update(s, 1);
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -664,7 +664,7 @@ int pa_stream_peek(pa_stream *s, const void **data, size_t *length) {
|
|||
|
||||
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
if (!s->peek_memchunk.memblock) {
|
||||
|
||||
if (pa_memblockq_peek(s->record_memblockq, &s->peek_memchunk) < 0) {
|
||||
|
|
@ -686,13 +686,13 @@ int pa_stream_drop(pa_stream *s) {
|
|||
PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY(s->context, s->direction == PA_STREAM_RECORD, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY(s->context, s->peek_memchunk.memblock, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
pa_memblockq_drop(s->record_memblockq, &s->peek_memchunk, s->peek_memchunk.length);
|
||||
|
||||
/* Fix the simulated local read index */
|
||||
if (s->timing_info_valid && !s->timing_info.read_index_corrupt)
|
||||
s->timing_info.read_index += s->peek_memchunk.length;
|
||||
|
||||
|
||||
pa_memblock_unref(s->peek_memchunk.memblock);
|
||||
s->peek_memchunk.length = 0;
|
||||
s->peek_memchunk.index = 0;
|
||||
|
|
@ -707,7 +707,7 @@ size_t pa_stream_writable_size(pa_stream *s) {
|
|||
|
||||
PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE, (size_t) -1);
|
||||
PA_CHECK_VALIDITY_RETURN_ANY(s->context, s->direction != PA_STREAM_RECORD, PA_ERR_BADSTATE, (size_t) -1);
|
||||
|
||||
|
||||
return s->requested_bytes;
|
||||
}
|
||||
|
||||
|
|
@ -725,7 +725,7 @@ pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *us
|
|||
pa_operation *o;
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
|
@ -746,7 +746,7 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
pa_operation *o = userdata;
|
||||
struct timeval local, remote, now;
|
||||
pa_timing_info *i;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
|
||||
|
|
@ -756,7 +756,7 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
i = &o->stream->timing_info;
|
||||
|
||||
/* pa_log("pre corrupt w:%u r:%u\n", !o->stream->timing_info_valid || i->write_index_corrupt,!o->stream->timing_info_valid || i->read_index_corrupt); */
|
||||
|
||||
|
||||
o->stream->timing_info_valid = 0;
|
||||
i->write_index_corrupt = 0;
|
||||
i->read_index_corrupt = 0;
|
||||
|
|
@ -777,21 +777,21 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
!pa_tagstruct_eof(t)) {
|
||||
pa_context_fail(o->context, PA_ERR_PROTOCOL);
|
||||
goto finish;
|
||||
|
||||
|
||||
} else {
|
||||
o->stream->timing_info_valid = 1;
|
||||
|
||||
pa_gettimeofday(&now);
|
||||
|
||||
|
||||
/* Calculcate timestamps */
|
||||
if (pa_timeval_cmp(&local, &remote) <= 0 && pa_timeval_cmp(&remote, &now) <= 0) {
|
||||
/* local and remote seem to have synchronized clocks */
|
||||
|
||||
|
||||
if (o->stream->direction == PA_STREAM_PLAYBACK)
|
||||
i->transport_usec = pa_timeval_diff(&remote, &local);
|
||||
else
|
||||
i->transport_usec = pa_timeval_diff(&now, &remote);
|
||||
|
||||
|
||||
i->synchronized_clocks = 1;
|
||||
i->timestamp = remote;
|
||||
} else {
|
||||
|
|
@ -816,7 +816,7 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
uint32_t ctag = tag;
|
||||
|
||||
/* Go through the saved correction values and add up the total correction.*/
|
||||
|
||||
|
||||
for (n = 0, j = o->stream->current_write_index_correction+1;
|
||||
n < PA_MAX_WRITE_INDEX_CORRECTIONS;
|
||||
n++, j = (j + 1) % PA_MAX_WRITE_INDEX_CORRECTIONS) {
|
||||
|
|
@ -851,21 +851,21 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
if (!i->read_index_corrupt)
|
||||
i->read_index -= pa_memblockq_get_length(o->stream->record_memblockq);
|
||||
}
|
||||
|
||||
|
||||
o->stream->cached_time_valid = 0;
|
||||
}
|
||||
|
||||
o->stream->auto_timing_update_requested = 0;
|
||||
/* pa_log("post corrupt w:%u r:%u\n", i->write_index_corrupt || !o->stream->timing_info_valid, i->read_index_corrupt || !o->stream->timing_info_valid); */
|
||||
|
||||
|
||||
/* Clear old correction entries */
|
||||
if (o->stream->direction == PA_STREAM_PLAYBACK) {
|
||||
int n;
|
||||
|
||||
|
||||
for (n = 0; n < PA_MAX_WRITE_INDEX_CORRECTIONS; n++) {
|
||||
if (!o->stream->write_index_corrections[n].valid)
|
||||
continue;
|
||||
|
||||
|
||||
if (o->stream->write_index_corrections[n].tag <= tag)
|
||||
o->stream->write_index_corrections[n].valid = 0;
|
||||
}
|
||||
|
|
@ -873,12 +873,12 @@ static void stream_get_timing_info_callback(pa_pdispatch *pd, uint32_t command,
|
|||
|
||||
if (o->stream->latency_update_callback)
|
||||
o->stream->latency_update_callback(o->stream, o->stream->latency_update_userdata);
|
||||
|
||||
|
||||
if (o->callback && o->stream && o->stream->state == PA_STREAM_READY) {
|
||||
pa_stream_success_cb_t cb = (pa_stream_success_cb_t) o->callback;
|
||||
cb(o->stream, o->stream->timing_info_valid, o->userdata);
|
||||
}
|
||||
|
||||
|
||||
finish:
|
||||
|
||||
pa_operation_done(o);
|
||||
|
|
@ -891,29 +891,29 @@ pa_operation* pa_stream_update_timing_info(pa_stream *s, pa_stream_success_cb_t
|
|||
pa_tagstruct *t;
|
||||
struct timeval now;
|
||||
int cidx = 0;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
if (s->direction == PA_STREAM_PLAYBACK) {
|
||||
/* Find a place to store the write_index correction data for this entry */
|
||||
cidx = (s->current_write_index_correction + 1) % PA_MAX_WRITE_INDEX_CORRECTIONS;
|
||||
|
||||
|
||||
/* Check if we could allocate a correction slot. If not, there are too many outstanding queries */
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, !s->write_index_corrections[cidx].valid, PA_ERR_INTERNAL);
|
||||
}
|
||||
o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
|
||||
t = pa_tagstruct_command(
|
||||
s->context,
|
||||
s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_GET_PLAYBACK_LATENCY : PA_COMMAND_GET_RECORD_LATENCY,
|
||||
&tag);
|
||||
pa_tagstruct_putu32(t, s->channel);
|
||||
pa_tagstruct_put_timeval(t, pa_gettimeofday(&now));
|
||||
|
||||
|
||||
pa_pstream_send_tagstruct(s->context->pstream, t);
|
||||
pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, stream_get_timing_info_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
|
||||
|
||||
|
|
@ -926,15 +926,15 @@ pa_operation* pa_stream_update_timing_info(pa_stream *s, pa_stream_success_cb_t
|
|||
o->stream->write_index_corrections[cidx].value = 0;
|
||||
o->stream->write_index_corrections[cidx].corrupt = 0;
|
||||
}
|
||||
|
||||
|
||||
/* pa_log("requesting update %u\n", tag); */
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
void pa_stream_disconnect_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_stream *s = userdata;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
|
@ -961,7 +961,7 @@ finish:
|
|||
int pa_stream_disconnect(pa_stream *s) {
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
|
@ -1010,7 +1010,7 @@ void pa_stream_set_state_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *
|
|||
void pa_stream_set_overflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
s->overflow_callback = cb;
|
||||
s->overflow_userdata = userdata;
|
||||
}
|
||||
|
|
@ -1018,7 +1018,7 @@ void pa_stream_set_overflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, voi
|
|||
void pa_stream_set_underflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
s->underflow_callback = cb;
|
||||
s->underflow_userdata = userdata;
|
||||
}
|
||||
|
|
@ -1026,7 +1026,7 @@ void pa_stream_set_underflow_callback(pa_stream *s, pa_stream_notify_cb_t cb, vo
|
|||
void pa_stream_set_latency_update_callback(pa_stream *s, pa_stream_notify_cb_t cb, void *userdata) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
s->latency_update_callback = cb;
|
||||
s->latency_update_userdata = userdata;
|
||||
}
|
||||
|
|
@ -1034,14 +1034,14 @@ void pa_stream_set_latency_update_callback(pa_stream *s, pa_stream_notify_cb_t c
|
|||
void pa_stream_simple_ack_callback(pa_pdispatch *pd, uint32_t command, PA_GCC_UNUSED uint32_t tag, pa_tagstruct *t, void *userdata) {
|
||||
pa_operation *o = userdata;
|
||||
int success = 1;
|
||||
|
||||
|
||||
assert(pd);
|
||||
assert(o);
|
||||
assert(o->ref >= 1);
|
||||
|
||||
if (!o->context)
|
||||
goto finish;
|
||||
|
||||
|
||||
if (command != PA_COMMAND_REPLY) {
|
||||
if (pa_context_handle_error(o->context, command, t) < 0)
|
||||
goto finish;
|
||||
|
|
@ -1066,15 +1066,15 @@ pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, voi
|
|||
pa_operation *o;
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
|
||||
|
||||
s->corked = b;
|
||||
|
||||
|
||||
o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(
|
||||
|
|
@ -1096,12 +1096,12 @@ static pa_operation* stream_send_simple_command(pa_stream *s, uint32_t command,
|
|||
pa_tagstruct *t;
|
||||
pa_operation *o;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(s->context, command, &tag);
|
||||
|
|
@ -1114,26 +1114,26 @@ static pa_operation* stream_send_simple_command(pa_stream *s, uint32_t command,
|
|||
|
||||
pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) {
|
||||
pa_operation *o;
|
||||
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
if ((o = stream_send_simple_command(s, s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_FLUSH_PLAYBACK_STREAM : PA_COMMAND_FLUSH_RECORD_STREAM, cb, userdata))) {
|
||||
|
||||
if (s->direction == PA_STREAM_PLAYBACK) {
|
||||
if (s->write_index_corrections[s->current_write_index_correction].valid)
|
||||
s->write_index_corrections[s->current_write_index_correction].corrupt = 1;
|
||||
|
||||
|
||||
if (s->timing_info_valid)
|
||||
s->timing_info.write_index_corrupt = 1;
|
||||
|
||||
if (s->buffer_attr.prebuf > 0)
|
||||
if (s->buffer_attr.prebuf > 0)
|
||||
invalidate_indexes(s, 1, 0);
|
||||
else
|
||||
request_auto_timing_update(s, 1);
|
||||
} else
|
||||
invalidate_indexes(s, 0, 1);
|
||||
}
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
|
|
@ -1151,13 +1151,13 @@ pa_operation* pa_stream_prebuf(pa_stream *s, pa_stream_success_cb_t cb, void *us
|
|||
|
||||
pa_operation* pa_stream_trigger(pa_stream *s, pa_stream_success_cb_t cb, void *userdata) {
|
||||
pa_operation *o;
|
||||
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE);
|
||||
|
||||
if ((o = stream_send_simple_command(s, PA_COMMAND_TRIGGER_PLAYBACK_STREAM, cb, userdata)))
|
||||
invalidate_indexes(s, 1, 0);
|
||||
|
||||
|
||||
return o;
|
||||
}
|
||||
|
||||
|
|
@ -1165,7 +1165,7 @@ pa_operation* pa_stream_set_name(pa_stream *s, const char *name, pa_stream_succe
|
|||
pa_operation *o;
|
||||
pa_tagstruct *t;
|
||||
uint32_t tag;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
assert(name);
|
||||
|
|
@ -1213,7 +1213,7 @@ int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) {
|
|||
* to us, we assume that the real output time is actually
|
||||
* a little ahead */
|
||||
usec += s->timing_info.transport_usec;
|
||||
|
||||
|
||||
/* However, the output device usually maintains a buffer
|
||||
too, hence the real sample currently played is a little
|
||||
back */
|
||||
|
|
@ -1222,7 +1222,7 @@ int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) {
|
|||
else
|
||||
usec -= s->timing_info.sink_usec;
|
||||
}
|
||||
|
||||
|
||||
} else if (s->direction == PA_STREAM_RECORD) {
|
||||
/* The last byte written into the server side queue had
|
||||
* this time value associated */
|
||||
|
|
@ -1231,10 +1231,10 @@ int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) {
|
|||
if (!s->corked) {
|
||||
/* Add transport latency */
|
||||
usec += s->timing_info.transport_usec;
|
||||
|
||||
|
||||
/* Add latency of data in device buffer */
|
||||
usec += s->timing_info.source_usec;
|
||||
|
||||
|
||||
/* If this is a monitor source, we need to correct the
|
||||
* time by the playback device buffer */
|
||||
if (s->timing_info.sink_usec >= usec)
|
||||
|
|
@ -1269,18 +1269,18 @@ int pa_stream_get_time(pa_stream *s, pa_usec_t *r_usec) {
|
|||
|
||||
if (r_usec)
|
||||
*r_usec = usec;
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static pa_usec_t time_counter_diff(pa_stream *s, pa_usec_t a, pa_usec_t b, int *negative) {
|
||||
assert(s);
|
||||
assert(s->ref >= 1);
|
||||
|
||||
|
||||
if (negative)
|
||||
*negative = 0;
|
||||
|
||||
if (a >= b)
|
||||
if (a >= b)
|
||||
return a-b;
|
||||
else {
|
||||
if (negative && s->direction == PA_STREAM_RECORD) {
|
||||
|
|
@ -1305,7 +1305,7 @@ int pa_stream_get_latency(pa_stream *s, pa_usec_t *r_usec, int *negative) {
|
|||
PA_CHECK_VALIDITY(s->context, s->timing_info_valid, PA_ERR_NODATA);
|
||||
PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_PLAYBACK || !s->timing_info.write_index_corrupt, PA_ERR_NODATA);
|
||||
PA_CHECK_VALIDITY(s->context, s->direction != PA_STREAM_RECORD || !s->timing_info.read_index_corrupt, PA_ERR_NODATA);
|
||||
|
||||
|
||||
if ((r = pa_stream_get_time(s, &t)) < 0)
|
||||
return r;
|
||||
|
||||
|
|
@ -1316,7 +1316,7 @@ int pa_stream_get_latency(pa_stream *s, pa_usec_t *r_usec, int *negative) {
|
|||
|
||||
if (cindex < 0)
|
||||
cindex = 0;
|
||||
|
||||
|
||||
c = pa_bytes_to_usec(cindex, &s->sample_spec);
|
||||
|
||||
if (s->direction == PA_STREAM_PLAYBACK)
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -113,7 +113,7 @@
|
|||
* read index may be larger than the write index, in which case
|
||||
* silence is played. If the application writes data to indexes lower
|
||||
* than the read index, the data is immediately lost.
|
||||
*
|
||||
*
|
||||
* \section transfer_sec Transferring Data
|
||||
*
|
||||
* Once the stream is up, data can start flowing between the client and the
|
||||
|
|
@ -159,13 +159,13 @@
|
|||
* \li PA_SEEK_ABSOLUTE - seek relative to the beginning of the playback buffer, (i.e. the first that was ever played in the stream)
|
||||
* \li PA_SEEK_RELATIVE_ON_READ - seek relative to the current read index. Use this to write data to the output buffer that should be played as soon as possible
|
||||
* \li PA_SEEK_RELATIVE_END - seek relative to the last byte ever written.
|
||||
*
|
||||
*
|
||||
* If an application just wants to append some data to the output
|
||||
* buffer, PA_SEEK_RELATIVE and an offset of 0 should be used.
|
||||
*
|
||||
* After a call to pa_stream_write() the write index will be left at
|
||||
* the position right after the last byte of the written data.
|
||||
*
|
||||
*
|
||||
* \section latency_sec Latency
|
||||
*
|
||||
* A major problem with networked audio is the increased latency caused by
|
||||
|
|
@ -217,7 +217,7 @@
|
|||
* this option with PA_STREAM_AUTO_TIMING_UPDATE, which will enable
|
||||
* you to monitor the current playback time/latency very precisely and
|
||||
* very frequently without requiring a network round trip every time.
|
||||
*
|
||||
*
|
||||
* \section flow_sec Overflow and underflow
|
||||
*
|
||||
* Even with the best precautions, buffers will sometime over - or
|
||||
|
|
@ -275,7 +275,7 @@ typedef void (*pa_stream_notify_cb_t)(pa_stream *p, void *userdata);
|
|||
|
||||
/** Create a new, unconnected stream with the specified name and sample type */
|
||||
pa_stream* pa_stream_new(
|
||||
pa_context *c /**< The context to create this stream in */,
|
||||
pa_context *c /**< The context to create this stream in */,
|
||||
const char *name /**< A name for this stream */,
|
||||
const pa_sample_spec *ss /**< The desired sample format */,
|
||||
const pa_channel_map *map /**< The desired channel map, or NULL for default */);
|
||||
|
|
@ -320,7 +320,7 @@ int pa_stream_disconnect(pa_stream *s);
|
|||
* is not copied. If NULL, the data is copied into an internal
|
||||
* buffer. The client my freely seek around in the output buffer. For
|
||||
* most applications passing 0 and PA_SEEK_RELATIVE as arguments for
|
||||
* offset and seek should be useful.*/
|
||||
* offset and seek should be useful.*/
|
||||
int pa_stream_write(
|
||||
pa_stream *p /**< The stream to use */,
|
||||
const void *data /**< The data to write */,
|
||||
|
|
@ -333,7 +333,7 @@ int pa_stream_write(
|
|||
* data will point to the actual data and length will contain the size
|
||||
* of the data in bytes (which can be less than a complete framgnet).
|
||||
* Use pa_stream_drop() to actually remove the data from the
|
||||
* buffer. If no data is available will return a NULL pointer \since 0.8 */
|
||||
* buffer. If no data is available will return a NULL pointer \since 0.8 */
|
||||
int pa_stream_peek(
|
||||
pa_stream *p /**< The stream to use */,
|
||||
const void **data /**< Pointer to pointer that will point to data */,
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -69,7 +69,7 @@ pa_operation* pa_context_subscribe(pa_context *c, pa_subscription_mask_t m, pa_c
|
|||
assert(c->ref >= 1);
|
||||
|
||||
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
|
||||
|
||||
|
||||
o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
|
||||
|
||||
t = pa_tagstruct_command(c, PA_COMMAND_SUBSCRIBE, &tag);
|
||||
|
|
@ -83,7 +83,7 @@ pa_operation* pa_context_subscribe(pa_context *c, pa_subscription_mask_t m, pa_c
|
|||
void pa_context_set_subscribe_callback(pa_context *c, pa_context_subscribe_cb_t cb, void *userdata) {
|
||||
assert(c);
|
||||
assert(c->ref >= 1);
|
||||
|
||||
|
||||
c->subscribe_callback = cb;
|
||||
c->subscribe_userdata = userdata;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -128,7 +128,7 @@ void pa_threaded_mainloop_free(pa_threaded_mainloop* m) {
|
|||
pa_mutex_free(m->mutex);
|
||||
pa_cond_free(m->cond);
|
||||
pa_cond_free(m->accept_cond);
|
||||
|
||||
|
||||
pa_xfree(m);
|
||||
}
|
||||
|
||||
|
|
@ -161,7 +161,7 @@ void pa_threaded_mainloop_stop(pa_threaded_mainloop *m) {
|
|||
|
||||
void pa_threaded_mainloop_lock(pa_threaded_mainloop *m) {
|
||||
assert(m);
|
||||
|
||||
|
||||
/* Make sure that this function is not called from the helper thread */
|
||||
assert(!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m));
|
||||
|
||||
|
|
@ -170,7 +170,7 @@ void pa_threaded_mainloop_lock(pa_threaded_mainloop *m) {
|
|||
|
||||
void pa_threaded_mainloop_unlock(pa_threaded_mainloop *m) {
|
||||
assert(m);
|
||||
|
||||
|
||||
/* Make sure that this function is not called from the helper thread */
|
||||
assert(!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m));
|
||||
|
||||
|
|
@ -188,7 +188,7 @@ void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept) {
|
|||
|
||||
void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
|
||||
assert(m);
|
||||
|
||||
|
||||
/* Make sure that this function is not called from the helper thread */
|
||||
assert(!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m));
|
||||
|
||||
|
|
@ -202,7 +202,7 @@ void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
|
|||
|
||||
void pa_threaded_mainloop_accept(pa_threaded_mainloop *m) {
|
||||
assert(m);
|
||||
|
||||
|
||||
/* Make sure that this function is not called from the helper thread */
|
||||
assert(!m->thread || !pa_thread_is_running(m->thread) || !in_worker(m));
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -149,7 +149,7 @@ PA_C_DECL_BEGIN
|
|||
* deal with that.
|
||||
*
|
||||
* The functions will not dead lock because the wait function will release
|
||||
* the lock before waiting and then regrab it once it has been signaled.
|
||||
* the lock before waiting and then regrab it once it has been signaled.
|
||||
* For those of you familiar with threads, the behaviour is that of a
|
||||
* condition variable.
|
||||
*
|
||||
|
|
@ -229,7 +229,7 @@ PA_C_DECL_BEGIN
|
|||
*/
|
||||
|
||||
/** \file
|
||||
*
|
||||
*
|
||||
* A thread based event loop implementation based on pa_mainloop. The
|
||||
* event loop is run in a helper thread in the background. A few
|
||||
* synchronization primitives are available to access the objects
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
@ -38,7 +38,7 @@
|
|||
struct timeval *pa_gettimeofday(struct timeval *tv) {
|
||||
#ifdef HAVE_GETTIMEOFDAY
|
||||
assert(tv);
|
||||
|
||||
|
||||
return gettimeofday(tv, NULL) < 0 ? NULL : tv;
|
||||
#elif defined(OS_IS_WIN32)
|
||||
/*
|
||||
|
|
@ -118,14 +118,14 @@ int pa_timeval_cmp(const struct timeval *a, const struct timeval *b) {
|
|||
pa_usec_t pa_timeval_age(const struct timeval *tv) {
|
||||
struct timeval now;
|
||||
assert(tv);
|
||||
|
||||
|
||||
return pa_timeval_diff(pa_gettimeofday(&now), tv);
|
||||
}
|
||||
|
||||
struct timeval* pa_timeval_add(struct timeval *tv, pa_usec_t v) {
|
||||
unsigned long secs;
|
||||
assert(tv);
|
||||
|
||||
|
||||
secs = (v/1000000);
|
||||
tv->tv_sec += (unsigned long) secs;
|
||||
v -= secs*1000000;
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
|
|||
|
|
@ -130,7 +130,7 @@ ONE_REMAINING:
|
|||
|
||||
if (o)
|
||||
o++;
|
||||
|
||||
|
||||
continue;
|
||||
|
||||
error:
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
@ -79,7 +79,7 @@ char *pa_get_user_name(char *s, size_t l) {
|
|||
|
||||
if (!(p = getenv("USER")) && !(p = getenv("LOGNAME")) && !(p = getenv("USERNAME"))) {
|
||||
#ifdef HAVE_PWD_H
|
||||
|
||||
|
||||
#ifdef HAVE_GETPWUID_R
|
||||
if (getpwuid_r(getuid(), &pw, buf, sizeof(buf), &r) != 0 || !r) {
|
||||
#else
|
||||
|
|
@ -90,7 +90,7 @@ char *pa_get_user_name(char *s, size_t l) {
|
|||
snprintf(s, l, "%lu", (unsigned long) getuid());
|
||||
return s;
|
||||
}
|
||||
|
||||
|
||||
p = r->pw_name;
|
||||
|
||||
#elif defined(OS_IS_WIN32) /* HAVE_PWD_H */
|
||||
|
|
@ -162,26 +162,26 @@ char *pa_get_binary_name(char *s, size_t l) {
|
|||
#if defined(OS_IS_WIN32)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
|
||||
|
||||
if (GetModuleFileName(NULL, path, PATH_MAX))
|
||||
return pa_strlcpy(s, pa_path_get_filename(path), l);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAVE_READLINK
|
||||
{
|
||||
int i;
|
||||
char path[PATH_MAX];
|
||||
/* This works on Linux only */
|
||||
|
||||
|
||||
if ((i = readlink("/proc/self/exe", path, sizeof(path)-1)) >= 0) {
|
||||
path[i] = 0;
|
||||
return pa_strlcpy(s, pa_path_get_filename(path), l);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)
|
||||
{
|
||||
|
||||
|
|
@ -192,14 +192,14 @@ char *pa_get_binary_name(char *s, size_t l) {
|
|||
|
||||
char tcomm[TASK_COMM_LEN+1];
|
||||
memset(tcomm, 0, sizeof(tcomm));
|
||||
|
||||
|
||||
/* This works on Linux only */
|
||||
if (prctl(PR_GET_NAME, (unsigned long) tcomm, 0, 0, 0) == 0)
|
||||
return pa_strlcpy(s, tcomm, l);
|
||||
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
@ -214,7 +214,7 @@ const char *pa_path_get_filename(const char *p) {
|
|||
|
||||
char *pa_get_fqdn(char *s, size_t l) {
|
||||
char hn[256];
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
#ifdef HAVE_GETADDRINFO
|
||||
struct addrinfo *a, hints;
|
||||
#endif
|
||||
|
||||
|
|
@ -225,7 +225,7 @@ char *pa_get_fqdn(char *s, size_t l) {
|
|||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_UNSPEC;
|
||||
hints.ai_flags = AI_CANONNAME;
|
||||
|
||||
|
||||
if (getaddrinfo(hn, NULL, &hints, &a) < 0 || !a || !a->ai_canonname || !*a->ai_canonname)
|
||||
return pa_strlcpy(s, hn, l);
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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
|
||||
Lesser 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -36,7 +36,7 @@ int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) {
|
|||
|
||||
if (a->channels != b->channels)
|
||||
return 0;
|
||||
|
||||
|
||||
for (i = 0; i < a->channels; i++)
|
||||
if (a->values[i] != b->values[i])
|
||||
return 0;
|
||||
|
|
@ -46,7 +46,7 @@ int pa_cvolume_equal(const pa_cvolume *a, const pa_cvolume *b) {
|
|||
|
||||
pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v) {
|
||||
int i;
|
||||
|
||||
|
||||
assert(a);
|
||||
assert(channels > 0);
|
||||
assert(channels <= PA_CHANNELS_MAX);
|
||||
|
|
@ -115,7 +115,7 @@ char *pa_cvolume_snprint(char *s, size_t l, const pa_cvolume *c) {
|
|||
unsigned channel;
|
||||
int first = 1;
|
||||
char *e;
|
||||
|
||||
|
||||
assert(s);
|
||||
assert(l > 0);
|
||||
assert(c);
|
||||
|
|
@ -149,7 +149,7 @@ int pa_cvolume_channels_equal_to(const pa_cvolume *a, pa_volume_t v) {
|
|||
|
||||
pa_cvolume *pa_sw_cvolume_multiply(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b) {
|
||||
unsigned i;
|
||||
|
||||
|
||||
assert(dest);
|
||||
assert(a);
|
||||
assert(b);
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
|
|
@ -2,17 +2,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
@ -60,10 +60,10 @@ void* pa_xmalloc(size_t size) {
|
|||
void *p;
|
||||
assert(size > 0);
|
||||
assert(size < MAX_ALLOC_SIZE);
|
||||
|
||||
|
||||
if (!(p = malloc(size)))
|
||||
oom();
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
|
@ -71,18 +71,18 @@ void* pa_xmalloc0(size_t size) {
|
|||
void *p;
|
||||
assert(size > 0);
|
||||
assert(size < MAX_ALLOC_SIZE);
|
||||
|
||||
|
||||
if (!(p = calloc(1, size)))
|
||||
oom();
|
||||
|
||||
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
void *pa_xrealloc(void *ptr, size_t size) {
|
||||
void *p;
|
||||
assert(size > 0);
|
||||
assert(size < MAX_ALLOC_SIZE);
|
||||
|
||||
|
||||
if (!(p = realloc(ptr, size)))
|
||||
oom();
|
||||
return p;
|
||||
|
|
@ -107,7 +107,7 @@ char *pa_xstrdup(const char *s) {
|
|||
|
||||
char *pa_xstrndup(const char *s, size_t l) {
|
||||
char *e, *r;
|
||||
|
||||
|
||||
if (!s)
|
||||
return NULL;
|
||||
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
|
||||
/***
|
||||
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 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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue