summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--common.c82
-rw-r--r--common.h4
-rw-r--r--driver.h4
-rw-r--r--oss.c4
-rw-r--r--sydney.h22
-rw-r--r--test-sine.c4
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)));