[pulseaudio-discuss] Is this a pulseaudio bug or a vala bug?

Sean McNamara smcnam at gmail.com
Thu Mar 24 22:08:51 PDT 2011


Hi,

On Thu, Mar 24, 2011 at 10:37 PM, Alexander Kurtz
<kurtz.alex at googlemail.com> wrote:
> Hi,
>
> I have a problem with Pulseaudio (0.9.21) + Vala (0.10.4). I've written
> this small demonstration program:
>
>        $ cat test.vala
>        class MyClass : Object {
>                static void main(){
>                        PulseAudio.SampleSpec spec = PulseAudio.SampleSpec() {
>                                format = PulseAudio.SampleFormat.S32NE,
>                                channels = 2,
>                                rate = 44100
>                        };
>                        PulseAudio.MainLoop loop =
>                                new PulseAudio.MainLoop();
>                        PulseAudio.Context context =
>                                new PulseAudio.Context(loop.get_api(), null);
>                        PulseAudio.Stream stream =
>                                new PulseAudio.Stream(context, "", spec);
>                        int32[] data = new int32[10];
>                        stream.write(data, sizeof(int32) * data.length);
>                }
>        }
>        $
>
> I know that this program won't work (i.e. "run") but it should compile
> just fine. However, I get this:
>
>        $ valac --vapidir=. --pkg=libpulse --pkg=posix test.vala
>        /home/alexander/test/test.vala.c: In function ‘myclass_main’:
>        /home/alexander/test/test.vala.c:61: warning: passing argument 5 of ‘pa_stream_write’ makes integer from pointer without a cast
>        /usr/include/pulse/stream.h:503: note: expected ‘int64_t’ but argument is of type ‘void *’
>        /home/alexander/test/test.vala.c:61: error: too many arguments to function ‘pa_stream_write’
>        error: cc exited with status 256
>        Compilation failed: 1 error(s), 0 warning(s)
>        $
>
> Looking at the generated C-Code reveals this:
>
>        $ valac --vapidir=. --pkg=libpulse --pkg=posix --ccode test.vala
>        $ cat test.c
>        [...]
>                pa_stream_write (stream, data, (gsize) (sizeof (gint32) * data_length1), NULL, NULL, 0, PA_SEEK_RELATIVE);
>        [...]
>        $
>
> This is obviously wrong, since pa_stream_write takes 6 arguments not 7, see[1].
>
> Is this a bug in PA's Vala bindings or in Vala itself?

Look at the PulseAudio bindings in
/usr/share/vala*/vapi/pulseaudio.vapi, or in git:
http://git.0pointer.de/?p=pulseaudio.git;a=blob_plain;f=vala/libpulse.vapi;hb=refs/heads/master-tx

[Vala]:
public int write(void *data, size_t bytes, FreeCb? free_cb = null,
int64 offset = 0, SeekMode mode = SeekMode.RELATIVE);

Compared to [C]:
int 	pa_stream_write (pa_stream *p, const void *data, size_t nbytes,
pa_free_cb_t free_cb, int64_t offset, pa_seek_mode_t seek)

It seems that the parameters match up in the vapi, but it compiles
down to two NULLs instead of just one for the FreeCb. But if you look
at the signature of FreeCb, it tries to accept a void* as a parameter:

[Vala]
public delegate void FreeCb(void *p);

Maybe the extra parameter that Vala compiles in is supposed to be the
void* that the callback would then get passed? I think this is the
default behavior of a delegate. Maybe there is an annotation to tell
the Vala compiler not to supply a parameter to the call for the formal
parameters of the delegate?

Try the following

[CCode (has_target = false)]
public delegate void FreeCb(void *p);

Just a guess though -- it may not work as intended! There's virtually
no documentation on this attribute; I'm just guessing from the Vala
sources.

HTH,

Sean

>
> Best regards
>
> Alexander Kurtz
>
> [1] http://0pointer.de/lennart/projects/pulseaudio/doxygen/stream_8h.html#a4fc69dec0cc202fcc174125dc88dada7
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at mail.0pointer.de
> https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss
>
>



More information about the pulseaudio-discuss mailing list