Frage zu INLINE [solved]

Previous topic - Next topic

D.J.Peters

Ich wollte meine freie Soundlib für WIN32, Linux x86, WINCE und GPX2
allen GLBasic Usern zur Verfügung stellen.
Kenne aber GLBasic nicht und stolpere schon beim Anfang.

Die Fehlermeldung ist "init was not declared in this scope"
Was mache hier falsch bzw. anders als im MessageBox DLL Beispiel?

Danke und Grüsse

Joshy
Code (glbasic) Select
// Project: test01
ok=SoundInit()
PRINT "SoundInit()=" + ok ,100,100
SHOWSCREEN
MOUSEWAIT
END

INLINE
  DECLARE_ALIAS(init, "freesound.dll", "SND_INIT@0",(void), int);
ENDINLINE

FUNCTION SoundInit:
  LOCAL ret
  INLINE
    ret=init();
  ENDINLINE
  RETURN ret
ENDFUNCTION

trucidare

versuch mal so:

Code (glbasic) Select
// Project: test01
ok=SoundInit()
PRINT "SoundInit()=" + ok ,100,100
SHOWSCREEN
MOUSEWAIT
END

FUNCTION foo:
ENDFUNCTION

INLINE
  DECLARE_ALIAS(init, "freesound.dll", "SND_INIT@0",(void), int);
ENDINLINE

FUNCTION SoundInit:
  LOCAL ret
  INLINE
    ret=init();
  ENDINLINE
  RETURN ret
ENDFUNCTION
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

D.J.Peters

Quote from: trucidare on 2008-Jun-16versuch mal so:...
Werd ich machen was macht denn die DUMMY function foo nach dem END Befehl?

Danke und Grüsse

Joshy

D.J.Peters

gibt es kein INCLUDE für BASIC?
sind symbole auch in BASIC definiert wenn ja welche
(sonst artet es in zu viel Arbeit aus)

ich bräuchte so etwas wie

#if PC then
include "soundpc.bas"
#elseif WINCE
include "soundce.bas"
#elseif GPX
include "soundgpx.bas"
...
...
#endif

Grüsse Joshy

nur um zu sehen was ich meine mit Arbeit
Code (glbasic) Select
// Project: test01

PRINT "FPU    = "+IsFPU()   ,0,8*0
PRINT "MMX    = "+IsMMX()   ,0,8*1
PRINT "MMX2   = "+IsMMX2()  ,0,8*2
PRINT "SSE    = "+IsMMX()   ,0,8*3
PRINT "SSE2   = "+IsMMX2()  ,0,8*4
PRINT "3DNOW  = "+Is3DNOW() ,0,8*5
PRINT "3DNOW2 = "+Is3DNOW2(),0,8*6
PRINT "MHz    = "+MHz()     ,0,8*7

SHOWSCREEN
MOUSEWAIT
END

FUNCTION foo:
  PRINT "foo" ,100,120
ENDFUNCTION


INLINE
  #if defined(WIN32) || defined(LINUX)
  # define _PC32_ 
  # if defined(WIN32)
  #  define LIB "freesound.dll"
  # else
  #  define LIB "freesound.so"
  # endif
 
    // system info
    DECLARE_ALIAS(_isfpu     ,LIB , "ISFPU@0"      ,(void), int);
    DECLARE_ALIAS(_ismmx     ,LIB , "ISMMX@0"      ,(void), int);
    DECLARE_ALIAS(_ismmx2    ,LIB , "ISMMX2@0"     ,(void), int);
    DECLARE_ALIAS(_issse     ,LIB , "ISSSE@0"      ,(void), int);
    DECLARE_ALIAS(_issse2    ,LIB , "ISSSE2@0"     ,(void), int);
    DECLARE_ALIAS(_is3dnow   ,LIB , "IS3DNOW@0"    ,(void), int);
    DECLARE_ALIAS(_is3dnow2  ,LIB , "IS3DNOW2@0"   ,(void), int);
   
    // helpers
    DECLARE_ALIAS(_mhz       ,LIB , "MHZ@0"        ,(void), int);
    DECLARE_ALIAS(_cpucounter,LIB , "CPUCOUNTER@0" ,(void), int);
 
    // core
    DECLARE_ALIAS(_init      ,LIB , "SND_INIT@0"   ,(void), int);
 
  #else
  # error "First test is only for WIN32 or LINUX !"
  #endif
ENDINLINE

FUNCTION IsFPU:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_isfpu();
  #endif
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION IsMMX:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_ismmx();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION IsMMX2:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_ismmx2();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION IsSSE:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_issse();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION IsSSE2:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_issse2();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION Is3DNOW:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_is3dnow();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION Is3DNOW2:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_is3dnow2();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION MHz:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_mhz();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

FUNCTION CPUCounter:
  LOCAL ret
  INLINE
  #if defined(_PC32_)
    ret=_cpucounter();
  #endif 
  ENDINLINE
  RETURN ret
ENDFUNCTION

trucidare

#4
hmm ich versteh das problem nicht.
Eine include funktion gibs leider nicht. du kannst deine dateien zum projekt hinzufügen und dann werden sie mit kompiliert.

EDIT:// die dummy funktion beendet die MainGame funktion. erst dann kannst du mit deinem inline code arbeiten.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

D.J.Peters

Quote from: trucidare on 2008-Jun-16...du kannst deine dateien zum projekt hinzufügen und dann werden sie mit kompiliert...
Bei 25 Beispielen zur Nutzung der Soundlib müste ich ja für jede Plattform * 25 Projekte erstellen die dann die Plattformabhängigen Quellcodes beinhalten.

Dabei bräuchte ich doch nur in den 25 Beispielen am Anfrag fragen welche Plattform und Includen
Naja wenn es nicht anders geht dann geht es halt nicht.

Grüsse Joshy

trucidare

versteh ich nich O.o
deine soundlib.dll / .so /.dylib beinhalten doch alle die selben funktionen. überprüf halt vorher ob win32 oder linux oder sonstwas kompiliert wird und setz deine variable.
lade den kram per declare und voila.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

Kitty Hello

...oder im INLINE Teil dann:
#ifdef GP2X
#elif defined(LINUX)
#elif defined(MACOSX)
#elif defined (POCKETPC)
#else // win32
#endif

D.J.Peters

Quote from: Gernot Frisch on 2008-Jun-17
...oder im INLINE Teil dann:
#ifdef GP2X
#elif defined(LINUX)
#elif defined(MACOSX)
#elif defined (POCKETPC)
#else // win32
#endif
Danke das war mir auch schon klar siehe ersten Post.
Das Problem ist ja, dass man im C++ Inlinebereich ja keine OS abhängigen BASIC Quellcodes includen kann
aber jede externe funktion einen BASIC wraper haben muss. (das ist das Problem)

z.B. CPUCounter() oder IsSSE() darf nur für PC Platformen included werden
aber z.B. MHz() unterstütze ich auf allen Platformen

Daher ich muss für alle 250 Funktionen einen BASIC wraper und ein Inline DECLARE schreiben.

Na denn und Grüsse

Joshy


Kitty Hello

ich glaube, wir reden aneinander vorbei. Der BASIC Teil muss gleich sein.
Mach mal eine Funktion als Beispiel, damit ich's richtig verstehe.

trucidare

*kopfkratz* bin ich der einzige der das nicht versteht`? *g*

Also ich denk mir das so:

Du hast eine dyamische lib die du einbinden willst. Alle libs beinhalten die selben Befehle, jedoch nicht die, die z.b. nur für win32 sind???
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC

D.J.Peters

#11
Nö wir reden eigentlich nicht aneinander vorbei das Einbinden von externen Funktionen ist halt etwas halbhertzig in GLB Implementiert. Diese Aussage erlaube ich mir weil selber Kompilerbauer und in meinem und vielen anderen Basic Kompilern kann eine extern deklarierte Funktion ohne zusätlichen BASIC Wraper Code benutzt werden. Ist ja auch Aufgabe des Linkers die unaufgelöste Refrenz (Pointer Platzhalter im Code Segment) zu Linken.

Ein wenig Preprocessor im BGL Basic wäre halt genau für diesem Fall recht Hilfreich
weil der Komnpiler ja mehrere Platformen unterstützt.
(Sonst nicht weil GLB ja so einfach wie möglich gehalten werden soll und das ist ja auch gut so)

Abner "nur" mit C/C++ Preprocessor in BGL habe ich entweder für jede Platform ein Verzeichnis mit OS abhängigen Declares.
\FreeSound
\FreeSound\win32_linux\beispiel00 bis 25.gbas
\FreeSound\gpx2\beispiel00 bis 25.gbas
\FreeSound\wince\beispiel00 bis 25.gbas
\FreeSound\macos\beispiel00 bis 25.gbas
...

Oder aber alle FreeSound Beispiele sind in einem Verzeichnis und verwenden nur eine Freesound Datei
dann müste ich für 250 Funktionen innerhalb des inline Bereiches des Basic Wrapers entscheiden
ob für die aktuelle zu Kompelierende Plattform die jeweilige Funktion überhaupt existiert.

Und nein nicht alle Funktionen stehen auf allen Platformen in gleicher Form zur Verfügung.

[pseudo code]
inline // im C/C++ bereich
#if bla1
  declare foo...
#elseif bla2
  declare_c foo...
#elseif bla3
  declare_alias foo...
#elseif bla4
  declare_c_alias foo...
#else
  // existiert nicht auf Platform blaxyz
#endif
endinline

FUNCTION foo() rem im BASIC Bereich
INLINE
#if bla1 (*)
  return foo() ' wenn existiert für Platform bla1
#elseif  bla1
  return foo() ' wenn existiert für Platform bla2
#elseif  bla2
  return foo() ' wenn existiert für Platform bla3
#else  bla3
  return foo() ' wenn existiert für Platform bla4
#else
  return error_code ' existiert nicht auf Platform blaxyz
#endif
ENDINLINE
ENDFUNCTION

(*) oder halt #if bla1 || bla2 ||  bla3 (wenn alle parameter gleich sind)


Es fehlt #IF und #INCLUDE im GL BASIC Bereich (nur im C++ inline Teil löst das Problem ja nicht)

Aber ich kann da mit leben ist nur halt mehr Tiparbeit um die Soundlib auch in GLB zur Verfügung zu haben.

PS. Die Soundlib unterstützt:
Assembler optimierte Mixerpipeline Pre und Post (wenn vorhanden mit CPU Extension FPU,MMX,MMX2,SSE,3DNOW...)
Belibiege Abspielgeschwindigkeiten (auch reverse)
Zeitunabhängie Abspielgeschwindigkeiten (realtime pitch shifting auch reverse kein Mickimouse Effekt)
10 frei definierbare EQ's (für jeden Channel, Stream und für alle in der Mastersektion)
Alle Parameter (Stereoposition, Volumen, Speed, EQ's ...) können während der Wiedergabe beliebig geändert werden.
User defined Callbacks Pre und Post (für jeden Channels, Stream oder Mastersection)
Realtime MP3 Streamdecoder für parallele Streams (nicht Streams werden zuvor im Speicher geladen/decodiert)
Last but not least 25 Beispiele in den alle Befehle mal zum Zuge kommen.

Grüsse und "happy coding"

Joshy

trucidare

Und wie ihr aneinander vorbeiredet. Du wirst doch in deiner komischen lib für verschiedene platformen die befehle umbenennen das wäre ja sowas von schwachsinnig.

deswegen setz doch einfach die befehle mit #ifndef im inline inaktiv die du für den fall nicht brauchst.

pseudo code:

function Sound_init:
IF WIN32
InitMMX()
ELIF MACOS
InitNormal()
....
endfunction


und so baust du dir 1ne datei zusammen die du für alle deine 25 beispiel nutzen kannst. wenn du nun die platform oben aussuchst nimmt der halt die befehle die er soll.
Da ist nichts mit 25x nplatform samples.
MacBook Pro 2,2 GHz Core 2 Duo, 4 GB RAM, 160 GB HDD, 8600M GT
Core i3 - 3,07 GHz, 8 GB Ram, 2.5 TB HDD, Geforce GTX 260+ OC