Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

OpenAL erzielt keinen 3D Effekt

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 02:26    Titel: OpenAL erzielt keinen 3D Effekt Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 08:44    Titel: Antworten mit Zitat

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 lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.05.2013, 15:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 16:09    Titel: Antworten mit Zitat

Das "Spiel" an sich testen? lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 16:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 05.05.2013, 16:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 17:15    Titel: Antworten mit Zitat

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 lächeln aber jetzt gehts! Ist mir wieder relativ egal wie grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden
storky



Anmeldungsdatum: 06.01.2013
Beiträge: 68

BeitragVerfasst am: 05.05.2013, 17:20    Titel: Antworten mit Zitat

Ach doch nochmal eine Frage. Mir fällt gerade auf, dass der "Fehler" für Ambiente und Donner etc, ideal war grinsen 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 verwundert

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 lächeln 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. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz