From bec5d6e03388a07d9d58a8564f665782231ef8ec Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 14 May 2007 10:46:28 +0000 Subject: * change signature of volume setters to include the size of the array * s/output/write/g, s/input/read/g * make "client_name" mandatory again git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@13 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce --- common.c | 82 ++++++++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 56 insertions(+), 26 deletions(-) (limited to 'common.c') diff --git a/common.c b/common.c index 2214207..fe6c8f0 100644 --- a/common.c +++ b/common.c @@ -25,12 +25,14 @@ static sa_stream_t *stream_alloc(void) { int sa_stream_create_opaque( sa_stream_t **s, + const char *client_name, sa_mode_t mode, const char *codec) { int error; sa_return_val_if_fail(s, SA_ERROR_INVALID); + sa_return_val_if_fail(client_name, 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(codec, SA_ERROR_INVALID); @@ -44,6 +46,9 @@ int sa_stream_create_opaque( goto fail; } + if ((error = sa_stream_change_meta_data(*s, SA_META_CLIENT_NAME, client_name, strlen(client_name))) < 0) + goto fail; + oil_init(); return SA_SUCCESS; @@ -55,6 +60,7 @@ fail: int sa_stream_create_pcm( sa_stream_t **s, + const char *client_name, sa_mode_t mode, sa_pcm_format_t format, unsigned rate, @@ -63,6 +69,7 @@ int sa_stream_create_pcm( int ret; sa_return_val_if_fail(s, SA_ERROR_INVALID); + sa_return_val_if_fail(client_name, 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); sa_return_val_if_fail(rate > 0, SA_ERROR_INVALID); @@ -81,13 +88,16 @@ int sa_stream_create_pcm( static const sa_channel_t map_stereo[2] = { SA_CHANNEL_LEFT, SA_CHANNEL_RIGHT }; static const sa_channel_t map_mono[1] = { SA_CHANNEL_MONO }; - if ((ret = sa_stream_set_channel_map(*s, nchannels == 2 ? map_stereo : map_mono))) + if ((ret = sa_stream_set_channel_map(*s, nchannels == 2 ? map_stereo : map_mono, nchannels))) goto fail; } if ((ret = sa_stream_change_rate(*s, rate))) goto fail; + if ((ret = sa_stream_change_meta_data(*s, SA_META_CLIENT_NAME, client_name, strlen(client_name))) < 0) + goto fail; + oil_init(); return SA_SUCCESS; @@ -122,8 +132,8 @@ int sa_stream_destroy(sa_stream_t *s) { sa_free(s->driver); sa_free(s->device); sa_free(s->pcm_attrs.channel_map); - sa_free(s->input_volume); - sa_free(s->output_volume); + sa_free(s->read_volume); + sa_free(s->write_volume); for (u = 0; u < META_NAMES_MAX; u++) sa_free(s->meta_data[u]); @@ -176,17 +186,17 @@ int sa_stream_set_read_upper_watermark(sa_stream_t *s, size_t size) { return SA_SUCCESS; } -int sa_stream_set_channel_map(sa_stream_t *s, const sa_channel_t *map) { +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; - unsigned n; sa_return_val_if_fail(s, SA_ERROR_INVALID); sa_return_val_if_fail(map, SA_ERROR_INVALID); sa_return_val_if_fail(s->state == SA_STATE_INIT, SA_ERROR_STATE); sa_return_val_if_fail(!s->codec, SA_ERROR_STATE); + sa_return_val_if_fail(n == s->pcm_attrs.nchannels, SA_ERROR_INVALID); - for (c = map, n = s->pcm_attrs.nchannels; n > 0; c++, n--) + for (c = map; n > 0; c++, n--) if (*c >= _SA_CHANNEL_MAX) return SA_ERROR_INVALID; @@ -272,44 +282,64 @@ int sa_stream_change_device(sa_stream_t *s, const char *device_name) { return ret; } -int sa_stream_change_input_volume(sa_stream_t *s, const int32_t vol[]) { +int sa_stream_change_read_volume(sa_stream_t *s, const int32_t vol[], unsigned n) { int *v, ret; sa_return_val_if_fail(s, SA_ERROR_INVALID); sa_return_val_if_fail(vol, SA_ERROR_INVALID); - sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED); sa_return_val_if_fail(s->mode & SA_MODE_RDONLY, SA_ERROR_STATE); + sa_return_val_if_fail((!s->codec && n == s->pcm_attrs.nchannels) || s->pcm_attrs.nchannels == 1, SA_ERROR_INVALID); - if (!(v = sa_newdup(vol, int32_t, s->pcm_attrs.nchannels))) - return SA_ERROR_OOM; + if (s->codec || s->pcm_attrs.nchannels == n) { + if (!(v = sa_newdup(vol, int32_t, n))) + return SA_ERROR_OOM; + } else { + unsigned i; + + if (!(v = sa_new(int32_t, s->pcm_attrs.nchannels))) + 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_input_volume(s, v); + ret = s->state == SA_STATE_INIT ? SA_SUCCESS : driver_change_read_volume(s, v); if (ret == SA_SUCCESS) { - sa_free(s->input_volume); - s->input_volume = v; + sa_free(s->read_volume); + s->read_volume = v; } else sa_free(v); return ret; } -int sa_stream_change_output_volume(sa_stream_t *s, const int32_t vol[]) { +int sa_stream_change_write_volume(sa_stream_t *s, const int32_t vol[], unsigned n) { int *v, ret; sa_return_val_if_fail(s, SA_ERROR_INVALID); sa_return_val_if_fail(vol, SA_ERROR_INVALID); - sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED); sa_return_val_if_fail(s->mode & SA_MODE_WRONLY, SA_ERROR_STATE); + sa_return_val_if_fail((!s->codec && n == s->pcm_attrs.nchannels) || s->pcm_attrs.nchannels == 1, SA_ERROR_INVALID); - if (!(v = sa_newdup(vol, int32_t, s->pcm_attrs.nchannels))) - return SA_ERROR_OOM; + if (s->codec || s->pcm_attrs.nchannels == n) { + if (!(v = sa_newdup(vol, int32_t, n))) + return SA_ERROR_OOM; + } else { + unsigned i; + + if (!(v = sa_new(int32_t, s->pcm_attrs.nchannels))) + 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_output_volume(s, v); + ret = s->state == SA_STATE_INIT ? SA_SUCCESS : driver_change_write_volume(s, v); if (ret == SA_SUCCESS) { - sa_free(s->output_volume); - s->output_volume = v; + sa_free(s->write_volume); + s->write_volume = v; } else sa_free(v); @@ -504,23 +534,23 @@ int sa_stream_get_device(sa_stream_t *s, const char **device_name) { return SA_SUCCESS; } -int sa_stream_get_input_volume(sa_stream_t *s, const int32_t *vol[]) { +int sa_stream_get_read_volume(sa_stream_t *s, const int32_t *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); + sa_return_val_if_fail(s->read_volume, SA_ERROR_STATE); - *vol = s->input_volume; + *vol = s->read_volume; return SA_SUCCESS; } -int sa_stream_get_output_volume(sa_stream_t *s, const int32_t *vol[]) { +int sa_stream_get_write_volume(sa_stream_t *s, const int32_t *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); + sa_return_val_if_fail(s->write_volume, SA_ERROR_STATE); - *vol = s->output_volume; + *vol = s->write_volume; return SA_SUCCESS; } -- cgit