summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common.c4
-rw-r--r--malloc.h2
-rw-r--r--oss.c11
3 files changed, 13 insertions, 4 deletions
diff --git a/common.c b/common.c
index 7ace728..774d4cf 100644
--- a/common.c
+++ b/common.c
@@ -291,7 +291,7 @@ int sa_stream_change_read_volume(sa_stream_t *s, const int32_t vol[], unsigned n
sa_return_val_if_fail((!s->codec && n == s->pcm_attrs.nchannels) || s->pcm_attrs.nchannels == 1, SA_ERROR_INVALID);
if (s->codec || s->pcm_attrs.nchannels == n) {
- if (!(v = sa_newdup(vol, int32_t, n)))
+ if (!(v = sa_newdup(int32_t, vol, n)))
return SA_ERROR_OOM;
} else {
unsigned i;
@@ -323,7 +323,7 @@ int sa_stream_change_write_volume(sa_stream_t *s, const int32_t vol[], unsigned
sa_return_val_if_fail((!s->codec && n == s->pcm_attrs.nchannels) || s->pcm_attrs.nchannels == 1, SA_ERROR_INVALID);
if (s->codec || s->pcm_attrs.nchannels == n) {
- if (!(v = sa_newdup(vol, int32_t, n)))
+ if (!(v = sa_newdup(int32_t, vol, n)))
return SA_ERROR_OOM;
} else {
unsigned i;
diff --git a/malloc.h b/malloc.h
index d9dcee9..bcaf53e 100644
--- a/malloc.h
+++ b/malloc.h
@@ -14,6 +14,6 @@ void* sa_memdup(const void* p, size_t size);
#define sa_new(t, n) ((t*) sa_malloc(sizeof(t)*(n)))
#define sa_new0(t, n) ((t*) sa_malloc0(sizeof(t)*(n)))
-#define sa_newdup(p, t, n) ((t*) sa_memdup(p, sizeof(t)*(n)))
+#define sa_newdup(t, p, n) ((t*) sa_memdup(p, sizeof(t)*(n)))
#endif
diff --git a/oss.c b/oss.c
index 8c46884..50063bd 100644
--- a/oss.c
+++ b/oss.c
@@ -340,8 +340,17 @@ int driver_open(sa_stream_t *s) {
printf("Chosen: %u channels, %uHz, format=%u\n", oss->real_pcm_attrs.nchannels, oss->real_pcm_attrs.rate, oss->real_pcm_attrs.format);
- if (s->adjust_nchannels != 0)
+ if (s->adjust_nchannels != 0) {
+ sa_channel_t *cm;
+
+ if (!(cm = sa_newdup(sa_channel_t, oss->real_pcm_attrs.channel_map, oss->real_pcm_attrs.nchannels)))
+ return SA_ERROR_OOM;
+
+ sa_free(s->pcm_attrs.channel_map);
+ s->pcm_attrs.channel_map = cm;
+
s->pcm_attrs.nchannels = oss->real_pcm_attrs.nchannels;
+ }
if (s->adjust_rate != 0)
s->pcm_attrs.rate = oss->real_pcm_attrs.rate;
if (s->adjust_pcm_format != 0)