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
// 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
versuch mal so:
// 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
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
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
// 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
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.
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
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.
...oder im INLINE Teil dann:
#ifdef GP2X
#elif defined(LINUX)
#elif defined(MACOSX)
#elif defined (POCKETPC)
#else // win32
#endif
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
ich glaube, wir reden aneinander vorbei. Der BASIC Teil muss gleich sein.
Mach mal eine Funktion als Beispiel, damit ich's richtig verstehe.
*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???
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
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.