summaryrefslogtreecommitdiffstats
path: root/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'common.c')
-rw-r--r--common.c193
1 files changed, 184 insertions, 9 deletions
diff --git a/common.c b/common.c
index 7219ae5..89779bb 100644
--- a/common.c
+++ b/common.c
@@ -137,6 +137,7 @@ int sa_stream_set_write_lower_watermark(sa_stream_t *s, size_t size) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size > 0, SA_ERROR_INVALID);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
s->write_lower_watermark = size;
return SA_SUCCESS;
@@ -147,6 +148,7 @@ int sa_stream_set_read_lower_watermark(sa_stream_t *s, size_t size) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size > 0, SA_ERROR_INVALID);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
s->read_lower_watermark = size;
return SA_SUCCESS;
@@ -157,6 +159,7 @@ int sa_stream_set_write_upper_watermark(sa_stream_t *s, size_t size) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size > 0, SA_ERROR_INVALID);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
s->write_upper_watermark = size;
return SA_SUCCESS;
@@ -167,6 +170,7 @@ int sa_stream_set_read_upper_watermark(sa_stream_t *s, size_t size) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(size > 0, SA_ERROR_INVALID);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
s->read_upper_watermark = size;
return SA_SUCCESS;
@@ -183,7 +187,7 @@ int sa_stream_set_channel_map(sa_stream_t *s, const sa_channel_t *map) {
sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
for (c = map, n = s->pcm_attrs.nchannels; n > 0; c++, n--)
- if (*c >= SA_CHANNEL_MAX)
+ if (*c >= _SA_CHANNEL_MAX)
return SA_ERROR_INVALID;
if (!(m = sa_memdup(map, sizeof(sa_channel_t) * s->pcm_attrs.nchannels)))
@@ -335,7 +339,7 @@ int sa_stream_change_user_data(sa_stream_t *s, void *value) {
return SA_SUCCESS;
}
-int sa_stream_adjust_rate(sa_stream_t *s, sa_adjust_t direction) {
+int sa_stream_set_adjust_rate(sa_stream_t *s, sa_adjust_t direction) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
@@ -344,7 +348,7 @@ int sa_stream_adjust_rate(sa_stream_t *s, sa_adjust_t direction) {
return SA_SUCCESS;
}
-int sa_stream_adjust_nchannels(sa_stream_t *s, sa_adjust_t direction) {
+int sa_stream_set_adjust_nchannels(sa_stream_t *s, sa_adjust_t direction) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
@@ -353,7 +357,7 @@ int sa_stream_adjust_nchannels(sa_stream_t *s, sa_adjust_t direction) {
return SA_SUCCESS;
}
-int sa_stream_adjust_pcm_format(sa_stream_t *s, sa_adjust_t direction) {
+int sa_stream_set_adjust_pcm_format(sa_stream_t *s, sa_adjust_t direction) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE);
@@ -396,6 +400,157 @@ int sa_stream_get_pcm_format(sa_stream_t *s, sa_pcm_format_t *pcm_format) {
return SA_SUCCESS;
}
+int sa_stream_get_mode(sa_stream_t *s, sa_mode_t *access_mode) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(access_mode, SA_ERROR_INVALID);
+
+ *access_mode = s->mode;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_codec(sa_stream_t *s, const char **codec) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(codec, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->codec, SA_ERROR_STATE);
+
+ *codec = s->codec;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_write_lower_watermark(sa_stream_t *s, size_t *size) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(size, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
+
+ *size = s->write_lower_watermark;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_read_lower_watermark(sa_stream_t *s, size_t *size) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(size, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
+
+ *size = s->read_lower_watermark;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_write_upper_watermark(sa_stream_t *s, size_t *size) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(size, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
+
+ *size = s->write_upper_watermark;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_read_upper_watermark(sa_stream_t *s, size_t *size) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(size, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
+
+ *size = s->read_upper_watermark;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_channel_map(sa_stream_t *s, const sa_channel_t *map[]) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(map, SA_ERROR_INVALID);
+ sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
+
+ *map = s->pcm_attrs.channel_map;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_xrun_mode(sa_stream_t *s, sa_xrun_mode_t *mode) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(mode, SA_ERROR_INVALID);
+
+ *mode = s->xrun_mode;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_ni(sa_stream_t *s, int *enabled) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(enabled, SA_ERROR_INVALID);
+
+ *enabled = s->ni_enabled;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_dynamic_rate(sa_stream_t *s, int *enabled) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(enabled, SA_ERROR_INVALID);
+
+ *enabled = s->ni_enabled;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_driver(sa_stream_t *s, const char **driver) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(driver, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->driver, SA_ERROR_STATE);
+
+ *driver = s->driver;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_device(sa_stream_t *s, const char **device_name) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(device_name, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->device, SA_ERROR_STATE);
+
+ *device_name = s->device;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_input_volume(sa_stream_t *s, const int *vol[]) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(vol, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->input_volume, SA_ERROR_STATE);
+
+ *vol = s->input_volume;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_output_volume(sa_stream_t *s, const int *vol[]) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(vol, SA_ERROR_INVALID);
+ sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE);
+ sa_return_val_if_fail(s->output_volume, SA_ERROR_STATE);
+
+ *vol = s->output_volume;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_adjust_rate(sa_stream_t *s, sa_adjust_t *direction) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(direction, SA_ERROR_INVALID);
+ sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
+
+ *direction = s->adjust_rate;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_adjust_nchannels(sa_stream_t *s, sa_adjust_t *direction) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(direction, SA_ERROR_INVALID);
+ sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
+
+ *direction = s->adjust_nchannels;
+ return SA_SUCCESS;
+}
+
+int sa_stream_get_adjust_pcm_format(sa_stream_t *s, sa_adjust_t *direction) {
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(direction, SA_ERROR_INVALID);
+ sa_return_val_if_fail(!s->codec, SA_ERROR_STATE);
+
+ *direction = s->adjust_pcm_format;
+ return SA_SUCCESS;
+}
+
int sa_stream_get_user_data(sa_stream_t *s, void **value) {
sa_return_val_if_fail(s, SA_ERROR_INVALID);
sa_return_val_if_fail(value, SA_ERROR_INVALID);
@@ -425,7 +580,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) {
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);
+ sa_return_val_if_fail(position < _SA_POSITION_MAX, SA_ERROR_INVALID);
sa_return_val_if_fail(s->state == SA_STATE_RUNNING || s->state == SA_STATE_STOPPED, SA_ERROR_STATE);
return driver_get_position(s, position, pos);
@@ -693,9 +848,28 @@ int sa_stream_change_meta_data(sa_stream_t *s, const char *name, const void *dat
return ret;
}
+int sa_stream_get_meta_data(sa_stream_t *s, const char *name, const void **data, size_t *size) {
+ const struct meta_name *m;
+
+ sa_return_val_if_fail(s, SA_ERROR_INVALID);
+ sa_return_val_if_fail(name, SA_ERROR_INVALID);
+ sa_return_val_if_fail(data, SA_ERROR_INVALID);
+ sa_return_val_if_fail(size, SA_ERROR_INVALID);
+
+ if (!(m = lookup_meta_name(name, strlen(name))))
+ return SA_ERROR_NO_META;
+
+ if (!s->meta_data[m->idx])
+ return SA_ERROR_NO_DATA;
+
+ *data = s->meta_data[m->idx];
+ *size = s->meta_data_size[m->idx];
+
+ return SA_SUCCESS;
+}
const char *sa_strerror(int code) {
- const char * const error_table[-SA_ERROR_MAX] = {
+ const char * const error_table[-_SA_ERROR_MAX] = {
[-SA_SUCCESS] = "Success",
[-SA_ERROR_NOT_SUPPORTED] = "Operation not supported",
[-SA_ERROR_INVALID] = "Invalid argument",
@@ -707,11 +881,12 @@ const char *sa_strerror(int code) {
[-SA_ERROR_NO_PCM_FORMAT] = "No such PCM format",
[-SA_ERROR_SYSTEM] = "System error",
[-SA_ERROR_NO_INIT] = "Not initialized",
- [-SA_ERROR_NO_META] ="No such meta name"
+ [-SA_ERROR_NO_META] = "No such meta name",
+ [-SA_ERROR_NO_DATA] = "No such data"
};
- sa_assert(code <= 0);
- sa_assert(code > SA_ERROR_MAX);
+ sa_return_val_if_fail(code <= 0, NULL);
+ sa_return_val_if_fail(code > _SA_ERROR_MAX, NULL);
return error_table[-code];
}