Discussion:
Help Audio::Ao XS/C - Segfaults on i686
(too old to reply)
agraham
2012-05-29 21:43:41 UTC
Permalink
Hi Guys,

I've been using Audio::Ao
(http://search.cpan.org/~dbp/Audio-Ao-0.01/Ao.pm) for some weeks and
it's great.

It's an interface to the libao library (http://xiph.org/ao/)

However, until today I have only used it on Linux x64 (Fedora 14), I
compiled it on i686 (Fedora 14) and it segfaults when I call the
open_live() function.

I created a clean F14 VM and get the same results as the i686 machine.

The other functions/methods appear to work and return the corrected data
from the library.

I do not understand C or XS and am incapable of fixing this issue myself
and was hoping someone could help resolve this problem as the Author is
AWAL :(

I'm pretty sure the bug is in the C/XS code:

Also: You are also supposed to be able to pass some optional parameters
to the open_live function, but if you pass anything other than an empty
hash ref (e.g. {}) it always segfaults :(, it would be nice to know why
that does not work as it should, but that is secondary.

To clarify, this works on x64, but _not_ on i686, but in both causes it
compiles fine.

The C/XS code is:

SV *open_live ( int id, int bits, int rate, int channels, int bform,
void *o)
{
ao_option *opstruct = NULL;
ao_sample_format format;
ao_device *device;
SV *hval;
HV *options;
char **hkey;
I32 *retlen;
int ops = 0;

if (o != NULL)
options = (HV *) o;
else
options = newHV();

hv_iterinit(options);
while ((hval = hv_iternextsv(options, hkey, retlen)) != NULL) {
ops = 1;
if (ao_append_option(&opstruct, *hkey, SvPV_nolen(hval)) != 1) {
perror("Bad value in options hash, aborting open_live");
return &PL_sv_undef;
}
}

format.bits = bits;
format.rate = rate;
format.channels = channels;
format.byte_format = bform;

if (ops > 0)
device = (ao_device *) ao_open_live(id, &format, opstruct);
else
device = (ao_device *) ao_open_live(id, &format, NULL);

ao_free_options(opstruct);

return newSViv((IV) device);
}


NOTE: The same issue exists with the open_file() function, so I assume
that is the same problem, as they are almost identical functions.

Thanks in advance

Albert
Xiao Yafeng
2012-06-10 13:39:15 UTC
Permalink
It appears to me this function open an ao_live and return a device no.
maybe the c library is too new to fit this. I suggest you use ao 0.86 which
was published on 2003. or you could post your request on perlmonks and see
if someone want to take over this module.
Post by agraham
Hi Guys,
I've been using Audio::Ao (http://search.cpan.org/~dbp/**
Audio-Ao-0.01/Ao.pm <http://search.cpan.org/~dbp/Audio-Ao-0.01/Ao.pm>)
for some weeks and it's great.
It's an interface to the libao library (http://xiph.org/ao/)
However, until today I have only used it on Linux x64 (Fedora 14), I
compiled it on i686 (Fedora 14) and it segfaults when I call the
open_live() function.
I created a clean F14 VM and get the same results as the i686 machine.
The other functions/methods appear to work and return the corrected data
from the library.
I do not understand C or XS and am incapable of fixing this issue myself
and was hoping someone could help resolve this problem as the Author is
AWAL :(
Also: You are also supposed to be able to pass some optional parameters to
the open_live function, but if you pass anything other than an empty hash
ref (e.g. {}) it always segfaults :(, it would be nice to know why that
does not work as it should, but that is secondary.
To clarify, this works on x64, but _not_ on i686, but in both causes it
compiles fine.
SV *open_live ( int id, int bits, int rate, int channels, int bform, void
*o)
{
ao_option *opstruct = NULL;
ao_sample_format format;
ao_device *device;
SV *hval;
HV *options;
char **hkey;
I32 *retlen;
int ops = 0;
if (o != NULL)
options = (HV *) o;
else
options = newHV();
hv_iterinit(options);
while ((hval = hv_iternextsv(options, hkey, retlen)) != NULL) {
ops = 1;
if (ao_append_option(&opstruct, *hkey, SvPV_nolen(hval)) != 1) {
perror("Bad value in options hash, aborting open_live");
return &PL_sv_undef;
}
}
format.bits = bits;
format.rate = rate;
format.channels = channels;
format.byte_format = bform;
if (ops > 0)
device = (ao_device *) ao_open_live(id, &format, opstruct);
else
device = (ao_device *) ao_open_live(id, &format, NULL);
ao_free_options(opstruct);
return newSViv((IV) device);
}
NOTE: The same issue exists with the open_file() function, so I assume
that is the same problem, as they are almost identical functions.
Thanks in advance
Albert
Loading...