All of lore.kernel.org
 help / color / mirror / Atom feed
* S24_LE is 3 bytes ? in alsa-lib example pcm.c
@ 2008-07-10  8:24 Norbert van Bolhuis
  2008-07-10  9:23 ` Clemens Ladisch
  0 siblings, 1 reply; 6+ messages in thread
From: Norbert van Bolhuis @ 2008-07-10  8:24 UTC (permalink / raw)
  To: alsa-devel, alsa-user


as far as I know:
sample format S24_LE is 24bit sample in 4 bytes
sample format S24_3LE is 24bit sample in 3 bytes
(why else have separate definitions), right ?

In the ALSA-LIb example /test/pcm.c however
(http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
there is no diff between the 2 sample formats.

I noticed this by simply showing the bytes presented to snd_pcm_writei
See:

S32_LE (for reference)
----------------------
./pcm -c 2 -o S32_LE -f 4000
Playback device is plughw:0,0
Stream parameters are 48000Hz, S32_LE, 2 channels
Sine wave rate is 4000.0000Hz
Using transfer method: write
write_loop: going to write: period_size=4096 samples
data[00:31]= 00000000 00000000 ffffff3f ffffff3f a0ebd96e a0ebd96e ffffff7f ffffff7f
data[32:63]= a0ebd96e a0ebd96e ffffff3f ffffff3f 00000000 00000000 010000c0 010000c0

S24_3LE (as expected)
----------------------
./pcm -c 2 -o S24_3LE -f 4000
Playback device is plughw:0,0
Stream parameters are 48000Hz, S24_3LE, 2 channels
Sine wave rate is 4000.0000Hz
Using transfer method: write
write_loop: going to write: period_size=4096 samples
data[00:31]= 00000000 0000ffff 3fffff3f ead96eea d96effff 7fffff7f ead96eea d96effff
data[32:63]= 3fffff3f 00000000 00000100 c00100c0 16269116 26910100 80010080 16269116

S24_LE
----------------------
./pcm -c 2 -o S24_LE -f 4000
Playback device is plughw:0,0
Stream parameters are 48000Hz, S24_LE, 2 channels
Sine wave rate is 4000.0000Hz
Using transfer method: write
write_loop: going to write: period_size=4096 samples
data[00:31]= 00000000 0000ffff 3fffff3f ead96eea d96effff 7fffff7f ead96eea d96effff
data[32:63]= 3fffff3f 00000000 00000100 c00100c0 16269116 26910100 80010080 16269116


I would expect to see
data[00:31]= 0x00000000 00000000 00ffff3f 00ffff3f 00ebd96e 00ebd96e 00ffff7f 00ffff7f
data[32:63]= 0x00ebd96e 00ebd96e 00ffff3f 00ffff3f 00000000 00000000 000000c0 000000c0
for S24_LE

do I miss something ?
is this is a fault in /test/pcm.c ?


-- 
This message has been scanned for viruses and is believed to be clean

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: S24_LE is 3 bytes ? in alsa-lib example pcm.c
  2008-07-10  8:24 S24_LE is 3 bytes ? in alsa-lib example pcm.c Norbert van Bolhuis
@ 2008-07-10  9:23 ` Clemens Ladisch
  2008-07-10 10:19   ` Jaroslav Kysela
  0 siblings, 1 reply; 6+ messages in thread
From: Clemens Ladisch @ 2008-07-10  9:23 UTC (permalink / raw)
  To: Norbert van Bolhuis; +Cc: alsa-user, alsa-devel

Norbert van Bolhuis wrote:
> as far as I know:
> sample format S24_LE is 24bit sample in 4 bytes
> sample format S24_3LE is 24bit sample in 3 bytes
> (why else have separate definitions), right ?

Yes.

> In the ALSA-LIb example /test/pcm.c however
> (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
> there is no diff between the 2 sample formats.

That example program uses snd_pcm_format_width() although it should
have used snd_pcm_format_physical_width() when calculating memory
buffer sizes.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: S24_LE is 3 bytes ? in alsa-lib example pcm.c
  2008-07-10  9:23 ` Clemens Ladisch
@ 2008-07-10 10:19   ` Jaroslav Kysela
  2008-07-10 16:30     ` Takashi Iwai
  0 siblings, 1 reply; 6+ messages in thread
From: Jaroslav Kysela @ 2008-07-10 10:19 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: ALSA development, Norbert van Bolhuis

On Thu, 10 Jul 2008, Clemens Ladisch wrote:

> Norbert van Bolhuis wrote:
> > as far as I know:
> > sample format S24_LE is 24bit sample in 4 bytes
> > sample format S24_3LE is 24bit sample in 3 bytes
> > (why else have separate definitions), right ?
> 
> Yes.
> 
> > In the ALSA-LIb example /test/pcm.c however
> > (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
> > there is no diff between the 2 sample formats.
> 
> That example program uses snd_pcm_format_width() although it should
> have used snd_pcm_format_physical_width() when calculating memory
> buffer sizes.

I think that the problem is in wrong area->step calculation in alsa-lib, 
but I'm still investigating where the real culprit is. The
snd_pcm_format_width() is used only for sample filling (which is OK).

						Jaroslav

-----
Jaroslav Kysela <perex@perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: S24_LE is 3 bytes ? in alsa-lib example pcm.c
  2008-07-10 16:30     ` Takashi Iwai
@ 2008-07-10 10:41       ` Jaroslav Kysela
  2008-07-10 16:46         ` Takashi Iwai
  0 siblings, 1 reply; 6+ messages in thread
From: Jaroslav Kysela @ 2008-07-10 10:41 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: ALSA development, Clemens Ladisch, Norbert van Bolhuis

On Thu, 10 Jul 2008, Takashi Iwai wrote:

> At Thu, 10 Jul 2008 12:19:05 +0200 (CEST),
> Jaroslav Kysela wrote:
> > 
> > On Thu, 10 Jul 2008, Clemens Ladisch wrote:
> > 
> > > Norbert van Bolhuis wrote:
> > > > as far as I know:
> > > > sample format S24_LE is 24bit sample in 4 bytes
> > > > sample format S24_3LE is 24bit sample in 3 bytes
> > > > (why else have separate definitions), right ?
> > > 
> > > Yes.
> > > 
> > > > In the ALSA-LIb example /test/pcm.c however
> > > > (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
> > > > there is no diff between the 2 sample formats.
> > > 
> > > That example program uses snd_pcm_format_width() although it should
> > > have used snd_pcm_format_physical_width() when calculating memory
> > > buffer sizes.
> > 
> > I think that the problem is in wrong area->step calculation in alsa-lib, 
> > but I'm still investigating where the real culprit is. The
> > snd_pcm_format_width() is used only for sample filling (which is OK).
> 
> I think Clemens is right.  The program uses snd_pcm_format_width()
> wrongly.  Also, it won't work properly with strict aliasing...

Yes, the patch looks good. I overlooked that the area initialization is 
directly in pcm.c code (I looked only to generate_sine(). I tested it and 
it produces good samples. I'm getting some underruns on my notebook with 
24-bit formats (but it's probably different problem).

					Jaroslav

-----
Jaroslav Kysela <perex@perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: S24_LE is 3 bytes ? in alsa-lib example pcm.c
  2008-07-10 10:19   ` Jaroslav Kysela
@ 2008-07-10 16:30     ` Takashi Iwai
  2008-07-10 10:41       ` Jaroslav Kysela
  0 siblings, 1 reply; 6+ messages in thread
From: Takashi Iwai @ 2008-07-10 16:30 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: ALSA development, Clemens Ladisch, Norbert van Bolhuis

At Thu, 10 Jul 2008 12:19:05 +0200 (CEST),
Jaroslav Kysela wrote:
> 
> On Thu, 10 Jul 2008, Clemens Ladisch wrote:
> 
> > Norbert van Bolhuis wrote:
> > > as far as I know:
> > > sample format S24_LE is 24bit sample in 4 bytes
> > > sample format S24_3LE is 24bit sample in 3 bytes
> > > (why else have separate definitions), right ?
> > 
> > Yes.
> > 
> > > In the ALSA-LIb example /test/pcm.c however
> > > (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
> > > there is no diff between the 2 sample formats.
> > 
> > That example program uses snd_pcm_format_width() although it should
> > have used snd_pcm_format_physical_width() when calculating memory
> > buffer sizes.
> 
> I think that the problem is in wrong area->step calculation in alsa-lib, 
> but I'm still investigating where the real culprit is. The
> snd_pcm_format_width() is used only for sample filling (which is OK).

I think Clemens is right.  The program uses snd_pcm_format_width()
wrongly.  Also, it won't work properly with strict aliasing...

Untested patch is below.


Takashi
--
diff --git a/test/pcm.c b/test/pcm.c
index cd29259..ecd0afa 100644
--- a/test/pcm.c
+++ b/test/pcm.c
@@ -38,7 +38,10 @@ static void generate_sine(const snd_pcm_channel_area_t *areas,
 	unsigned char *samples[channels], *tmp;
 	int steps[channels];
 	unsigned int chn, byte;
-	int ires;
+	union {
+		int i;
+		unsigned char c[4];
+	} ires;
 	unsigned int maxval = (1 << (snd_pcm_format_width(format) - 1)) - 1;
 	int bps = snd_pcm_format_width(format) / 8;  /* bytes per sample */
 	
@@ -59,8 +62,8 @@ static void generate_sine(const snd_pcm_channel_area_t *areas,
 	/* fill the channel areas */
 	while (count-- > 0) {
 		res = sin(phase) * maxval;
-		ires = res;
-		tmp = (unsigned char *)(&ires);
+		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];
@@ -868,7 +871,7 @@ int main(int argc, char *argv[])
 	if (verbose > 0)
 		snd_pcm_dump(handle, output);
 
-	samples = malloc((period_size * channels * snd_pcm_format_width(format)) / 8);
+	samples = malloc((period_size * channels * snd_pcm_format_physical_width(format)) / 8);
 	if (samples == NULL) {
 		printf("No enough memory\n");
 		exit(EXIT_FAILURE);
@@ -881,8 +884,8 @@ int main(int argc, char *argv[])
 	}
 	for (chn = 0; chn < channels; chn++) {
 		areas[chn].addr = samples;
-		areas[chn].first = chn * snd_pcm_format_width(format);
-		areas[chn].step = channels * snd_pcm_format_width(format);
+		areas[chn].first = chn * snd_pcm_format_physical_width(format);
+		areas[chn].step = channels * snd_pcm_format_physical_width(format);
 	}
 
 	err = transfer_methods[method].transfer_loop(handle, samples, areas);

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: S24_LE is 3 bytes ? in alsa-lib example pcm.c
  2008-07-10 10:41       ` Jaroslav Kysela
@ 2008-07-10 16:46         ` Takashi Iwai
  0 siblings, 0 replies; 6+ messages in thread
From: Takashi Iwai @ 2008-07-10 16:46 UTC (permalink / raw)
  To: Jaroslav Kysela; +Cc: ALSA development, Clemens Ladisch, Norbert van Bolhuis

At Thu, 10 Jul 2008 12:41:39 +0200 (CEST),
Jaroslav Kysela wrote:
> 
> On Thu, 10 Jul 2008, Takashi Iwai wrote:
> 
> > At Thu, 10 Jul 2008 12:19:05 +0200 (CEST),
> > Jaroslav Kysela wrote:
> > > 
> > > On Thu, 10 Jul 2008, Clemens Ladisch wrote:
> > > 
> > > > Norbert van Bolhuis wrote:
> > > > > as far as I know:
> > > > > sample format S24_LE is 24bit sample in 4 bytes
> > > > > sample format S24_3LE is 24bit sample in 3 bytes
> > > > > (why else have separate definitions), right ?
> > > > 
> > > > Yes.
> > > > 
> > > > > In the ALSA-LIb example /test/pcm.c however
> > > > > (http://www.alsa-project.org/alsa-doc/alsa-lib/_2test_2pcm_8c-example.html)
> > > > > there is no diff between the 2 sample formats.
> > > > 
> > > > That example program uses snd_pcm_format_width() although it should
> > > > have used snd_pcm_format_physical_width() when calculating memory
> > > > buffer sizes.
> > > 
> > > I think that the problem is in wrong area->step calculation in alsa-lib, 
> > > but I'm still investigating where the real culprit is. The
> > > snd_pcm_format_width() is used only for sample filling (which is OK).
> > 
> > I think Clemens is right.  The program uses snd_pcm_format_width()
> > wrongly.  Also, it won't work properly with strict aliasing...
> 
> Yes, the patch looks good. I overlooked that the area initialization is 
> directly in pcm.c code (I looked only to generate_sine(). I tested it and 
> it produces good samples. I'm getting some underruns on my notebook with 
> 24-bit formats (but it's probably different problem).

OK, committed now.


Takashi

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-07-10 10:46 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-07-10  8:24 S24_LE is 3 bytes ? in alsa-lib example pcm.c Norbert van Bolhuis
2008-07-10  9:23 ` Clemens Ladisch
2008-07-10 10:19   ` Jaroslav Kysela
2008-07-10 16:30     ` Takashi Iwai
2008-07-10 10:41       ` Jaroslav Kysela
2008-07-10 16:46         ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.