[alsa-devel] Serious bug calling ALSA lib functions from .so vs. .o file
scott andrew franco
samiam at moorecad.com
Tue Jun 18 17:54:02 CEST 2019
uname -a
Linux samiam-home-pc 4.15.0-51-generic #55-Ubuntu SMP Wed May 15 14:27:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
samiam at samiam-home-pc:/usr/lib/x86_64-linux-gnu$ ls -l libasound*
lrwxrwxrwx 1 root root 18 Dec 18 20:25 libasound.so -> libasound.so.2.0.0
lrwxrwxrwx 1 root root 18 Dec 18 20:25 libasound.so.2 -> libasound.so.2.0.0
-rw-r--r-- 1 root root 1075496 Dec 18 20:25 libasound.so.2.0.0
samiam at samiam-home-pc:/usr/lib/x86_64-linux-gnu$
--------- Original Message --------- Subject: RE: Serious bug calling ALSA lib functions from .so vs. .o file
From: "scott andrew franco" <samiam at moorecad.com>
Date: 6/18/19 8:16 am
To: alsa-devel at alsa-project.org
Hello,
The issue:
calling across .so (dynamic linking) produces different behavior in ALSA library calls than normal,
and causes ALSA to malfunction.
I have minimized my issue to as small a code section as possible. Note the code is from commonly available
internet examples, including Free Electrons "Audio in embedded linux systems".
The run is:
samiam at samiam-home-pc:~/projects/petit_ami$ gcc -fPIC -c test2.c -o test2.o
samiam at samiam-home-pc:~/projects/petit_ami$ gcc -g3 -Iinclude linux/playwav.c ./test2.so -lasound -o playwav
samiam at samiam-home-pc:~/projects/petit_ami$ ./playwav
alsaplaywave: rate: 1
alsaplaywave: rate: 0
samiam at samiam-home-pc:~/projects/petit_ami$ gcc -g3 -Iinclude linux/playwav.c ./test2.o -lasound -o playwav
samiam at samiam-home-pc:~/projects/petit_ami$ ./playwav
alsaplaywave: rate: 1
alsaplaywave: rate: 1
Note the only difference between the two runs of "playwave" is if the second module, test2, is linked as a .so or
linked as a .o.
The code is:
=======================================================================================
playwav.c
#include <alsa/asoundlib.h>
#include <stdio.h>
void alsaplaywave1(void)
{
snd_pcm_t *pcm_handle;
snd_pcm_hw_params_t *params;
unsigned int val;
unsigned int rate;
int r;
/* open pcm device */
r = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
if (r < 0) printf("Cannot open PCM output device");
snd_pcm_hw_params_alloca(¶ms); /* get hw parameter block */
snd_pcm_hw_params_any(pcm_handle, params);
r = snd_pcm_hw_params_set_access(pcm_handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
if (r < 0) printf("Cannot set interleaved mode");
r = snd_pcm_hw_params_set_format(pcm_handle, params, SND_PCM_FORMAT_S16_LE);
if (r < 0) printf("Cannot set format");
r = snd_pcm_hw_params_set_channels(pcm_handle, params, 2);
if (r < 0) printf("Cannot set channels number");
val = 44100;
r = snd_pcm_hw_params_set_rate_near(pcm_handle, params, &rate, 0);
if (r < 0) printf("Cannot set rate");
snd_pcm_hw_params_get_rate(params, &rate, 0);
printf("alsaplaywave: rate: %d\n", rate);
snd_pcm_close(pcm_handle);
}
extern void alsaplaywave2(void);
int main(int argc, char **argv)
{
alsaplaywave1();
alsaplaywave2();
return 0;
}
==================================================================================
test2.c
#include <alsa/asoundlib.h>
#include <stdio.h>
void alsaplaywave2(void)
{
snd_pcm_t *pcm_handle;
snd_pcm_hw_params_t *params;
unsigned int val;
unsigned int rate;
int r;
/* open pcm device */
r = snd_pcm_open(&pcm_handle, "default", SND_PCM_STREAM_PLAYBACK, 0);
if (r < 0) printf("Cannot open PCM output device");
snd_pcm_hw_params_alloca(¶ms); /* get hw parameter block */
snd_pcm_hw_params_any(pcm_handle, params);
r = snd_pcm_hw_params_set_access(pcm_handle, params, SND_PCM_ACCESS_RW_INTERLEAVED);
if (r < 0) printf("Cannot set interleaved mode");
r = snd_pcm_hw_params_set_format(pcm_handle, params, SND_PCM_FORMAT_S16_LE);
if (r < 0) printf("Cannot set format");
r = snd_pcm_hw_params_set_channels(pcm_handle, params, 2);
if (r < 0) printf("Cannot set channels number");
val = 44100;
r = snd_pcm_hw_params_set_rate_near(pcm_handle, params, &rate, 0);
if (r < 0) printf("Cannot set rate");
snd_pcm_hw_params_get_rate(params, &rate, 0);
printf("alsaplaywave: rate: %d\n", rate);
snd_pcm_close(pcm_handle);
}
More information about the Alsa-devel
mailing list