alsa/alsa-lib-hg-fixes.diff

853 lines
35 KiB
Diff
Raw Normal View History

diff -r 3cfb9808fb42 include/global.h
--- a/include/global.h Mon Feb 26 09:21:12 2007 +0100
+++ b/include/global.h Mon Jan 22 11:45:18 2007 +0100
@@ -130,7 +130,7 @@ int snd_shm_area_destroy(struct snd_shm_
int snd_user_file(const char *file, char **result);
-#ifndef _POSIX_C_SOURCE
+#if !defined(_POSIX_C_SOURCE) && !defined(_POSIX_SOURCE)
struct timeval {
time_t tv_sec; /* seconds */
long tv_usec; /* microseconds */
diff -r 3cfb9808fb42 src/pcm/pcm.c
--- a/src/pcm/pcm.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm.c Tue Mar 13 15:26:22 2007 +0100
@@ -6313,15 +6313,6 @@ snd_pcm_sframes_t snd_pcm_mmap_commit(sn
}
#ifndef DOC_HIDDEN
-
-int _snd_pcm_link_descriptors(snd_pcm_t *pcm, int *fds, int count,
- int (**failed)(snd_pcm_t *, int))
-{
- assert(pcm);
- if (pcm->fast_ops->link_fd)
- return pcm->fast_ops->link_fd(pcm, fds, count, failed);
- return -ENOSYS;
-}
int _snd_pcm_poll_descriptor(snd_pcm_t *pcm)
{
diff -r 3cfb9808fb42 src/pcm/pcm_direct.c
--- a/src/pcm/pcm_direct.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_direct.c Mon Mar 12 11:31:18 2007 +0100
@@ -885,7 +885,7 @@ int snd_pcm_direct_initialize_slave(snd_
SND_PCM_FORMAT_S24_3LE,
};
snd_pcm_format_t format;
- int i;
+ unsigned int i;
for (i = 0; i < sizeof dmix_formats / sizeof dmix_formats[0]; ++i) {
format = dmix_formats[i];
diff -r 3cfb9808fb42 src/pcm/pcm_dmix.c
--- a/src/pcm/pcm_dmix.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_dmix.c Tue Mar 13 15:26:22 2007 +0100
@@ -757,8 +757,8 @@ static snd_pcm_fast_ops_t snd_pcm_dmix_f
.rewind = snd_pcm_dmix_rewind,
.forward = snd_pcm_dmix_forward,
.resume = snd_pcm_direct_resume,
- .link_fd = NULL,
.link = NULL,
+ .link_slaves = NULL,
.unlink = NULL,
.writei = snd_pcm_mmap_writei,
.writen = snd_pcm_mmap_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_dshare.c
--- a/src/pcm/pcm_dshare.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_dshare.c Tue Mar 13 15:26:22 2007 +0100
@@ -562,8 +562,8 @@ static snd_pcm_fast_ops_t snd_pcm_dshare
.rewind = snd_pcm_dshare_rewind,
.forward = snd_pcm_dshare_forward,
.resume = snd_pcm_direct_resume,
- .link_fd = NULL,
.link = NULL,
+ .link_slaves = NULL,
.unlink = NULL,
.writei = snd_pcm_mmap_writei,
.writen = snd_pcm_mmap_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_dsnoop.c
--- a/src/pcm/pcm_dsnoop.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_dsnoop.c Tue Mar 13 15:26:22 2007 +0100
@@ -452,8 +452,8 @@ static snd_pcm_fast_ops_t snd_pcm_dsnoop
.rewind = snd_pcm_dsnoop_rewind,
.forward = snd_pcm_dsnoop_forward,
.resume = snd_pcm_direct_resume,
- .link_fd = NULL,
.link = NULL,
+ .link_slaves = NULL,
.unlink = NULL,
.writei = snd_pcm_dsnoop_writei,
.writen = snd_pcm_dsnoop_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_file.c
--- a/src/pcm/pcm_file.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_file.c Tue Mar 13 15:26:22 2007 +0100
@@ -373,8 +373,8 @@ static snd_pcm_fast_ops_t snd_pcm_file_f
.rewind = snd_pcm_file_rewind,
.forward = snd_pcm_file_forward,
.resume = snd_pcm_generic_resume,
- .link_fd = snd_pcm_generic_link_fd,
.link = snd_pcm_generic_link,
+ .link_slaves = snd_pcm_generic_link_slaves,
.unlink = snd_pcm_generic_unlink,
.writei = snd_pcm_file_writei,
.writen = snd_pcm_file_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_generic.c
--- a/src/pcm/pcm_generic.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_generic.c Tue Mar 13 15:26:22 2007 +0100
@@ -197,14 +197,6 @@ snd_pcm_sframes_t snd_pcm_generic_rewind
return snd_pcm_rewind(generic->slave, frames);
}
-int snd_pcm_generic_link_fd(snd_pcm_t *pcm, int *fds, int count, int (**failed)(snd_pcm_t *, int))
-{
- snd_pcm_generic_t *generic = pcm->private_data;
- if (generic->slave->fast_ops->link_fd)
- return generic->slave->fast_ops->link_fd(generic->slave->fast_op_arg, fds, count, failed);
- return -ENOSYS;
-}
-
int snd_pcm_generic_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
{
snd_pcm_generic_t *generic = pcm1->private_data;
@@ -213,44 +205,12 @@ int snd_pcm_generic_link(snd_pcm_t *pcm1
return -ENOSYS;
}
-int snd_pcm_generic_link2(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
-{
- int fds1[16], fds2[16];
- int (*failed1)(snd_pcm_t *, int) = NULL;
- int (*failed2)(snd_pcm_t *, int) = NULL;
- int count1 = _snd_pcm_link_descriptors(pcm1, fds1, 16, &failed1);
- int count2 = _snd_pcm_link_descriptors(pcm2, fds2, 16, &failed2);
- int i, err = 0;
-
- if (count1 < 0)
- return count1;
- if (count2 < 0)
- return count2;
- for (i = 1; i < count1; i++) {
- if (fds1[i] < 0)
- return 0;
- if (ioctl(fds1[0], SNDRV_PCM_IOCTL_LINK, fds1[i]) < 0) {
- if (failed1 != NULL) {
- err = failed1(pcm2, fds1[i]);
- } else {
- SYSMSG("SNDRV_PCM_IOCTL_LINK failed");
- err = -errno;
- }
- }
- }
- for (i = 0; i < count2; i++) {
- if (fds2[i] < 0)
- return 0;
- if (ioctl(fds1[0], SNDRV_PCM_IOCTL_LINK, fds2[i]) < 0) {
- if (failed1 != NULL) {
- err = failed2(pcm2, fds2[i]);
- } else {
- SYSMSG("SNDRV_PCM_IOCTL_LINK failed");
- err = -errno;
- }
- }
- }
- return err;
+int snd_pcm_generic_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
+{
+ snd_pcm_generic_t *generic = pcm->private_data;
+ if (generic->slave->fast_ops->link_slaves)
+ return generic->slave->fast_ops->link_slaves(generic->slave->fast_op_arg, master);
+ return -ENOSYS;
}
int snd_pcm_generic_unlink(snd_pcm_t *pcm)
diff -r 3cfb9808fb42 src/pcm/pcm_generic.h
--- a/src/pcm/pcm_generic.h Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_generic.h Tue Mar 13 15:26:22 2007 +0100
@@ -50,9 +50,8 @@ int snd_pcm_generic_delay(snd_pcm_t *pcm
int snd_pcm_generic_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp);
snd_pcm_sframes_t snd_pcm_generic_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
snd_pcm_sframes_t snd_pcm_generic_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
-int snd_pcm_generic_link_fd(snd_pcm_t *pcm, int *fds, int count, int (**failed)(snd_pcm_t *, int));
int snd_pcm_generic_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2);
-int snd_pcm_generic_link2(snd_pcm_t *pcm1, snd_pcm_t *pcm2);
+int snd_pcm_generic_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master);
int snd_pcm_generic_unlink(snd_pcm_t *pcm);
snd_pcm_sframes_t snd_pcm_generic_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
snd_pcm_sframes_t snd_pcm_generic_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
diff -r 3cfb9808fb42 src/pcm/pcm_hooks.c
--- a/src/pcm/pcm_hooks.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_hooks.c Tue Mar 13 15:26:22 2007 +0100
@@ -151,8 +151,8 @@ static snd_pcm_fast_ops_t snd_pcm_hooks_
.rewind = snd_pcm_generic_rewind,
.forward = snd_pcm_generic_forward,
.resume = snd_pcm_generic_resume,
- .link_fd = snd_pcm_generic_link_fd,
.link = snd_pcm_generic_link,
+ .link_slaves = snd_pcm_generic_link_slaves,
.unlink = snd_pcm_generic_unlink,
.writei = snd_pcm_generic_writei,
.writen = snd_pcm_generic_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_hw.c
--- a/src/pcm/pcm_hw.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_hw.c Tue Mar 13 15:26:22 2007 +0100
@@ -686,41 +686,35 @@ static int snd_pcm_hw_resume(snd_pcm_t *
return 0;
}
-static int snd_pcm_hw_link_fd(snd_pcm_t *pcm, int *fds, int count, int (**failed)(snd_pcm_t *, int))
-{
- snd_pcm_hw_t *hw = pcm->private_data;
-
- if (count < 1)
+static int hw_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
+{
+ snd_pcm_hw_t *hw1 = pcm1->private_data;
+ snd_pcm_hw_t *hw2 = pcm2->private_data;
+ if (ioctl(hw1->fd, SNDRV_PCM_IOCTL_LINK, hw2->fd) < 0) {
+ SYSMSG("SNDRV_PCM_IOCTL_LINK failed");
+ return -errno;
+ }
+ return 0;
+}
+
+static int snd_pcm_hw_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
+{
+ if (master->type != SND_PCM_TYPE_HW) {
+ SYSMSG("Invalid type for SNDRV_PCM_IOCTL_LINK");
return -EINVAL;
- *failed = NULL;
- fds[0] = hw->fd;
- return 1;
+ }
+ return hw_link(master, pcm);
}
static int snd_pcm_hw_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
{
- snd_pcm_hw_t *hw = pcm1->private_data;
- int fds[16];
- int (*failed)(snd_pcm_t *, int) = NULL;
- int count = _snd_pcm_link_descriptors(pcm2, fds, 16, &failed);
- int i, err = 0;
-
- if (count < 0)
- return count;
- for (i = 0; i < count; i++) {
- if (fds[i] < 0)
- return 0;
- if (ioctl(hw->fd, SNDRV_PCM_IOCTL_LINK, fds[i]) < 0) {
- if (failed != NULL) {
- err = failed(pcm2, fds[i]);
- } else {
- SYSMSG("SNDRV_PCM_IOCTL_LINK failed");
- err = -errno;
- }
- }
- }
- return err;
-}
+ if (pcm2->type != SND_PCM_TYPE_HW) {
+ if (pcm2->fast_ops->link_slaves)
+ return pcm2->fast_ops->link_slaves(pcm2, pcm1);
+ return -ENOSYS;
+ }
+ return hw_link(pcm1, pcm2);
+ }
static int snd_pcm_hw_unlink(snd_pcm_t *pcm)
{
@@ -1045,8 +1039,8 @@ static snd_pcm_fast_ops_t snd_pcm_hw_fas
.rewind = snd_pcm_hw_rewind,
.forward = snd_pcm_hw_forward,
.resume = snd_pcm_hw_resume,
- .link_fd = snd_pcm_hw_link_fd,
.link = snd_pcm_hw_link,
+ .link_slaves = snd_pcm_hw_link_slaves,
.unlink = snd_pcm_hw_unlink,
.writei = snd_pcm_hw_writei,
.writen = snd_pcm_hw_writen,
diff -r 3cfb9808fb42 src/pcm/pcm_ioplug.c
--- a/src/pcm/pcm_ioplug.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_ioplug.c Tue Mar 13 15:26:22 2007 +0100
@@ -747,8 +747,8 @@ static snd_pcm_fast_ops_t snd_pcm_ioplug
.hwsync = snd_pcm_ioplug_hwsync,
.delay = snd_pcm_ioplug_delay,
.resume = snd_pcm_ioplug_resume,
- .link_fd = NULL,
.link = NULL,
+ .link_slaves = NULL,
.unlink = NULL,
.rewind = snd_pcm_ioplug_rewind,
.forward = snd_pcm_ioplug_forward,
diff -r 3cfb9808fb42 src/pcm/pcm_local.h
--- a/src/pcm/pcm_local.h Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_local.h Tue Mar 13 15:26:22 2007 +0100
@@ -152,8 +152,8 @@ typedef struct {
int (*hwsync)(snd_pcm_t *pcm);
int (*delay)(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp);
int (*resume)(snd_pcm_t *pcm);
- int (*link_fd)(snd_pcm_t *pcm, int *fds, int count, int (**failed)(snd_pcm_t *, int));
int (*link)(snd_pcm_t *pcm1, snd_pcm_t *pcm2);
+ int (*link_slaves)(snd_pcm_t *pcm, snd_pcm_t *master);
int (*unlink)(snd_pcm_t *pcm);
snd_pcm_sframes_t (*rewind)(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
snd_pcm_sframes_t (*forward)(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
@@ -274,7 +274,6 @@ static inline int snd_pcm_channel_info(s
}
int snd_pcm_channel_info_shm(snd_pcm_t *pcm, snd_pcm_channel_info_t *info, int shmid);
int _snd_pcm_poll_descriptor(snd_pcm_t *pcm);
-int _snd_pcm_link_descriptors(snd_pcm_t *pcm, int *fds, int size, int (**failed)(snd_pcm_t *, int));
#define _snd_pcm_link_descriptor _snd_pcm_poll_descriptor /* FIXME */
#define _snd_pcm_async_descriptor _snd_pcm_poll_descriptor /* FIXME */
diff -r 3cfb9808fb42 src/pcm/pcm_multi.c
--- a/src/pcm/pcm_multi.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_multi.c Tue Mar 13 15:26:22 2007 +0100
@@ -45,7 +45,7 @@ typedef struct {
snd_pcm_t *pcm;
unsigned int channels_count;
int close_slave;
- int linked;
+ snd_pcm_t *linked;
} snd_pcm_multi_slave_t;
typedef struct {
@@ -57,7 +57,6 @@ typedef struct {
unsigned int slaves_count;
unsigned int master_slave;
snd_pcm_multi_slave_t *slaves;
- int slave_link_master;
unsigned int channels_count;
snd_pcm_multi_channel_t *channels;
} snd_pcm_multi_t;
@@ -314,6 +313,25 @@ static int snd_pcm_multi_hw_params_slave
return 0;
}
+/* reset links to the normal state
+ * slave #0 = trigger master
+ * slave #1-(N-1) = trigger slaves, linked is set to #0
+ */
+static void reset_links(snd_pcm_multi_t *multi)
+{
+ unsigned int i;
+
+ for (i = 0; i < multi->slaves_count; ++i) {
+ if (multi->slaves[i].linked)
+ snd_pcm_unlink(multi->slaves[i].linked);
+ multi->slaves[0].linked = NULL;
+ if (! i)
+ continue;
+ if (snd_pcm_link(multi->slaves[0].pcm, multi->slaves[i].pcm) >= 0)
+ multi->slaves[i].linked = multi->slaves[0].pcm;
+ }
+}
+
static int snd_pcm_multi_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
{
snd_pcm_multi_t *multi = pcm->private_data;
@@ -331,12 +349,7 @@ static int snd_pcm_multi_hw_params(snd_p
return err;
}
}
- multi->slaves[0].linked = 0;
- multi->slave_link_master = 0;
- for (i = 1; i < multi->slaves_count; ++i) {
- err = snd_pcm_link(multi->slaves[0].pcm, multi->slaves[i].pcm);
- multi->slaves[i].linked = (err >= 0);
- }
+ reset_links(multi);
return 0;
}
@@ -352,10 +365,10 @@ static int snd_pcm_multi_hw_free(snd_pcm
err = e;
if (!multi->slaves[i].linked)
continue;
- multi->slaves[i].linked = 0;
e = snd_pcm_unlink(slave);
if (e < 0)
err = e;
+ multi->slaves[i].linked = NULL;
}
return err;
}
@@ -421,7 +434,7 @@ static int snd_pcm_multi_prepare(snd_pcm
static int snd_pcm_multi_prepare(snd_pcm_t *pcm)
{
snd_pcm_multi_t *multi = pcm->private_data;
- int err = 0;
+ int result = 0, err;
unsigned int i;
for (i = 0; i < multi->slaves_count; ++i) {
/* We call prepare to each slave even if it's linked.
@@ -429,75 +442,87 @@ static int snd_pcm_multi_prepare(snd_pcm
*/
err = snd_pcm_prepare(multi->slaves[i].pcm);
if (err < 0)
- return err;
- }
- return err;
+ result = err;
+ }
+ return result;
}
static int snd_pcm_multi_reset(snd_pcm_t *pcm)
{
snd_pcm_multi_t *multi = pcm->private_data;
- int err = 0;
+ int result = 0, err;
unsigned int i;
for (i = 0; i < multi->slaves_count; ++i) {
/* Reset each slave, as well as in prepare */
err = snd_pcm_reset(multi->slaves[i].pcm);
+ if (err < 0)
+ result = err;
+ }
+ return result;
+}
+
+/* when the first slave PCM is linked, it means that the whole multi
+ * plugin instance is linked manually to another PCM. in this case,
+ * we need to trigger the master.
+ */
+static int snd_pcm_multi_start(snd_pcm_t *pcm)
+{
+ snd_pcm_multi_t *multi = pcm->private_data;
+ int err = 0;
+ unsigned int i;
+ if (multi->slaves[0].linked)
+ return snd_pcm_start(multi->slaves[0].linked);
+ for (i = 0; i < multi->slaves_count; ++i) {
+ if (multi->slaves[i].linked)
+ continue;
+ err = snd_pcm_start(multi->slaves[i].pcm);
if (err < 0)
return err;
}
return err;
}
-static int snd_pcm_multi_start(snd_pcm_t *pcm)
+static int snd_pcm_multi_drop(snd_pcm_t *pcm)
{
snd_pcm_multi_t *multi = pcm->private_data;
int err = 0;
unsigned int i;
+ if (multi->slaves[0].linked)
+ return snd_pcm_drop(multi->slaves[0].linked);
for (i = 0; i < multi->slaves_count; ++i) {
if (multi->slaves[i].linked)
continue;
- err = snd_pcm_start(multi->slaves[i].pcm);
+ err = snd_pcm_drop(multi->slaves[i].pcm);
if (err < 0)
return err;
}
return err;
}
-static int snd_pcm_multi_drop(snd_pcm_t *pcm)
+static int snd_pcm_multi_drain(snd_pcm_t *pcm)
{
snd_pcm_multi_t *multi = pcm->private_data;
int err = 0;
unsigned int i;
+ if (multi->slaves[0].linked)
+ return snd_pcm_drain(multi->slaves[0].linked);
for (i = 0; i < multi->slaves_count; ++i) {
if (multi->slaves[i].linked)
continue;
- err = snd_pcm_drop(multi->slaves[i].pcm);
+ err = snd_pcm_drain(multi->slaves[i].pcm);
if (err < 0)
return err;
}
return err;
}
-static int snd_pcm_multi_drain(snd_pcm_t *pcm)
+static int snd_pcm_multi_pause(snd_pcm_t *pcm, int enable)
{
snd_pcm_multi_t *multi = pcm->private_data;
int err = 0;
unsigned int i;
- for (i = 0; i < multi->slaves_count; ++i) {
- if (multi->slaves[i].linked)
- continue;
- err = snd_pcm_drain(multi->slaves[i].pcm);
- if (err < 0)
- return err;
- }
- return err;
-}
-
-static int snd_pcm_multi_pause(snd_pcm_t *pcm, int enable)
-{
- snd_pcm_multi_t *multi = pcm->private_data;
- int err = 0;
- unsigned int i;
+ if (multi->slaves[0].linked)
+ return snd_pcm_pause(multi->slaves[0].linked, enable);
for (i = 0; i < multi->slaves_count; ++i) {
if (multi->slaves[i].linked)
continue;
@@ -587,6 +612,8 @@ static int snd_pcm_multi_resume(snd_pcm_
snd_pcm_multi_t *multi = pcm->private_data;
int err = 0;
unsigned int i;
+ if (multi->slaves[0].linked)
+ return snd_pcm_resume(multi->slaves[0].linked);
for (i = 0; i < multi->slaves_count; ++i) {
if (multi->slaves[i].linked)
continue;
@@ -597,45 +624,48 @@ static int snd_pcm_multi_resume(snd_pcm_
return err;
}
-static int snd_pcm_multi_link_fd_failed(snd_pcm_t *pcm, int fd)
-{
- snd_pcm_multi_t *multi = pcm->private_data;
- unsigned int i;
-
- for (i = 0; i < multi->slaves_count; ++i) {
- if (_snd_pcm_link_descriptor(multi->slaves[i].pcm) != fd)
- continue;
- multi->slaves[i].linked = 0;
- }
- return 0;
-}
-
-static int snd_pcm_multi_link_fd(snd_pcm_t *pcm, int *fds, int count, int (**failed)(snd_pcm_t *pcm, int fd))
+/* if a multi plugin instance is linked as slaves, every slave PCMs
+ * including the first one has to be relinked to the given master.
+ */
+static int snd_pcm_multi_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master)
{
snd_pcm_multi_t *multi = pcm->private_data;
- unsigned int i;
-
- if (count < (int)multi->slaves_count)
- return -ENOMEM;
+ unsigned int i, j;
+ int err;
+
+ for (i = 0; i < multi->slaves_count; ++i) {
+ snd_pcm_unlink(multi->slaves[i].pcm);
+ multi->slaves[i].linked = NULL;
+ err = snd_pcm_link(master, multi->slaves[i].pcm);
+ if (err < 0) {
+ reset_links(multi);
+ return err;
+ }
+ multi->slaves[i].linked = master;
+ }
+ return 0;
+}
+
+/* linking to a multi as a master is easy - simply link to the first
+ * slave element as its own slaves are already linked.
+ */
+static int snd_pcm_multi_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
+{
+ snd_pcm_multi_t *multi = pcm1->private_data;
+ if (multi->slaves[0].pcm->fast_ops->link)
+ return multi->slaves[0].pcm->fast_ops->link(multi->slaves[0].pcm, pcm2);
+ return -ENOSYS;
+}
+
+static int snd_pcm_multi_unlink(snd_pcm_t *pcm)
+{
+ snd_pcm_multi_t *multi = pcm->private_data;
+ unsigned int i;
+
for (i = 0; i < multi->slaves_count; ++i) {
if (multi->slaves[i].linked)
- snd_pcm_unlink(multi->slaves[i].pcm);
- fds[i] = _snd_pcm_link_descriptor(multi->slaves[i].pcm);
- multi->slaves[i].linked = 1;
- }
- *failed = snd_pcm_multi_link_fd_failed;
- return multi->slaves_count;
-}
-
-static int snd_pcm_multi_unlink(snd_pcm_t *pcm)
-{
- snd_pcm_multi_t *multi = pcm->private_data;
- unsigned int i;
-
- for (i = 0; i < multi->slaves_count; ++i) {
- if (multi->slaves[i].linked)
- snd_pcm_unlink(multi->slaves[i].pcm);
- multi->slaves[i].linked = 0;
+ snd_pcm_unlink(multi->slaves[i].linked);
+ multi->slaves[0].linked = NULL;
}
return 0;
}
@@ -726,8 +756,8 @@ static snd_pcm_fast_ops_t snd_pcm_multi_
.rewind = snd_pcm_multi_rewind,
.forward = snd_pcm_multi_forward,
.resume = snd_pcm_multi_resume,
- .link_fd = snd_pcm_multi_link_fd,
- .link = snd_pcm_generic_link2,
+ .link = snd_pcm_multi_link,
+ .link_slaves = snd_pcm_multi_link_slaves,
.unlink = snd_pcm_multi_unlink,
.avail_update = snd_pcm_multi_avail_update,
.mmap_commit = snd_pcm_multi_mmap_commit,
diff -r 3cfb9808fb42 src/pcm/pcm_plugin.c
--- a/src/pcm/pcm_plugin.c Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/pcm_plugin.c Tue Mar 13 15:26:22 2007 +0100
@@ -566,8 +566,8 @@ snd_pcm_fast_ops_t snd_pcm_plugin_fast_o
.rewind = snd_pcm_plugin_rewind,
.forward = snd_pcm_plugin_forward,
.resume = snd_pcm_generic_resume,
- .link_fd = snd_pcm_generic_link_fd,
.link = snd_pcm_generic_link,
+ .link_slaves = snd_pcm_generic_link_slaves,
.unlink = snd_pcm_generic_unlink,
.writei = snd_pcm_plugin_writei,
.writen = snd_pcm_plugin_writen,
diff -r 3cfb9808fb42 src/pcm/plugin_ops.h
--- a/src/pcm/plugin_ops.h Mon Feb 26 09:21:12 2007 +0100
+++ b/src/pcm/plugin_ops.h Fri Mar 09 15:59:18 2007 +0100
@@ -85,6 +85,8 @@ static inline u_int32_t sx24s(u_int32_t
#define _put_triple(ptr,val) _put_triple_be(ptr,val)
#define _put_triple_s(ptr,val) _put_triple_le(ptr,val)
#endif
+
+#define shift_down(val, bits) (((val) + (1 << ((bits) - 1))) >> (bits))
#ifdef COPY_LABELS
static void *copy_labels[5] = {
@@ -256,14 +258,14 @@ conv_xxx1_009x: as_u32(dst) = sx24s((u_i
conv_xxx1_009x: as_u32(dst) = sx24s((u_int32_t)(as_u8c(src) ^ 0x80) << 8); goto CONV_END;
conv_xxx1_9000: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80) << 24; goto CONV_END;
conv_xxx1_0009: as_u32(dst) = (u_int32_t)(as_u8c(src) ^ 0x80); goto CONV_END;
-conv_xx12_xxx1: as_u8(dst) = as_u16c(src) >> 8; goto CONV_END;
+conv_xx12_xxx1: as_u8(dst) = shift_down(as_u16c(src), 8); goto CONV_END;
conv_xx12_xx12: as_u16(dst) = as_u16c(src); goto CONV_END;
conv_xx12_xx21: as_u16(dst) = bswap_16(as_u16c(src)); goto CONV_END;
conv_xx12_x120: as_u32(dst) = sx24((u_int32_t)as_u16c(src) << 8); goto CONV_END;
conv_xx12_021x: as_u32(dst) = sx24s((u_int32_t)bswap_16(as_u16c(src)) << 8); goto CONV_END;
conv_xx12_1200: as_u32(dst) = (u_int32_t)as_u16c(src) << 16; goto CONV_END;
conv_xx12_0021: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src)); goto CONV_END;
-conv_xx12_xxx9: as_u8(dst) = (as_u16c(src) >> 8) ^ 0x80; goto CONV_END;
+conv_xx12_xxx9: as_u8(dst) = shift_down(as_u16c(src), 8) ^ 0x80; goto CONV_END;
conv_xx12_xx92: as_u16(dst) = as_u16c(src) ^ 0x8000; goto CONV_END;
conv_xx12_xx29: as_u16(dst) = bswap_16(as_u16c(src)) ^ 0x80; goto CONV_END;
conv_xx12_x920: as_u32(dst) = sx24((u_int32_t)(as_u16c(src) ^ 0x8000) << 8); goto CONV_END;
@@ -282,57 +284,57 @@ conv_xx12_01Ax: as_u32(dst) = sx24s((u_i
conv_xx12_01Ax: as_u32(dst) = sx24s((u_int32_t)(as_u16c(src) ^ 0x80) << 8); goto CONV_END;
conv_xx12_A100: as_u32(dst) = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto CONV_END;
conv_xx12_001A: as_u32(dst) = (u_int32_t)(as_u16c(src) ^ 0x80); goto CONV_END;
-conv_x123_xxx1: as_u8(dst) = as_u32c(src) >> 16; goto CONV_END;
-conv_x123_xx12: as_u16(dst) = as_u32c(src) >> 8; goto CONV_END;
-conv_x123_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
+conv_x123_xxx1: as_u8(dst) = shift_down(as_u32c(src), 16); goto CONV_END;
+conv_x123_xx12: as_u16(dst) = shift_down(as_u32c(src), 8); goto CONV_END;
+conv_x123_xx21: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 8)); goto CONV_END;
conv_x123_x123: as_u32(dst) = sx24(as_u32c(src)); goto CONV_END;
conv_x123_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src))); goto CONV_END;
conv_x123_1230: as_u32(dst) = as_u32c(src) << 8; goto CONV_END;
-conv_x123_0321: as_u32(dst) = bswap_32(as_u32c(src)) >> 8; goto CONV_END;
-conv_x123_xxx9: as_u8(dst) = (as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
-conv_x123_xx92: as_u16(dst) = (as_u32c(src) >> 8) ^ 0x8000; goto CONV_END;
-conv_x123_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
+conv_x123_0321: as_u32(dst) = shift_down(bswap_32(as_u32c(src)), 8); goto CONV_END;
+ conv_x123_xxx9: as_u8(dst) = shift_down(as_u32c(src), 16) ^ 0x80; goto CONV_END;
+conv_x123_xx92: as_u16(dst) = shift_down(as_u32c(src), 8) ^ 0x8000; goto CONV_END;
+conv_x123_xx29: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 8)) ^ 0x80; goto CONV_END;
conv_x123_x923: as_u32(dst) = sx24(as_u32c(src) ^ 0x800000); goto CONV_END;
conv_x123_329x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) ^ 0x8000); goto CONV_END;
conv_x123_9230: as_u32(dst) = (as_u32c(src) ^ 0x800000) << 8; goto CONV_END;
-conv_x123_0329: as_u32(dst) = (bswap_32(as_u32c(src)) >> 8) ^ 0x80; goto CONV_END;
-conv_123x_xxx3: as_u8(dst) = (as_u32c(src) >> 8) & 0xff; goto CONV_END;
-conv_123x_xx32: as_u16(dst) = bswap_16(as_u32c(src) >> 8); goto CONV_END;
-conv_123x_xx23: as_u16(dst) = (as_u32c(src) >> 8) & 0xffff; goto CONV_END;
+conv_x123_0329: as_u32(dst) = shift_down(bswap_32(as_u32c(src)), 8) ^ 0x80; goto CONV_END;
+conv_123x_xxx3: as_u8(dst) = shift_down(as_u32c(src), 8) & 0xff; goto CONV_END;
+conv_123x_xx32: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 8)); goto CONV_END;
+conv_123x_xx23: as_u16(dst) = shift_down(as_u32c(src), 8) & 0xffff; goto CONV_END;
conv_123x_x321: as_u32(dst) = sx24(bswap_32(as_u32c(src))); goto CONV_END;
conv_123x_123x: as_u32(dst) = sx24s(as_u32c(src)); goto CONV_END;
conv_123x_3210: as_u32(dst) = bswap_32(as_u32c(src)) << 8; goto CONV_END;
-conv_123x_0123: as_u32(dst) = as_u32c(src) >> 8; goto CONV_END;
-conv_123x_xxxB: as_u8(dst) = ((as_u32c(src) >> 8) & 0xff) ^ 0x80; goto CONV_END;
-conv_123x_xxB2: as_u16(dst) = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto CONV_END;
-conv_123x_xx2B: as_u16(dst) = ((as_u32c(src) >> 8) & 0xffff) ^ 0x80; goto CONV_END;
+conv_123x_0123: as_u32(dst) = shift_down(as_u32c(src), 8); goto CONV_END;
+conv_123x_xxxB: as_u8(dst) = (shift_down(as_u32c(src), 8) & 0xff) ^ 0x80; goto CONV_END;
+conv_123x_xxB2: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 8) ^ 0x80); goto CONV_END;
+conv_123x_xx2B: as_u16(dst) = (shift_down(as_u32c(src), 8) & 0xffff) ^ 0x80; goto CONV_END;
conv_123x_xB21: as_u32(dst) = sx24(bswap_32(as_u32c(src)) ^ 0x800000); goto CONV_END;
conv_123x_12Bx: as_u32(dst) = sx24s(as_u32c(src) ^ 0x8000); goto CONV_END;
conv_123x_B210: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x8000) << 8; goto CONV_END;
-conv_123x_012B: as_u32(dst) = (as_u32c(src) >> 8) ^ 0x80; goto CONV_END;
-conv_1234_xxx1: as_u8(dst) = as_u32c(src) >> 24; goto CONV_END;
-conv_1234_xx12: as_u16(dst) = as_u32c(src) >> 16; goto CONV_END;
-conv_1234_xx21: as_u16(dst) = bswap_16(as_u32c(src) >> 16); goto CONV_END;
-conv_1234_x123: as_u32(dst) = sx24(as_u32c(src) >> 8); goto CONV_END;
+conv_123x_012B: as_u32(dst) = shift_down(as_u32c(src), 8) ^ 0x80; goto CONV_END;
+conv_1234_xxx1: as_u8(dst) = shift_down(as_u32c(src), 24); goto CONV_END;
+conv_1234_xx12: as_u16(dst) = shift_down(as_u32c(src), 16); goto CONV_END;
+conv_1234_xx21: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 16)); goto CONV_END;
+conv_1234_x123: as_u32(dst) = sx24(shift_down(as_u32c(src), 8)); goto CONV_END;
conv_1234_321x: as_u32(dst) = sx24s(bswap_32(as_u32c(src)) << 8); goto CONV_END;
conv_1234_1234: as_u32(dst) = as_u32c(src); goto CONV_END;
conv_1234_4321: as_u32(dst) = bswap_32(as_u32c(src)); goto CONV_END;
-conv_1234_xxx9: as_u8(dst) = (as_u32c(src) >> 24) ^ 0x80; goto CONV_END;
-conv_1234_xx92: as_u16(dst) = (as_u32c(src) >> 16) ^ 0x8000; goto CONV_END;
-conv_1234_xx29: as_u16(dst) = bswap_16(as_u32c(src) >> 16) ^ 0x80; goto CONV_END;
-conv_1234_x923: as_u32(dst) = sx24((as_u32c(src) >> 8) ^ 0x800000); goto CONV_END;
+conv_1234_xxx9: as_u8(dst) = shift_down(as_u32c(src), 24) ^ 0x80; goto CONV_END;
+conv_1234_xx92: as_u16(dst) = shift_down(as_u32c(src), 16) ^ 0x8000; goto CONV_END;
+conv_1234_xx29: as_u16(dst) = bswap_16(shift_down(as_u32c(src), 16)) ^ 0x80; goto CONV_END;
+conv_1234_x923: as_u32(dst) = sx24(shift_down(as_u32c(src), 8) ^ 0x800000); goto CONV_END;
conv_1234_329x: as_u32(dst) = sx24s((bswap_32(as_u32c(src)) ^ 0x80) << 8); goto CONV_END;
conv_1234_9234: as_u32(dst) = as_u32c(src) ^ 0x80000000; goto CONV_END;
conv_1234_4329: as_u32(dst) = bswap_32(as_u32c(src)) ^ 0x80; goto CONV_END;
conv_1234_xxx4: as_u8(dst) = as_u32c(src) & 0xff; goto CONV_END;
conv_1234_xx43: as_u16(dst) = bswap_16(as_u32c(src)); goto CONV_END;
conv_1234_xx34: as_u16(dst) = as_u32c(src) & 0xffff; goto CONV_END;
-conv_1234_x432: as_u32(dst) = sx24(bswap_32(as_u32c(src)) >> 8); goto CONV_END;
+conv_1234_x432: as_u32(dst) = sx24(shift_down(bswap_32(as_u32c(src)), 8)); goto CONV_END;
conv_1234_234x: as_u32(dst) = sx24s(as_u32c(src) << 8); goto CONV_END;
conv_1234_xxxC: as_u8(dst) = (as_u32c(src) & 0xff) ^ 0x80; goto CONV_END;
conv_1234_xxC3: as_u16(dst) = bswap_16(as_u32c(src) ^ 0x80); goto CONV_END;
conv_1234_xx3C: as_u16(dst) = (as_u32c(src) & 0xffff) ^ 0x80; goto CONV_END;
-conv_1234_xC32: as_u32(dst) = sx24((bswap_32(as_u32c(src)) >> 8) ^ 0x800000); goto CONV_END;
+conv_1234_xC32: as_u32(dst) = sx24(shift_down(bswap_32(as_u32c(src)), 8) ^ 0x800000); goto CONV_END;
conv_1234_23Cx: as_u32(dst) = sx24s((as_u32c(src) ^ 0x80) << 8); goto CONV_END;
conv_1234_C321: as_u32(dst) = bswap_32(as_u32c(src) ^ 0x80); goto CONV_END;
conv_1234_123C: as_u32(dst) = as_u32c(src) ^ 0x80; goto CONV_END;
@@ -382,26 +384,26 @@ get16_12_92: sample = as_u16c(src) ^ 0x8
get16_12_92: sample = as_u16c(src) ^ 0x8000; goto GET16_END;
get16_12_21: sample = bswap_16(as_u16c(src)); goto GET16_END;
get16_12_A1: sample = bswap_16(as_u16c(src) ^ 0x80); goto GET16_END;
-get16_0123_12: sample = as_u32c(src) >> 8; goto GET16_END;
-get16_0123_92: sample = (as_u32c(src) >> 8) ^ 0x8000; goto GET16_END;
-get16_1230_32: sample = bswap_16(as_u32c(src) >> 8); goto GET16_END;
-get16_1230_B2: sample = bswap_16((as_u32c(src) >> 8) ^ 0x80); goto GET16_END;
-get16_1234_12: sample = as_u32c(src) >> 16; goto GET16_END;
-get16_1234_92: sample = (as_u32c(src) >> 16) ^ 0x8000; goto GET16_END;
+get16_0123_12: sample = shift_down(as_u32c(src), 8); goto GET16_END;
+get16_0123_92: sample = shift_down(as_u32c(src), 8) ^ 0x8000; goto GET16_END;
+get16_1230_32: sample = bswap_16(shift_down(as_u32c(src), 8)); goto GET16_END;
+get16_1230_B2: sample = bswap_16(shift_down(as_u32c(src), 8) ^ 0x80); goto GET16_END;
+get16_1234_12: sample = shift_down(as_u32c(src), 16); goto GET16_END;
+get16_1234_92: sample = shift_down(as_u32c(src), 16) ^ 0x8000; goto GET16_END;
get16_1234_43: sample = bswap_16(as_u32c(src)); goto GET16_END;
get16_1234_C3: sample = bswap_16(as_u32c(src) ^ 0x80); goto GET16_END;
-get16_123_12: sample = _get_triple(src) >> 8; goto GET16_END;
-get16_123_92: sample = (_get_triple(src) >> 8) ^ 0x8000; goto GET16_END;
-get16_123_32: sample = _get_triple_s(src) >> 8; goto GET16_END;
-get16_123_B2: sample = (_get_triple_s(src) >> 8) ^ 0x8000; goto GET16_END;
-get16_123_12_20: sample = _get_triple(src) >> 4; goto GET16_END;
-get16_123_92_20: sample = (_get_triple(src) >> 4) ^ 0x8000; goto GET16_END;
-get16_123_32_20: sample = _get_triple_s(src) >> 4; goto GET16_END;
-get16_123_B2_20: sample = (_get_triple_s(src) >> 4) ^ 0x8000; goto GET16_END;
-get16_123_12_18: sample = _get_triple(src) >> 2; goto GET16_END;
-get16_123_92_18: sample = (_get_triple(src) >> 2) ^ 0x8000; goto GET16_END;
-get16_123_32_18: sample = _get_triple_s(src) >> 2; goto GET16_END;
-get16_123_B2_18: sample = (_get_triple_s(src) >> 2) ^ 0x8000; goto GET16_END;
+get16_123_12: sample = shift_down(_get_triple(src), 8); goto GET16_END;
+get16_123_92: sample = shift_down(_get_triple(src), 8) ^ 0x8000; goto GET16_END;
+get16_123_32: sample = shift_down(_get_triple_s(src), 8); goto GET16_END;
+get16_123_B2: sample = shift_down(_get_triple_s(src), 8) ^ 0x8000; goto GET16_END;
+get16_123_12_20: sample = shift_down(_get_triple(src), 4); goto GET16_END;
+get16_123_92_20: sample = shift_down(_get_triple(src), 4) ^ 0x8000; goto GET16_END;
+get16_123_32_20: sample = shift_down(_get_triple_s(src), 4); goto GET16_END;
+get16_123_B2_20: sample = shift_down(_get_triple_s(src), 4) ^ 0x8000; goto GET16_END;
+get16_123_12_18: sample = shift_down(_get_triple(src), 2); goto GET16_END;
+get16_123_92_18: sample = shift_down(_get_triple(src), 2) ^ 0x8000; goto GET16_END;
+get16_123_32_18: sample = shift_down(_get_triple_s(src), 2); goto GET16_END;
+get16_123_B2_18: sample = shift_down(_get_triple_s(src), 2) ^ 0x8000; goto GET16_END;
}
#endif
@@ -429,8 +431,8 @@ static void *put16_labels[4 * 2 * 2] = {
#ifdef PUT16_END
while (0) {
-put16_12_1: as_u8(dst) = sample >> 8; goto PUT16_END;
-put16_12_9: as_u8(dst) = (sample >> 8) ^ 0x80; goto PUT16_END;
+put16_12_1: as_u8(dst) = shift_down(sample, 8); goto PUT16_END;
+put16_12_9: as_u8(dst) = shift_down(sample, 8) ^ 0x80; goto PUT16_END;
put16_12_12: as_u16(dst) = sample; goto PUT16_END;
put16_12_92: as_u16(dst) = sample ^ 0x8000; goto PUT16_END;
put16_12_21: as_u16(dst) = bswap_16(sample); goto PUT16_END;
@@ -500,8 +502,8 @@ get32_12_A100: sample = (u_int32_t)bswap
get32_12_A100: sample = (u_int32_t)bswap_16(as_u16c(src) ^ 0x80) << 16; goto GET32_END;
get32_0123_1230: sample = as_u32c(src) << 8; goto GET32_END;
get32_0123_9230: sample = (as_u32c(src) << 8) ^ 0x80000000; goto GET32_END;
-get32_1230_3210: sample = bswap_32(as_u32c(src) >> 8); goto GET32_END;
-get32_1230_B210: sample = bswap_32((as_u32c(src) >> 8) ^ 0x80); goto GET32_END;
+get32_1230_3210: sample = bswap_32(shift_down(as_u32c(src), 8)); goto GET32_END;
+get32_1230_B210: sample = bswap_32(shift_down(as_u32c(src), 8) ^ 0x80); goto GET32_END;
get32_1234_1234: sample = as_u32c(src); goto GET32_END;
get32_1234_9234: sample = as_u32c(src) ^ 0x80000000; goto GET32_END;
get32_1234_4321: sample = bswap_32(as_u32c(src)); goto GET32_END;
@@ -568,32 +570,32 @@ static void *put32_labels[4 * 2 * 2 + 4
#ifdef PUT32_END
while (0) {
-put32_1234_1: as_u8(dst) = sample >> 24; goto PUT32_END;
-put32_1234_9: as_u8(dst) = (sample >> 24) ^ 0x80; goto PUT32_END;
-put32_1234_12: as_u16(dst) = sample >> 16; goto PUT32_END;
-put32_1234_92: as_u16(dst) = (sample >> 16) ^ 0x8000; goto PUT32_END;
-put32_1234_21: as_u16(dst) = bswap_16(sample >> 16); goto PUT32_END;
-put32_1234_29: as_u16(dst) = bswap_16(sample >> 16) ^ 0x80; goto PUT32_END;
-put32_1234_0123: as_u32(dst) = sx24(sample >> 8); goto PUT32_END;
-put32_1234_0923: as_u32(dst) = sx24((sample >> 8) ^ 0x800000); goto PUT32_END;
+put32_1234_1: as_u8(dst) = shift_down(sample, 24); goto PUT32_END;
+put32_1234_9: as_u8(dst) = shift_down(sample, 24) ^ 0x80; goto PUT32_END;
+put32_1234_12: as_u16(dst) = shift_down(sample, 16); goto PUT32_END;
+put32_1234_92: as_u16(dst) = shift_down(sample, 16) ^ 0x8000; goto PUT32_END;
+put32_1234_21: as_u16(dst) = bswap_16(shift_down(sample, 16)); goto PUT32_END;
+put32_1234_29: as_u16(dst) = bswap_16(shift_down(sample, 16)) ^ 0x80; goto PUT32_END;
+put32_1234_0123: as_u32(dst) = sx24(shift_down(sample, 8)); goto PUT32_END;
+put32_1234_0923: as_u32(dst) = sx24(shift_down(sample, 8) ^ 0x800000); goto PUT32_END;
put32_1234_3210: as_u32(dst) = sx24s(bswap_32(sample) << 8); goto PUT32_END;
put32_1234_3290: as_u32(dst) = sx24s((bswap_32(sample) ^ 0x80) << 8); goto PUT32_END;
put32_1234_1234: as_u32(dst) = sample; goto PUT32_END;
put32_1234_9234: as_u32(dst) = sample ^ 0x80000000; goto PUT32_END;
put32_1234_4321: as_u32(dst) = bswap_32(sample); goto PUT32_END;
put32_1234_4329: as_u32(dst) = bswap_32(sample) ^ 0x80; goto PUT32_END;
-put32_1234_123: _put_triple(dst, sample >> 8); goto PUT32_END;
-put32_1234_923: _put_triple(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
-put32_1234_321: _put_triple_s(dst, sample >> 8); goto PUT32_END;
-put32_1234_329: _put_triple_s(dst, (sample ^ 0x80000000) >> 8); goto PUT32_END;
-put32_1234_123_20: _put_triple(dst, sample >> 12); goto PUT32_END;
-put32_1234_923_20: _put_triple(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
-put32_1234_321_20: _put_triple_s(dst, sample >> 12); goto PUT32_END;
-put32_1234_329_20: _put_triple_s(dst, (sample ^ 0x80000000) >> 12); goto PUT32_END;
-put32_1234_123_18: _put_triple(dst, sample >> 14); goto PUT32_END;
-put32_1234_923_18: _put_triple(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
-put32_1234_321_18: _put_triple_s(dst, sample >> 14); goto PUT32_END;
-put32_1234_329_18: _put_triple_s(dst, (sample ^ 0x80000000) >> 14); goto PUT32_END;
+put32_1234_123: _put_triple(dst, shift_down(sample, 8)); goto PUT32_END;
+put32_1234_923: _put_triple(dst, shift_down(sample ^ 0x80000000, 8)); goto PUT32_END;
+put32_1234_321: _put_triple_s(dst, shift_down(sample, 8)); goto PUT32_END;
+put32_1234_329: _put_triple_s(dst, shift_down(sample ^ 0x80000000, 8)); goto PUT32_END;
+put32_1234_123_20: _put_triple(dst, shift_down(sample, 12)); goto PUT32_END;
+put32_1234_923_20: _put_triple(dst, shift_down(sample ^ 0x80000000, 12)); goto PUT32_END;
+put32_1234_321_20: _put_triple_s(dst, shift_down(sample, 12)); goto PUT32_END;
+put32_1234_329_20: _put_triple_s(dst, shift_down(sample ^ 0x80000000, 12)); goto PUT32_END;
+put32_1234_123_18: _put_triple(dst, shift_down(sample, 14)); goto PUT32_END;
+put32_1234_923_18: _put_triple(dst, shift_down(sample ^ 0x80000000, 14)); goto PUT32_END;
+put32_1234_321_18: _put_triple_s(dst, shift_down(sample, 14)); goto PUT32_END;
+put32_1234_329_18: _put_triple_s(dst, shift_down(sample ^ 0x80000000, 14)); goto PUT32_END;
}
#endif
@@ -1079,3 +1081,4 @@ norms_32_s32s: _norms(src, dst, 32, 1,
#undef _put_triple_le
#undef _put_triple_be
+#undef shift_down