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 --- Makefile | 2 +- common.c | 82 +++++++++++++++++++++++++++++++++++++++++-------------------- common.h | 4 +-- driver.h | 4 +-- oss.c | 4 +-- sydney.h | 22 ++++++++--------- test-sine.c | 4 +-- 7 files changed, 76 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index c46a30a..4338843 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ test-sine: $(OBJS) *.o: *.h indent: - indent -brf -kr -nbbo -nbc -ip0 -ppi 4 -cs -nbfde -npsl -br -brs -bap -i4 -bs -cdw -ce -npcs -nbfda -hnl -cli4 -nut -ci8 < oss.c + indent -bdfa -brf -kr -nbbo -nbc -ip0 -ppi 4 -cs -nbfde -npsl -br -brs -bap -i4 -bs -cdw -ce -npcs -hnl -cli4 -nut -ci8 < oss.c # astyle --indent=spaces=4 --brackets=attach --indent-switches --max-instatement-indent=40 --pad=oper --unpad=paren --convert-tabs --mode=c < oss.c clean: 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; } diff --git a/common.h b/common.h index 0444fd4..5af7268 100644 --- a/common.h +++ b/common.h @@ -35,8 +35,8 @@ struct sa_stream { char *device; char *driver; - int32_t *input_volume; - int32_t *output_volume; + int32_t *read_volume; + int32_t *write_volume; void *user_data; diff --git a/driver.h b/driver.h index 7aaa5e6..5c98070 100644 --- a/driver.h +++ b/driver.h @@ -8,8 +8,8 @@ int driver_destroy(sa_stream_t *dev); int driver_start_thread(sa_stream_t *dev, sa_event_callback_t *callback); int driver_change_device(sa_stream_t *dev, const char *device_name); -int driver_change_input_volume(sa_stream_t *dev, const int32_t vol[]); -int driver_change_output_volume(sa_stream_t *dev, const int32_t vol[]); +int driver_change_read_volume(sa_stream_t *dev, const int32_t vol[]); +int driver_change_write_volume(sa_stream_t *dev, const int32_t vol[]); int driver_change_rate(sa_stream_t *dev, unsigned rate); int driver_change_meta_data(sa_stream_t *dev, const char *name, const void *data, size_t size); diff --git a/oss.c b/oss.c index fc1d540..8c46884 100644 --- a/oss.c +++ b/oss.c @@ -376,7 +376,7 @@ int driver_start_thread(sa_stream_t *s, sa_event_callback_t *callback) { return SA_ERROR_NOT_SUPPORTED; } -int driver_change_input_volume(sa_stream_t *s, const int32_t vol[]) { +int driver_change_read_volume(sa_stream_t *s, const int32_t vol[]) { oss_stream_t *oss = OSS_STREAM(s); sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED); @@ -386,7 +386,7 @@ int driver_change_input_volume(sa_stream_t *s, const int32_t vol[]) { return SA_SUCCESS; } -int driver_change_output_volume(sa_stream_t *s, const int32_t vol[]) { +int driver_change_write_volume(sa_stream_t *s, const int32_t vol[]) { oss_stream_t *oss = OSS_STREAM(s); sa_return_val_if_fail(!s->codec, SA_ERROR_NOT_SUPPORTED); diff --git a/sydney.h b/sydney.h index 58d7a88..401eac5 100644 --- a/sydney.h +++ b/sydney.h @@ -111,11 +111,11 @@ typedef enum { /** Possible events for notifications */ typedef enum { - SA_NOTIFY_REQUEST_STOP, SA_NOTIFY_REQUEST_START, - SA_NOTIFY_VOLUME_CHANGED_IN, - SA_NOTIFY_VOLUME_CHANGED_OUT, - SA_NOTIFY_DEVICE_CHANGED, + SA_NOTIFY_REQUEST_STOP, + SA_NOTIFY_CHANGED_READ_VOLUME, + SA_NOTIFY_CHANGED_WRITE_VOLUME, + SA_NOTIFY_CHANGED_DEVICE, _SA_NOTIFY_MAX } sa_notify_t; @@ -235,10 +235,10 @@ typedef enum { typedef int (*sa_event_callback_t)(sa_stream_t *s, sa_event_t event); /** Create an opaque (e.g. AC3) codec stream */ -int sa_stream_create_opaque(sa_stream_t **s, sa_mode_t mode, const char *codec); +int sa_stream_create_opaque(sa_stream_t **s, const char *client_name, sa_mode_t mode, const char *codec); /** Normal way to open a PCM device */ -int sa_stream_create_pcm(sa_stream_t **s, sa_mode_t mode, sa_pcm_format_t format, unsigned rate, unsigned nchannels); +int sa_stream_create_pcm(sa_stream_t **s, const char *client_name, sa_mode_t mode, sa_pcm_format_t format, unsigned rate, unsigned nchannels); /** Initialise the device */ int sa_stream_open(sa_stream_t *s); @@ -253,7 +253,7 @@ int sa_stream_set_write_upper_watermark(sa_stream_t *s, size_t size); int sa_stream_set_read_upper_watermark(sa_stream_t *s, size_t size); /** Set the mapping between channels and the loudspeakers */ -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); /** Whether xruns cause the card to reset */ int sa_stream_set_xrun_mode(sa_stream_t *s, sa_xrun_mode_t mode); @@ -274,10 +274,10 @@ int sa_stream_start_thread(sa_stream_t *s, sa_event_callback_t *callback); int sa_stream_change_device(sa_stream_t *s, const char *device_name); /** volume in hundreths of dB*/ -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); /** volume in hundreths of dB*/ -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); /** Change the sampling rate */ int sa_stream_change_rate(sa_stream_t *s, unsigned rate); @@ -311,8 +311,8 @@ int sa_stream_get_non_interleaved(sa_stream_t *s, int *enabled); int sa_stream_get_dynamic_rate(sa_stream_t *s, int *enabled); int sa_stream_get_driver(sa_stream_t *s, const char **driver); int sa_stream_get_device(sa_stream_t *s, const char **device_name); -int sa_stream_get_input_volume(sa_stream_t *s, const int32_t *vol[]); -int sa_stream_get_output_volume(sa_stream_t *s, const int32_t *vol[]); +int sa_stream_get_read_volume(sa_stream_t *s, const int32_t *vol[]); +int sa_stream_get_write_volume(sa_stream_t *s, const int32_t *vol[]); int sa_stream_get_meta_data(sa_stream_t *s, const char *name, const void **data, size_t *size); int sa_stream_get_adjust_rate(sa_stream_t *s, sa_adjust_t *direction); int sa_stream_get_adjust_nchannels(sa_stream_t *s, sa_adjust_t *direction); diff --git a/test-sine.c b/test-sine.c index 57d38e1..b3a49e9 100644 --- a/test-sine.c +++ b/test-sine.c @@ -24,7 +24,7 @@ int main(int argc, char *argv[]) { float data[4] = { 0.0, 1.0, 0.0, -1.0 }; int i, j; - ASSERT_SUCCESS(sa_stream_create_pcm(&dev, SA_MODE_WRONLY, SA_PCM_FORMAT_FLOAT32_NE, FREQ * 4, 1)); + ASSERT_SUCCESS(sa_stream_create_pcm(&dev, "Sine Test", SA_MODE_WRONLY, SA_PCM_FORMAT_FLOAT32_NE, FREQ * 4, 1)); ASSERT_SUCCESS(sa_stream_change_device(dev, "/dev/dsp1")); ASSERT_SUCCESS(sa_stream_set_dynamic_rate(dev, 1)); sa_stream_change_meta_data(dev, SA_META_CLIENT_NAME, argv[0], strlen(argv[0])); @@ -36,7 +36,7 @@ int main(int argc, char *argv[]) { v = -j*500; /* ASSERT_SUCCESS(sa_stream_change_rate(dev, FREQ*4+100*j)); */ - ASSERT_SUCCESS(sa_stream_change_output_volume(dev, &v)); + ASSERT_SUCCESS(sa_stream_change_write_volume(dev, &v, 1)); for (i = 0; i < FREQ; i++) ASSERT_SUCCESS(sa_stream_write(dev, data, sizeof(data))); -- cgit