summaryrefslogtreecommitdiffstats
path: root/src/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/common.c')
-rw-r--r--src/common.c108
1 files changed, 56 insertions, 52 deletions
diff --git a/src/common.c b/src/common.c
index 5a81d02..c8017e8 100644
--- a/src/common.c
+++ b/src/common.c
@@ -1,3 +1,7 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
#include <string.h>
#include <errno.h>
#include <liboil/liboil.h>
@@ -21,11 +25,11 @@ static sa_stream_t *stream_alloc(void) {
/* All fields a carefully chosen in a way that initializing them
* NUL bytes is sufficient */
- if (!(d->mutex = sa_mutex_new(0))) {
+ if (!(d->mutex = sa_mutex_new(FALSE, FALSE))) {
sa_free(d);
return NULL;
}
-
+
return d;
}
@@ -34,7 +38,7 @@ int sa_stream_create_opaque(
const char *client_name,
sa_mode_t mode,
const char *codec) {
-
+
int error;
sa_return_val_if_fail(s, SA_ERROR_INVALID);
@@ -74,7 +78,7 @@ int sa_stream_create_pcm(
int ret;
size_t lwm;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(mode == SA_MODE_RDONLY || mode == SA_MODE_WRONLY || mode == SA_MODE_RDWR, SA_ERROR_INVALID);
sa_return_val_if_fail(format < _SA_PCM_FORMAT_MAX, SA_ERROR_INVALID);
@@ -100,12 +104,12 @@ int sa_stream_create_pcm(
if ((ret = sa_stream_change_rate(*s, rate)))
goto fail;
-
+
lwm = ((*s)->pcm_frame_size * (*s)->pcm_attrs.rate) / 20; /* 50 ms */
if (lwm <= 0)
lwm = (*s)->pcm_frame_size * (*s)->pcm_attrs.rate; /* 1s */
-
+
if (mode & SA_MODE_RDONLY) {
if ((ret = sa_stream_set_read_lower_watermark(*s, lwm)))
@@ -113,7 +117,7 @@ int sa_stream_create_pcm(
if ((ret = sa_stream_set_read_upper_watermark(*s, lwm*2)))
goto fail;
- }
+ }
if (mode & SA_MODE_WRONLY) {
@@ -123,24 +127,24 @@ int sa_stream_create_pcm(
if ((ret = sa_stream_set_write_upper_watermark(*s, lwm*2)))
goto fail;
}
-
+
oil_init();
if (client_name)
if ((ret = sa_stream_change_meta_data(*s, SA_META_CLIENT_NAME, client_name, strlen(client_name))) < 0)
goto fail;
-
+
return SA_SUCCESS;
fail:
-
+
sa_stream_destroy(*s);
return ret;
}
int sa_stream_open(sa_stream_t *s) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_INIT, SA_ERROR_STATE);
@@ -161,7 +165,7 @@ int sa_stream_open(sa_stream_t *s) {
int sa_stream_destroy(sa_stream_t *s) {
int ret;
unsigned u;
-
+
sa_return_val_if_fail_mutex(s->mutex, s, SA_ERROR_INVALID);
ret = driver_destroy(s);
@@ -241,7 +245,7 @@ int sa_stream_set_read_upper_watermark(sa_stream_t *s, size_t size) {
int sa_stream_set_channel_map(sa_stream_t *s, const sa_channel_t *map, unsigned n) {
const sa_channel_t *c;
sa_channel_t *m;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(map, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -254,7 +258,7 @@ int sa_stream_set_channel_map(sa_stream_t *s, const sa_channel_t *map, unsigned
sa_mutex_unlock(s->mutex);
return SA_ERROR_INVALID;
}
-
+
if (!(m = sa_memdup(map, sizeof(sa_channel_t) * s->pcm_attrs.nchannels))) {
sa_mutex_unlock(s->mutex);
return SA_ERROR_OOM;
@@ -305,7 +309,7 @@ int sa_stream_set_dynamic_rate(sa_stream_t *s, int enable) {
int sa_stream_set_driver(sa_stream_t *s, const char *driver) {
char *d;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(driver, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -315,17 +319,17 @@ int sa_stream_set_driver(sa_stream_t *s, const char *driver) {
sa_mutex_unlock(s->mutex);
return SA_ERROR_OOM;
}
-
+
sa_free(s->driver);
s->driver = d;
-
+
sa_mutex_unlock(s->mutex);
return SA_SUCCESS;
}
int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t callback) {
int r;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(callback, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -336,14 +340,14 @@ int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t callback) {
if (r == SA_SUCCESS)
s->callback = callback;
-
+
sa_mutex_unlock(s->mutex);
return r;
}
int sa_stream_stop_thread(sa_stream_t *s) {
int r;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
@@ -353,7 +357,7 @@ int sa_stream_stop_thread(sa_stream_t *s) {
if (r == SA_SUCCESS)
s->callback = NULL;
-
+
sa_mutex_unlock(s->mutex);
return r;
}
@@ -361,7 +365,7 @@ int sa_stream_stop_thread(sa_stream_t *s) {
int sa_stream_change_device(sa_stream_t *s, const char *device_name) {
char *d;
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(device_name, SA_ERROR_INVALID);
@@ -379,7 +383,7 @@ int sa_stream_change_device(sa_stream_t *s, const char *device_name) {
sa_free(d);
sa_mutex_unlock(s->mutex);
-
+
return ret;
}
@@ -404,11 +408,11 @@ int sa_stream_change_read_volume(sa_stream_t *s, const int32_t vol[], unsigned n
sa_mutex_unlock(s->mutex);
return SA_ERROR_OOM;
}
-
+
for (i = 0; i < s->pcm_attrs.nchannels; i++)
v[i] = vol[0];
}
-
+
ret = s->state == SA_STATE_INIT ? SA_SUCCESS : driver_change_read_volume(s, v);
if (ret == SA_SUCCESS) {
@@ -442,7 +446,7 @@ int sa_stream_change_write_volume(sa_stream_t *s, const int32_t vol[], unsigned
sa_mutex_unlock(s->mutex);
return SA_ERROR_OOM;
}
-
+
for (i = 0; i < s->pcm_attrs.nchannels; i++)
v[i] = vol[0];
}
@@ -461,7 +465,7 @@ int sa_stream_change_write_volume(sa_stream_t *s, const int32_t vol[], unsigned
int sa_stream_change_rate(sa_stream_t *s, unsigned rate) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(rate > 0, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -480,9 +484,9 @@ int sa_stream_change_rate(sa_stream_t *s, unsigned rate) {
int sa_stream_change_user_data(sa_stream_t *s, const void *value) {
sa_return_val_if_fail(s->mutex, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
-
+
s->user_data = (void*) value;
-
+
sa_mutex_unlock(s->mutex);
return SA_SUCCESS;
}
@@ -597,7 +601,7 @@ int sa_stream_get_mode(sa_stream_t *s, sa_mode_t *access_mode) {
int sa_stream_get_codec(sa_stream_t *s, char *codec, size_t *size) {
size_t n;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size && (*size == 0 || codec), SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -612,7 +616,7 @@ int sa_stream_get_codec(sa_stream_t *s, char *codec, size_t *size) {
if (codec)
strcpy(codec, s->codec);
*size = n;
-
+
sa_mutex_unlock(s->mutex);
return SA_SUCCESS;
}
@@ -719,7 +723,7 @@ int sa_stream_get_dynamic_rate(sa_stream_t *s, int *enabled) {
int sa_stream_get_driver(sa_stream_t *s, char *driver, size_t *size) {
size_t n;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size && (*size == 0 || driver), SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -734,7 +738,7 @@ int sa_stream_get_driver(sa_stream_t *s, char *driver, size_t *size) {
if (driver)
strcpy(driver, s->driver);
*size = n;
-
+
sa_mutex_unlock(s->mutex);
return SA_SUCCESS;
}
@@ -885,7 +889,7 @@ int sa_stream_get_event_notify(sa_stream_t *s, sa_notify_t *notify) {
int sa_stream_get_position(sa_stream_t *s, sa_position_t position, int64_t *pos) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(pos, SA_ERROR_INVALID);
sa_return_val_if_fail(position < _SA_POSITION_MAX, SA_ERROR_INVALID);
@@ -930,7 +934,7 @@ int sa_stream_read_ni(sa_stream_t *s, unsigned channel, void *data, size_t nbyte
sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
ret = driver_read_ni(s, channel, data, nbytes);
-
+
sa_mutex_unlock(s->mutex);
return ret;
}
@@ -945,7 +949,7 @@ int sa_stream_write_ni(sa_stream_t *s, unsigned channel, const void *data, size_
int sa_stream_pwrite(sa_stream_t *s, const void *data, size_t nbytes, int64_t offset, sa_seek_t whence) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(data, SA_ERROR_INVALID);
sa_return_val_if_fail(nbytes > 0, SA_ERROR_INVALID);
@@ -1002,7 +1006,7 @@ int sa_stream_get_read_size(sa_stream_t *s, size_t *size) {
int sa_stream_get_write_size(sa_stream_t *s, size_t *size) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -1017,7 +1021,7 @@ int sa_stream_get_write_size(sa_stream_t *s, size_t *size) {
int sa_stream_resume(sa_stream_t *s) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
sa_return_val_if_fail_mutex(s->mutex, s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
@@ -1043,7 +1047,7 @@ int sa_stream_pause(sa_stream_t *s) {
int sa_stream_drain(sa_stream_t *s) {
int ret;
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
sa_return_val_if_fail_mutex(s->mutex, s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
@@ -1056,7 +1060,7 @@ int sa_stream_drain(sa_stream_t *s) {
}
size_t sa_get_pcm_sample_size(sa_pcm_format_t f) {
-
+
switch (f) {
case SA_PCM_FORMAT_U8:
case SA_PCM_FORMAT_ULAW:
@@ -1069,7 +1073,7 @@ size_t sa_get_pcm_sample_size(sa_pcm_format_t f) {
case SA_PCM_FORMAT_S24_LE:
case SA_PCM_FORMAT_S24_BE:
return 3;
-
+
case SA_PCM_FORMAT_S32_LE:
case SA_PCM_FORMAT_S32_BE:
case SA_PCM_FORMAT_FLOAT32_LE:
@@ -1089,13 +1093,13 @@ static int meta_check_png(const void *data, size_t size) {
if (size < sizeof(png_signature))
return 0;
-
+
return memcmp(data, png_signature, 8) == 0;
}
static int meta_check_utf8(const void *data, size_t size) {
int32_t idx;
-
+
oil_utf8_validate(&idx, data, size);
return (size_t) idx == size;
@@ -1110,14 +1114,14 @@ static int meta_check_pid(const void *data, size_t size) {
if (memchr(data, 0, size))
return 0;
-
+
if (!(t = sa_strndup(data, size)))
return 0;
-
+
errno = 0;
pid = strtol(t, NULL, 10);
sa_free(t);
-
+
if (errno != 0)
return 0;
@@ -1135,7 +1139,7 @@ static int meta_check_icon_name(const void *data, size_t size) {
if (memchr(data, 0, size))
return 0;
-
+
if (size == 1 && t[0] == '.')
return 0;
@@ -1144,7 +1148,7 @@ static int meta_check_icon_name(const void *data, size_t size) {
if (memchr(t, '/', size))
return 0;
-
+
return 1;
}
@@ -1154,7 +1158,7 @@ static int meta_check_word(const void *data, size_t size) {
for (; size > 0; size --, t++)
if (*t <= 32 || *t >= 127)
return 0;
-
+
return 1;
}
@@ -1175,7 +1179,7 @@ int sa_stream_change_meta_data(sa_stream_t *s, const char *name, const void *dat
meta_check_word, /* FIXME */
meta_check_word, /* FIXME */
};
-
+
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(name, SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
@@ -1205,7 +1209,7 @@ int sa_stream_change_meta_data(sa_stream_t *s, const char *name, const void *dat
s->meta_data_size[m->idx] = size;
} else
sa_free(d);
-
+
sa_mutex_unlock(s->mutex);
return ret;
}
@@ -1217,7 +1221,7 @@ int sa_stream_get_meta_data(sa_stream_t *s, const char *name, void *data, size_t
sa_return_val_if_fail(name, SA_ERROR_INVALID);
sa_return_val_if_fail(size && (*size == 0 || data), SA_ERROR_INVALID);
sa_mutex_lock(s->mutex);
-
+
if (!(m = sa_lookup_meta_name(name, strlen(name)))) {
sa_mutex_unlock(s->mutex);
return SA_ERROR_NO_META;