Benoît Minisini ha scritto:
>> Hi,
>>
>> I finally wrote the tutorial about using external declarations.
>>     
> This is not HTML, but plain text. If you can make an HTML version of your 
> document, with formatted text, I will be able to add it to the wiki.
>   
Mmm... this is an excerpt from the first lines of "External-howto.html", 
the file attached to my previous message:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd";>
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html;
    charset=UTF-8">


This seems HTML to me... what document are you speaking about? Perhaps 
the .t2t one?

>
>> In the Drum Machine project, after having verified that it works
>> correctly using pointers for read/write, I tried to create a new class
>> which should be a gambas representation for an alsa event (which is a C
>> struct). It does not work, and I don't know how to debug it (well, I
>> could, using gdb or similar, but I was looking for a more direct way).
>>     
>
> Give me the C declaration, and your class declaration, and I will be able to 
> see if they correctly match.
>   
Both are contained in the attached files - the C declaration, along with 
explanation and unrolling of structs/typedef/#define and so on, in the 
document; the Gambas class trying to emulate the C declaration, in the 
project "Gambas2-Drummachine....". For your convenience, I will repeat 
both at the end of this email.

>
> It is explicitely said that "WRITE #Pointer" is not supported anymore in 
> Gambas 3, in the WRITE documentation page. And so on for the READ instruction.
>   
Sorry, I think that it is not so clear. "No more supported", or 
equivalent semantics, is totally absent from the page. It is true that 
there is a frame specifying the syntax for READ in Gambas3, but it 
speaks only about "READ #Stream". This makes me think that the "READ 
#Stream" syntax or behavior changed, not necessarily that pointers are 
no more valid. Perhaps would be better to say something more in the 
first frame, the one just below the title of the page: "WARNING! The 
syntax has changed in Gambas 3. READ/WRITE with pointers is no more 
supported in Gambas 3. See below."

You said that you removed this syntax because of possible problems with 
memory alignment. What about BytePtr(), SinglePtr() and the alike? Do 
they not suffer from the same problem? (Just a curiosity).

> The Gambas 3 structures were implemented for the use of extern C structures. 
> Moreover, in Gambas 3, you can now use Gambas functions as C function pointer 
>  
> (as known as "callbacks") almost transparently.
>   
I know... it was me that kindly requested that feature, I suppose... :-)
And, apropos...
I saw that alsa does not really provides a callback - there is something 
about in an undocumented source (an utility for alsa). Instead, what 
alsa provides, is a file descriptor which can be poll()ed or select()ed. 
Then I have seen a source for QT, which uses this capability. It seems 
the QT has a way to pass it a file descriptor, so it can raise events 
intermixed with GUI events. Glib too has something similar. I thought to 
use or fool some gambas stream to obtain the same result... but perhaps 
you have a better idea.

Now let us see the problem about the alsa (musical) event structure. 
Giving that I made it to work, probably I did understand that structure 
and, if I only had a simple way to debug my gambas implementation, I 
would have had success. The alsa declaration is:

    snd_seq_event_type_t    type
    unsigned char           flags
    unsigned char           tag
    unsigned char           queue
    snd_seq_timestamp_t     time
    snd_seq_addr_t          source
    snd_seq_addr_t          dest
    union {
       snd_seq_ev_note_t    note
        ...

The first field, type, is a byte. The fifth field, time, is a union 
having a total length of two ints, eight bytes in total.
The source and dest fields are struct composed of two bytes each. After 
this fields, that are common to every alsa event, comes a specialized 
part for every different event. I only used the snd_seq_ev_note_t.

My gambas translation is:

    ' Gambas class file

    ' object data to simulate a C struct

    type AS Byte            '    snd_seq_event_type_t type
    flags AS Byte           '    unsigned char flags
    tag AS Byte             '    unsigned char tag
    PUBLIC queue AS Byte    '    unsigned char queue
    time_tick AS Integer    '    snd_seq_timestamp_t Time
    time_dummy AS Integer   '    snd_seq_timestamp_t Time (2 part of union)
    PUBLIC sourceq AS Byte  '    snd_seq_addr_t source (source client)
    PUBLIC sourcep AS Byte  '    snd_seq_addr_t source (source port)
    PUBLIC destq AS Byte    '    snd_seq_addr_t dest (dest client)
    PUBLIC destp AS Byte    '    snd_seq_addr_t dest (dest port)

    ' note on fields of union {   snd_seq_ev_note_t note ...
    channel AS Byte
    note AS Byte
    velocity AS Byte

    ' a few bytes as filler
    dummy1 AS Integer
    dummy2 AS Integer
    ...

If you can use MIDI, or you have a soft synth like timidity, you can try 
to run the project to see what is going on.
In FMain.class, in the subroutine btLegato2_Click(), you find:

    ' alsa.playnoteobj(-10 * i, 0, 60 + i, 100, 20)
    alsa.playnote(-10 * i, 0, 60 + i, 100, 20)

Decomment the first line and comment-out the second. The second line 
prepares a C struct as the one above, using pointers to write in a 
memory region previously allocated, once for the whole life of the 
running program. The first line instead, tries to do the same by using a 
gambas class. An instance of that class is created once, and then 
repeatedly written to to set the various fields; finally, a pointer to 
the instance is passed to alsa, but alsa replies with "invalid 
argument". My machine is a 32-bit AMD Duron, with a Debian stable 
distribution; the test was made with gambas 2.0.0.

Best regards,
Doriano


------------------------------------------------------------------------------
Sell apps to millions through the Intel(R) Atom(Tm) Developer Program
Be part of this innovative community and reach millions of netbook users 
worldwide. Take advantage of special opportunities to increase revenue and 
speed time-to-market. Join now, and jumpstart your future.
http://p.sf.net/sfu/intel-atom-d2d
_______________________________________________
Gambas-user mailing list
Gambas-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gambas-user

Reply via email to