[alsa-devel] [PATCH] Sample generation on big endian platforms was broken.
Kenneth Johansson
kenneth at southpole.se
Fri Jul 3 16:19:31 CEST 2009
Has not worked since commit 3d1fa924906996463ac33cba5b5143f762d913cf
Signed-off-by: Kenneth Johansson <kenneth at southpole.se>
---
test/pcm.c | 24 ++++++++++++++----------
1 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/test/pcm.c b/test/pcm.c
index ee27422..9b8a923 100644
--- a/test/pcm.c
+++ b/test/pcm.c
@@ -34,14 +34,11 @@ static void generate_sine(const
snd_pcm_channel_area_t *areas,
static double max_phase = 2. * M_PI;
double phase = *_phase;
double step = max_phase*freq/(double)rate;
- double res;
+ int res;
unsigned char *samples[channels], *tmp;
int steps[channels];
- unsigned int chn, byte;
- union {
- int i;
- unsigned char c[4];
- } ires;
+ unsigned int chn;
+
unsigned int maxval = (1 << (snd_pcm_format_width(format) - 1)) - 1;
int bps = snd_pcm_format_width(format) / 8; /* bytes per sample */
@@ -62,11 +59,18 @@ static void generate_sine(const
snd_pcm_channel_area_t *areas,
/* fill the channel areas */
while (count-- > 0) {
res = sin(phase) * maxval;
- ires.i = res;
- tmp = ires.c;
for (chn = 0; chn < channels; chn++) {
- for (byte = 0; byte < (unsigned int)bps; byte++)
- *(samples[chn] + byte) = tmp[byte];
+ /* Generate data in native endian format */
+ switch(bps){
+ case 1:
+ *(samples[chn]) = res;
+ break;
+ case 2:
+ *(short*)(samples[chn]) = res;
+ break;
+ case 4:
+ *(int*)(samples[chn]) = res;
+ }
samples[chn] += steps[chn];
}
phase += step;
--
1.6.1.GIT
More information about the Alsa-devel
mailing list