 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 02:26 Titel: OpenAL erzielt keinen 3D Effekt |
|
|
Hallo,
ich habe gerade ein Problem mit OpenAL. Zwar werden bei mir Sounds immer gleich laut abgespielt und die Positionnierung gar nicht beachtet. Ich wollte mir alles in Funktionen packen um das ganze für ein Spiel zu verwenden, hier der Sourcecode:
Code: | #Include "al/al.bi"
#Include "al/alut.bi"
Declare Function initSound() As Integer
Declare Function loadWav(fname As string) As Integer
Declare Function UnloadSound() As Integer
Declare Function stopSound(nr As integer) As Integer
Declare Function playSound(nr As Integer, looping As Integer) As Integer
Declare Function setSoundPosition(nr As Integer, x As Single, y As Single, z As Single) As Integer
Declare Function setListenerPosition(x As Single, y As Single, z As Single, velX As Single, velY As Single, velZ As Single, oAtX As Single, oAtY As Single, oAtZ As Single, oUpX As Single, oUpY As Single, oUpZ As Single) As Integer
dim shared Buffer(10) as ALuint
dim shared Source(10) as ALuint
Dim Shared wavFormat as ALenum
dim Shared wavSize as ALsizei
dim Shared wavFreq as ALsizei
dim Shared wavData as any ptr
dim Shared wavLoop as ALboolean
Dim Shared As Integer soundCount = 0
dim Shared curPitch as ALfloat
dim y as integer
dim tmr as single
dim kbin as string
If initSound() Then
Dim wav1 As Integer
wav1 = loadWav("4.wav")
'setSoundPosition(wav1, 100000, 100000, 100000)
'setListenerPosition(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
playSound(wav1, 1)
EndIf
Function initSound() As Integer
Print "Initialising OpenAL... ";
alutInit(0, 0)
Print "done."
If alGetError <> AL_NO_ERROR then
Print "failed!"
alutExit
Return 0
End if
Return 1
End Function
Function loadWav(fname As string) As Integer
soundCount += 1
Print "Load Sound" & fname
alutLoadWAVFile(fname, @wavFormat, @wavData, @wavSize, @wavFreq, @wavLoop)
alGenBuffers(1, @Buffer(soundCount))
alBufferData(Buffer(soundCount), wavFormat, wavData, wavSize, wavFreq)
alutUnloadWAV(wavFormat, wavData, wavSize, wavFreq)
If alGetError <> AL_NO_ERROR then
print "failed!"
alutExit
Return 0
End If
alGenSources(1, @Source(soundCount))
If alGetError <> AL_NO_ERROR then
Print "failed!"
alutExit
Return -1
End if
Return soundCount
End Function
Function playSound(nr As Integer, looping As Integer) As Integer
If (looping) Then
curPitch = 1.0
Dim As ALfloat iu(3)
iu(0) = 0
iu(1) = 0
iu(2) = 0
Dim As ALfloat iui(3)
iui(0) = 100
iui(1) = 100
iui(2) = 100
alSourcei (Source(nr), AL_BUFFER, Buffer(nr))
alListenerfv (AL_POSITION, @iu(0))
alSourcefv(source(nr), AL_VELOCITY, @iu(0))
alSourcef (Source(nr), AL_PITCH, 1)
'alSourcefv(Source(nr), AL_POSITION, 0)
alSourcef (Source(nr), AL_GAIN, 1.0)
alSourcei (Source(nr), AL_LOOPING, AL_TRUE)
alListenerfv(AL_VELOCITY, @iui(0))
alListenerfv(AL_ORIENTATION, @iui(0))
alListenerfv(AL_POSITION, @iui(0))
alListenerfv(AL_VELOCITY, @iui(0))
alListenerfv(AL_ORIENTATION, @iui(0))
Else
alSourcei(Source(nr), AL_LOOPING, AL_TRUE)
End If
alSourcePlay(Source(nr))
Print alGetError()
Return 1
End Function
Function stopSound(nr As Integer) As Integer
alSourceStop(Source(nr))
Return 1
End Function
Function setSoundPosition(nr As Integer, x As Single, y As Single, z As Single) As Integer
dim SourcePos(3) as ALfloat
dim SourceVel(3) as ALfloat
SourcePos(0) = x
SourcePos(1) = y
SourcePos(2) = z
SourceVel(0) = 0.0 ' x
SourceVel(1) = 0.0 ' y
SourceVel(2) = 0.0 ' z
curPitch = 1.0
'alSourcei (Source(nr), AL_BUFFER, Buffer(nr))
'alSourcef (Source(nr), AL_PITCH, curPitch)
'alSourcef (Source(nr), AL_GAIN, 1.0)
'alSourcefv(Source(nr), AL_POSITION, @SourcePos(0))
'alSourcefv(Source(nr), AL_VELOCITY, @SourceVel(0))
'alSourcei (Source(nr), AL_LOOPING, wavLoop)
'Print alGetError()
Return 1
End function
Function setListenerPosition(x As Single, y As Single, z As Single, velX As Single, velY As Single, velZ As Single, oAtX As Single, oAtY As Single, oAtZ As Single, oUpX As Single, oUpY As Single, oUpZ As Single) As Integer
Dim ListenerPos(3) as ALfloat
Dim ListenerVel(3) as ALfloat
Dim ListenerOri(6) as ALfloat
ListenerPos(0) = x
ListenerPos(1) = y
ListenerPos(2) = z
ListenerVel(0) = velX
ListenerVel(1) = velY
ListenerVel(2) = velZ
ListenerOri(0) = oAtX
ListenerOri(1) = oAtY
ListenerOri(2) = oAtZ
ListenerOri(3) = oUpX
ListenerOri(4) = oUpY
ListenerOri(5) = oUpZ
alListener3f(AL_POSITION, x, y, z)
'alListenerfv(AL_POSITION, @ListenerPos(0))
'alListenerfv(AL_VELOCITY, @ListenerVel(0))
'alListenerfv(AL_ORIENTATION, @ListenerOri(0))
'Print alGetError()
Return 1
End Function
function UnloadSound() As Integer
Dim i As Integer
For i = 0 To soundCount
alDeleteBuffers(1, @Buffer(i))
alDeleteSources(1, @Source(i))
Next
alutExit
Return 1
end Function
Sleep
|
Einige Dinge habe ich auskommentiert und bissel was rumgetestet, somit verwende ich die Funktionen zur Positionierung nicht aber mach das ganze in playSound() Egal was ich da für ALfloats übergebe, immer das selbe Ergebnis. Und AlGetError() ist 0.
Ne Idee?
Danke  |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 08:44 Titel: |
|
|
Hier mal ein kleines Video was es werden soll:
http://www.youtube.com/watch?v=kMFQ9rywbn4
Als Engine nehme ich Irrlicht. Eventuell käm für den Sound noch Irrklang in frage, aber der FB Wrapper braucht die Version 0.4 und die findet man nirgends.
Kurzum gesagt, ich nehme jeden Tipp der mir 3D Sound bringt an  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.05.2013, 15:34 Titel: |
|
|
Würde ja gern mal testen;
interessant finde ich das alle (FreeBASIC) Titorials wie auch Dein Code eine Function alutLoadWAVFile aufrufen, ich mich aber gerade frage woher diese kommt...
denn meine alut.bi -> https://github.com/freebasic/fbc/blob/master/inc/AL/alut.bi enthält dafür keine deklaration.... _________________
 |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 16:09 Titel: |
|
|
Das "Spiel" an sich testen?
Ja meine alut.bi hat die Funktion auch nicht gehabt, ich hatte es zuerst mit alutLoadMemoryFromFile() probiert aber die war wiederrum nicht nicht in meiner alut.dll drin. Also hab ich alutLoadWAVFile() noch in die bi eingetragen. |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 16:19 Titel: |
|
|
Was mich auch wundert...
So wird die Position ja übergeben:
Code: |
Dim As ALfloat iui(3)
iui(0) = 100
iui(1) = 100
iui(2) = 100
alListenerfv(AL_POSITION, @iui(0)) |
Laut allen Tutorials. Aber was soll das für einen Sinn haben wenn ich einen Array erstelle und dann dann den pointer auf den ersten Index übergebe... soll er dann abschätzen wo die anderen beiden Speicher anfangen? In c wird der Array an der Stelle ohne Index übergeben, aber das mag fb nicht.
"fv" könnte doch float vector bedeuten, ich hab es auch mit alListener3f probiert, da hat man gleich 3 Parameter für die Position, das erscheint mir sinnvoller aber ging auch nicht.
Und wie das funktionieren soll kann ich mir gar nicht vorstellen:
Code: |
declare sub alListenerf (byval param as ALenum, byval value as ALfloat) |
Egal, ich schau nur so genau hin weils nicht funktioniert obwohls funktionieren sollte (kein Fehler als Rückgabe).
Achso, hier gleich mal meine alut.bi Änderung:
Code: | declare function alutLoadWAVFile (byval fileName as zstring ptr, byval format as ALenum ptr, byval data as any ptr, byval size as ALsizei ptr, byval frequency as ALfloat ptr, byval loop as any ptr) as ALvoid ptr
declare function alutUnloadWAV (byval format as ALenum ptr, byval data as any ptr, byval size as ALsizei ptr, byval frequency as ALfloat ptr) as ALvoid ptr |
|
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 05.05.2013, 16:35 Titel: |
|
|
Hab die Änderungen bereits selbst nachgetragen (Grund dafür das sie nicht da waren könnte vielleicht auch der nette Hinweis dabei sein...)
Code: |
'' * Nasty Compatibility stuff, WARNING: THESE FUNCTIONS ARE STRONGLY DEPRECATED * ''
declare function alutLoadWAVFile (byval fileName as zstring ptr, byval format as ALenum ptr, byval data as ALvoid ptr, byval size as ALsizei ptr, byval frequency as ALsizei ptr, byval loop as ALboolean ptr) as ALvoid ptr
'declare function alutLoadWAVMemory (ALbyte *buffer, ALenum *format, void **data, ALsizei *size, ALsizei *frequency, ALboolean *loop) as ALvoid ptr
declare function alutUnloadWAV (byval format as ALenum ptr, byval data as ALvoid ptr, byval size as ALsizei ptr, byval frequency as ALsizei ptr) as ALvoid ptr
|
Naja, das wie und warum so mit position möcht ich so nicht ergründen/Diskutieren, hat seine gründe, kann/ist bei opengl teils nicht anders...
bei mir tut sich da jedendfalls was, auch wenn ich noch nicht genau sagen kann was...
hab den beispiel wav in den examples genommen ../data/prodigy.wav
an deiner im Beispiel angegebenen Position 100,100,100 höre ich absolut nichts, geändert auf 0,0,0 hör ichs laut und klar, mit ein bisschen Spielerei in den Positionen höre ich definitiv Unterschiede
Edit: wegen der Positionen... ginge auch
Code: |
type vec3
X as Single
Y as Single
Z as Single
end type
#define positionv3(X,Y,Z) cast(ALFloat ptr,@type<vec3>(X,Y,Z))
'...
alListenerfv(AL_POSITION, positionv3(0,0,0))
'...
|
als Beispiel... _________________
 |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 17:15 Titel: |
|
|
Jop! Hab mir auch mal die prodigy.wav besorgt und mit der gehts. Hmm, naja der erste Unterschied zu meinen Files ist, dass die eine schlechte Samplerate hat (hoffe/denke, dass das nicht der Grund sein wird weil so gehts nicht) und sie ist mono.
Ich denke Zweiteres macht sogar Sinn, da ja das Stereo sowieso neu berechnet wird.
Danke schonmal! Ich teste mal meine Files in mono und schreib dann nochmal ob es wirklich der Fehler war.
Mit dem Vector type sieht das ordentlicher aus aber jetzt gehts! Ist mir wieder relativ egal wie
Thx, und ich werde mal versuchen so schnell wie möglich eine kleine Demo vom Ganzen zu liefern... Grafisch und bald auch Soundtechnisch wirds ja fertig sein.
Wie ich das Geschehen scripte ist mir noch unklar, soll ein Adventure werden. |
|
Nach oben |
|
 |
storky

Anmeldungsdatum: 06.01.2013 Beiträge: 68
|
Verfasst am: 05.05.2013, 17:20 Titel: |
|
|
Ach doch nochmal eine Frage. Mir fällt gerade auf, dass der "Fehler" für Ambiente und Donner etc, ideal war Ist ja blöd wenn der Hintergundsound bei x, y, z spielt, man etwas weglatscht und man dann den Sound aufeinmal nur noch leise links hört, beispielsweiße..
Gibt es auch eine Möglichkeit einen Sound "global" abzuspielen? Die anfängliche Frage nur andersrum
Edit: Also eine Möglichkeit gibts schonmal. Immer den Sound zum Spieler setzen, wenn man das vllt 4 mal pro Sekunde macht reicht es vllt aus und ist immer noch schnell genug.
Edit2: Mit mono Wav's geht es Zwar nur lauter und leiser obwohl 100, 0, 0 rechts kommen müsste wenn man bei 0, 0, 0 steht aber mit L_ORIENTATION bekommt man irgendwie Stereo hin, also da konnte ich einen Unterschied hören. Das finde ich noch herraus.
Hier noch meine aufgeräumte .bas
Code: | #Include "al/al.bi"
#Include "al/alut.bi"
Declare Function initSound() As Integer
Declare Function loadWav(fname As string) As Integer
Declare Function UnloadSound() As Integer
Declare Function stopSound(nr As integer) As Integer
Declare Function playSound(nr As Integer, x As Single, y As Single, z As Single, looping As Integer) As Integer
Declare Function setSoundPosition(nr As Integer, x As Single, y As Single, z As Single) As Integer
Declare Function setListenerPosition(x As Single, y As Single, z As Single, oAtX As Single, oAtY As Single, oAtZ As Single, oUpX As Single, oUpY As Single, oUpZ As Single) As Integer
dim shared Buffer(20) as ALuint
dim shared Source(20) as ALuint
dim shared sndSize(20) As Integer
dim shared As Integer soundCount = 0
Function initSound() As Integer
Print "Initialising OpenAL... ";
alutInit(0, 0)
Print "done."
If alGetError <> AL_NO_ERROR then
Print "OpenAl error!"
alutExit
Return 0
End if
Return 1
End Function
Function loadWav(fname As string) As Integer
Dim wavFormat as ALenum
Dim wavSize as ALsizei
Dim wavFreq as ALsizei
Dim wavData as any ptr
Dim wavLoop as ALboolean
soundCount += 1
Print "Load Sound" & fname
alutLoadWAVFile(fname, @wavFormat, @wavData, @wavSize, @wavFreq, @wavLoop)
alGenBuffers(1, @Buffer(soundCount))
alBufferData(Buffer(soundCount), wavFormat, wavData, wavSize, wavFreq)
sndSize(soundCount) = wavSize
alutUnloadWAV(wavFormat, wavData, wavSize, wavFreq)
If alGetError <> AL_NO_ERROR then
alutExit
Return 0
End If
alGenSources(1, @Source(soundCount))
If alGetError <> AL_NO_ERROR then
alutExit
Return 0
End if
Return soundCount
End Function
Function playSound(nr As Integer, x As Single, y As Single, z As Single, looping As Integer) As Integer
If (Not looping) Then
alSourcei(Source(nr), AL_LOOPING, AL_FALSE)
Else
alSourcei(Source(nr), AL_LOOPING, AL_TRUE)
End If
Dim As ALfloat Spos(3)
Spos(0) = x
Spos(1) = y
Spos(2) = z
alSourcei (Source(nr), AL_BUFFER, Buffer(nr))
alListenerfv (AL_POSITION, @Spos(0))
alSourcePlay(Source(nr))
Return 1
End Function
Function stopSound(nr As Integer) As Integer
alSourceStop(Source(nr))
Return 1
End Function
Function setSoundPosition(nr As Integer, x As Single, y As Single, z As Single) As Integer
dim SourcePos(3) as ALfloat
SourcePos(0) = x
SourcePos(1) = y
SourcePos(2) = z
alSourcefv(Source(nr), AL_POSITION, @SourcePos(0))
Return 1
End function
Function setListenerPosition(x As Single, y As Single, z As Single, oAtX As Single, oAtY As Single, oAtZ As Single, oUpX As Single, oUpY As Single, oUpZ As Single) As Integer
dim ListenerPos(3) as ALfloat
dim ListenerOri(6) as ALfloat
ListenerPos(0) = x
ListenerPos(1) = y
ListenerPos(2) = z
ListenerOri(0) = oAtX
ListenerOri(1) = oAtY
ListenerOri(2) = oAtZ
ListenerOri(3) = oUpX
ListenerOri(4) = oUpY
ListenerOri(5) = oUpZ
alListenerfv(AL_POSITION, @ListenerPos(0))
alListenerfv(AL_ORIENTATION, @ListenerOri(0))
Return 1
End Function
function UnloadSound() As Integer
Dim i As Integer
For i = 1 To soundCount
alDeleteBuffers(sndSize(i), @Buffer(i))
alDeleteSources(sndSize(i), @Source(i))
Next
alutExit
Return 1
end Function |
Damit sollte man dann Alles soweit unter Kontrolle haben wenn man auf Pitch usw verzichtet...
Bsp
Code: | If initSound() Then
setListenerPosition(0, 0, 0, 0, 0, 0, 0, 0, 0)
dim As Integer wav = loadWav("./data/sound/thunder.wav")
playSound(wav, 0, 0, 0, 0) 'snd, x, y, z, loop
Sleep
playSound(wav, 10, 10, 10, 0)
sleep
UnloadSound()
sleep
End If |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|