853 lines
35 KiB
Diff
853 lines
35 KiB
Diff
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
|